qualia_core_db/specialized_libs/physics_simulation/
engine.rs1use super::*;
2
3pub struct SimulationEngine {
5 simulation_config: SimulationConfig,
6 time_integrator: TimeIntegrator,
7 spatial_discretizer: SpatialDiscretizer,
8 boundary_conditions: BoundaryConditions,
9 initial_conditions: InitialConditions,
10}
11
12impl SimulationEngine {
15 pub fn new() -> Self {
16 Self {
17 simulation_config: SimulationConfig::default(),
18 time_integrator: TimeIntegrator::new(),
19 spatial_discretizer: SpatialDiscretizer::new(),
20 boundary_conditions: BoundaryConditions::new(),
21 initial_conditions: InitialConditions::new(),
22 }
23 }
24
25 pub fn initialize(&mut self) -> Result<(), PhysicsError> {
26 self.time_integrator.initialize()?;
27 self.spatial_discretizer.initialize()?;
28 Ok(())
29 }
30
31 pub fn create_mesh(&self, config: &SimulationConfig) -> Result<Mesh, PhysicsError> {
32 let mesh = Mesh {
33 mesh_id: "default_mesh".to_string(),
34 mesh_type: MeshType::Quadrilateral,
35 dimensions: vec![config.spatial_resolution.nx],
36 nodes: Vec::new(),
37 elements: Vec::new(),
38 quality_metrics: MeshQualityMetrics::new(),
39 };
40
41 Ok(mesh)
42 }
43
44 pub fn update_boundary_conditions(
45 &self,
46 simulation: &mut Simulation,
47 fields: &mut Vec<PhysicsField>,
48 ) -> Result<(), PhysicsError> {
49 for field in fields.iter_mut() {
51 self.boundary_conditions
52 .apply_to_field(field, simulation.current_time);
53 }
54 Ok(())
55 }
56
57 pub fn get_simulation_config(&self) -> &SimulationConfig {
59 &self.simulation_config
60 }
61
62 pub fn set_simulation_config(&mut self, config: SimulationConfig) {
64 self.simulation_config = config;
65 }
66
67 pub fn get_initial_conditions(&self) -> &InitialConditions {
69 &self.initial_conditions
70 }
71
72 pub fn get_initial_conditions_mut(&mut self) -> &mut InitialConditions {
74 &mut self.initial_conditions
75 }
76}