use crate::constants::HBAR;
use crate::vector3::Vector3;
#[derive(Debug, Clone)]
pub struct EinsteinDeHaas {
pub moment_of_inertia: f64,
pub volume: f64,
pub density: f64,
}
impl EinsteinDeHaas {
pub fn new(moment_of_inertia: f64, volume: f64, density: f64) -> Self {
Self {
moment_of_inertia,
volume,
density,
}
}
pub fn angular_velocity_from_magnetization_change(
&self,
delta_m: Vector3<f64>,
) -> Vector3<f64> {
let delta_l_spin = delta_m * (HBAR * self.volume);
let delta_l_mech = delta_l_spin * (-1.0);
delta_l_mech * (1.0 / self.moment_of_inertia)
}
pub fn rotation_angle_magnetization_flip(&self, ms: f64) -> f64 {
let delta_m_magnitude = 2.0 * ms;
let delta_l = HBAR * delta_m_magnitude * self.volume;
delta_l / self.moment_of_inertia
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_edh_creation() {
let edh = EinsteinDeHaas::new(1.0e-15, 1.0e-18, 8000.0);
assert!(edh.moment_of_inertia > 0.0);
}
#[test]
fn test_angular_velocity_calculation() {
let edh = EinsteinDeHaas::new(1.0e-15, 1.0e-18, 8000.0);
let delta_m = Vector3::new(0.0, 0.0, 1.0e5);
let omega = edh.angular_velocity_from_magnetization_change(delta_m);
assert!(omega.magnitude() > 0.0);
}
}