Source code for pedophysics.predict.water_perm
import numpy as np
from pedophysics.pedophysical_models.water_perm import *
[docs]def WaterPerm(soil):
"""
Calculate or set missing values of soil.df.water_perm and return
Determines the soil water phase real dielectric permittivity using either the MalmbergMaryott
function or the Olhoeft function based on the soil's salinity and
frequency permittivity.
If the permittivity cannot be determined by either method, it defaults
to a value of 80.
Parameters
----------
soil : object
A custom soil object that contains:
- water_perm : array-like
Soil water phase real dielectric permittivity [-]
- temperature : array-like
Soil bulk temperature [K]
- salinity : array-like
Soil salinity (NaCl) of the bulk pore fluid [mol/L]
- frequency_perm : array-like
Frequency of dielectric permittivity measurement [Hz]
- df : DataFrame
Data Frame containing all the quantitative information of soil array-like attributes for each state
- info : DataFrame
Data Frame containing descriptive information about how each array-like attribute was determined or modified.
- n_states : int
Number of states or records in the dataframe.
Returns
-------
np.ndarray
soil.df.water_perm.values: array containing the updated soil water phase real dielectric permittivity values.
Notes
-----
This function modifies the soil object in-place by updating the `df` and `info` dataframes.
External functions
--------
MalmbergMaryott : Calculate soil water phase real dielectric permittivity using the Malmberg & Maryott model and return
Olhoeft : Calculate soil water phase real dielectric permittivity using the Olhoeft (1986) model and return
Example
-------
>>> sample = Soil()
>>> sample.df.water_perm
0 NaN
Name: water_perm, dtype: float64
>>> WaterPerm(sample)
>>> sample.df.water_perm
0 80
Name: water_perm, dtype: float64
"""
if (np.isnan(soil.df.water_perm)).any(): # Go over if any value is missing
soil.info['water_perm'] = ["Calculated using MalmbergMaryott function (RMSE = 0.0046)" if np.isnan(soil.df.water_perm[x]) & ((soil.df.salinity[x] == 0) or np.isnan(soil.df.salinity[x])) & (soil.df.frequency_perm[x] <= 100e6) & (soil.df.frequency_perm[x] >= 1e5)
or soil.info.water_perm[x] == "Calculated using MalmbergMaryott function (RMSE = 0.0046)"
else soil.info.water_perm[x] for x in range(soil.n_states)]
soil.df['water_perm'] = [np.round(MalmbergMaryott(soil.df.temperature.values[x]), soil.roundn) if np.isnan(soil.df.water_perm[x]) & ((soil.df.salinity[x] == 0) or np.isnan(soil.df.salinity[x])) & (soil.df.frequency_perm[x] <= 100e6) & (soil.df.frequency_perm[x] >= 1e5) else soil.df.water_perm[x] for x in range(soil.n_states)]
soil.info['water_perm'] = ["Calculated using Olhoeft function" if np.isnan(soil.df.water_perm[x]) & ~np.isnan(soil.df.salinity[x]) & (soil.df.frequency_perm[x] < 100e6)
or soil.info.water_perm[x] == "Calculated using Olhoeft function"
else soil.info.water_perm[x] for x in range(soil.n_states)]
soil.df['water_perm'] = [np.round(Olhoeft(soil.df.temperature.values[x], soil.df.salinity[x]), soil.roundn) if np.isnan(soil.df.water_perm[x]) & ~np.isnan(soil.df.salinity[x]) & (soil.df.frequency_perm[x] < 100e6) else soil.df.water_perm[x] for x in range(soil.n_states)]
soil.info['water_perm'] = ["Set as 80 by default" if np.isnan(soil.df.water_perm[x])
or soil.info.water_perm[x] == "Set as 80 by default"
else soil.info.water_perm[x] for x in range(soil.n_states)]
soil.df['water_perm'] = [80 if np.isnan(soil.df.water_perm[x]) else soil.df.water_perm[x] for x in range(soil.n_states)]
return soil.df.water_perm.values