app: stacked-cores: short-circuit sims that have already completed

this takes the per-sim time down from about 30s to 1s for completed
runs. allows much easier stopping + restarting of batched sims.
This commit is contained in:
2022-09-26 16:08:15 -07:00
parent 858c8f4db5
commit 638a97c106

View File

@@ -3906,23 +3906,6 @@ fn run_sim<const C: usize, const R: usize>(
// each col M denotes the drive current at core M.
let num_cycles = drive_map.len() as u32;
let num_cores = drive_map[0].len() as u32;
let mut core_drivers = vec![Vec::default(); num_cores as usize];
for (cycle, cores) in drive_map.into_iter().enumerate() {
for (core, clock) in cores.into_iter().enumerate() {
core_drivers[core as usize].extend(clock.time_stimulus(&params, cycle as u32));
}
}
let stim: Vec<_> = core_drivers.into_iter()
.enumerate()
.map(|(core, time_varying)| {
let region = params.ctl(core as u32);
let area = region.cross_section();
let amp = 1.0 / area;
let v_field = CurlVectorField::new(region.clone());
ModulatedVectorField::new(v_field, time_varying.scaled(amp.cast::<R>()))
})
.collect();
assert_eq!(stim.len(), num_cores as usize);
let ctl_mat = IsomorphicConductor::new(params.ctl_conductivity.cast::<R>());
@@ -3934,6 +3917,25 @@ fn run_sim<const C: usize, const R: usize>(
let mut driver = Driver::new(Sim::new(
sim_bounds(num_cores).to_index(feat_size), feat_size,
));
let duration = Seconds(params.clock_phase_duration * num_cycles as f32);
let snapshot_freq = 12800;
let duration_frames = duration.to_frame(driver.timestep()).round_up(snapshot_freq);
let prefix = format!("out/applications/stacked_cores/{}/", name);
let _ = std::fs::create_dir_all(&prefix);
driver.add_state_file(&*format!("{}state.bc", prefix), snapshot_freq);
if driver.steps_until(duration_frames) == 0 {
println!("sim already completed");
return; // all our work is done
}
driver.add_serializer_renderer(&*format!("{}frame-", prefix), 6400, Some(12800));
// driver.add_csv_renderer(&*format!("{}meas-detailed.csv", prefix), 100, None);
driver.add_csv_renderer(&*format!("{}meas.csv", prefix), 1600, None);
driver.add_csv_renderer(&*format!("{}meas-sparse.csv", prefix), 12800, None);
driver.set_steps_per_stimulus(200);
driver.add_classical_boundary(sim_padding);
//////// create the wires and toroids
@@ -4005,26 +4007,30 @@ fn run_sim<const C: usize, const R: usize>(
}
let duration = Seconds(params.clock_phase_duration * num_cycles as f32);
//////// add the stimuli
let mut core_drivers = vec![Vec::default(); num_cores as usize];
for (cycle, cores) in drive_map.into_iter().enumerate() {
for (core, clock) in cores.into_iter().enumerate() {
core_drivers[core as usize].extend(clock.time_stimulus(&params, cycle as u32));
}
}
let stim: Vec<_> = core_drivers.into_iter()
.enumerate()
.map(|(core, time_varying)| {
let region = params.ctl(core as u32);
let area = region.cross_section();
let amp = 1.0 / area;
let v_field = CurlVectorField::new(region.clone());
ModulatedVectorField::new(v_field, time_varying.scaled(amp.cast::<R>()))
})
.collect();
assert_eq!(stim.len(), num_cores as usize);
// let stim = DynStimuli::from_vec(stim.map(MapIntoBoxStimulus).into_vec());
let mut driver = driver.with_modulated_stimulus();
for s in stim {
driver.add_stimulus(s);
}
let prefix = format!("out/applications/stacked_cores/{}/", name);
let _ = std::fs::create_dir_all(&prefix);
driver.add_state_file(&*format!("{}state.bc", prefix), 12800);
driver.add_serializer_renderer(&*format!("{}frame-", prefix), 6400, Some(12800));
// driver.add_csv_renderer(&*format!("{}meas-detailed.csv", prefix), 100, None);
driver.add_csv_renderer(&*format!("{}meas.csv", prefix), 1600, None);
driver.add_csv_renderer(&*format!("{}meas-sparse.csv", prefix), 12800, None);
driver.set_steps_per_stimulus(200);
driver.step_until(
duration
.to_frame(driver.timestep())
.round_up(25600)
);
driver.step_until(duration_frames);
println!("sim complete");
}