Files
fdtd-coremem/examples/em_reflection.rs
2020-09-04 16:49:24 -07:00

49 lines
1.8 KiB
Rust

use coremem::{mat, SimState};
use coremem::render::{self, Renderer as _};
use std::{thread, time};
fn main() {
let width = 201;
let mut state = SimState::new(width, 101, 1e-3 /* feature size */);
for inset in 0..20 {
for x in 0..width {
*state.get_mut(x, inset).mat_mut() = mat::Conductor { conductivity: 0.1*(20.0 - inset as f64) }.into();
}
for y in 0..100 {
*state.get_mut(inset, y).mat_mut() = mat::Conductor { conductivity: 0.1*(20.0 - inset as f64) }.into();
*state.get_mut(width-1 - inset, y).mat_mut() = mat::Conductor { conductivity: 0.1*(20.0 - inset as f64) }.into();
}
}
for y in 75..100 {
for x in 0..width {
// from https://www.thoughtco.com/table-of-electrical-resistivity-conductivity-608499
// NB: different sources give pretty different values for this
// NB: Simulation misbehaves for values > 10... Proably this model isn't so great.
// Maybe use \eps or \xi instead of conductivity.
*state.get_mut(x, y).mat_mut() = mat::Conductor { conductivity: 2.17 }.into();
}
}
let mut step = 0u64;
let mut renderer = render::Y4MRenderer::new("test.y4m");
loop {
step += 1;
let imp = if step < 50 {
250000.0 * ((step as f64)*0.04*std::f64::consts::PI).sin()
} else {
0.0
};
// state.impulse_ex(50, 50, imp);
// state.impulse_ey(50, 50, imp);
// state.impulse_bz(20, 20, (imp / 3.0e8) as _);
// state.impulse_bz(80, 20, (imp / 3.0e8) as _);
for x in 0..width {
state.impulse_bz(x, 20, (imp / 3.0e8) as _);
}
renderer.render(&state);
state.step();
thread::sleep(time::Duration::from_millis(67));
}
}