diff --git a/examples/toroid25d.rs b/examples/toroid25d.rs index 8441558..4dbc747 100644 --- a/examples/toroid25d.rs +++ b/examples/toroid25d.rs @@ -100,7 +100,7 @@ fn main() { let d = Vec2::new(to_m(x_px), to_m(y_px)) - center; let r = d.mag(); if (conductor_inner_rad as _..conductor_outer_rad as _).contains(&r) { - *driver.state.get_mut(loc).mat_mut() = mat::Static::conductor(conductivity).into(); + *driver.state.get_mut(loc).mat_mut() = mat::db::conductor(conductivity).into(); } else if (ferro_inner_rad as _..ferro_outer_rad as _).contains(&r) { let half_depth_px = from_m(half_depth); let ferro_depth_px = from_m(ferro_depth); diff --git a/examples/wrapped_torus.rs b/examples/wrapped_torus.rs index 45a370e..c3f5641 100644 --- a/examples/wrapped_torus.rs +++ b/examples/wrapped_torus.rs @@ -28,14 +28,14 @@ fn main() { let size_px = Index((width_px, width_px, depth_px).into()); let mut driver = Driver::new(size_px, feat_size); driver.set_steps_per_frame(1000); - let base = "wrapped_torus-11"; + let base = "wrapped_torus-12"; let ferro_region = Torus::new_xy(Meters((half_width, half_width, half_depth).into()), ferro_major, ferro_minor); let drive_region = Torus::new_xz(Meters((half_width - ferro_major, half_width, half_depth).into()), wire_major, wire_minor); let sense_region = Torus::new_xz(Meters((half_width + ferro_major, half_width, half_depth).into()), wire_major, wire_minor); driver.fill_region(&ferro_region, mat::db::ferroxcube_3r1()); - driver.fill_region(&drive_region, mat::Static::conductor(conductivity).into()); - driver.fill_region(&sense_region, mat::Static::conductor(conductivity).into()); + driver.fill_region(&drive_region, mat::db::conductor(conductivity).into()); + driver.fill_region(&sense_region, mat::db::conductor(conductivity).into()); let boundary_xy = half_width - ferro_major - ferro_minor - buffer; let boundary_z = half_depth - wire_major - wire_minor - buffer; diff --git a/src/driver.rs b/src/driver.rs index 4af385a..c3e85a2 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -181,7 +181,7 @@ impl Driver { } } -impl> Driver { +impl> Driver { // pub fn add_boundary(&mut self, thickness: u32, base_conductivity: Flt) { // for inset in 0..thickness { // let depth = thickness - inset; @@ -252,7 +252,7 @@ impl> Driver { }; let cond = Vec3::new(cond_x, cond_y, cond_z); // trace!("cond: {:?}", cond); - let conductor = mat::Static::anisotropic_conductor(cond); + let conductor = mat::db::anisotropic_conductor(cond); *self.state.get_mut(Index(Vec3u::new(x, y, z))).mat_mut() = conductor.into(); } } diff --git a/src/mat.rs b/src/mat.rs index c84c6be..8b4c89a 100644 --- a/src/mat.rs +++ b/src/mat.rs @@ -29,24 +29,37 @@ pub trait Material { } } +/// Materical which has a conductivity parameter, but cannot be magnetized +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct Conductor { + conductivity: Vec3, +} + +impl Conductor { + pub fn new(conductivity: Flt) -> Self { + Self::new_anisotropic(Vec3::unit() * conductivity) + } + pub fn new_anisotropic(conductivity: Vec3) -> Self { + Self { + conductivity, + } + } +} + +impl Material for Conductor { + fn conductivity(&self) -> Vec3 { + self.conductivity + } +} + +/// Capable of capturing all field-related information about a material at any +/// snapshot moment-in-time. Useful for serializing state. #[derive(Clone, Default, Serialize, Deserialize)] pub struct Static { pub conductivity: Vec3, pub m: Vec3, } -impl Static { - pub fn conductor(conductivity: Flt) -> Self { - Self::anisotropic_conductor(Vec3::unit() * conductivity) - } - pub fn anisotropic_conductor(conductivity: Vec3) -> Self { - Self { - conductivity, - ..Default::default() - } - } -} - impl Material for Static { fn conductivity(&self) -> Vec3 { self.conductivity @@ -162,7 +175,7 @@ impl MHCurve { pub struct PiecewiseLinearFerromagnet { /// Instantaneous magnetization in the z direction. pub m: Vec3, - pub conductivity: Vec3, + pub conductivity: Flt, mh_curve: &'static MHCurve, } @@ -184,7 +197,7 @@ impl Material for PiecewiseLinearFerromagnet { self.m } fn conductivity(&self) -> Vec3 { - self.conductivity + Vec3::new(self.conductivity, self.conductivity, self.conductivity) } fn step_h(&mut self, context: &CellState, delta_b: Vec3) -> Vec3 { trace!("step_h enter"); @@ -206,20 +219,26 @@ impl Material for PiecewiseLinearFerromagnet { #[enum_dispatch(Material)] #[derive(Clone)] pub enum GenericMaterial { - Static(Static), + Conductor(Conductor), // ComsolFerromagnet(ComsolFerromagnet), PiecewiseLinearFerromagnet(PiecewiseLinearFerromagnet) } impl Default for GenericMaterial { fn default() -> Self { - Static::default().into() + Conductor::default().into() } } /// Database of common materials pub mod db { use super::*; + pub fn conductor(conductivity: Flt) -> Conductor { + Conductor::new(conductivity) + } + pub fn anisotropic_conductor(conductivity: Vec3) -> Conductor { + Conductor::new_anisotropic(conductivity) + } /// https://www.ferroxcube.com/upload/media/product/file/MDS/3r1.pdf pub fn ferroxcube_3r1() -> GenericMaterial { ferroxcube_3r1_concrete().into() @@ -243,7 +262,7 @@ pub mod db { } pub fn ferroxcube_3r1_concrete() -> PiecewiseLinearFerromagnet { let mut m = PiecewiseLinearFerromagnet::new(ferroxcube_3r1_curve()); - m.conductivity = Vec3::unit() * 1e-3; + m.conductivity = 1e-3; m } }