One recorder: a single scalar channel's history against its stage's load
factor. NodeDisp was the first variant (node displacement/load-factor
history for a static pushover); ElementForce (results-storage-indexeddb.md's
"several more types of recorders" plan) is the second, sharing the exact
same batching/storage machinery — see session::ResolvedRecorder and
StepOutcome::recorder_batches, neither of which needed to change shape
to add it. ElementForce's element_kind/element_index pair mirrors
ElementLoadTable's existing disambiguation between per-kind element
tables (ElasticBeamColumn2dTable, FiberBeamColumn3dTable, ...) — there is
no single flat element table to index into directly, unlike NodeTable.
Adding a future response kind (velocity, acceleration, ...) is one more
variant here plus one more match arm in ModelSession::record_sample,
not a new parallel type or a new Session/StepOutcome field.
Which half of a fiber's (strain, stress) pair (core::FiberSection:: fiber_responses's doc comment) a RecorderSpec::Fiber reads — one scalar channel per recorder, same as every other
kind here.
One recorder: a single scalar channel's history against its stage's load factor.
NodeDispwas the first variant (node displacement/load-factor history for a static pushover);ElementForce(results-storage-indexeddb.md's "several more types of recorders" plan) is the second, sharing the exact same batching/storage machinery — seesession::ResolvedRecorderandStepOutcome::recorder_batches, neither of which needed to change shape to add it.ElementForce'selement_kind/element_indexpair mirrorsElementLoadTable's existing disambiguation between per-kind element tables (ElasticBeamColumn2dTable,FiberBeamColumn3dTable, ...) — there is no single flat element table to index into directly, unlikeNodeTable. Adding a future response kind (velocity, acceleration, ...) is one more variant here plus one more match arm inModelSession::record_sample, not a new parallel type or a newSession/StepOutcomefield. Which half of a fiber's(strain, stress)pair (core::FiberSection:: fiber_responses's doc comment) aRecorderSpec::Fiberreads — one scalar channel per recorder, same as every other kind here.