app: multi-core-inverter: allow setting coupling and drive conductivities separately

This commit is contained in:
2022-08-25 15:37:06 -07:00
parent 6afa65c3e4
commit f80b2e22a4

View File

@@ -100,7 +100,8 @@ struct Params {
input_magnitude: f32,
clock_phase_duration: f32,
clock_decay: f32, // exp decay half-life
conductivity: f32, // wire conductivity
ctl_conductivity: f32,
coupling_conductivity: f32,
// 's' = core (ferromagnetic part)
s_major: f32,
s_minor: f32,
@@ -179,8 +180,12 @@ impl Params {
self.clock_decay = p;
self
}
fn with_conductivity(mut self, p: f32) -> Self {
self.conductivity = p;
fn with_ctl_conductivity(mut self, p: f32) -> Self {
self.ctl_conductivity = p;
self
}
fn with_coupling_conductivity(mut self, p: f32) -> Self {
self.coupling_conductivity = p;
self
}
}
@@ -278,7 +283,8 @@ fn main() {
input_magnitude: 0.0,
clock_phase_duration: 0.0,
clock_decay: 0.0,
conductivity: 0.0,
ctl_conductivity: 0.0,
coupling_conductivity: 0.0,
// 's' = core (ferromagnetic part)
s_major: um(160),
s_minor: um(30),
@@ -301,7 +307,8 @@ fn main() {
.with_clock_phase_duration(ps(160000))
.with_clock_decay(ps(12000))
.with_input_magnitude(2.0e7)
.with_conductivity(1e6)
.with_ctl_conductivity(1e6)
.with_coupling_conductivity(1e6)
);
run_sim(
"33-160ns-12000ps-1e7A",
@@ -310,7 +317,8 @@ fn main() {
.with_clock_phase_duration(ps(160000))
.with_clock_decay(ps(12000))
.with_input_magnitude(1.0e7)
.with_conductivity(1e6)
.with_ctl_conductivity(1e6)
.with_coupling_conductivity(1e6)
);
run_sim(
"34-320ns-12000ps-1e7A",
@@ -319,7 +327,8 @@ fn main() {
.with_clock_phase_duration(ps(320000))
.with_clock_decay(ps(12000))
.with_input_magnitude(1.0e7)
.with_conductivity(1e6)
.with_ctl_conductivity(1e6)
.with_coupling_conductivity(1e6)
);
let deferred = || run_sim(
"35-320ns-24000ps-1e7A",
@@ -328,7 +337,8 @@ fn main() {
.with_clock_phase_duration(ps(320000))
.with_clock_decay(ps(24000))
.with_input_magnitude(1.0e7)
.with_conductivity(1e6)
.with_ctl_conductivity(1e6)
.with_coupling_conductivity(1e6)
);
run_sim(
"36-40ns-4000ps-1e7A-1e5cond",
@@ -337,7 +347,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(1.0e7)
.with_conductivity(1e5)
.with_ctl_conductivity(1e5)
.with_coupling_conductivity(1e5)
);
run_sim(
"37-40ns-4000ps-5e8A-1e5cond",
@@ -346,7 +357,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(5e8)
.with_conductivity(1e5)
.with_ctl_conductivity(1e5)
.with_coupling_conductivity(1e5)
);
run_sim(
"38-40ns-4000ps-2e8A-1e5cond",
@@ -355,7 +367,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(2e8)
.with_conductivity(1e5)
.with_ctl_conductivity(1e5)
.with_coupling_conductivity(1e5)
);
run_sim(
"39-40ns-4000ps-2e9A-1e4cond",
@@ -364,7 +377,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(2e9)
.with_conductivity(1e4)
.with_ctl_conductivity(1e4)
.with_coupling_conductivity(1e4)
);
run_sim(
"40-40ns-4000ps-2e10A-1e3cond",
@@ -373,7 +387,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(2e10)
.with_conductivity(1e3)
.with_ctl_conductivity(1e3)
.with_coupling_conductivity(1e3)
);
run_sim(
"41-40ns-4000ps-2e6A-1e7cond",
@@ -382,7 +397,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(2e6)
.with_conductivity(1e7)
.with_ctl_conductivity(1e7)
.with_coupling_conductivity(1e7)
);
run_sim(
"42-40ns-4000ps-2e5A-1e8cond",
@@ -391,7 +407,8 @@ fn main() {
.with_clock_phase_duration(ps(40000))
.with_clock_decay(ps(4000))
.with_input_magnitude(2e5)
.with_conductivity(1e8)
.with_ctl_conductivity(1e8)
.with_coupling_conductivity(1e8)
);
deferred();
@@ -431,8 +448,8 @@ fn run_sim<const C: usize, const R: usize>(
assert_eq!(stim.len(), num_cores as usize);
let wire_mat = IsomorphicConductor::new(params.conductivity.cast::<R>());
// let ferro_mat = wire_mat;
let ctl_mat = IsomorphicConductor::new(params.ctl_conductivity.cast::<R>());
let coupling_mat = IsomorphicConductor::new(params.coupling_conductivity.cast::<R>());
let ferro_mat = Ferroxcube3R1MH::new();
let last_core = num_cores - 1;
@@ -443,13 +460,13 @@ fn run_sim<const C: usize, const R: usize>(
driver.add_classical_boundary(sim_padding);
//////// create the wires and toroids
driver.fill_region(&params.input0(), wire_mat);
driver.fill_region(&params.sense(last_core), wire_mat);
driver.fill_region(&params.input0(), coupling_mat);
driver.fill_region(&params.sense(last_core), coupling_mat);
for core in 0..num_cores {
driver.fill_region(&params.s(core), ferro_mat);
driver.fill_region(&params.ctl(core), wire_mat);
driver.fill_region(&params.ctl(core), ctl_mat);
if core != last_core {
driver.fill_region(&params.coupling(core), wire_mat);
driver.fill_region(&params.coupling(core), coupling_mat);
}
}