Rock and saturation properties ============================== Rock records ------------ Each physical layer uses ``[Kxy, Kz, porosity, thickness, z_cells]``. Only the final boundary-rock record may use ``[Kxy, Kz, porosity]``. Permeabilities are non-negative, porosity lies in [0, 1], thickness is positive, and cell counts are positive integers. Saturation expressions ---------------------- ``krw``, ``krn``, and ``pcap`` are restricted Python expressions that must reference ``sw``. Approved positional NumPy functions include ``np.maximum``, ``np.minimum``, ``np.clip``, ``np.where``, ``np.exp``, ``np.log``, and related safe numerical functions. Saturation records ------------------ Every ``safu`` row has 11 entries: ``swi``, ``sni``, wetting and non-wetting end points, entry pressure, three exponents, capillary threshold, low-saturation control, and number of points. Endpoint saturations lie in [0, 1] and sum to at most one. At least two table points are required. Hysteresis and boundary behavior -------------------------------- ``ehystr`` configures EHYSTR. ``pvmult`` controls boundary pore volume: positive values apply a multiplier, zero may use producers, and -1 disables it.