conspire/domain/fem/block/element/thermal/
mod.rs1pub mod conduction;
2
3use crate::{
4 fem::block::element::{Element, FiniteElement},
5 math::{Quantity, Tensor, TensorList},
6 mechanics::TemperatureGradients,
7 units::Temperature,
8};
9
10pub type ElementNodalTemperatures<const D: usize> = TensorList<Quantity<Temperature>, D>;
11
12pub trait ThermalFiniteElement<const G: usize, const M: usize, const N: usize, const P: usize>
13where
14 Self: FiniteElement<G, M, N, P>,
15{
16 fn temperature_gradients(
17 &self,
18 nodal_temperatures: &ElementNodalTemperatures<N>,
19 ) -> TemperatureGradients<G>;
20}
21
22impl<const G: usize, const M: usize, const N: usize, const O: usize, const P: usize>
23 ThermalFiniteElement<G, M, N, P> for Element<3, G, N, O>
24where
25 Self: FiniteElement<G, M, N, P>,
26{
27 fn temperature_gradients(
28 &self,
29 nodal_temperatures: &ElementNodalTemperatures<N>,
30 ) -> TemperatureGradients<G> {
31 self.gradient_vectors()
32 .iter()
33 .map(|gradient_vectors| {
34 nodal_temperatures
35 .iter()
36 .zip(gradient_vectors)
37 .map(|(nodal_temperature, gradient_vector)| gradient_vector * nodal_temperature)
38 .sum()
39 })
40 .collect()
41 }
42}