use crate::numerical_derivative::derivator::DerivatorMultiVariable;
use crate::scalar::function::Component;
use crate::scalar::{Numeric, VectorFn};
use crate::utils::error_codes::CalcError;
pub fn get_3d<D: DerivatorMultiVariable, F: VectorFn<NUM_VARS, 3>, const NUM_VARS: usize>(
derivator: D,
vector_field: &F,
point: &[D::Scalar; NUM_VARS],
) -> Result<[D::Scalar; 3], CalcError> {
let vx = Component::new(vector_field, 0);
let vy = Component::new(vector_field, 1);
let vz = Component::new(vector_field, 2);
let mut ans = [<D::Scalar as Numeric>::ZERO; 3];
ans[0] = derivator.get_single_partial(&vz, 1, point)?
- derivator.get_single_partial(&vy, 2, point)?;
ans[1] = derivator.get_single_partial(&vx, 2, point)?
- derivator.get_single_partial(&vz, 0, point)?;
ans[2] = derivator.get_single_partial(&vy, 0, point)?
- derivator.get_single_partial(&vx, 1, point)?;
Ok(ans)
}
pub fn get_2d<D: DerivatorMultiVariable, F: VectorFn<NUM_VARS, 2>, const NUM_VARS: usize>(
derivator: D,
vector_field: &F,
point: &[D::Scalar; NUM_VARS],
) -> Result<D::Scalar, CalcError> {
let vx = Component::new(vector_field, 0);
let vy = Component::new(vector_field, 1);
Ok(derivator.get_single_partial(&vy, 0, point)?
- derivator.get_single_partial(&vx, 1, point)?)
}