runmat-analysis-core 0.5.4

Solver-agnostic analysis model and validation for RunMat
Documentation
use serde::{Deserialize, Serialize};

fn default_reference_temperature_k() -> f64 {
    293.15
}

fn default_modulus_temp_coeff_per_k() -> f64 {
    -2.5e-4
}

fn default_thermal_conductivity_w_per_mk() -> f64 {
    45.0
}

fn default_specific_heat_j_per_kgk() -> f64 {
    500.0
}

fn default_thermal_expansion_coefficient_per_k() -> f64 {
    1.2e-5
}

fn default_electrical_conductivity_s_per_m() -> f64 {
    1.0
}

fn default_resistive_heating_coefficient() -> f64 {
    0.0
}

fn default_relative_permittivity() -> f64 {
    1.0
}

fn default_relative_permeability() -> f64 {
    1.0
}

fn default_acoustic_density_kg_per_m3() -> f64 {
    1.225
}
fn default_mechanical_density_kg_per_m3() -> f64 {
    7850.0
}

fn default_speed_of_sound_m_per_s() -> f64 {
    343.0
}

fn default_acoustic_damping_ratio() -> f64 {
    0.02
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ConductivityFrequencyPoint {
    pub frequency_hz: f64,
    pub conductivity_scale: f64,
    #[serde(default)]
    pub dispersive_loss_scale: Option<f64>,
    #[serde(default)]
    pub relative_permittivity_scale: Option<f64>,
    #[serde(default)]
    pub relative_permeability_scale: Option<f64>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialMechanicalModel {
    pub youngs_modulus_pa: f64,
    pub poisson_ratio: f64,
    #[serde(default = "default_mechanical_density_kg_per_m3")]
    pub density_kg_per_m3: f64,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialThermalModel {
    #[serde(default = "default_reference_temperature_k")]
    pub reference_temperature_k: f64,
    #[serde(default = "default_modulus_temp_coeff_per_k")]
    pub modulus_temp_coeff_per_k: f64,
    #[serde(default = "default_thermal_conductivity_w_per_mk")]
    pub conductivity_w_per_mk: f64,
    #[serde(default = "default_specific_heat_j_per_kgk")]
    pub specific_heat_j_per_kgk: f64,
    #[serde(default = "default_thermal_expansion_coefficient_per_k")]
    pub expansion_coefficient_per_k: f64,
}

impl Default for MaterialThermalModel {
    fn default() -> Self {
        Self {
            reference_temperature_k: default_reference_temperature_k(),
            modulus_temp_coeff_per_k: default_modulus_temp_coeff_per_k(),
            conductivity_w_per_mk: default_thermal_conductivity_w_per_mk(),
            specific_heat_j_per_kgk: default_specific_heat_j_per_kgk(),
            expansion_coefficient_per_k: default_thermal_expansion_coefficient_per_k(),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialAcousticModel {
    #[serde(default = "default_acoustic_density_kg_per_m3")]
    pub density_kg_per_m3: f64,
    #[serde(default = "default_speed_of_sound_m_per_s")]
    pub speed_of_sound_m_per_s: f64,
    #[serde(default = "default_acoustic_damping_ratio")]
    pub damping_ratio: f64,
}

impl Default for MaterialAcousticModel {
    fn default() -> Self {
        Self {
            density_kg_per_m3: default_acoustic_density_kg_per_m3(),
            speed_of_sound_m_per_s: default_speed_of_sound_m_per_s(),
            damping_ratio: default_acoustic_damping_ratio(),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialElectricalModel {
    #[serde(default = "default_reference_temperature_k")]
    pub reference_temperature_k: f64,
    #[serde(default = "default_electrical_conductivity_s_per_m")]
    pub conductivity_s_per_m: f64,
    #[serde(default = "default_resistive_heating_coefficient")]
    pub resistive_heating_coefficient: f64,
    #[serde(default = "default_relative_permittivity")]
    pub relative_permittivity: f64,
    #[serde(default = "default_relative_permeability")]
    pub relative_permeability: f64,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub conductivity_frequency_response: Vec<ConductivityFrequencyPoint>,
}

impl Default for MaterialElectricalModel {
    fn default() -> Self {
        Self {
            reference_temperature_k: default_reference_temperature_k(),
            conductivity_s_per_m: default_electrical_conductivity_s_per_m(),
            resistive_heating_coefficient: default_resistive_heating_coefficient(),
            relative_permittivity: default_relative_permittivity(),
            relative_permeability: default_relative_permeability(),
            conductivity_frequency_response: Vec::new(),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialPlasticModel {
    pub yield_strain: f64,
    pub hardening_modulus_ratio: f64,
    pub saturation_exponent: f64,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MaterialModel {
    pub material_id: String,
    pub name: String,
    pub mechanical: MaterialMechanicalModel,
    #[serde(default)]
    pub thermal: MaterialThermalModel,
    #[serde(default)]
    pub acoustic: Option<MaterialAcousticModel>,
    #[serde(default)]
    pub electrical: Option<MaterialElectricalModel>,
    #[serde(default)]
    pub plastic: Option<MaterialPlasticModel>,
}