Add power measurements to the minimal_torus
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
use coremem::{Driver, Flt, mat, meas};
|
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 _};
|
use coremem::stim::{CurlStimulus, Sinusoid1, TimeVarying1 as _};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
coremem::init_logging();
|
coremem::init_logging();
|
||||||
let feat_size = 10e-6; // feature size
|
let feat_size = 10e-6; // feature size
|
||||||
let duration = 3e-11;
|
let duration = 6e-9;
|
||||||
let width = 2200e-6;
|
let width = 2200e-6;
|
||||||
let depth = 1800e-6;
|
let depth = 1800e-6;
|
||||||
let buffer = 200e-6;
|
let buffer = 200e-6;
|
||||||
@@ -27,9 +27,9 @@ fn main() {
|
|||||||
let depth_px = from_m(depth);
|
let depth_px = from_m(depth);
|
||||||
let size_px = Index((width_px, width_px, depth_px).into());
|
let size_px = Index((width_px, width_px, depth_px).into());
|
||||||
let mut driver: Driver<mat::GenericMaterial> = Driver::new(size_px, feat_size);
|
let mut driver: Driver<mat::GenericMaterial> = Driver::new(size_px, feat_size);
|
||||||
driver.set_steps_per_frame(10);
|
driver.set_steps_per_frame(400);
|
||||||
driver.set_steps_per_stim(1);
|
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 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 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);
|
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_xy = half_width - ferro_major - ferro_minor - buffer;
|
||||||
let boundary_z = half_depth - wire_major - wire_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));
|
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()));
|
driver.add_upml_boundary(Meters((boundary_xy, boundary_xy, boundary_z).into()));
|
||||||
|
|
||||||
// J=\sigma E
|
// J=\sigma E
|
||||||
@@ -72,11 +75,17 @@ fn main() {
|
|||||||
|
|
||||||
driver.add_measurement(meas::CurrentLoop::new("sense", sense_region.clone()));
|
driver.add_measurement(meas::CurrentLoop::new("sense", sense_region.clone()));
|
||||||
driver.add_measurement(meas::Current::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::MagneticLoop::new("mem", ferro_region.clone()));
|
||||||
driver.add_measurement(meas::Magnetization::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::MagneticFlux::new("mem", ferro_region.clone()));
|
||||||
driver.add_measurement(meas::CurrentLoop::new("drive", drive_region.clone()));
|
driver.add_measurement(meas::Power::new("mem", ferro_region.clone()));
|
||||||
driver.add_measurement(meas::Current::new("drive", drive_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",
|
let prefix = format!("out/{}/{}-flt{}-{}-feat{}um-{}mA-{}ps--radii{}um-{}um-{}um-{}um",
|
||||||
base,
|
base,
|
||||||
|
@@ -50,7 +50,7 @@ impl<M: Default> Driver<M> {
|
|||||||
Box::new(meas::Time),
|
Box::new(meas::Time),
|
||||||
Box::new(meas::Meta),
|
Box::new(meas::Meta),
|
||||||
Box::new(meas::Energy),
|
Box::new(meas::Energy),
|
||||||
Box::new(meas::Power),
|
Box::new(meas::Power::world()),
|
||||||
],
|
],
|
||||||
stimuli: StimuliAdapter::new(),
|
stimuli: StimuliAdapter::new(),
|
||||||
start_time: Instant::now(),
|
start_time: Instant::now(),
|
||||||
@@ -234,7 +234,6 @@ impl<M: Material + From<mat::Conductor>> Driver<M> {
|
|||||||
|
|
||||||
if depth_x > 0 || depth_y > 0 || depth_z > 0 {
|
if depth_x > 0 || depth_y > 0 || depth_z > 0 {
|
||||||
let scale = 0.5 * consts::EPS0 / self.state.timestep();
|
let scale = 0.5 * consts::EPS0 / self.state.timestep();
|
||||||
// let scale = 1e3;
|
|
||||||
let cond_x = if thickness.x() != 0 {
|
let cond_x = if thickness.x() != 0 {
|
||||||
scale * (depth_x as Flt/thickness.x() as Flt).powf(3.0)
|
scale * (depth_x as Flt/thickness.x() as Flt).powf(3.0)
|
||||||
} else {
|
} else {
|
||||||
|
@@ -3,7 +3,7 @@ mod units;
|
|||||||
mod vec;
|
mod vec;
|
||||||
mod vecu;
|
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 units::{Coord, Meters, Index};
|
||||||
pub use vec::{Vec2, Vec3};
|
pub use vec::{Vec2, Vec3};
|
||||||
pub use vecu::Vec3u;
|
pub use vecu::Vec3u;
|
||||||
|
21
src/meas.rs
21
src/meas.rs
@@ -1,5 +1,5 @@
|
|||||||
use crate::flt::Flt;
|
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::mat::Material as _;
|
||||||
use crate::sim::{Cell, GenericSim};
|
use crate::sim::{Cell, GenericSim};
|
||||||
use dyn_clone::{self, DynClone};
|
use dyn_clone::{self, DynClone};
|
||||||
@@ -374,7 +374,22 @@ impl AbstractMeasurement for Energy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Serialize, Deserialize)]
|
#[derive(Clone, Serialize, Deserialize)]
|
||||||
pub struct Power;
|
pub struct Power {
|
||||||
|
name: String,
|
||||||
|
region: Box<dyn Region>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Power {
|
||||||
|
pub fn world() -> Self {
|
||||||
|
Self::new("World", WorldRegion)
|
||||||
|
}
|
||||||
|
pub fn new<R: Region + 'static>(name: &str, region: R) -> Self {
|
||||||
|
Self {
|
||||||
|
name: name.into(),
|
||||||
|
region: Box::new(region),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[typetag::serde]
|
#[typetag::serde]
|
||||||
impl AbstractMeasurement for Power {
|
impl AbstractMeasurement for Power {
|
||||||
@@ -386,6 +401,6 @@ impl AbstractMeasurement for Power {
|
|||||||
let power = dV * state.map_sum(|cell| {
|
let power = dV * state.map_sum(|cell| {
|
||||||
cell.current_density().dot(cell.e())
|
cell.current_density().dot(cell.e())
|
||||||
});
|
});
|
||||||
format!("P: {:.2e}", power)
|
format!("P({}): {:.2e}", self.name, power)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user