mod ffi;
#[cfg(feature = "extended")]
mod ffi_extended;
mod force_env;
pub mod worker_protocol;
pub mod worker;
#[cfg(feature = "mpi")]
use mpi::{ffi::MPI_Comm_c2f, raw::AsRaw};
pub use force_env::{CP2KError, CP2KResult, ForceEnv};
#[cfg(feature = "python")]
pub mod python;
pub fn init() -> CP2KResult<()> {
unsafe {
let result = ffi::cp2k_init_with_mpi_check();
if result != 0 {
return Err(CP2KError::InitializationError(format!(
"CP2K initialization failed with code {}",
result
)));
}
}
Ok(())
}
pub fn init_without_mpi() -> CP2KResult<()> {
unsafe {
ffi::cp2k_init_without_mpi();
}
Ok(())
}
pub fn finalize() -> CP2KResult<()> {
unsafe {
let result = ffi::cp2k_finalize_with_mpi_check();
if result != 0 {
return Err(CP2KError::FinalizationError(format!(
"CP2K finalization failed with code {}",
result
)));
}
}
Ok(())
}
pub fn finalize_without_mpi() -> CP2KResult<()> {
unsafe {
ffi::cp2k_finalize_without_mpi();
}
Ok(())
}
pub fn get_version() -> CP2KResult<String> {
const MAX_VERSION_LEN: usize = 256;
let mut version_buf = vec![0u8; MAX_VERSION_LEN];
unsafe {
ffi::cp2k_get_version(version_buf.as_mut_ptr() as *mut i8, MAX_VERSION_LEN as i32);
}
let end = version_buf
.iter()
.position(|&c| c == 0)
.unwrap_or(version_buf.len());
version_buf.truncate(end);
Ok(String::from_utf8(version_buf)?)
}
pub fn run_input(input_file: &str, output_file: &str) -> CP2KResult<()> {
let input_c = std::ffi::CString::new(input_file)?;
let output_c = std::ffi::CString::new(output_file)?;
unsafe {
ffi::cp2k_run_input(input_c.as_ptr(), output_c.as_ptr());
}
Ok(())
}
#[cfg(feature = "mpi")]
pub fn run_input_comm(
input_file: &str,
output_file: &str,
comm: &mpi::topology::SimpleCommunicator,
) -> CP2KResult<()> {
let input_c = std::ffi::CString::new(input_file)?;
let output_c = std::ffi::CString::new(output_file)?;
let raw_comm = comm.as_raw();
let fortran_comm = unsafe { MPI_Comm_c2f(raw_comm) };
unsafe {
ffi::cp2k_run_input_comm(input_c.as_ptr(), output_c.as_ptr(), fortran_comm);
}
Ok(())
}