class Hargreaves(Model): def initial(self): self.temperature_module = Temperature(self) self.extraterrestrial_radiation_module = ExtraterrestrialRadiation( self) self.temperature_module.initial() self.extraterrestrial_radiation_module.initial() self.ETref = np.zeros((self.domain.nxy)) self.reporting_module = Reporting(self, variable_list, config_section='ETREF') self.reporting_module.initial() def hargreaves(self): self.ETref = ( 0.0023 * (self.extraterrestrial_radiation * 0.408) # MJ m-2 d-1 -> mm d-1 * ((np.maximum(0, (self.tmean.values[0, self.domain.mask.values] - 273.0))) + 17.8) * np.sqrt( np.maximum(0, (self.tmax.values[0, self.domain.mask.values] - self.tmin.values[0, self.domain.mask.values])))) def dynamic(self): self.temperature_module.dynamic() self.extraterrestrial_radiation_module.dynamic() self.hargreaves() self.reporting_module.dynamic()
def initial(self): self.temperature_module = Temperature(self) self.extraterrestrial_radiation_module = ExtraterrestrialRadiation( self) self.temperature_module.initial() self.extraterrestrial_radiation_module.initial() self.ETref = np.zeros((self.domain.nxy)) self.reporting_module = Reporting( self, variable_list, config_section='ETREF') self.reporting_module.initial()
def initial(self): # self.longwave_radiation_module.initial() self.shortwave_radiation_module.initial() self.extraterrestrial_radiation_module.initial() self.relative_humidity_module.initial() self.specific_humidity_module.initial() self.surface_pressure_module.initial() self.vapour_pressure_module.initial() self.net_radiation_module.initial() self.temperature_module.initial() self.wind_module.initial() self.reporting_module = Reporting(self, variable_list) self.reporting_module.initial()
class PenmanMonteith(Model): def __init__(self, config, time, domain, init=None): super(PenmanMonteith, self).__init__(config, time, domain, is_1d=True, init=init) self.temperature_module = Temperature(self) # self.longwave_radiation_module = LongwaveRadiation(self) self.shortwave_radiation_module = ShortwaveRadiation(self) self.extraterrestrial_radiation_module = ExtraterrestrialRadiation( self) self.relative_humidity_module = RelativeHumidity(self) self.specific_humidity_module = SpecificHumidity(self) self.surface_pressure_module = SurfacePressure(self) self.vapour_pressure_module = VapourPressure(self) self.net_radiation_module = NetRadiation(self) self.wind_module = Wind(self) self.ETref = np.zeros((self.domain.nxy)) def initial(self): # self.longwave_radiation_module.initial() self.shortwave_radiation_module.initial() self.extraterrestrial_radiation_module.initial() self.relative_humidity_module.initial() self.specific_humidity_module.initial() self.surface_pressure_module.initial() self.vapour_pressure_module.initial() self.net_radiation_module.initial() self.temperature_module.initial() self.wind_module.initial() self.reporting_module = Reporting(self, variable_list) self.reporting_module.initial() def penman_monteith(self): """Function implementing the Penman-Monteith equation (*NOT* FAO version) """ cp = 0.001013 # specific heat of air 1013 [MJ kg-1 K-1] TimeStepSecs = 86400 # timestep in seconds rs = 70 # surface resistance, 70 [s m-1] R = 287.058 # Universal gas constant [J kg-1 K-1] # ratio of water vapour/dry air molecular weights [-] eps = 0.622 # g = 9.81 # gravitational constant [m s-2] rho = self.surface_pressure.values / \ (self.tmean.values * R) # density of air [kg m-3] # latent heat [MJ kg-1] latent_heat = (2.501 - (0.002361 * (self.tmean.values - 273.15))) # slope of vapour pressure [kPa K-1] deltop = 4098. * \ (0.6108 * np.exp((17.27 * (self.tmean.values - 273.15)) / ((self.tmean.values - 273.15) + 237.3))) delbase = ((self.tmean.values - 273.15) + 237.3)**2 delta = deltop / delbase # psychrometric constant [kPa K-1] gamma = cp * (self.surface_pressure.values / 1000) / \ (eps * latent_heat) # aerodynamic resistance [m s-1] z = 10 # height of wind speed variable (10 meters above surface) Wsp_2 = self.wind.values * 4.87 / (np.log(67.8 * z - 5.42)) ra = np.divide(208., Wsp_2, out=np.zeros_like(Wsp_2), where=Wsp_2 != 0) # Penman-Monteith equation (NB unit conversion) PETtop = np.maximum( ((delta * 1e3) * self.net_radiation + rho * (cp * 1e6) * np.divide(self.vapour_pressure_deficit, ra, out=np.zeros_like(ra), where=ra != 0)), 1) PETbase = np.maximum( ((delta * 1e3) + (gamma * 1e3) * (1 + np.divide(rs, ra, out=np.zeros_like(ra), where=ra != 0))), 1) PET = np.maximum(PETtop / PETbase, 0) PETmm = np.maximum((PET / (latent_heat * 1e6) * TimeStepSecs), 0) self.ETref = PETmm.copy() # FAO Penman-Monteith: # PETtop = ( # (0.408 * delta * self.net_radiation * 0.086400) # + (gamma # * (900 / self.tmean) # * Wsp_2 # * self.vapour_pressure_deficit / 1e3) # ) # PETbot = (delta + gamma * (1 + 0.34 * Wsp_2)) # PETmm = PETtop / PETbot # self.ETref = PETmm.copy() def dynamic(self): # logger.info("Reading forcings for time %s", self._modelTime) self.temperature_module.dynamic() # self.longwave_radiation_module.dynamic() self.shortwave_radiation_module.dynamic() self.extraterrestrial_radiation_module.dynamic() self.relative_humidity_module.dynamic() self.specific_humidity_module.dynamic() self.surface_pressure_module.dynamic() self.vapour_pressure_module.dynamic() self.net_radiation_module.dynamic() self.wind_module.dynamic() self.penman_monteith() self.reporting_module.dynamic()