use super::*;
#[derive(Debug)]
pub struct GiadrL2 {
pub contents:GiadrL2Contents,
pub error_data:GiadrL2ErrorData,
}
#[derive(Debug)]
pub struct GiadrL2Contents {
pub pressure_levels_temp:Vec<f64>,
pub pressure_levels_humidity:Vec<f64>,
pub pressure_levels_ozone:Vec<f64>,
pub surface_emissivity_wavelengths:Vec<f64>,
}
#[derive(Debug)]
pub struct GiadrL2ErrorData {
pub num_temperature_pcs:u8,
pub num_water_vapour_pcs:u8,
pub num_ozone_pcs:u8,
}
impl GiadrL2 {
pub fn read_bin<R:Read+Seek>(rd:&mut NatReader<R>,rec:&Grh)->Result<Self> {
let contents = GiadrL2Contents::read_bin(rd,rec)?;
let error_data = GiadrL2ErrorData::read_bin(rd,rec)?;
Ok(Self {
contents,
error_data
})
}
}
impl GiadrL2Contents {
pub fn read_bin<R:Read+Seek>(rd:&mut NatReader<R>,rec:&Grh)->Result<Self> {
rec.seek_to_record(rd,20)?;
let pressure_levels_temp = read_vec_and_scale(rd,1e2)?;
rec.seek_to_record(rd,425)?;
let pressure_levels_humidity = read_vec_and_scale(rd,1e2)?;
rec.seek_to_record(rd,830)?;
let pressure_levels_ozone = read_vec_and_scale(rd,1e2)?;
rec.seek_to_record(rd,1235)?;
let surface_emissivity_wavelengths = read_vec_and_scale(rd,1e4)?;
Ok(Self {
pressure_levels_temp,
pressure_levels_humidity,
pressure_levels_ozone,
surface_emissivity_wavelengths
})
}
}
impl GiadrL2ErrorData {
pub fn read_bin<R:Read+Seek>(rd:&mut NatReader<R>,rec:&Grh)->Result<Self> {
rec.seek_to_record(rd,1284)?;
let num_temperature_pcs = u8::read_bin(rd)?;
let num_water_vapour_pcs = u8::read_bin(rd)?;
let num_ozone_pcs = u8::read_bin(rd)?;
Ok(Self {
num_temperature_pcs,
num_water_vapour_pcs,
num_ozone_pcs
})
}
fn ntri(n:u8)->usize {
let n = n as usize;
(n*(n + 1))/2
}
pub fn nerrt(&self)->usize { Self::ntri(self.num_temperature_pcs) }
pub fn nerrw(&self)->usize { Self::ntri(self.num_water_vapour_pcs) }
pub fn nerro(&self)->usize { Self::ntri(self.num_ozone_pcs) }
}