Parameterize Vec3 over Real type. BROKEN TESTS

sim::pml_boundary_conditions_{x,y,z} are broken, among others.
Unsure if this is new. I don't see an obvious cause yet.
This commit is contained in:
2021-06-07 14:23:07 -07:00
parent 84a92ad572
commit 9f6d92c5fc
16 changed files with 548 additions and 402 deletions

View File

@@ -1,6 +1,7 @@
use crate::geom::{Index, Meters, Vec2, Vec3, Vec3u};
use crate::{Material as _, MaterialExt as _};
use crate::mat;
use crate::real::{Real as _, ToFloat as _};
use crate::sim::{Cell, GenericSim, StaticSim};
use crate::meas::AbstractMeasurement;
use crossterm::{cursor, QueueableCommand as _};
@@ -152,7 +153,7 @@ impl<'a, S: GenericSim> RenderSteps<'a, S> {
trace!("rendering at {}x{} with z={}", width, height, z);
let mut me = Self::new(state, measurements, width, height, z);
me.render_scalar_field(10.0, false, 2, |cell| {
cell.mat().conductivity().mag() as f32 + if cell.mat().is_vacuum() {
cell.mat().conductivity().mag().to_f32() + if cell.mat().is_vacuum() {
0.0
} else {
5.0
@@ -193,12 +194,12 @@ impl<'a, S: GenericSim> RenderSteps<'a, S> {
let y_prop = y_px as f32 / self.im.height() as f32;
let y_m = y_prop * (self.sim.height() as f32 * self.sim.feature_size() as f32);
let z_m = self.z as f32 * self.sim.feature_size() as f32;
self.sim.sample(Meters(Vec3::new(x_m as _, y_m as _, z_m as _)))
self.sim.sample(Meters(Vec3::new(x_m, y_m, z_m)))
}
////////////// Ex/Ey/Bz configuration ////////////
fn render_b_z_field(&mut self, scale: f32) {
self.render_scalar_field(1.0e-4 * scale, true, 1, |cell| cell.b().z() as f32);
self.render_scalar_field(1.0e-4 * scale, true, 1, |cell| cell.b().z().to_f32());
}
fn render_e_xy_field(&mut self, scale: f32) {
self.render_vector_field(Rgb([0xff, 0xff, 0xff]), 100.0 * scale, |cell| cell.e().xy().to_f32());
@@ -209,24 +210,24 @@ impl<'a, S: GenericSim> RenderSteps<'a, S> {
}
////////////// Magnitude configuration /////////////
fn render_b(&mut self, scale: f32) {
self.render_scalar_field(1.0e-3 * scale, false, 1, |cell| cell.b().mag() as f32);
self.render_scalar_field(1.0e-3 * scale, false, 1, |cell| cell.b().mag().to_f32());
}
fn render_current(&mut self, scale: f32) {
self.render_scalar_field(1.0e1 * scale, false, 0, |cell| {
cell.e().elem_mul(cell.mat().conductivity()).mag() as f32
cell.e().elem_mul(cell.mat().conductivity()).mag().to_f32()
});
}
////////////// Bx/By/Ez configuration ////////////
fn render_e_z_field(&mut self, scale: f32) {
self.render_scalar_field(1e4 * scale, true, 1, |cell| cell.e().z() as f32);
self.render_scalar_field(1e4 * scale, true, 1, |cell| cell.e().z().to_f32());
}
fn render_b_xy_field(&mut self, scale: f32) {
self.render_vector_field(Rgb([0xff, 0xff, 0xff]), 1.0e-9 * scale, |cell| cell.b().xy().to_f32());
}
fn render_m(&mut self, scale: f32) {
self.render_scalar_field(1.0e5 * scale, false, 1, |cell| cell.mat().m().mag() as f32);
self.render_scalar_field(1.0e5 * scale, false, 1, |cell| cell.mat().m().mag().to_f32());
self.render_vector_field(Rgb([0xff, 0xff, 0xff]), 1.0e5 * scale, |cell| cell.mat().m().xy().to_f32());
}
@@ -558,7 +559,7 @@ impl<S: GenericSim> Renderer<S> for PlotlyRenderer {
yv.push(y);
zv.push(z);
// opacities.push((cell.e().mag() * 0.1).min(1.0) as f64)
let mat = cell.mat().conductivity().mag() + if cell.mat().is_vacuum() {
let mat = cell.mat().conductivity().mag().to_f32() + if cell.mat().is_vacuum() {
0.0
} else {
5.0
@@ -566,9 +567,9 @@ impl<S: GenericSim> Renderer<S> for PlotlyRenderer {
//let g = scale_unsigned_to_u8(mat, 10.0);
//let r = scale_unsigned_to_u8(cell.mat().m().mag(), 100.0);
//let b = scale_unsigned_to_u8(cell.e().mag(), 1e2);
let r = scale_unsigned_to_u8(cell.mat().m().mag() as f32, 100.0);
let g = scale_unsigned_to_u8(cell.e().mag() as f32, 1e2);
let b = scale_unsigned_to_u8(mat as f32, 10.0);
let r = scale_unsigned_to_u8(cell.mat().m().mag().to_f32(), 100.0);
let g = scale_unsigned_to_u8(cell.e().mag().to_f32(), 1e2);
let b = scale_unsigned_to_u8(mat, 10.0);
let alpha = 1.0;
colors.push(Rgba::new(r, g, b, alpha));
}
@@ -666,6 +667,7 @@ impl<S: GenericSim + Clone + Serialize> Renderer<S> for SerializerRenderer {
}
fn render(&self, state: &S, measurements: &[Box<dyn AbstractMeasurement>], _config: RenderConfig) {
let frame = SerializedFrame {
// N.B.: `to_static` isn't 100% necessary here, but it tends to result in a smaller file.
state: state.to_static(),
measurements: measurements.iter().cloned().collect(),
};