Skip to main content

conspire/domain/fem/block/thermal/
mod.rs

1pub mod conduction;
2
3use crate::{
4    constitutive::thermal::Thermal,
5    fem::block::{
6        Block,
7        element::thermal::{ElementNodalTemperatures, ThermalFiniteElement},
8    },
9    math::QuantityVector,
10    mechanics::TemperatureGradients,
11    units::Temperature,
12};
13
14pub type NodalTemperatures = QuantityVector<Temperature>;
15
16pub trait ThermalElements<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
17where
18    C: Thermal,
19    F: ThermalFiniteElement<G, M, N, P>,
20{
21    fn nodal_temperatures_element(
22        &self,
23        element_connectivity: &[usize; N],
24        nodal_temperatures: &NodalTemperatures,
25    ) -> ElementNodalTemperatures<N>;
26    fn temperature_gradients(
27        &self,
28        nodal_temperatures: &NodalTemperatures,
29    ) -> Vec<TemperatureGradients<G>>;
30}
31
32impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
33    ThermalElements<C, F, G, M, N, P> for Block<C, F, G, M, N, P>
34where
35    C: Thermal,
36    F: ThermalFiniteElement<G, M, N, P>,
37{
38    fn nodal_temperatures_element(
39        &self,
40        element_connectivity: &[usize; N],
41        nodal_temperatures: &NodalTemperatures,
42    ) -> ElementNodalTemperatures<N> {
43        element_connectivity
44            .iter()
45            .map(|&node| nodal_temperatures[node])
46            .collect()
47    }
48    fn temperature_gradients(
49        &self,
50        nodal_temperatures: &NodalTemperatures,
51    ) -> Vec<TemperatureGradients<G>> {
52        self.elements()
53            .iter()
54            .zip(self.connectivity())
55            .map(|(element, element_connectivity)| {
56                element.temperature_gradients(
57                    &self.nodal_temperatures_element(element_connectivity, nodal_temperatures),
58                )
59            })
60            .collect()
61    }
62}