Skip to main content

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 ThermalElements<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
15where
16    F: ThermalFiniteElement<G, M, N, P>,
17{
18    fn nodal_temperatures_element(
19        &self,
20        element_connectivity: &[usize; N],
21        nodal_temperatures: &NodalTemperatures,
22    ) -> ElementNodalTemperatures<N>;
23    fn temperature_gradients(
24        &self,
25        nodal_temperatures: &NodalTemperatures,
26    ) -> Vec<TemperatureGradients<G>>;
27}
28
29impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
30    ThermalElements<C, F, G, M, N, P> for Block<C, F, G, M, N, P>
31where
32    F: ThermalFiniteElement<G, M, N, P>,
33{
34    fn nodal_temperatures_element(
35        &self,
36        element_connectivity: &[usize; N],
37        nodal_temperatures: &NodalTemperatures,
38    ) -> ElementNodalTemperatures<N> {
39        element_connectivity
40            .iter()
41            .map(|&node| nodal_temperatures[node])
42            .collect()
43    }
44    fn temperature_gradients(
45        &self,
46        nodal_temperatures: &NodalTemperatures,
47    ) -> Vec<TemperatureGradients<G>> {
48        self.elements()
49            .iter()
50            .zip(self.connectivity())
51            .map(|(element, element_connectivity)| {
52                element.temperature_gradients(
53                    &self.nodal_temperatures_element(element_connectivity, nodal_temperatures),
54                )
55            })
56            .collect()
57    }
58}