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 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}