Optimize GenericMaterial layout
Shaving off 2 floats, i.e. 16 bytes. Brings a 3-4% overall perf increase. Should be possible to shave another 16 bytes.
This commit is contained in:
@@ -100,7 +100,7 @@ fn main() {
|
|||||||
let d = Vec2::new(to_m(x_px), to_m(y_px)) - center;
|
let d = Vec2::new(to_m(x_px), to_m(y_px)) - center;
|
||||||
let r = d.mag();
|
let r = d.mag();
|
||||||
if (conductor_inner_rad as _..conductor_outer_rad as _).contains(&r) {
|
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) {
|
} else if (ferro_inner_rad as _..ferro_outer_rad as _).contains(&r) {
|
||||||
let half_depth_px = from_m(half_depth);
|
let half_depth_px = from_m(half_depth);
|
||||||
let ferro_depth_px = from_m(ferro_depth);
|
let ferro_depth_px = from_m(ferro_depth);
|
||||||
|
@@ -28,14 +28,14 @@ fn main() {
|
|||||||
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::new(size_px, feat_size);
|
let mut driver = Driver::new(size_px, feat_size);
|
||||||
driver.set_steps_per_frame(1000);
|
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 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);
|
||||||
|
|
||||||
driver.fill_region(&ferro_region, mat::db::ferroxcube_3r1());
|
driver.fill_region(&ferro_region, mat::db::ferroxcube_3r1());
|
||||||
driver.fill_region(&drive_region, mat::Static::conductor(conductivity).into());
|
driver.fill_region(&drive_region, mat::db::conductor(conductivity).into());
|
||||||
driver.fill_region(&sense_region, mat::Static::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_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;
|
||||||
|
@@ -181,7 +181,7 @@ impl<M: Material + Clone + Default + Send + Sync + 'static> Driver<M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M: Material + From<mat::Static>> Driver<M> {
|
impl<M: Material + From<mat::Conductor>> Driver<M> {
|
||||||
// pub fn add_boundary(&mut self, thickness: u32, base_conductivity: Flt) {
|
// pub fn add_boundary(&mut self, thickness: u32, base_conductivity: Flt) {
|
||||||
// for inset in 0..thickness {
|
// for inset in 0..thickness {
|
||||||
// let depth = thickness - inset;
|
// let depth = thickness - inset;
|
||||||
@@ -252,7 +252,7 @@ impl<M: Material + From<mat::Static>> Driver<M> {
|
|||||||
};
|
};
|
||||||
let cond = Vec3::new(cond_x, cond_y, cond_z);
|
let cond = Vec3::new(cond_x, cond_y, cond_z);
|
||||||
// trace!("cond: {:?}", cond);
|
// 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();
|
*self.state.get_mut(Index(Vec3u::new(x, y, z))).mat_mut() = conductor.into();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
53
src/mat.rs
53
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)]
|
#[derive(Clone, Default, Serialize, Deserialize)]
|
||||||
pub struct Static {
|
pub struct Static {
|
||||||
pub conductivity: Vec3,
|
pub conductivity: Vec3,
|
||||||
pub m: 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 {
|
impl Material for Static {
|
||||||
fn conductivity(&self) -> Vec3 {
|
fn conductivity(&self) -> Vec3 {
|
||||||
self.conductivity
|
self.conductivity
|
||||||
@@ -162,7 +175,7 @@ impl MHCurve {
|
|||||||
pub struct PiecewiseLinearFerromagnet {
|
pub struct PiecewiseLinearFerromagnet {
|
||||||
/// Instantaneous magnetization in the z direction.
|
/// Instantaneous magnetization in the z direction.
|
||||||
pub m: Vec3,
|
pub m: Vec3,
|
||||||
pub conductivity: Vec3,
|
pub conductivity: Flt,
|
||||||
mh_curve: &'static MHCurve,
|
mh_curve: &'static MHCurve,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +197,7 @@ impl Material for PiecewiseLinearFerromagnet {
|
|||||||
self.m
|
self.m
|
||||||
}
|
}
|
||||||
fn conductivity(&self) -> Vec3 {
|
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 {
|
fn step_h(&mut self, context: &CellState, delta_b: Vec3) -> Vec3 {
|
||||||
trace!("step_h enter");
|
trace!("step_h enter");
|
||||||
@@ -206,20 +219,26 @@ impl Material for PiecewiseLinearFerromagnet {
|
|||||||
#[enum_dispatch(Material)]
|
#[enum_dispatch(Material)]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum GenericMaterial {
|
pub enum GenericMaterial {
|
||||||
Static(Static),
|
Conductor(Conductor),
|
||||||
// ComsolFerromagnet(ComsolFerromagnet),
|
// ComsolFerromagnet(ComsolFerromagnet),
|
||||||
PiecewiseLinearFerromagnet(PiecewiseLinearFerromagnet)
|
PiecewiseLinearFerromagnet(PiecewiseLinearFerromagnet)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for GenericMaterial {
|
impl Default for GenericMaterial {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Static::default().into()
|
Conductor::default().into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Database of common materials
|
/// Database of common materials
|
||||||
pub mod db {
|
pub mod db {
|
||||||
use super::*;
|
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
|
/// https://www.ferroxcube.com/upload/media/product/file/MDS/3r1.pdf
|
||||||
pub fn ferroxcube_3r1() -> GenericMaterial {
|
pub fn ferroxcube_3r1() -> GenericMaterial {
|
||||||
ferroxcube_3r1_concrete().into()
|
ferroxcube_3r1_concrete().into()
|
||||||
@@ -243,7 +262,7 @@ pub mod db {
|
|||||||
}
|
}
|
||||||
pub fn ferroxcube_3r1_concrete() -> PiecewiseLinearFerromagnet {
|
pub fn ferroxcube_3r1_concrete() -> PiecewiseLinearFerromagnet {
|
||||||
let mut m = PiecewiseLinearFerromagnet::new(ferroxcube_3r1_curve());
|
let mut m = PiecewiseLinearFerromagnet::new(ferroxcube_3r1_curve());
|
||||||
m.conductivity = Vec3::unit() * 1e-3;
|
m.conductivity = 1e-3;
|
||||||
m
|
m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user