pub struct RandomAnisotropyModel {
pub num_grains: usize,
pub grain_size: f64,
pub bulk_anisotropy: f64,
pub exchange_stiffness: f64,
pub grain_axes: Vec<Vector3<f64>>,
pub effective_anisotropy: f64,
}Expand description
Random anisotropy model (RAM) following the Herzer scaling theory.
In nanocrystalline materials the effective anisotropy is averaged over the exchange-correlated volume, leading to:
K_eff = K₁ / √N
where N = (L_ex / D)³ is the number of grains within the exchange length and L_ex = √(A / K₁) is the ferromagnetic exchange length.
§Example
use spintronics::material::disorder::RandomAnisotropyModel;
let ram = RandomAnisotropyModel::new(
100, // 100 grains
10.0e-9, // 10 nm grain size
1.0e4, // K₁ = 10 kJ/m³
1.0e-11, // A = 10 pJ/m
42, // seed
).expect("valid parameters");
assert!(ram.effective_anisotropy < ram.bulk_anisotropy);Fields§
§num_grains: usizeNumber of grains in the model.
grain_size: f64Average grain diameter [m].
bulk_anisotropy: f64Bulk magnetocrystalline anisotropy constant K₁ [J/m³].
exchange_stiffness: f64Exchange stiffness constant A [J/m].
grain_axes: Vec<Vector3<f64>>Random easy axis direction for each grain (unit vectors).
effective_anisotropy: f64Effective anisotropy K_eff from Herzer averaging [J/m³].
Implementations§
Source§impl RandomAnisotropyModel
impl RandomAnisotropyModel
Sourcepub fn new(
num_grains: usize,
grain_size: f64,
bulk_anisotropy: f64,
exchange_stiffness: f64,
seed: u64,
) -> Result<Self>
pub fn new( num_grains: usize, grain_size: f64, bulk_anisotropy: f64, exchange_stiffness: f64, seed: u64, ) -> Result<Self>
Create a new random anisotropy model.
§Arguments
num_grains- Number of grains (must be > 0)grain_size- Average grain diameter D [m] (must be > 0)bulk_anisotropy- K₁ [J/m³] (must be > 0)exchange_stiffness- A [J/m] (must be > 0)seed- PRNG seed for reproducibility
§Errors
Returns Error::InvalidParameter if any physical parameter is non-positive.
Sourcepub fn exchange_length(&self) -> f64
pub fn exchange_length(&self) -> f64
Compute the ferromagnetic exchange length L_ex = √(A / K₁) [m].
Sourcepub fn grains_in_exchange_volume(&self) -> f64
pub fn grains_in_exchange_volume(&self) -> f64
Number of grains within one exchange volume: N = (L_ex / D)³.
Sourcepub fn herzer_scaling_ratio(&self) -> f64
pub fn herzer_scaling_ratio(&self) -> f64
Herzer scaling exponent check: K_eff should scale as K₁⁴ D⁶ / A³.
Returns the ratio K_eff / (K₁⁴ D⁶ / A³) which should be of order unity in the regime where D << L_ex.
Trait Implementations§
Source§impl Clone for RandomAnisotropyModel
impl Clone for RandomAnisotropyModel
Source§fn clone(&self) -> RandomAnisotropyModel
fn clone(&self) -> RandomAnisotropyModel
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for RandomAnisotropyModel
impl RefUnwindSafe for RandomAnisotropyModel
impl Send for RandomAnisotropyModel
impl Sync for RandomAnisotropyModel
impl Unpin for RandomAnisotropyModel
impl UnsafeUnpin for RandomAnisotropyModel
impl UnwindSafe for RandomAnisotropyModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.