runmat_analysis_core/problem/
materials.rs1use 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}