use crate::structure::particle_filter::{ParticleFilter,VectorSpecifier,
SecondaryParticleFilter};
use crate::physical_constants::*;
use std::collections::HashMap;
#[derive(Debug,Clone,PartialEq)]
pub struct ParticleConfig{
pub label: String,
pub filter: Option<ParticleFilter>,
pub properties: Option<ParticleProperties>,
pub cell_type: CellType,
}
impl ParticleConfig{
pub fn new(label: String) -> Self{
ParticleConfig{
label,
filter: None,
properties: None,
cell_type: CellType::AllCells,
}
}
pub fn max_possible_spin_multiplicity(&self) -> Option<usize> {
let properties = &self.properties.as_ref()?;
if properties.isotopic_distribution.isotope_abundances.is_empty(){
return None;
}
let mut max_spin_mult = 0;
for isotope_abundance in properties.isotopic_distribution
.isotope_abundances.iter()
{
max_spin_mult = usize::max(max_spin_mult,
isotope_abundance.isotope.spin_multiplicity());
}
Some(max_spin_mult)
}
}
#[derive(Debug,Clone,PartialEq)]
pub enum CellType{
AllCells,
PrimaryCell,
Extracells,
}
#[derive(Debug,Clone,PartialEq,Default)]
pub struct ParticleProperties{
pub cosubstitute: Option<SecondaryParticleFilter>,
pub isotopic_distribution: IsotopeDistribution,
pub isotope_properties: HashMap::<String,IsotopeProperties>,
}
impl ParticleProperties{
pub fn new() -> Self{
Default::default()
}
}
#[derive(Debug,Clone,PartialEq,Default)]
pub struct IsotopeProperties{
pub active: Option<bool>,
pub electric_quadrupole_coupling: Option<TensorSpecifier>,
pub exchange_coupling: Option<f64>,
pub g_matrix: Option<TensorSpecifier>,
pub hyperfine_coupling: Option<TensorSpecifier>,
}
impl IsotopeProperties{
pub fn new() -> Self{ IsotopeProperties::default() }
}
#[derive(Debug,Clone,PartialEq,Default)]
pub struct IsotopeDistribution{
pub isotope_abundances: Vec::<IsotopeAbundance>,
pub void_probability: Option<f64>,
}
#[derive(Debug,Clone,PartialEq)]
pub struct IsotopeAbundance{
pub isotope: Isotope,
pub abundance: f64,
}
#[derive(Debug,Clone,PartialEq,Default)]
pub struct TensorSpecifier{
pub values: Option<[f64; 3]>,
pub x_axis: Option<VectorSpecifier>,
pub y_axis: Option<VectorSpecifier>,
pub z_axis: Option<VectorSpecifier>,
}
impl TensorSpecifier{
pub fn new() -> Self{
TensorSpecifier::default()
}
}