zoomy_core.model.boundary_conditions#
Boundary conditions of the Model layer: per-tag BC classes, the BoundaryConditions container and the kernels it lowers to. They are attached to a SystemModel, which turns them into the boundary / ghost-state kernels the solver templates call.
Module Contents#
Classes#
What a boundary condition’s value is: the ghost state, or the state on the face. |
|
Base class of a boundary condition: a |
|
Ghost state equals the interior state (zero normal gradient). |
|
Named alias of |
|
Prescribed value on the field(s) selected by |
|
Prescribed normal gradient |
|
preCICE-coupled boundary patch; the kernel is an extrapolation fallback that the solver overwrites with the exchanged data at runtime. |
|
Prescribe selected state fields, extrapolate the rest. |
|
Face values from user functions: |
|
Boundary values derived in the model: references a |
|
Incoming-characteristic ghost: only the characteristic fields with |
|
Non-reflecting far-field boundary: incoming characteristics carry |
|
Wall from the characteristic tool: the target is the mirror state (normal momentum
reflected) and only its incoming content is imposed. |
|
Face values from a time series: |
|
Reflective boundary in characteristic variables: incoming ones ( |
|
Free-slip / partially permeable wall: per momentum vector,
|
|
|
|
Periodic boundary; the runtime pairs it with |
|
Mixed Dirichlet and Neumann boundary (POM-style wind-stress surface):
|
|
System-aware BC: |
|
System-aware BC: |
|
System-aware wall: extrapolation (without gradient) for scalar equations, reflection
( |
|
Wall BC for the momentum equations of a system; |
|
Container of the per-tag BCs, sorted by tag; builds the indexed boundary, gradient and ghost-state kernels. |
|
Composite BC for one tag: each state slot takes the value/gradient of the BC assigned to
its field. Built by |
Functions#
Derive the momentum index groups (one vector per group, across the horizontal directions)
from the registry |
|
Translate system-aware BCs into a |
|
Per-face boundary-data group |
|
Build the ghost-state kernel of |
|
BC-kernel branch index of every boundary face of |
|
Build a |
|
Attach boundary conditions (a |
API#
- class zoomy_core.model.boundary_conditions.BoundaryValueKind#
Bases:
zoomy_core.misc.options.OptionWhat a boundary condition’s value is: the ghost state, or the state on the face.
Initialization
Initialize self. See help(type(self)) for accurate signature.
- ghost#
‘ghost’
- face#
‘face’
- class zoomy_core.model.boundary_conditions.BoundaryCondition(tag=None, on=None, **params)#
Bases:
param.ParameterizedBase class of a boundary condition: a
tag(patch) and anonselector naming the state field(s) it owns. A flat list of BCs gives different fields different BCs at one tag;onis resolved against the model state byresolve_per_field.A BC feeds three channels:
face, the state on the boundary face (the Riemann problem);ghost, the value at the mirror image of the inner cell centre (gradients, limiters, derivative aux, diffusion), by default derived from the face value;normal_gradient, a prescribed dQ/dn on the face (Neumann data).face=/ghost=/normal_gradient=take another BC that supplies that channel on the slots of itson, e.g.Wall(tag="w", ghost=Dirichlet(on="momentum", value=0)).Initialization
Set
tagandon(both optional) and forward the remaining parameters.- tag#
‘String(…)’
- on#
‘String(…)’
- face#
‘Parameter(…)’
- ghost#
‘Parameter(…)’
- normal_gradient#
‘Parameter(…)’
- boundary_value_kind#
None
- channels()#
The channel BCs given, e.g.
{"face": bc, "ghost": bc}.
- bind_on(state_names, aliases=None)#
Resolve
onto the owned state-slot indices (None: all, no masking); called bySystemModel.attach_boundary_conditions.
- abstract compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value (the outer face state seen by the Riemann problem), assembled into the indexed
boundary_conditionskernel.
- compute_boundary_gradient(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic face-normal gradient
dQ/dn(default: zero Neumann), assembled into theboundary_gradientskernel.
- compute_ghost_state(time, X, dX, Q, Qaux, parameters, normal, bdata=None)#
Symbolic ghost state at the mirror image of the inner cell centre; a
BoundaryValueKind.facevaluevgives2v - Q.Args
bdata: per-face boundary data (coupling), read only by subclasses that need it.
- face_state(Q_face, Qaux_face, normal, parameters)#
Deprecated numpy boundary-side Riemann state from the reconstructed face value (default: copy); use
face_value.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy boundary-side Riemann state of the adjacent interior cell (default: copy of
Q_inner).Args
d_face: distance from the interior cell centre to the face centre.
Returns
State of shape
(n_vars,)seen by the Riemann solver on the boundary side.
- face_gradient(Q_inner, Q_face, Qaux_inner, normal, d_face, time, parameters)#
Numpy face-normal gradient
dQ/dnfor the diffusive flux (default:(Q_face - Q_inner) / d_face).Args
Q_face: the already computedface_valueresult.
Returns
Gradient of shape
(n_vars,).
- class zoomy_core.model.boundary_conditions.Extrapolation(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionGhost state equals the interior state (zero normal gradient).
Initialization
Set
tagandon(both optional) and forward the remaining parameters.- use_gradient#
‘Boolean(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value: the inner state.
- face_state(Q_face, Qaux_face, normal, parameters)#
Boundary state equals the interior face state.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Boundary state equals the interior cell state.
- face_gradient(Q_inner, Q_face, Qaux_inner, normal, d_face, time, parameters)#
Zero normal gradient.
- class zoomy_core.model.boundary_conditions.ZeroNeumann(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.ExtrapolationNamed alias of
Extrapolation(dQ/dn = 0).Initialization
Set
tagandon(both optional) and forward the remaining parameters.
- class zoomy_core.model.boundary_conditions.Dirichlet(tag=None, on=None, value=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionPrescribed value on the field(s) selected by
on=, e.g.Dirichlet("left", on="h", value=1.5).Initialization
Set the prescribed
valuebesidestagandon.- value#
‘Number(…)’
- boundary_value_kind#
None
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value:
valuein every slot.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy boundary state:
valuein every slot.
- class zoomy_core.model.boundary_conditions.Flux(tag=None, on=None, gradient=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionPrescribed normal gradient
dQ/dn = gradienton the field(s) selected byon=; the ghost value extrapolates.gradientis a number, a string formula in field/parameter names (e.g. Navier slip"lambda_s*h*mom/nu"), a sympy expression or a numpy callable; names are bound byresolve.Initialization
Set the
gradientspecification besidestagandon.- gradient#
‘Parameter(…)’
- resolve(sm)#
Bind a string / sympy
gradientto the symbols ofsmby name and lambdify it for the numpy path.
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value: the inner state.
- compute_ghost_state(time, X, dX, Q, Qaux, parameters, normal, bdata=None)#
Ghost of the prescribed gradient
g:Q + 2*dX*g.
- compute_boundary_gradient(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic prescribed gradient in every slot.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy boundary state: the interior cell state.
- face_gradient(Q_inner, Q_face, Qaux_inner, normal, d_face, time, parameters)#
Numpy prescribed gradient, evaluated at the interior cell.
- class zoomy_core.model.boundary_conditions.Coupled(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionpreCICE-coupled boundary patch; the kernel is an extrapolation fallback that the solver overwrites with the exchanged data at runtime.
Args
mesh_name: preCICE mesh name of the patch (as inprecice-config.xml).
Initialization
Set
tagandon(both optional) and forward the remaining parameters.- mesh_name#
‘String(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Fallback boundary value (extrapolation), overwritten by preCICE at runtime.
- compute_ghost_state(time, X, dX, Q, Qaux, parameters, normal, bdata=None)#
Ghost equals the per-face coupling data
bdata(the inner state if absent).
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Fallback face value: the interior cell state.
- class zoomy_core.model.boundary_conditions.InflowOutflow(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionPrescribe selected state fields, extrapolate the rest.
prescribe_fieldsmaps a state index to a value (scalar or expression) or to a dict withmodeinreplace(value),inlet_outlet(value only where inflowing) orblend(soft pull totargetwithweight).Initialization
Set
tagandon(both optional) and forward the remaining parameters.- prescribe_fields#
‘Dict(…)’
- boundary_value_kind#
None
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value with the prescribed fields replaced.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy path: constant
replacespecs only; other modes go through the codegen path.
- class zoomy_core.model.boundary_conditions.Lambda(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionFace values from user functions:
prescribe_fieldsmaps a slot tof(time, X, dX, Q, Qaux, p, n)at the face centre.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- prescribe_fields#
‘Dict(…)’
- boundary_value_kind#
None
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value with the prescribed slots from the user functions.
- class zoomy_core.model.boundary_conditions.FromModel(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionBoundary values derived in the model: references a
boundary:<name>function group registered by the derivation.resolve(called bySystemModel.attach_boundary_conditions) binds it tosm.boundary_specs; slots the definition does not prescribe extrapolate.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- definition#
‘String(…)’
- prescribe_fields#
‘Dict(…)’
- resolve(sm)#
Take the named definition from
sm.boundary_specsand capture the state and face-normal symbols.
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value: the model definition with state and normal symbols substituted.
- class zoomy_core.model.boundary_conditions.Characteristic(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionIncoming-characteristic ghost: only the characteristic fields with
lambda < 0take the target state,Q + R 1_{lambda<0} L (Q_target - Q), so the Riemann problem reflects nothing. Built on the SystemModel’s opaqueeigensystemkernel; the target is the inner state unless overridden byprescribe_fieldsortarget_state.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- prescribe_fields#
‘Dict(…)’
- resolve(sm)#
Bind the state symbols, normal symbols and eigensystem of
sm.
- target_state(time, X, dX, Q, Qaux, parameters, normal)#
State whose incoming content is imposed (default: inner state overridden by
prescribe_fields).
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value from the eigendecomposition of the normal-projected system.
- class zoomy_core.model.boundary_conditions.CharacteristicFarField(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.CharacteristicNon-reflecting far-field boundary: incoming characteristics carry
far_field, outgoing ones leave undisturbed.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- far_field#
‘Parameter(…)’
- target_state(time, X, dX, Q, Qaux, parameters, normal)#
Far-field state vector (the inner state if
far_fieldis None).
- zoomy_core.model.boundary_conditions.derive_momentum_field_indices(sm)#
Derive the momentum index groups (one vector per group, across the horizontal directions) from the registry
sm.interpolate_to_3d, or from declared roles.Returns
Groups such as
[[q_x_0, q_y_0], [q_x_1, q_y_1], ...]; raises if the registry is missing or ragged.
- class zoomy_core.model.boundary_conditions.CharacteristicWall(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions._DerivedMomentumIndices,zoomy_core.model.boundary_conditions.CharacteristicWall from the characteristic tool: the target is the mirror state (normal momentum reflected) and only its incoming content is imposed.
momentum_field_indices=Nonederives the groups at resolve time (seederive_momentum_field_indices).Initialization
Set
tagandon(both optional) and forward the remaining parameters.- momentum_field_indices#
‘List(…)’
- target_state(time, X, dX, Q, Qaux, parameters, normal)#
Inner state with the normal momentum of each group reflected.
- class zoomy_core.model.boundary_conditions.FromData(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionFace values from a time series:
prescribe_fieldsmaps a slot to data interpolated overtimeline.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- prescribe_fields#
‘Dict(…)’
- timeline#
‘Array(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic ghost
2*interp - Qfor the prescribed slots.
- class zoomy_core.model.boundary_conditions.CharacteristicReflective(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionReflective boundary in characteristic variables: incoming ones (
D <= 0) are mapped throughM.R, L, Dare the user-supplied eigen-decomposition andSthe rotation into the normal frame.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- R#
‘Parameter(…)’
- L#
‘Parameter(…)’
- D#
‘Parameter(…)’
- S#
‘Parameter(…)’
- M#
‘Parameter(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value: incoming characteristic variables reflected through
M, guarded against dry cells.
- class zoomy_core.model.boundary_conditions.Wall(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions._DerivedMomentumIndices,zoomy_core.model.boundary_conditions.BoundaryConditionFree-slip / partially permeable wall: per momentum vector,
u_wall = slip * u_tangential - (1 - permeability) * u_normal; scalars extrapolate.momentum_field_indiceslists index groups (one vector per group); None derives them from the model at resolve time, an explicit pin wins.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- momentum_field_indices#
‘List(…)’
- permeability#
‘Number(…)’
- wall_slip#
‘Number(…)’
- blending#
‘Number(…)’
- use_gradient#
‘Boolean(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic wall ghost: reflected normal momentum, slip on the tangential part, blended with the inner state by
blending.
- face_state(Q_face, Qaux_face, normal, parameters)#
Numpy wall state from the reconstructed face value.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy wall state: reflected normal momentum, scalars copied from the interior.
- class zoomy_core.model.boundary_conditions.RoughWall(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.WallWallwith a distance-dependent slip from a log-law roughness (CsW,Ks).Initialization
Set
tagandon(both optional) and forward the remaining parameters.- CsW#
‘Number(…)’
- Ks#
‘Number(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic wall ghost with the roughness slip
(1 - f) / (1 + f).
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy wall state with the roughness slip.
- class zoomy_core.model.boundary_conditions.Periodic(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionPeriodic boundary; the runtime pairs it with
periodic_to_physical_tag(mesh.resolve_periodic_bcs), the kernel is an extrapolation fallback.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- periodic_to_physical_tag#
‘String(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Fallback boundary value: the inner state.
- class zoomy_core.model.boundary_conditions.WindStress(tag=None, on=None, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionMixed Dirichlet and Neumann boundary (POM-style wind-stress surface):
prescribe_valuesfixes rows,prescribe_gradientsfixes face-normal gradients, other rows extrapolate. Symbolic specs work on the codegen and Firedrake-DG paths, the numpy paths need numbers.Initialization
Set
tagandon(both optional) and forward the remaining parameters.- prescribe_values#
‘Dict(…)’
- prescribe_gradients#
‘Dict(…)’
- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Dirichlet rows take the prescribed value; others extrapolate.
- compute_boundary_gradient(time, X, dX, Q, Qaux, parameters, normal)#
Neumann rows take the prescribed gradient; others zero.
- compute_ghost_state(time, X, dX, Q, Qaux, parameters, normal, bdata=None)#
Dirichlet rows
2v - Q, Neumann rowsQ + 2*dX*g, the rest extrapolate.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy: Dirichlet rows take the prescribed (numeric) value; others extrapolate.
- face_gradient(Q_inner, Q_face, Qaux_inner, normal, d_face, time, parameters)#
Numpy: Neumann rows take the prescribed (numeric) gradient; others zero.
- class zoomy_core.model.boundary_conditions.SystemExtrapolation(tag=None)#
System-aware BC:
Extrapolationon every equation.Initialization
Store the boundary
tag.- apply_to_system_bcs(system_bcs, tag=None)#
Set
Extrapolationfor every equation ofsystem_bcsat the tag.
- class zoomy_core.model.boundary_conditions.SystemPeriodic(tag=None, periodic_to_physical_tag='')#
System-aware BC:
Periodicon every equation.Initialization
Store the
tagandperiodic_to_physical_tag.- apply_to_system_bcs(system_bcs, tag=None)#
Set
Periodicfor every equation ofsystem_bcsat the tag.
- class zoomy_core.model.boundary_conditions.SystemWall(tag=None, permeability=0.0, wall_slip=1.0)#
System-aware wall: extrapolation (without gradient) for scalar equations, reflection (
WallMomentumBC) for momentum equations.Args
permeability: 0 impermeable (default), 1 fully permeable.wall_slip: 1 free-slip (default), 0 no-slip.
Initialization
Store tag, permeability and wall slip.
- apply_to_system_bcs(system_bcs, tag=None, system=None)#
Set extrapolation on scalar equations and
WallMomentumBCon momentum equations at the tag.
- class zoomy_core.model.boundary_conditions.WallMomentumBC(tag, system_bcs, permeability=0.0, wall_slip=1.0, use_gradient=True)#
Wall BC for the momentum equations of a system;
compile_system_bcsgroups their variables into momentum vectors.Initialization
Store the tag, the system BC container and the wall parameters.
- property momentum_equations#
Momentum equations of the current system.
- zoomy_core.model.boundary_conditions.compile_system_bcs(system_bcs, equation_variable_map, dimension)#
Translate system-aware BCs into a
BoundaryConditionscontainer with one BC per tag.Args
system_bcs: per-equation, per-tag BCs.equation_variable_map:{equation_name: [var_index, ...]}, used to group momentum indices.dimension: horizontal model dimension (1 or 2).
Returns
The container, with
_gradient_variable_indicesper tag.
- class zoomy_core.model.boundary_conditions.BoundaryConditions(boundary_conditions=None, **params)#
Bases:
param.ParameterizedContainer of the per-tag BCs, sorted by tag; builds the indexed boundary, gradient and ghost-state kernels.
Initialization
Take the list of BCs (
boundary_conditions), sort by tag and collect their kernels.- boundary_conditions_list#
‘List(…)’
- property list_sorted_function_names#
Tags in kernel-branch order.
- property boundary_conditions_list_dict#
BCs keyed by tag.
- get_boundary_condition_function(time, X, dX, Q, Qaux, parameters, normal, function_name='boundary_conditions')#
Indexed symbolic
boundary_conditionskernel: a Piecewise over the BC index dispatching to each BC’s boundary value.
- get_boundary_gradient_function(time, X, dX, Q, Qaux, parameters, normal, function_name='boundary_gradients')#
Indexed symbolic
boundary_gradientskernel (face-normal gradient), same contract asget_boundary_condition_function.
- ghost_state_branches(time, X, dX, Q, Qaux, parameters, normal, bdata)#
Per-BC symbolic ghost states (branch
iserves tagi); an empty container gives one extrapolation branch.
- get_boundary_ghost_function(time, X, dX, Q, Qaux, parameters, normal, bdata, function_name='boundary_ghost_state')#
Indexed symbolic ghost-state kernel; as
get_boundary_condition_functionplus the per-faceboundary_datagroup.
- zoomy_core.model.boundary_conditions.boundary_data_symbols(n_state)#
Per-face boundary-data group
bdata_0 .. bdata_{n-1}(coupling data, one entry per state row) of the ghost-state kernel.
- zoomy_core.model.boundary_conditions.build_boundary_ghost_kernel(sm)#
Build the ghost-state kernel of
smfrom itsBoundaryConditionssource, in the system’s current symbols.Returns
(function, branches): the indexedboundary_ghost_statekernel and the ghostZArrayper BC branch.
- zoomy_core.model.boundary_conditions.boundary_face_branches(mesh, bcs)#
BC-kernel branch index of every boundary face of
mesh, matched by tag name (the mesh’s own tag numbers are not branch indices). A face whose tag has no BC raises, except the reservedhalotag (branch -1); withoutbcsthe mesh numbering is returned unchanged.
- class zoomy_core.model.boundary_conditions.PerFieldBoundary(tag=None, slot_bc=None, n_state=0, **params)#
Bases:
zoomy_core.model.boundary_conditions.BoundaryConditionComposite BC for one tag: each state slot takes the value/gradient of the BC assigned to its field. Built by
resolve_per_field; unclaimed slots fall back toExtrapolation.Initialization
Store the
{slot: BC}map and the state size.- compute_boundary_condition(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary value, per slot from the owning BC.
- compute_boundary_gradient(time, X, dX, Q, Qaux, parameters, normal)#
Symbolic boundary gradient, per slot from the owning BC.
- compute_ghost_state(time, X, dX, Q, Qaux, parameters, normal, bdata=None)#
Symbolic ghost state, per slot from the owning BC.
- face_value(Q_inner, Qaux_inner, normal, d_face, time, parameters)#
Numpy boundary state, per slot from the owning BC.
- face_gradient(Q_inner, Q_face, Qaux_inner, normal, d_face, time, parameters)#
Numpy face gradient, per slot from the owning BC.
- zoomy_core.model.boundary_conditions.resolve_per_field(bc_list, state_names, aliases=None)#
Build a
BoundaryConditionsfrom a flat list of per-field BCs: onePerFieldBoundaryper tag, unclaimed slots extrapolate, two BCs on one (tag, field) raise. Whole-patch BCs (Periodic,Coupled) pass through unwrapped.
- zoomy_core.model.boundary_conditions.resolve_and_attach(sm, boundary_conditions, aux_bcs=None, aliases=None)#
Attach boundary conditions (a
BoundaryConditionscontainer or a flat per-field list) to the SystemModelsm; shared by every model’ssystem_model.