use ndarray::{Array1, Array2, ArrayView1, ArrayView2, ArrayView3};
use refeff_core::{Real, SfconvSo2convXanesPreparation};
use crate::chi_dat::ChiDatData;
use crate::sfconv_input::{SfconvSo2convFeffPathData, SfconvSo2convTargetData};
use crate::xmu_dat::XmuDatData;
pub const SPECFUNCT_DAT_INFO_COLUMNS: usize = 8;
#[derive(Debug, Clone, PartialEq)]
pub struct SfconvSpecfunctData {
pub wigner_seitz_radius: f64,
pub core_hole_lifetime: f64,
pub asymmetric_phase: i32,
pub satellite_type: i32,
pub low_q_mode: i32,
pub pole_count: usize,
pub pole_energy: Array1<f64>,
pub pole_broadening: Array1<f64>,
pub pole_weight: Array1<f64>,
pub spectral_info: Array2<f64>,
pub weights: Array2<f64>,
pub extrinsic_quasiparticle: Array2<f64>,
pub extrinsic_satellite: Array2<f64>,
pub interference_quasiparticle: Array2<f64>,
pub interference_satellite: Array2<f64>,
pub intrinsic_satellite: Array2<f64>,
pub clipped_extrinsic_satellite: Array2<f64>,
pub energy_grid: Array2<f64>,
}
impl SfconvSpecfunctData {
#[must_use]
pub fn pole_capacity(&self) -> usize {
self.pole_energy.len()
}
#[must_use]
pub fn momentum_count(&self) -> usize {
self.spectral_info.nrows()
}
#[must_use]
pub fn spectral_point_count(&self) -> usize {
self.energy_grid.ncols()
}
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctCompatibilityInput<'a> {
pub wigner_seitz_radius: f64,
pub core_hole_lifetime: f64,
pub asymmetric_phase: i32,
pub satellite_type: i32,
pub low_q_mode: i32,
pub pole_count: usize,
pub pole_energy: ArrayView1<'a, f64>,
pub pole_broadening: ArrayView1<'a, f64>,
pub pole_weight: ArrayView1<'a, f64>,
pub momentum_grid: ArrayView1<'a, f64>,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctExafsRowsInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub signal_energy: ArrayView1<'a, Real>,
pub real_signal: ArrayView1<'a, Real>,
pub imaginary_signal: ArrayView1<'a, Real>,
pub original_magnitude: ArrayView1<'a, Real>,
pub original_phase: ArrayView1<'a, Real>,
pub phase_minus_2kr: ArrayView1<'a, Real>,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub active_len: usize,
pub chemical_potential: Real,
pub cutoff: bool,
pub plasma_frequency: Real,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctXanesRowsInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub prepared: &'a SfconvSo2convXanesPreparation,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub active_len: usize,
pub chemical_potential: Real,
pub cutoff: bool,
pub plasma_frequency: Real,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctChiDataInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub source: &'a ChiDatData,
pub material: refeff_core::SfconvSo2convMaterialInput,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub work_len: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctFeffPathDataInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub source: &'a SfconvSo2convFeffPathData,
pub material: refeff_core::SfconvSo2convMaterialInput,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub work_len: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctTargetDataInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub source: &'a SfconvSo2convTargetData,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub work_len: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctXmuDataInput<'a> {
pub cache: &'a SfconvSpecfunctData,
pub source: &'a XmuDatData,
pub material: refeff_core::SfconvSo2convMaterialInput,
pub photoelectron_momentum: ArrayView1<'a, Real>,
pub work_len: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct SfconvSpecfunctSpectralRowsInput<'a> {
pub wigner_seitz_radius: f64,
pub core_hole_lifetime: f64,
pub asymmetric_phase: i32,
pub satellite_type: i32,
pub low_q_mode: i32,
pub pole_count: usize,
pub pole_energy: ArrayView1<'a, f64>,
pub pole_broadening: ArrayView1<'a, f64>,
pub pole_weight: ArrayView1<'a, f64>,
pub spectral_info: ArrayView2<'a, f64>,
pub weights: ArrayView2<'a, f64>,
pub spectral_function: ArrayView3<'a, f64>,
pub energy_grid: ArrayView2<'a, f64>,
}