use crate::imports::*;
use crate::three_thermal_mass_sys::System3TM;
use dess::solver::SolverTypes;
use eng_fmt::FormatEng;
pub fn baseline_euler_sys() -> System3TM {
let t_report: Vec<f64> = Vec::linspace(0.0, 1.0, 4);
System3TM {
solver_type: SolverTypes::EulerFixed { dt: 5e-10 },
t_report,
..Default::default()
}
}
pub fn baseline_three_tm_sys(overwrite_baseline: bool) {
if overwrite_baseline {
let mut sys_euler = baseline_euler_sys();
let t_euler = time_it!(sys_euler.walk());
let dt = sys_euler.t_report[1] - sys_euler.t_report.first().unwrap();
println!(
"Euler {} s time step elapsed time: {} μs",
dt,
t_euler.as_micros()
);
let baseline_file = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap())
.parent()
.unwrap()
.to_path_buf()
.join("dess-examples/src/tests/fixtures/euler_baseline.yaml");
sys_euler
.to_file(baseline_file.as_os_str().to_str().unwrap())
.unwrap();
}
}
pub fn mock_method_sys(method: SolverTypes) -> System3TM {
let t_report: Vec<f64> = Vec::linspace(0.0, 1.0, 4);
System3TM {
solver_type: method,
t_report,
..Default::default()
}
}
pub fn test_method_against_euler_baseline(method: SolverTypes, epsilon: f64) {
let mut sys = mock_method_sys(method);
sys.walk();
let baseline_file = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap())
.parent()
.unwrap()
.to_path_buf()
.join("dess-examples/src/tests/fixtures/euler_baseline.yaml");
let baseline_sys = System3TM::from_file(baseline_file.as_os_str().to_str().unwrap()).unwrap();
let baseline_m1 = baseline_sys.m1.history.temp;
let baseline_m2 = baseline_sys.m2.history.temp;
let baseline_m3 = baseline_sys.m3.history.temp;
let method_m1 = sys.m1.history.temp;
let method_m2 = sys.m2.history.temp;
let method_m3 = sys.m3.history.temp;
let m1: Vec<(&f64, &f64)> = baseline_m1.iter().zip(&method_m1).collect();
let m2: Vec<(&f64, &f64)> = baseline_m2.iter().zip(&method_m2).collect();
let m3: Vec<(&f64, &f64)> = baseline_m3.iter().zip(&method_m3).collect();
let m1_within_epsilon = crate::tests::tests_core::within_epsilon(m1, epsilon);
println!(
"Stays within {} of m1 solution: {}",
epsilon.format_eng(Some(2)),
m1_within_epsilon
);
let m2_within_epsilon = crate::tests::tests_core::within_epsilon(m2, epsilon);
println!(
"Stays within {} of m2 solution: {}",
epsilon.format_eng(Some(2)),
m2_within_epsilon
);
let m3_within_epsilon = crate::tests::tests_core::within_epsilon(m3, epsilon);
println!(
"Stays within {} of m3 solution: {}",
epsilon.format_eng(Some(2)),
m3_within_epsilon
);
let m1_1: Vec<(&f64, &f64)> = baseline_m1.iter().zip(&method_m1).collect();
let m2_1: Vec<(&f64, &f64)> = baseline_m2.iter().zip(&method_m2).collect();
let m3_1: Vec<(&f64, &f64)> = baseline_m3.iter().zip(&method_m3).collect();
let m1_mean_absolute_error = crate::tests::tests_core::average_distance(m1_1);
println!(
"Mean absolute error of m1 solution: {}",
m1_mean_absolute_error.format_eng(Some(10))
);
let m2_mean_absolute_error = crate::tests::tests_core::average_distance(m2_1);
println!(
"Mean absolute error of m2 solution: {}",
m2_mean_absolute_error.format_eng(Some(10))
);
let m3_mean_absolute_error = crate::tests::tests_core::average_distance(m3_1);
println!(
"Mean absolute error of m3 solution: {}",
m3_mean_absolute_error.format_eng(Some(10))
)
}