use crate::fem_domain::basis::{HierCurlBasisFn, HierCurlBasisFnSpace};
use crate::fem_domain::domain::{dof::basis_spec::BasisDir, mesh::element::Materials};
pub mod glq;
pub mod integrals;
pub enum IntegralResult {
Full(f64),
ByParts(f64, [f64; 4]),
}
impl IntegralResult {
pub fn full_solution(self) -> f64 {
match self {
Self::Full(full) => full,
Self::ByParts(face, edges) => face + edges.iter().sum::<f64>(),
}
}
pub fn unwrap_parts(self) -> (f64, [f64; 4]) {
match self {
Self::Full(_) => {
panic!("Integral solution was computed in one part; cannot get By-Parts solution!")
}
Self::ByParts(face, edges) => (face, edges),
}
}
pub fn get_face(&self) -> f64 {
match self {
Self::Full(full) => *full,
Self::ByParts(face, _) => *face,
}
}
pub fn get_edges(&self) -> [f64; 4] {
match self {
Self::Full(_) => [0.0; 4],
Self::ByParts(_, edges) => *edges,
}
}
}
pub trait HierCurlIntegral: Sync + Send {
fn with_weights(u_weights: &[f64], v_weights: &[f64]) -> Self;
fn integrate<BSpace: HierCurlBasisFnSpace>(
&self,
p_dir: BasisDir,
q_dir: BasisDir,
p_orders: [usize; 2],
q_orders: [usize; 2],
p_basis: &HierCurlBasisFn<BSpace>,
q_basis: &HierCurlBasisFn<BSpace>,
materials: &Materials,
) -> IntegralResult;
fn integrate_by_parts<BSpace: HierCurlBasisFnSpace>(
&self,
p_dir: BasisDir,
q_dir: BasisDir,
p_orders: [usize; 2],
q_orders: [usize; 2],
p_basis: &HierCurlBasisFn<BSpace>,
q_basis: &HierCurlBasisFn<BSpace>,
materials: &Materials,
) -> IntegralResult;
}