#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Provides a centralised, immutable container for all simulation parameters.
:module: config
:author: Le Bars, Yoann
"""
from __future__ import annotations
# Defines the public names of this module.
__all__ = ['SimulationConfig']
from dataclasses import dataclass
from src import constants
from src.args import CmdLineArgs
[docs]
@dataclass(frozen=True)
class SimulationConfig:
"""
A centralised, immutable container for all simulation parameters.
This object is created from command-line arguments and passed to the
simulation engine, decoupling the core logic from argument parsing.
The `frozen=True` attribute makes instances of this class immutable,
preventing accidental modification of parameters during the simulation.
:ivar int n_iter: Number of simulation iterations.
:ivar int n_bodies: Number of bodies to simulate.
:ivar float dens: Density of the bodies.
:ivar float universal_g: Universal gravitational constant.
:ivar float epsilon: Softening factor for force calculations.
:ivar int seed: Seed for random number generation.
:ivar int log_freq: Frequency of energy log output.
:ivar float target_dx: Heuristic for adaptive time-stepping.
:ivar float max_dt: Maximum allowed time step.
:ivar float dt_damping_factor: Damping factor for time step smoothing.
:ivar float coeff_restitution: Coefficient of restitution for collisions.
:ivar float coeff_friction: Coefficient of kinetic friction.
:ivar float positional_correction_factor: Factor for Baumgarte stabilisation.
:ivar float coeff_static_friction: Coefficient of static friction.
:ivar float linear_damping: Damping factor for linear velocity.
:ivar float angular_damping: Damping factor for angular velocity.
"""
# Core simulation parameters
n_iter: int
n_bodies: int
dens: float
universal_g: float
epsilon: float
seed: int
log_freq: int
# Algorithmic and physics tuning parameters
target_dx: float = constants.TARGET_DX
max_dt: float = constants.MAX_DT
dt_damping_factor: float = constants.DT_DAMPING_FACTOR
coeff_restitution: float = constants.COEFF_RESTITUTION
coeff_friction: float = constants.COEFF_FRICTION
positional_correction_factor: float = constants.POSITIONAL_CORRECTION_FACTOR
coeff_static_friction: float = constants.COEFF_STATIC_FRICTION
linear_damping: float = constants.LINEAR_DAMPING
angular_damping: float = constants.ANGULAR_DAMPING
# Display options
show_torque_arrow: bool = False
show_alpha_arrow: bool = False
[docs]
@classmethod
def from_args(cls, args: CmdLineArgs) -> 'SimulationConfig':
"""
Factory method to create a SimulationConfig instance from parsed
command-line arguments.
:param CmdLineArgs args: The parsed command-line arguments.
:returns: An initialised SimulationConfig object.
:rtype: 'SimulationConfig'
"""
return cls(
n_iter=args.n_iter,
n_bodies=args.n_bodies,
dens=args.dens,
universal_g=args.universal_g,
epsilon=args.epsilon,
seed=args.seed,
log_freq=args.log_freq,
coeff_restitution=args.restitution,
coeff_friction=args.friction,
coeff_static_friction=args.static_friction,
linear_damping=args.linear_damping,
angular_damping=args.angular_damping,
show_torque_arrow=args.show_torque_arrow,
show_alpha_arrow=args.show_alpha_arrow
)