use crate::numerical::matrix::Matrix;
use crate::physics::physics_sim::ising_statistical::IsingParameters;
use crate::physics::physics_sim::ising_statistical::{
self,
};
#[repr(C)]
pub struct IsingResultHandle {
pub grid: *mut Matrix<f64>,
pub magnetization: f64,
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_physics_sim_ising_run(
width: usize,
height: usize,
temperature: f64,
mc_steps: usize,
) -> IsingResultHandle {
let params = IsingParameters {
width,
height,
temperature,
mc_steps,
};
let (grid, mag) = ising_statistical::run_ising_simulation(¶ms);
let grid_f64: Vec<f64> = grid.into_iter().map(f64::from).collect();
let matrix = Matrix::new(height, width, grid_f64);
IsingResultHandle {
grid: Box::into_raw(Box::new(matrix)),
magnetization: mag,
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_physics_sim_ising_free_result(handle: IsingResultHandle) {
unsafe {
if !handle.grid.is_null() {
let _ = Box::from_raw(handle.grid);
}
}
}