dess_examples/tests/
euler_three_thrml_mass_w_bc_sys.rs

1use crate::imports::*;
2use crate::three_thrml_mass_w_bc_sys::System3TMWithBC;
3use eng_fmt::FormatEng;
4/// building and running small step (high accuracy) euler method for system3TM comparison
5pub 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}
38/// three thermal mass w bc with chosen method, to compare to small step euler
39pub 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}
48/// tests chosen solver (including dt) against small step euler
49pub 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    // taking baseline
53    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    // temperatures for m1, m2, m3 with small step euler
61    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    // temperatures for m1, m2, m3 with chosen method
65    let method_m1 = sys.m1.history.temp;
66    let method_m2 = sys.m2.history.temp;
67    let method_m3 = sys.m3.history.temp;
68    // creating vectors made up of pairs, with first one in pair being baseline_m_ and second one being method_m_
69    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}