#![doc = include_str!("../README.md")]
#[cfg(feature = "serde")]
use serde_mosaic::{
DatabaseEntry,
serde::{Deserialize, Serialize},
};
use var_quantity::VarQuantity;
#[cfg(feature = "serde")]
use std::ffi::OsStr;
use std::{fmt::Debug, mem};
use var_quantity::uom::si::{
electrical_resistivity::ohm_meter, f64::*, magnetic_field_strength::ampere_per_meter,
magnetic_flux_density::tesla, magnetic_permeability::henry_per_meter,
mass_density::kilogram_per_cubic_meter, specific_heat_capacity::joule_per_kilogram_kelvin,
specific_power::watt_per_kilogram, thermal_conductivity::watt_per_meter_kelvin,
};
use crate::iron_losses::*;
use crate::relative_permeability::*;
pub const VACUUM_PERMEABILITY_UNITLESS: f64 = 4.0 * std::f64::consts::PI * 1e-7;
lazy_static::lazy_static! {
pub static ref VACUUM_PERMEABILITY: MagneticPermeability =
MagneticPermeability::new::<henry_per_meter>(
VACUUM_PERMEABILITY_UNITLESS
);
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
pub struct Material {
pub name: String,
#[cfg_attr(feature = "serde", serde(default = "default_relative_permeability"))]
pub relative_permeability: RelativePermeability,
#[cfg_attr(feature = "serde", serde(default = "default_iron_losses"))]
pub iron_losses: IronLosses,
#[cfg_attr(feature = "serde", serde(default = "default_remanence"))]
pub remanence: VarQuantity<MagneticFluxDensity>,
#[cfg_attr(feature = "serde", serde(default = "default_intrinsic_coercivity"))]
pub intrinsic_coercivity: VarQuantity<MagneticFieldStrength>,
#[cfg_attr(feature = "serde", serde(default = "default_electrical_resistivity"))]
pub electrical_resistivity: VarQuantity<ElectricalResistivity>,
#[cfg_attr(feature = "serde", serde(default = "default_mass_density"))]
pub mass_density: VarQuantity<MassDensity>,
#[cfg_attr(feature = "serde", serde(default = "default_heat_capacity"))]
pub heat_capacity: VarQuantity<SpecificHeatCapacity>,
#[cfg_attr(feature = "serde", serde(default = "default_thermal_conductivity"))]
pub thermal_conductivity: VarQuantity<ThermalConductivity>,
}
impl Material {
pub fn name(&self) -> &str {
return &self.name;
}
pub fn set_name(&mut self, name: String) -> String {
return mem::replace(&mut self.name, name);
}
pub fn relative_permeability(&self) -> &RelativePermeability {
return &self.relative_permeability;
}
pub fn set_relative_permeability(
&mut self,
property: RelativePermeability,
) -> RelativePermeability {
return mem::replace(&mut self.relative_permeability, property);
}
pub fn iron_losses(&self) -> &IronLosses {
return &self.iron_losses;
}
pub fn set_iron_losses(&mut self, property: IronLosses) -> IronLosses {
return mem::replace(&mut self.iron_losses, property);
}
pub fn remanence(&self) -> &VarQuantity<MagneticFluxDensity> {
return &self.remanence;
}
pub fn set_remanence(
&mut self,
property: VarQuantity<MagneticFluxDensity>,
) -> VarQuantity<MagneticFluxDensity> {
return mem::replace(&mut self.remanence, property);
}
pub fn intrinsic_coercivity(&self) -> &VarQuantity<MagneticFieldStrength> {
return &self.intrinsic_coercivity;
}
pub fn set_intrinsic_coercivity(
&mut self,
property: VarQuantity<MagneticFieldStrength>,
) -> VarQuantity<MagneticFieldStrength> {
return mem::replace(&mut self.intrinsic_coercivity, property);
}
pub fn electrical_resistivity(&self) -> &VarQuantity<ElectricalResistivity> {
return &self.electrical_resistivity;
}
pub fn set_electrical_resistivity(
&mut self,
property: VarQuantity<ElectricalResistivity>,
) -> VarQuantity<ElectricalResistivity> {
return mem::replace(&mut self.electrical_resistivity, property);
}
pub fn mass_density(&self) -> &VarQuantity<MassDensity> {
return &self.mass_density;
}
pub fn set_mass_density(
&mut self,
property: VarQuantity<MassDensity>,
) -> VarQuantity<MassDensity> {
return mem::replace(&mut self.mass_density, property);
}
pub fn heat_capacity(&self) -> &VarQuantity<SpecificHeatCapacity> {
return &self.heat_capacity;
}
pub fn set_heat_capacity(
&mut self,
property: VarQuantity<SpecificHeatCapacity>,
) -> VarQuantity<SpecificHeatCapacity> {
return mem::replace(&mut self.heat_capacity, property);
}
pub fn thermal_conductivity(&self) -> &VarQuantity<ThermalConductivity> {
return &self.thermal_conductivity;
}
pub fn set_thermal_conductivity(
&mut self,
property: VarQuantity<ThermalConductivity>,
) -> VarQuantity<ThermalConductivity> {
return mem::replace(&mut self.thermal_conductivity, property);
}
}
impl Default for Material {
fn default() -> Self {
return Material {
name: "default_name".to_string(),
relative_permeability: default_relative_permeability(),
iron_losses: default_iron_losses(),
remanence: default_remanence(),
intrinsic_coercivity: default_intrinsic_coercivity(),
electrical_resistivity: default_electrical_resistivity(),
mass_density: default_mass_density(),
heat_capacity: default_heat_capacity(),
thermal_conductivity: default_thermal_conductivity(),
};
}
}
#[cfg(feature = "serde")]
#[typetag::serde]
impl DatabaseEntry for Material {
fn name(&self) -> &OsStr {
self.name.as_ref()
}
}
fn default_relative_permeability() -> RelativePermeability {
return RelativePermeability::Constant(1.0);
}
fn default_iron_losses() -> IronLosses {
return IronLosses::Constant(SpecificPower::new::<watt_per_kilogram>(0.0));
}
fn default_remanence() -> VarQuantity<MagneticFluxDensity> {
return VarQuantity::Constant(MagneticFluxDensity::new::<tesla>(0.0));
}
fn default_intrinsic_coercivity() -> VarQuantity<MagneticFieldStrength> {
return VarQuantity::Constant(MagneticFieldStrength::new::<ampere_per_meter>(0.0));
}
fn default_electrical_resistivity() -> VarQuantity<ElectricalResistivity> {
return VarQuantity::Constant(ElectricalResistivity::new::<ohm_meter>(std::f64::INFINITY));
}
fn default_mass_density() -> VarQuantity<MassDensity> {
return VarQuantity::Constant(MassDensity::new::<kilogram_per_cubic_meter>(1000.0));
}
fn default_heat_capacity() -> VarQuantity<SpecificHeatCapacity> {
return VarQuantity::Constant(SpecificHeatCapacity::new::<joule_per_kilogram_kelvin>(0.0));
}
fn default_thermal_conductivity() -> VarQuantity<ThermalConductivity> {
return VarQuantity::Constant(ThermalConductivity::new::<watt_per_meter_kelvin>(0.0));
}