use crate::grid::cell::Cell;
use crate::grid::geometry::{CornerPointGeom, Pillar};
use crate::grid::index::{Dims, Ijk};
use crate::grid::klayer::KLayer;
use crate::grid::property::Properties;
#[derive(Debug, Clone)]
pub struct Grid {
geom: CornerPointGeom,
properties: Properties,
layers: Vec<KLayer>,
}
impl Grid {
#[must_use]
pub fn new(geom: CornerPointGeom) -> Self {
let dims = geom.dims();
let layers = (0..dims.nk).map(KLayer::new).collect();
let properties = Properties::new(dims.cell_count());
Self {
geom,
properties,
layers,
}
}
#[must_use]
pub fn take_geometry_buffers(&mut self) -> (Vec<Pillar>, Vec<f64>) {
self.geom.take_buffers()
}
pub fn install_geometry(&mut self, dims: Dims, coord: Vec<Pillar>, zcorn: Vec<f64>) {
let nk = dims.nk;
let cell_count = dims.cell_count();
self.geom.install(dims, coord, zcorn);
if self.layers.len() != nk {
self.layers = (0..nk).map(KLayer::new).collect();
}
self.properties.set_cell_count(cell_count);
}
#[must_use]
pub fn dims(&self) -> Dims {
self.geom.dims()
}
#[must_use]
pub fn geometry(&self) -> &CornerPointGeom {
&self.geom
}
#[must_use]
pub fn cell_count(&self) -> usize {
self.geom.dims().cell_count()
}
#[must_use]
#[inline]
pub fn cell(&self, c: Ijk) -> Cell {
Cell {
ijk: c,
corners: self.geom.cell_corners(c),
}
}
pub fn cells(&self) -> impl Iterator<Item = Cell> + '_ {
self.geom.dims().iter().map(|c| self.cell(c))
}
#[must_use]
#[inline]
pub fn cell_centroid_z_at(&self, lin: usize) -> f64 {
self.geom.centroid_z_at(lin)
}
#[must_use]
#[inline]
pub fn cell_volume_at(&self, lin: usize) -> f64 {
self.geom.cell_volume_at(lin)
}
#[must_use]
pub fn bulk_volume(&self) -> f64 {
(0..self.cell_count())
.map(|i| self.geom.cell_volume_at(i))
.sum()
}
#[must_use]
pub fn properties(&self) -> &Properties {
&self.properties
}
pub fn properties_mut(&mut self) -> &mut Properties {
&mut self.properties
}
#[must_use]
pub fn layers(&self) -> &[KLayer] {
&self.layers
}
}