use crate::numerical_derivative::finite_difference::MultiVariableSolver;
use crate::vector_field::divergence;
use crate::vector_field::line_integral;
use crate::vector_field::flux_integral;
use crate::vector_field::curl;
use crate::utils::error_codes::*;
#[test]
fn test_line_integral_1()
{
let vector_field_matrix: [&dyn Fn(&f64, &f64) -> f64; 2] = [&(|_:&f64, y:&f64|-> f64 { *y }), &(|x:&f64, _:&f64|-> f64 { -x })];
let transformation_matrix: [&dyn Fn(&f64) -> f64; 2] = [&(|t:&f64|->f64 { t.cos() }), &(|t:&f64|->f64 { t.sin() })];
let integration_limit = [0.0, 6.28];
let val = line_integral::get_2d_custom(&vector_field_matrix, &transformation_matrix, &integration_limit, 100).unwrap();
assert!(f64::abs(val + 6.28) < 0.01);
}
#[test]
fn test_line_integral_error_1()
{
let vector_field_matrix: [&dyn Fn(&f64, &f64) -> f64; 2] = [&(|_:&f64, y:&f64|-> f64 { *y }), &(|x:&f64, _:&f64|-> f64 { -x })];
let transformation_matrix: [&dyn Fn(&f64) -> f64; 2] = [&(|t:&f64|->f64 { t.cos() }), &(|t:&f64|->f64 { t.sin() })];
let integration_limit = [0.0, 6.28];
let val = line_integral::get_2d_custom(&vector_field_matrix, &transformation_matrix, &integration_limit, 0);
assert!(val.is_err());
assert!(val.unwrap_err() == INTEGRATION_CANNOT_HAVE_ZERO_ITERATIONS);
}
#[test]
fn test_line_integral_error_2()
{
let vector_field_matrix: [&dyn Fn(&f64, &f64) -> f64; 2] = [&(|_:&f64, y:&f64|-> f64 { *y }), &(|x:&f64, _:&f64|-> f64 { -x })];
let transformation_matrix: [&dyn Fn(&f64) -> f64; 2] = [&(|t:&f64|->f64 { t.cos() }), &(|t:&f64|->f64 { t.sin() })];
let integration_limit = [10.0, 0.0];
let val = line_integral::get_2d_custom(&vector_field_matrix, &transformation_matrix, &integration_limit, 100);
assert!(val.is_err());
assert!(val.unwrap_err() == INTEGRATION_LIMITS_ILL_DEFINED);
}
#[test]
fn test_flux_integral_1()
{
let vector_field_matrix: [&dyn Fn(&f64, &f64) -> f64; 2] = [&(|_:&f64, y:&f64|-> f64 { *y }), &(|x:&f64, _:&f64|-> f64 { -x })];
let transformation_matrix: [&dyn Fn(&f64) -> f64; 2] = [&(|t:&f64|->f64 { t.cos() }), &(|t:&f64|->f64 { t.sin() })];
let integration_limit = [0.0, 6.28];
let val = flux_integral::get_2d_custom(&vector_field_matrix, &transformation_matrix, &integration_limit, 100).unwrap();
assert!(f64::abs(val + 0.0) < 0.01);
}
#[test]
fn test_curl_2d_1()
{
let vf_x = | args: &[f64; 2] | -> f64
{
return 2.0*args[0]*args[1];
};
let vf_y = | args: &[f64; 2] | -> f64
{
return 3.0*args[1].cos()
};
let vector_field_matrix: [&dyn Fn(&[f64; 2]) -> f64; 2] = [&vf_x, &vf_y];
let point = [1.0, 3.14];
let derivator = MultiVariableSolver::default();
let val = curl::get_2d(derivator, &vector_field_matrix, &point).unwrap();
assert!(f64::abs(val + 2.0) < 0.000001); }
#[test]
fn test_curl_3d_1()
{
let vf_x = | args: &[f64; 3] | -> f64
{
return args[1];
};
let vf_y = | args: &[f64; 3] | -> f64
{
return -args[0];
};
let vf_z = | args: &[f64; 3] | -> f64
{
return 2.0*args[2];
};
let vector_field_matrix: [&dyn Fn(&[f64; 3]) -> f64; 3] = [&vf_x, &vf_y, &vf_z];
let point = [1.0, 2.0, 3.0];
let derivator = MultiVariableSolver::default();
let val = curl::get_3d(derivator, &vector_field_matrix, &point).unwrap();
assert!(f64::abs(val[0] - 0.0) < 0.000001);
assert!(f64::abs(val[1] - 0.0) < 0.000001);
assert!(f64::abs(val[2] + 2.0) < 0.000001);
}
#[test]
fn test_divergence_2d_1()
{
let vf_x = | args: &[f64; 2] | -> f64
{
return 2.0*args[0]*args[1];
};
let vf_y = | args: &[f64; 2] | -> f64
{
return 3.0*args[1].cos()
};
let vector_field_matrix: [&dyn Fn(&[f64; 2]) -> f64; 2] = [&vf_x, &vf_y];
let point = [1.0, 3.14];
let derivator = MultiVariableSolver::default();
let val = divergence::get_2d(derivator, &vector_field_matrix, &point).unwrap();
assert!(f64::abs(val - 6.27) < 0.01);
}
#[test]
fn test_divergence_3d_1()
{
let vf_x = | args: &[f64; 3] | -> f64
{
return args[1];
};
let vf_y = | args: &[f64; 3] | -> f64
{
return -args[0];
};
let vf_z = | args: &[f64; 3] | -> f64
{
return 2.0*args[2];
};
let vector_field_matrix: [&dyn Fn(&[f64; 3]) -> f64; 3] = [&vf_x, &vf_y, &vf_z];
let point = [0.0, 1.0, 3.0];
let derivator = MultiVariableSolver::default();
let val = divergence::get_3d(derivator, &vector_field_matrix, &point).unwrap();
assert!(f64::abs(val - 2.00) < 0.00001);
}