Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
 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()
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
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()