use spintronics::mech::{BarnettMagnetization, Cantilever, EinsteinDeHaas, SpinMechanicalCoupling};
use spintronics::vector3::Vector3;
fn main() {
println!("=== Spin-Mechanical Coupling ===\n");
println!("--- Part 1: Barnett Effect (Rotation → Magnetization) ---\n");
let barnett = BarnettMagnetization::permalloy();
println!("Material: Permalloy (Ni₈₀Fe₂₀)");
println!(" Saturation magnetization: {:.2e} A/m", barnett.ms);
println!();
let omega_moderate = Vector3::new(0.0, 0.0, 1000.0); let m_barnett = barnett.magnetization_from_rotation(omega_moderate);
println!("Rotation: Ω = 1000 rad/s (z-axis)");
println!(
" Frequency: {:.1} Hz",
1000.0 / (2.0 * std::f64::consts::PI)
);
println!();
println!("Induced magnetization:");
println!(" M_B = {:.3e} A/m", m_barnett.magnitude());
println!(
" Fractional: M_B/M_s = {:.3e}",
barnett.fractional_magnetization(omega_moderate)
);
println!();
let omega_sat = barnett.saturation_rotation_rate();
println!("Rotation rate for saturation:");
println!(" Ω_sat = {:.3e} rad/s", omega_sat);
println!(" (unrealistically high for macroscopic samples)");
println!();
println!("--- Part 2: Einstein-de Haas Effect (Magnetization → Rotation) ---\n");
let moment_of_inertia = 1.0e-15; let volume = 1.0e-18; let density = 8900.0;
let edh = EinsteinDeHaas::new(moment_of_inertia, volume, density);
println!("Sample: Permalloy nanowire");
println!(" Volume: 1 μm³");
println!(" Moment of inertia: {:.2e} kg·m²", moment_of_inertia);
println!();
let ms_permalloy = 8.0e5;
let rotation_angle = edh.rotation_angle_magnetization_flip(ms_permalloy);
println!("Magnetization flip: M → -M");
println!(" ΔM = 2 M_s = {:.2e} A/m", 2.0 * ms_permalloy);
println!(
" Rotation angle: {:.3e} rad = {:.3e} degrees",
rotation_angle,
rotation_angle * 180.0 / std::f64::consts::PI
);
println!();
let delta_m = Vector3::new(0.0, 0.0, 2.0 * ms_permalloy);
let omega_edh = edh.angular_velocity_from_magnetization_change(delta_m);
println!("Instantaneous angular velocity:");
println!(" Ω = {:.3e} rad/s", omega_edh.magnitude());
println!();
println!("--- Part 3: Coupled Dynamics Simulation ---\n");
let mut coupling = SpinMechanicalCoupling::new(
Vector3::new(1.0, 0.0, 0.0), moment_of_inertia,
0.01, ms_permalloy,
volume,
);
println!("Initial state:");
println!(
" m = [{:.2}, {:.2}, {:.2}]",
coupling.magnetization.x, coupling.magnetization.y, coupling.magnetization.z
);
println!(
" Ω = [{:.2e}, {:.2e}, {:.2e}] rad/s",
coupling.omega.x, coupling.omega.y, coupling.omega.z
);
println!();
let h_ext = Vector3::new(0.0, 0.0, 1.0e5); let dt = 1.0e-13; let n_steps = 1000;
println!("Applying external field: H_ext = 100 kA/m (z-direction)");
println!("Time step: {} ps", dt * 1e12);
println!("Total time: {} ns", dt * n_steps as f64 * 1e9);
println!();
println!("Evolving coupled system...");
for i in 0..n_steps {
coupling.evolve(h_ext, dt);
if i % 200 == 0 {
println!(
" t = {:.2} ns: m_z = {:.4}, Ω_z = {:.3e} rad/s",
i as f64 * dt * 1e9,
coupling.magnetization.z,
coupling.omega.z
);
}
}
println!();
println!("Final state:");
println!(
" m = [{:.4}, {:.4}, {:.4}]",
coupling.magnetization.x, coupling.magnetization.y, coupling.magnetization.z
);
println!(
" |m| = {:.6} (should be 1.0)",
coupling.magnetization.magnitude()
);
println!(
" Ω = [{:.3e}, {:.3e}, {:.3e}] rad/s",
coupling.omega.x, coupling.omega.y, coupling.omega.z
);
println!();
println!("--- Part 4: Nanomechanical Detection ---\n");
let mut cantilever = Cantilever::afm_cantilever();
println!("AFM Cantilever:");
println!(" Resonance frequency: {:.1} kHz", cantilever.f0 / 1e3);
println!(" Q factor: {:.0}", cantilever.q_factor);
println!(" Mass: {:.1} pg", cantilever.mass * 1e15);
println!();
let force_amplitude = 1.0e-12; let omega_drive = 2.0 * std::f64::consts::PI * cantilever.f0;
let dt_cant = 1.0e-8; let n_cycles = 100;
println!(
"Driving force: {:.1} pN at resonance",
force_amplitude * 1e12
);
println!("Simulating {} oscillation cycles...", n_cycles);
for i in 0..(n_cycles * 20) {
let t = i as f64 * dt_cant;
let force = force_amplitude * (omega_drive * t).sin();
cantilever.evolve(force, dt_cant);
}
println!();
println!("Final cantilever state:");
println!(" Displacement: {:.3} nm", cantilever.displacement * 1e9);
println!(" Velocity: {:.3e} m/s", cantilever.velocity);
println!(" Total energy: {:.3e} J", cantilever.total_energy());
println!();
println!("=== Summary ===");
println!("1. Barnett effect: Rotation induces magnetization (very small for realistic rates)");
println!(
"2. Einstein-de Haas: Magnetization change causes rotation (angular momentum conservation)"
);
println!("3. Coupled dynamics: Magnetization and rotation exchange angular momentum");
println!("4. Cantilever: Sensitive detector for mechanical motion induced by spin dynamics");
}