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

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