From 197e29638f3cc2bc4a758855dc0e4d75e1e59b83 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 18 Dec 2020 13:48:35 -0800 Subject: [PATCH] Add power measurements to the minimal_torus --- examples/minimal_torus.rs | 21 +++++++++++++++------ src/driver.rs | 3 +-- src/geom/mod.rs | 2 +- src/meas.rs | 21 ++++++++++++++++++--- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/examples/minimal_torus.rs b/examples/minimal_torus.rs index 78f082a..ae0b7d7 100644 --- a/examples/minimal_torus.rs +++ b/examples/minimal_torus.rs @@ -1,11 +1,11 @@ use coremem::{Driver, Flt, mat, meas}; -use coremem::geom::{Index, Meters, Torus}; +use coremem::geom::{Cube, Index, InvertedRegion, Meters, Torus}; use coremem::stim::{CurlStimulus, Sinusoid1, TimeVarying1 as _}; fn main() { coremem::init_logging(); let feat_size = 10e-6; // feature size - let duration = 3e-11; + let duration = 6e-9; let width = 2200e-6; let depth = 1800e-6; let buffer = 200e-6; @@ -27,9 +27,9 @@ fn main() { let depth_px = from_m(depth); let size_px = Index((width_px, width_px, depth_px).into()); let mut driver: Driver = Driver::new(size_px, feat_size); - driver.set_steps_per_frame(10); + driver.set_steps_per_frame(400); driver.set_steps_per_stim(1); - let base = "minimal_torus-2"; + let base = "minimal_torus-4"; 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); @@ -40,7 +40,10 @@ fn main() { let boundary_xy = half_width - ferro_major - ferro_minor - buffer; let boundary_z = half_depth - wire_major - wire_minor - buffer; + let boundary_lower = Meters((boundary_xy, boundary_xy, boundary_z).into()); + let boundary_upper = Meters((width - boundary_xy, width - boundary_xy, depth - boundary_z).into()); println!("boundary: {}um; {}um", m_to_um(boundary_xy), m_to_um(boundary_z)); + let boundary_region = InvertedRegion::new(Cube::new(boundary_lower, boundary_upper)); driver.add_upml_boundary(Meters((boundary_xy, boundary_xy, boundary_z).into())); // J=\sigma E @@ -72,11 +75,17 @@ fn main() { driver.add_measurement(meas::CurrentLoop::new("sense", sense_region.clone())); driver.add_measurement(meas::Current::new("sense", sense_region.clone())); + driver.add_measurement(meas::Power::new("sense", sense_region.clone())); + + driver.add_measurement(meas::CurrentLoop::new("drive", drive_region.clone())); + driver.add_measurement(meas::Current::new("drive", drive_region.clone())); + driver.add_measurement(meas::Power::new("drive", drive_region.clone())); + driver.add_measurement(meas::MagneticLoop::new("mem", ferro_region.clone())); driver.add_measurement(meas::Magnetization::new("mem", ferro_region.clone())); driver.add_measurement(meas::MagneticFlux::new("mem", ferro_region.clone())); - driver.add_measurement(meas::CurrentLoop::new("drive", drive_region.clone())); - driver.add_measurement(meas::Current::new("drive", drive_region.clone())); + driver.add_measurement(meas::Power::new("mem", ferro_region.clone())); + driver.add_measurement(meas::Power::new("boundary", boundary_region.clone())); let prefix = format!("out/{}/{}-flt{}-{}-feat{}um-{}mA-{}ps--radii{}um-{}um-{}um-{}um", base, diff --git a/src/driver.rs b/src/driver.rs index 7867d6e..7a6efc6 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -50,7 +50,7 @@ impl Driver { Box::new(meas::Time), Box::new(meas::Meta), Box::new(meas::Energy), - Box::new(meas::Power), + Box::new(meas::Power::world()), ], stimuli: StimuliAdapter::new(), start_time: Instant::now(), @@ -234,7 +234,6 @@ impl> Driver { if depth_x > 0 || depth_y > 0 || depth_z > 0 { let scale = 0.5 * consts::EPS0 / self.state.timestep(); - // let scale = 1e3; let cond_x = if thickness.x() != 0 { scale * (depth_x as Flt/thickness.x() as Flt).powf(3.0) } else { diff --git a/src/geom/mod.rs b/src/geom/mod.rs index c203b55..dcef303 100644 --- a/src/geom/mod.rs +++ b/src/geom/mod.rs @@ -3,7 +3,7 @@ mod units; mod vec; mod vecu; -pub use region::{CylinderZ, Region, Sphere, Torus, WorldRegion}; +pub use region::{Cube, CylinderZ, InvertedRegion, Region, Sphere, Torus, WorldRegion}; pub use units::{Coord, Meters, Index}; pub use vec::{Vec2, Vec3}; pub use vecu::Vec3u; diff --git a/src/meas.rs b/src/meas.rs index 447b9fb..d6fb1d9 100644 --- a/src/meas.rs +++ b/src/meas.rs @@ -1,5 +1,5 @@ use crate::flt::Flt; -use crate::geom::{Meters, Region, Torus, Vec3}; +use crate::geom::{Meters, Region, Torus, Vec3, WorldRegion}; use crate::mat::Material as _; use crate::sim::{Cell, GenericSim}; use dyn_clone::{self, DynClone}; @@ -374,7 +374,22 @@ impl AbstractMeasurement for Energy { } #[derive(Clone, Serialize, Deserialize)] -pub struct Power; +pub struct Power { + name: String, + region: Box +} + +impl Power { + pub fn world() -> Self { + Self::new("World", WorldRegion) + } + pub fn new(name: &str, region: R) -> Self { + Self { + name: name.into(), + region: Box::new(region), + } + } +} #[typetag::serde] impl AbstractMeasurement for Power { @@ -386,6 +401,6 @@ impl AbstractMeasurement for Power { let power = dV * state.map_sum(|cell| { cell.current_density().dot(cell.e()) }); - format!("P: {:.2e}", power) + format!("P({}): {:.2e}", self.name, power) } }