Skip to main content

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

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