Skip to main content

runmat_analysis_core/problem/
materials.rs

1use serde::{Deserialize, Serialize};
2
3fn default_reference_temperature_k() -> f64 {
4    293.15
5}
6
7fn default_modulus_temp_coeff_per_k() -> f64 {
8    -2.5e-4
9}
10
11fn default_thermal_conductivity_w_per_mk() -> f64 {
12    45.0
13}
14
15fn default_specific_heat_j_per_kgk() -> f64 {
16    500.0
17}
18
19fn default_thermal_expansion_coefficient_per_k() -> f64 {
20    1.2e-5
21}
22
23fn default_electrical_conductivity_s_per_m() -> f64 {
24    1.0
25}
26
27fn default_resistive_heating_coefficient() -> f64 {
28    0.0
29}
30
31fn default_relative_permittivity() -> f64 {
32    1.0
33}
34
35fn default_relative_permeability() -> f64 {
36    1.0
37}
38
39fn default_acoustic_density_kg_per_m3() -> f64 {
40    1.225
41}
42fn default_mechanical_density_kg_per_m3() -> f64 {
43    7850.0
44}
45
46fn default_speed_of_sound_m_per_s() -> f64 {
47    343.0
48}
49
50fn default_acoustic_damping_ratio() -> f64 {
51    0.02
52}
53
54#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
55pub struct ConductivityFrequencyPoint {
56    pub frequency_hz: f64,
57    pub conductivity_scale: f64,
58    #[serde(default)]
59    pub dispersive_loss_scale: Option<f64>,
60    #[serde(default)]
61    pub relative_permittivity_scale: Option<f64>,
62    #[serde(default)]
63    pub relative_permeability_scale: Option<f64>,
64}
65
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
67pub struct MaterialMechanicalModel {
68    pub youngs_modulus_pa: f64,
69    pub poisson_ratio: f64,
70    #[serde(default = "default_mechanical_density_kg_per_m3")]
71    pub density_kg_per_m3: f64,
72}
73
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75pub struct MaterialThermalModel {
76    #[serde(default = "default_reference_temperature_k")]
77    pub reference_temperature_k: f64,
78    #[serde(default = "default_modulus_temp_coeff_per_k")]
79    pub modulus_temp_coeff_per_k: f64,
80    #[serde(default = "default_thermal_conductivity_w_per_mk")]
81    pub conductivity_w_per_mk: f64,
82    #[serde(default = "default_specific_heat_j_per_kgk")]
83    pub specific_heat_j_per_kgk: f64,
84    #[serde(default = "default_thermal_expansion_coefficient_per_k")]
85    pub expansion_coefficient_per_k: f64,
86}
87
88impl Default for MaterialThermalModel {
89    fn default() -> Self {
90        Self {
91            reference_temperature_k: default_reference_temperature_k(),
92            modulus_temp_coeff_per_k: default_modulus_temp_coeff_per_k(),
93            conductivity_w_per_mk: default_thermal_conductivity_w_per_mk(),
94            specific_heat_j_per_kgk: default_specific_heat_j_per_kgk(),
95            expansion_coefficient_per_k: default_thermal_expansion_coefficient_per_k(),
96        }
97    }
98}
99
100#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
101pub struct MaterialAcousticModel {
102    #[serde(default = "default_acoustic_density_kg_per_m3")]
103    pub density_kg_per_m3: f64,
104    #[serde(default = "default_speed_of_sound_m_per_s")]
105    pub speed_of_sound_m_per_s: f64,
106    #[serde(default = "default_acoustic_damping_ratio")]
107    pub damping_ratio: f64,
108}
109
110impl Default for MaterialAcousticModel {
111    fn default() -> Self {
112        Self {
113            density_kg_per_m3: default_acoustic_density_kg_per_m3(),
114            speed_of_sound_m_per_s: default_speed_of_sound_m_per_s(),
115            damping_ratio: default_acoustic_damping_ratio(),
116        }
117    }
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
121pub struct MaterialElectricalModel {
122    #[serde(default = "default_reference_temperature_k")]
123    pub reference_temperature_k: f64,
124    #[serde(default = "default_electrical_conductivity_s_per_m")]
125    pub conductivity_s_per_m: f64,
126    #[serde(default = "default_resistive_heating_coefficient")]
127    pub resistive_heating_coefficient: f64,
128    #[serde(default = "default_relative_permittivity")]
129    pub relative_permittivity: f64,
130    #[serde(default = "default_relative_permeability")]
131    pub relative_permeability: f64,
132    #[serde(default, skip_serializing_if = "Vec::is_empty")]
133    pub conductivity_frequency_response: Vec<ConductivityFrequencyPoint>,
134}
135
136impl Default for MaterialElectricalModel {
137    fn default() -> Self {
138        Self {
139            reference_temperature_k: default_reference_temperature_k(),
140            conductivity_s_per_m: default_electrical_conductivity_s_per_m(),
141            resistive_heating_coefficient: default_resistive_heating_coefficient(),
142            relative_permittivity: default_relative_permittivity(),
143            relative_permeability: default_relative_permeability(),
144            conductivity_frequency_response: Vec::new(),
145        }
146    }
147}
148
149#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
150pub struct MaterialPlasticModel {
151    pub yield_strain: f64,
152    pub hardening_modulus_ratio: f64,
153    pub saturation_exponent: f64,
154}
155
156#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
157pub struct MaterialModel {
158    pub material_id: String,
159    pub name: String,
160    pub mechanical: MaterialMechanicalModel,
161    #[serde(default)]
162    pub thermal: MaterialThermalModel,
163    #[serde(default)]
164    pub acoustic: Option<MaterialAcousticModel>,
165    #[serde(default)]
166    pub electrical: Option<MaterialElectricalModel>,
167    #[serde(default)]
168    pub plastic: Option<MaterialPlasticModel>,
169}