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(); } }