use crate::crystal::Crystal;
use crate::element::Element;
use crate::molecular::Molecule;
use crate::polymer::PolymerChain;
#[derive(Debug, Clone)]
pub enum Substance {
Molecular(Molecule),
Crystalline(Crystal),
Polymer(PolymerChain),
Amorphous {
name: String,
composition: Vec<(Element, f32)>,
density: f32,
},
}
impl Substance {
pub fn amorphous(name: &str, composition: &[(Element, f32)], density: f32) -> Self {
Substance::Amorphous {
name: name.into(),
composition: composition.to_vec(),
density,
}
}
pub fn total_bond_energy(&self) -> f32 {
match self {
Substance::Molecular(mol) => mol.total_bond_energy(),
Substance::Crystalline(c) => {
c.cohesive_energy() * 96.485
}
Substance::Polymer(p) => {
p.monomer.total_bond_energy() * p.chain_length as f32
}
Substance::Amorphous { composition, .. } => {
let mut energy = 0.0f32;
for &(elem, frac) in composition {
energy += elem.cohesive_energy() * frac * 96.485;
}
energy
}
}
}
}