def place_objects(
volume: SimulationObject,
config: SimulationConfig,
constraints: Sequence[
(
PositionConstraint
| SizeConstraint
| SizeExtensionConstraint
| GridCoordinateConstraint
| RealCoordinateConstraint
)
],
key: jax.Array,
) -> tuple[
ObjectContainer,
ArrayContainer,
ParameterContainer,
SimulationConfig,
dict[str, Any],
]:
"""Places simulation objects according to specified constraints and initializes containers.
Args:
volume (SimulationObject): The volume object defining the simulation boundaries
config (SimulationConfig): The simulation configuration
constraints (Sequence[PositionConstraint| SizeConstraint| SizeExtensionConstraint| GridCoordinateConstraint| RealCoordinateConstraint]):
Sequence of positioning and sizing constraints for objects
key (jax.Array): JAX random key for initialization
Returns:
tuple[ObjectContainer, ArrayContainer, ParameterContainer, SimulationConfig, dict[str, Any]]: A tuple containing
- ObjectContainer with placed simulation objects
- ArrayContainer with initialized field arrays
- ParameterContainer with device parameters
- Updated SimulationConfig
- Dictionary with additional initialization info
"""
slice_tuple_dict = _resolve_object_constraints(
volume=volume,
constraints=constraints,
config=config,
)
obj_list = list(slice_tuple_dict.keys())
# place objects on computed grid positions
placed_objects = []
for o in obj_list:
if o == volume:
continue
key, subkey = jax.random.split(key)
placed_objects.append(
o.place_on_grid(
grid_slice_tuple=slice_tuple_dict[o],
config=config,
key=subkey,
)
)
key, subkey = jax.random.split(key)
placed_objects.insert(
0,
volume.place_on_grid(
grid_slice_tuple=slice_tuple_dict[volume],
config=config,
key=subkey,
),
)
# create container
objects = ObjectContainer(
object_list=placed_objects,
volume_idx=0,
)
params = _init_params(
objects=objects,
key=key,
)
arrays, config, info = _init_arrays(
objects=objects,
config=config,
)
# replace config in objects with compiled config
new_object_list = []
for o in objects.objects:
o = o.aset("_config", config)
new_object_list.append(o)
objects = ObjectContainer(
object_list=new_object_list,
volume_idx=0,
)
return objects, arrays, params, config, info