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

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