use crate::error::IntegrateError;
use crate::numerical_integration::DEFAULT_TOTAL_ITERATIONS;
use crate::scalar::Numeric;
use crate::vector_field::line_integral::{line_integral_partial_2d, line_integral_partial_3d};
pub fn flux_integral_2d<T: Numeric>(
vector_field: &[&dyn Fn(&[T; 2]) -> T; 2],
transformations: &[&dyn Fn(T) -> T; 2],
integration_limit: &[T; 2],
) -> Result<T, IntegrateError> {
flux_integral_2d_custom(
vector_field,
transformations,
integration_limit,
DEFAULT_TOTAL_ITERATIONS,
)
}
pub fn flux_integral_2d_custom<T: Numeric>(
vector_field: &[&dyn Fn(&[T; 2]) -> T; 2],
transformations: &[&dyn Fn(T) -> T; 2],
integration_limit: &[T; 2],
total_iterations: u64,
) -> Result<T, IntegrateError> {
Ok(line_integral_partial_2d(
vector_field,
transformations,
integration_limit,
total_iterations,
0,
)? - line_integral_partial_2d(
vector_field,
transformations,
integration_limit,
total_iterations,
1,
)?)
}
pub fn flux_integral_3d<T: Numeric>(
vector_field: &[&dyn Fn(&[T; 3]) -> T; 3],
transformations: &[&dyn Fn(T) -> T; 3],
integration_limit: &[T; 2],
) -> Result<T, IntegrateError> {
flux_integral_3d_custom(
vector_field,
transformations,
integration_limit,
DEFAULT_TOTAL_ITERATIONS,
)
}
pub fn flux_integral_3d_custom<T: Numeric>(
vector_field: &[&dyn Fn(&[T; 3]) -> T; 3],
transformations: &[&dyn Fn(T) -> T; 3],
integration_limit: &[T; 2],
total_iterations: u64,
) -> Result<T, IntegrateError> {
Ok(line_integral_partial_3d(
vector_field,
transformations,
integration_limit,
total_iterations,
0,
)? - line_integral_partial_3d(
vector_field,
transformations,
integration_limit,
total_iterations,
1,
)? - line_integral_partial_3d(
vector_field,
transformations,
integration_limit,
total_iterations,
2,
)?)
}