use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(clippy::large_enum_variant)]
pub enum Cp2kInputSpec {
FromFile { path: String },
Generated { settings: Cp2kSettings },
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kSettings {
pub global: Option<Cp2kGlobalSettings>,
pub force_eval: Cp2kForceEvalSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kGlobalSettings {
pub project: Option<String>,
pub print_level: Option<String>,
pub run_type: Option<String>,
pub walltime: Option<String>,
pub seed: Option<Vec<i32>>,
pub echo_input: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Cp2kForceEvalSettings {
pub method: String,
pub stress_tensor: Option<String>,
pub dft: Option<Cp2kDftSettings>,
pub subsys: Option<Cp2kSubsysSettings>,
}
impl Default for Cp2kForceEvalSettings {
fn default() -> Self {
Self {
method: "Quickstep".to_string(),
stress_tensor: None,
dft: Some(Cp2kDftSettings::default()),
subsys: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kSubsysSettings {
pub kinds: Vec<Cp2kKindSettings>,
pub extra_sections: Vec<Cp2kSection>,
pub extra_keywords: Vec<Cp2kKeyword>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kKindSettings {
pub element: String,
pub basis_set: Option<String>,
pub potential: Option<String>,
pub extra_keywords: Vec<Cp2kKeyword>,
pub extra_sections: Vec<Cp2kSection>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kDftSettings {
pub basis_set_file_name: Option<String>,
pub potential_file_name: Option<String>,
pub qs: Option<Cp2kQsSettings>,
pub mgrid: Option<Cp2kMgridSettings>,
pub scf: Option<Cp2kScfSettings>,
pub xc: Option<Cp2kXcSettings>,
pub extra_keywords: Vec<Cp2kKeyword>,
pub extra_sections: Vec<Cp2kSection>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kQsSettings {
pub eps_default: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kMgridSettings {
pub cutoff: Option<f64>,
pub rel_cutoff: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kScfSettings {
pub scf_guess: Option<String>,
pub max_scf: Option<i32>,
pub eps_scf: Option<f64>,
pub added_mos: Option<i32>,
pub smear: Option<Cp2kSmearSettings>,
pub diagonalization: Option<Cp2kDiagonalizationSettings>,
pub mixing: Option<Cp2kMixingSettings>,
pub extra_keywords: Vec<Cp2kKeyword>,
pub extra_sections: Vec<Cp2kSection>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kSmearSettings {
pub enabled: bool,
pub method: Option<String>,
pub electronic_temperature_k: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kDiagonalizationSettings {
pub enabled: bool,
pub algorithm: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kMixingSettings {
pub method: Option<String>,
pub alpha: Option<f64>,
pub nbroyden: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kXcSettings {
pub functional: Option<String>,
pub extra_keywords: Vec<Cp2kKeyword>,
pub extra_sections: Vec<Cp2kSection>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Cp2kKeyword {
pub name: String,
pub value: String,
pub unit: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Cp2kSection {
pub name: String,
pub parameter: Option<String>,
pub keywords: Vec<Cp2kKeyword>,
pub sections: Vec<Cp2kSection>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KPointScheme {
None,
Gamma,
MonkhorstPack(u32, u32, u32),
ExplicitList(Vec<[f64; 4]>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KPointConfig {
pub scheme: KPointScheme,
pub use_symmetry: bool,
pub verbose: bool,
pub full_grid: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DosConfig {
pub enabled: bool,
pub partial_dos: bool,
pub erange_ev: Option<(f64, f64)>,
pub npoints: Option<usize>,
}
#[derive(Debug, Serialize, Deserialize)]
#[allow(clippy::large_enum_variant)]
pub enum Command {
InitForceEnv { input: String, output: String },
InitForceEnvWithGeometry {
input: Cp2kInputSpec,
output: String,
symbols: Vec<String>,
positions_angstrom: Vec<f64>,
cell_angstrom: Vec<f64>,
periodic: String,
project_label: Option<String>,
print_level: Option<String>,
run_type: Option<String>,
charge: Option<i32>,
multiplicity: Option<i32>,
walltime: Option<String>,
seed: Option<Vec<i32>>,
echo_input: Option<bool>,
uks: Option<bool>,
roks: Option<bool>,
wfn_restart_file: Option<String>,
kpoint_config: Option<KPointConfig>,
dos_config: Option<DosConfig>,
},
CalcEnergyForce,
CalcEnergy,
GetNatom,
GetNparticle,
GetPositions,
GetForces,
GetPotentialEnergy,
GetCell,
GetQmmmCell,
SetPositions { data: Vec<f64> },
SetVelocities { data: Vec<f64> },
SetCell { data: Vec<f64> },
GetMoCount,
#[cfg(feature = "extended")]
IsQuickstep,
#[cfg(feature = "extended")]
GetStressTensor,
#[cfg(feature = "extended")]
GetVirialTensor,
#[cfg(feature = "extended")]
GetNmo { spin: i32 },
#[cfg(feature = "extended")]
GetEigenvalues { spin: i32 },
#[cfg(feature = "extended")]
GetOccupationNumbers { spin: i32 },
#[cfg(feature = "extended")]
GetHomoLumo { spin: i32 },
#[cfg(feature = "extended")]
GetMullikenCharges,
#[cfg(feature = "extended")]
GetHirshfeldCharges,
#[cfg(feature = "extended")]
GetDipoleMoment,
#[cfg(feature = "extended")]
GetScfInfo,
#[cfg(feature = "extended")]
GetEnergyComponents,
#[cfg(feature = "extended")]
GetNelectron,
#[cfg(feature = "extended")]
GetFermiEnergy,
#[cfg(feature = "extended")]
GetTotalSpin,
#[cfg(feature = "extended")]
GetGridInfo { spin: i32 },
#[cfg(feature = "extended")]
GetElectronDensity { spin: i32 },
#[cfg(feature = "extended")]
GetMoCoeffInfo { spin: i32 },
#[cfg(feature = "extended")]
GetMoCoefficients { spin: i32 },
#[cfg(feature = "extended")]
GetNkpoints,
#[cfg(feature = "extended")]
GetKpointEigenvalues { kpt_idx: i32, spin: i32 },
Shutdown,
GetVersion,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Request {
pub request_id: u64,
pub command: Command,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Status {
Ok,
Error(String),
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Payload {
Empty,
Int(i64),
UInt(u64),
Float(f64),
Bool(bool),
Array1(Vec<f64>),
Array2 {
rows: usize,
cols: usize,
data: Vec<f64>,
},
String(String),
HomoLumo {
homo: f64,
lumo: f64,
homo_idx: i32,
lumo_idx: i32,
},
EnergyComponents {
e_kin: f64,
e_hartree: f64,
e_xc: f64,
e_core: f64,
e_total: f64,
},
ScfInfo {
nsteps: i32,
converged: bool,
energy_change: f64,
},
GridInfo {
npts: [i32; 3],
origin: [f64; 3],
dh: [[f64; 3]; 3],
},
SharedArray3 {
shm_name: String,
dims: [usize; 3],
byte_size: usize,
},
SharedArray2 {
shm_name: String,
rows: usize,
cols: usize,
byte_size: usize,
},
MoCoeffInfo { nao: usize, nmo: usize },
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Response {
pub request_id: u64,
pub status: Status,
pub payload: Payload,
}
impl Response {
pub fn ok(request_id: u64, payload: Payload) -> Self {
Response {
request_id,
status: Status::Ok,
payload,
}
}
pub fn error(request_id: u64, msg: impl Into<String>) -> Self {
Response {
request_id,
status: Status::Error(msg.into()),
payload: Payload::Empty,
}
}
}