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