conspire/domain/fem/block/thermal/
mod.rs1pub 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}