dess_examples/tests/
euler_three_thrml_mass_w_bc_sys.rs1use crate::imports::*;
2use crate::three_thrml_mass_w_bc_sys::System3TMWithBC;
3use eng_fmt::FormatEng;
4pub fn baseline_euler_sys() -> System3TMWithBC {
6 let t_report: Vec<f64> = Vec::linspace(0.0, 1.0, 4);
7
8 System3TMWithBC {
9 solver_type: SolverTypes::EulerFixed { dt: 5e-10 },
10 t_report,
11 ..Default::default()
12 }
13}
14pub fn baseline_three_tm_w_bc_sys(overwrite_baseline: bool) {
15 if overwrite_baseline {
16 let mut sys_euler = baseline_euler_sys();
17
18 let t_euler = time_it!(sys_euler.walk());
19
20 let dt = sys_euler.t_report[1] - sys_euler.t_report.first().unwrap();
21
22 println!(
23 "Euler {} s time step elapsed time: {} μs",
24 dt,
25 t_euler.as_micros()
26 );
27 let baseline_file = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap())
28 .parent()
29 .unwrap()
30 .to_path_buf()
31 .join("dess-examples/src/tests/fixtures/euler_w_bc_baseline.yaml");
32
33 sys_euler
34 .to_file(baseline_file.as_os_str().to_str().unwrap())
35 .unwrap();
36 }
37}
38pub fn mock_method_w_bc_sys(method: SolverTypes) -> System3TMWithBC {
40 let t_report: Vec<f64> = Vec::linspace(0.0, 1.0, 4);
41
42 System3TMWithBC {
43 solver_type: method,
44 t_report,
45 ..Default::default()
46 }
47}
48pub fn test_method_against_euler_baseline_bc(method: SolverTypes, epsilon: f64) {
50 let mut sys = mock_method_w_bc_sys(method);
51 sys.walk();
52 let baseline_file = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap())
54 .parent()
55 .unwrap()
56 .to_path_buf()
57 .join("dess-examples/src/tests/fixtures/euler_w_bc_baseline.yaml");
58 let baseline_sys =
59 System3TMWithBC::from_file(baseline_file.as_os_str().to_str().unwrap()).unwrap();
60 let baseline_m1 = baseline_sys.m1.history.temp;
62 let baseline_m2 = baseline_sys.m2.history.temp;
63 let baseline_m3 = baseline_sys.m3.history.temp;
64 let method_m1 = sys.m1.history.temp;
66 let method_m2 = sys.m2.history.temp;
67 let method_m3 = sys.m3.history.temp;
68 let m1: Vec<(&f64, &f64)> = baseline_m1.iter().zip(&method_m1).collect();
70 let m2: Vec<(&f64, &f64)> = baseline_m2.iter().zip(&method_m2).collect();
71 let m3: Vec<(&f64, &f64)> = baseline_m3.iter().zip(&method_m3).collect();
72 let m1_within_epsilon = crate::tests::tests_core::within_epsilon(m1, epsilon);
73 println!(
74 "Stays within {} of three thermal mass w bc m1 solution: {}",
75 epsilon.format_eng(Some(2)),
76 m1_within_epsilon
77 );
78 let m2_within_epsilon = crate::tests::tests_core::within_epsilon(m2, epsilon);
79 println!(
80 "Stays within {} of three thermal mass w bc m2 solution: {}",
81 epsilon.format_eng(Some(2)),
82 m2_within_epsilon
83 );
84 let m3_within_epsilon = crate::tests::tests_core::within_epsilon(m3, epsilon);
85 println!(
86 "Stays within {} of three thermal mass w bc m3 solution: {}",
87 epsilon.format_eng(Some(2)),
88 m3_within_epsilon
89 );
90 let m1_1: Vec<(&f64, &f64)> = baseline_m1.iter().zip(&method_m1).collect();
91 let m2_1: Vec<(&f64, &f64)> = baseline_m2.iter().zip(&method_m2).collect();
92 let m3_1: Vec<(&f64, &f64)> = baseline_m3.iter().zip(&method_m3).collect();
93 let m1_mean_absolute_error = crate::tests::tests_core::average_distance(m1_1);
94 println!(
95 "Mean absolute error of m1 solution: {}",
96 m1_mean_absolute_error.format_eng(Some(10))
97 );
98 let m2_mean_absolute_error = crate::tests::tests_core::average_distance(m2_1);
99 println!(
100 "Mean absolute error of m2 solution: {}",
101 m2_mean_absolute_error.format_eng(Some(10))
102 );
103 let m3_mean_absolute_error = crate::tests::tests_core::average_distance(m3_1);
104 println!(
105 "Mean absolute error of m3 solution: {}",
106 m3_mean_absolute_error.format_eng(Some(10))
107 )
108}