63 lines
2.5 KiB
Rust
63 lines
2.5 KiB
Rust
use coremem::{Driver, mat, meas};
|
|
use coremem::geom::Point;
|
|
|
|
fn main() {
|
|
coremem::init_logging();
|
|
let width = 1200;
|
|
let feat_size = 1e-3; // feature size
|
|
let peak_current = 2.5e9;
|
|
let conductivity = 1.0e5;
|
|
let ferro_inner_rad = 60;
|
|
let ferro_outer_rad = 80;
|
|
let conductor_inner_rad = 20;
|
|
let conductor_outer_rad = 50;
|
|
let mut driver = Driver::new(width, width, feat_size);
|
|
//driver.set_steps_per_frame(8);
|
|
//driver.set_steps_per_frame(40);
|
|
driver.add_y4m_renderer("toroid2.y4m");
|
|
// driver.add_term_renderer();
|
|
driver.add_measurement(meas::Label(format!("Conductivity: {}, Imax: {:.2e}", conductivity, peak_current)));
|
|
driver.add_measurement(meas::Current(width / 2 + (conductor_inner_rad + conductor_outer_rad) / 2, width / 2));
|
|
driver.add_measurement(meas::Current(width / 2 + conductor_inner_rad + 2, width / 2));
|
|
driver.add_measurement(meas::Magnetization(width / 2 + ferro_inner_rad + 2, width / 2));
|
|
driver.add_measurement(meas::MagneticFlux(width / 2 + ferro_inner_rad + 2, width / 2));
|
|
driver.add_measurement(meas::MagneticStrength(width / 2 + ferro_inner_rad + 2, width / 2));
|
|
|
|
let center = Point::new((width/2) as _, (width/2) as _);
|
|
|
|
for y in 0..width {
|
|
for x in 0..width {
|
|
let d = Point::new(x as _, y as _) - center;
|
|
let r = d.mag();
|
|
if (conductor_inner_rad as _..conductor_outer_rad as _).contains(&r) {
|
|
*driver.state.get_mut(x, y).mat_mut() = mat::Static::conductor(conductivity).into();
|
|
} else if (ferro_inner_rad as _..ferro_outer_rad as _).contains(&r) {
|
|
*driver.state.get_mut(x, y).mat_mut() = mat::db::ferroxcube_3r1();
|
|
}
|
|
}
|
|
}
|
|
driver.add_boundary(width/2 - ferro_outer_rad - 200, 0.01);
|
|
|
|
loop {
|
|
let drive_current = peak_current * match driver.state.step_no() {
|
|
0..=1000 => 1.0,
|
|
3000..=4000 => -1.0,
|
|
_ => 0.0,
|
|
};
|
|
// E = V/M
|
|
//let e = v/(2.0*feat_size);
|
|
let e = drive_current/conductivity;
|
|
for y in 0..width {
|
|
for x in 0..width {
|
|
let d = Point::new(x as _, y as _) - center;
|
|
if (conductor_inner_rad as _..conductor_outer_rad as _).contains(&d.mag()) {
|
|
let tangent = Point::new(-d.y(), d.x()).with_mag(e);
|
|
driver.state.impulse_ex(x, y, tangent.x());
|
|
driver.state.impulse_ey(x, y, tangent.y());
|
|
}
|
|
}
|
|
}
|
|
driver.step();
|
|
}
|
|
}
|