conspire/domain/fem/block/element/thermal/
mod.rs

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