pub mod am1;
pub mod mndo;
pub mod pm3;
pub mod pm6;
pub mod pm7;
pub mod rm1;
pub use am1::Am1Model;
pub use mndo::MndoModel;
pub use pm3::Pm3Model;
pub use pm6::Pm6Model;
pub use pm7::Pm7Model;
pub use rm1::Rm1Model;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct GaussianCoreCorrection {
pub a: f64,
pub b: f64,
pub c: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SemiEmpiricalElementParams {
pub z: u8,
pub core_charge: f64,
pub uss: f64,
pub upp: f64,
pub udd: f64,
pub zs: f64,
pub zp: f64,
pub zd: f64,
pub betas: f64,
pub betap: f64,
pub betad: f64,
pub alpha: f64,
pub gss: f64,
pub gsp: f64,
pub gpp: f64,
pub gp2: f64,
pub hsp: f64,
pub gaussians: [GaussianCoreCorrection; 4],
pub num_gaussians: usize,
}
pub trait ParameterModel: Send + Sync {
fn get_element(&self, z: u8) -> Option<SemiEmpiricalElementParams>;
fn name(&self) -> &'static str {
"AM1"
}
fn pair_core_repulsion(
&self,
r_angstrom: f64,
elem_a: &SemiEmpiricalElementParams,
elem_b: &SemiEmpiricalElementParams,
) -> f64 {
crate::integrals::core_repulsion::compute_pair_core_repulsion(r_angstrom, elem_a, elem_b)
}
fn use_feathering(&self) -> bool {
false
}
fn get_d_element_params(&self, _z: u8) -> Option<crate::integrals::d_orbitals::DElementParams> {
None
}
fn basis_type(&self, z: u8) -> crate::types::BasisType {
if let Some(p) = self.get_element(z) {
if p.zd > 1.0e-8 {
crate::types::BasisType::SPD
} else if p.zp > 1.0e-20 {
crate::types::BasisType::SP
} else {
crate::types::BasisType::S
}
} else {
match z {
1 => crate::types::BasisType::S,
2..=20 => crate::types::BasisType::SP,
_ => crate::types::BasisType::SPD,
}
}
}
}