conspire/domain/fem/block/element/thermal/
mod.rs1pub mod conduction;
2
3use crate::{
4 fem::block::element::Element,
5 math::{Tensor, TensorRank0List},
6 mechanics::TemperatureGradients,
7};
8use std::fmt::Debug;
9
10pub type ElementNodalTemperatures<const D: usize> = TensorRank0List<D>;
11
12pub trait ThermalFiniteElement<const G: usize, const N: usize>
13where
14 Self: Debug,
15{
16 fn temperature_gradients(
17 &self,
18 nodal_temperatures: &ElementNodalTemperatures<N>,
19 ) -> TemperatureGradients<G>;
20}
21
22impl<const G: usize, const N: usize> ThermalFiniteElement<G, N> for Element<G, N>
23where
24 Self: Debug,
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.iter())
36 .map(|(nodal_temperature, gradient_vector)| gradient_vector * nodal_temperature)
37 .sum()
38 })
39 .collect()
40 }
41}