use crate::mesh::QuadratureRule;
use crate::mesh::elements::quad2d::{quad4, quad9};
use crate::physics::solenoid_stress::geometry::{
FaceSample, VolumeSample, face_samples_quad4, face_samples_quad9, volume_samples_quad4,
volume_samples_quad9,
};
use crate::physics::solenoid_stress::model::AxisymmetricElementType;
use crate::physics::solenoid_stress::types::Real;
pub(crate) trait QuadElementFamily<const NODES_PER_ELEMENT: usize> {
fn element_type() -> AxisymmetricElementType;
fn flatten_elements(elements: &[[usize; NODES_PER_ELEMENT]]) -> Vec<usize> {
let mut flat = Vec::with_capacity(elements.len() * NODES_PER_ELEMENT);
for conn in elements {
flat.extend_from_slice(conn);
}
flat
}
fn volume_samples<F: Real>(
coords: &[[F; 2]; NODES_PER_ELEMENT],
quadrature: QuadratureRule,
) -> Result<Vec<VolumeSample<F, NODES_PER_ELEMENT>>, String>;
fn face_samples<F: Real>(
coords: &[[F; 2]; NODES_PER_ELEMENT],
local_face: u8,
quadrature: QuadratureRule,
) -> Result<Vec<FaceSample<F, NODES_PER_ELEMENT>>, String>;
}
pub(crate) struct Quad4Family;
impl QuadElementFamily<{ quad4::NODES_PER_ELEMENT }> for Quad4Family {
fn element_type() -> AxisymmetricElementType {
AxisymmetricElementType::Quad4
}
fn volume_samples<F: Real>(
coords: &[[F; 2]; quad4::NODES_PER_ELEMENT],
quadrature: QuadratureRule,
) -> Result<Vec<VolumeSample<F, { quad4::NODES_PER_ELEMENT }>>, String> {
volume_samples_quad4(coords, quadrature)
}
fn face_samples<F: Real>(
coords: &[[F; 2]; quad4::NODES_PER_ELEMENT],
local_face: u8,
quadrature: QuadratureRule,
) -> Result<Vec<FaceSample<F, { quad4::NODES_PER_ELEMENT }>>, String> {
face_samples_quad4(coords, local_face, quadrature)
}
}
pub(crate) struct Quad9Family;
impl QuadElementFamily<{ quad9::NODES_PER_ELEMENT }> for Quad9Family {
fn element_type() -> AxisymmetricElementType {
AxisymmetricElementType::Quad9
}
fn volume_samples<F: Real>(
coords: &[[F; 2]; quad9::NODES_PER_ELEMENT],
quadrature: QuadratureRule,
) -> Result<Vec<VolumeSample<F, { quad9::NODES_PER_ELEMENT }>>, String> {
volume_samples_quad9(coords, quadrature)
}
fn face_samples<F: Real>(
coords: &[[F; 2]; quad9::NODES_PER_ELEMENT],
local_face: u8,
quadrature: QuadratureRule,
) -> Result<Vec<FaceSample<F, { quad9::NODES_PER_ELEMENT }>>, String> {
face_samples_quad9(coords, local_face, quadrature)
}
}