#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::vector3::Vector3;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct HeatCurrentCalculator {
pub thermal_conductivity: f64,
pub peltier_coeff: f64,
pub spin_peltier_coeff: f64,
}
impl HeatCurrentCalculator {
pub fn new(thermal_conductivity: f64, peltier_coeff: f64, spin_peltier_coeff: f64) -> Self {
Self {
thermal_conductivity,
peltier_coeff,
spin_peltier_coeff,
}
}
#[inline]
pub fn fourier_current(&self, grad_t: &Vector3<f64>) -> Vector3<f64> {
Vector3::new(
-self.thermal_conductivity * grad_t.x,
-self.thermal_conductivity * grad_t.y,
-self.thermal_conductivity * grad_t.z,
)
}
#[inline]
pub fn peltier_current(&self, j_charge: &Vector3<f64>) -> Vector3<f64> {
Vector3::new(
self.peltier_coeff * j_charge.x,
self.peltier_coeff * j_charge.y,
self.peltier_coeff * j_charge.z,
)
}
#[inline]
pub fn spin_peltier_current(&self, j_spin: &Vector3<f64>) -> Vector3<f64> {
Vector3::new(
self.spin_peltier_coeff * j_spin.x,
self.spin_peltier_coeff * j_spin.y,
self.spin_peltier_coeff * j_spin.z,
)
}
pub fn total_heat_current(
&self,
grad_t: &Vector3<f64>,
j_charge: &Vector3<f64>,
j_spin: &Vector3<f64>,
) -> Vector3<f64> {
let fourier = self.fourier_current(grad_t);
let peltier = self.peltier_current(j_charge);
let spin_peltier = self.spin_peltier_current(j_spin);
Vector3::new(
fourier.x + peltier.x + spin_peltier.x,
fourier.y + peltier.y + spin_peltier.y,
fourier.z + peltier.z + spin_peltier.z,
)
}
}