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