pub(crate) mod error;
pub(crate) use error::BeamError;
use marlu::{ndarray, AzEl, Jones};
use ndarray::Array2;
cfg_if::cfg_if! {
if #[cfg(feature = "cuda")] {
use marlu::cuda::*;
use super::CudaFloat;
}
}
#[allow(clippy::upper_case_acronyms)]
pub enum BeamType {
FEE,
Analytic,
AnalyticRTS,
None,
}
pub trait Beam: Sync + Send {
fn get_beam_type(&self) -> BeamType;
fn get_num_tiles(&self) -> usize;
fn calc_jones(
&self,
azel: AzEl,
freq_hz: f64,
tile_index: usize,
) -> Result<Jones<f64>, BeamError>;
fn calc_jones_array(
&self,
azels: &[AzEl],
freq_hz: f64,
tile_index: usize,
) -> Result<Vec<Jones<f64>>, BeamError>;
fn find_closest_freq(&self, desired_freq_hz: f64) -> f64;
fn empty_coeff_cache(&self);
#[cfg(feature = "cuda")]
unsafe fn prepare_cuda_beam(&self, freqs_hz: &[u32]) -> Result<Box<dyn BeamCUDA>, BeamError>;
}
#[cfg(feature = "cuda")]
pub trait BeamCUDA {
unsafe fn calc_jones(
&self,
azels: &[AzEl],
) -> Result<DevicePointer<Jones<CudaFloat>>, BeamError>;
fn get_beam_type(&self) -> BeamType;
fn get_tile_map(&self) -> *const i32;
fn get_freq_map(&self) -> *const i32;
fn get_num_unique_freqs(&self) -> i32;
}
#[derive(Debug)]
pub enum Delays {
Full(Array2<u32>),
Partial(Vec<u32>),
None,
NotNecessary,
}