1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
mod calculation_step;
pub mod helper_equation_traits;
mod integrators;
pub mod quadrature;
pub mod range_generator;
pub use calculation_step::CalculationStep;
mod calculation_result;
pub use calculation_result::CalculationResult;
mod utils;

use fehler::throws;

use crate::errors::Error;

#[throws]
pub fn calculate_single_integral<Q: quadrature::QuadratureSingleIntegral>(
    quadrature: Q,
    first_integral_begin: f64,
    first_integral_end: f64,
) -> f64 {
    let result = integrators::Integrator::integrate::<Q, Q>(
        first_integral_begin,
        first_integral_end,
        quadrature.get_step_size(),
        quadrature.clone(),
        quadrature,
    )?;

    result
}

#[throws]
pub fn calculate_double_integral<Q: quadrature::QuadratureDoubleIntegral>(
    quadrature: Q,
    first_integral_begin: f64,
    first_integral_end: f64,
    second_integral_begin: &str,
    second_integral_end: &str,
) -> f64 {
    let second_integrator = integrators::SecondIntegrator::<Q, Q>::new(
        second_integral_begin,
        second_integral_end,
        quadrature.get_step_size().1,
        quadrature.clone(),
    )?;

    let result = integrators::Integrator::integrate::<integrators::SecondIntegrator<Q, Q>, Q>(
        first_integral_begin,
        first_integral_end,
        quadrature.get_step_size().0,
        second_integrator,
        quadrature,
    )?;

    result
}

#[throws]
pub fn calculate_triple_integral<Q: quadrature::QuadratureTripleIntegral>(
    quadrature: Q,
    first_integral_begin: f64,
    first_integral_end: f64,
    second_integral_begin: &str,
    second_integral_end: &str,
    third_integral_begin: &str,
    third_integral_end: &str,
) -> f64 {
    let third_integrator = integrators::ThirdIntegrator::<Q, Q>::new(
        third_integral_begin,
        third_integral_end,
        quadrature.get_step_size().2,
        quadrature.clone(),
    )?;

    let second_integrator =
        integrators::SecondIntegrator::<Q, integrators::ThirdIntegrator<Q, Q>>::new(
            second_integral_begin,
            second_integral_end,
            quadrature.get_step_size().1,
            third_integrator,
        )?;

    let result = integrators::Integrator::integrate::<
        integrators::SecondIntegrator<Q, integrators::ThirdIntegrator<Q, Q>>,
        Q,
    >(
        first_integral_begin,
        first_integral_end,
        quadrature.get_step_size().0,
        second_integrator,
        quadrature,
    )?;

    result
}