!! Compute evapotranspiration !|author: Giovanni Ravazzani ! license: GPL ! !### History ! ! current version 1.2 - 8th March 2023 ! ! | version | date | comment | ! |----------|-------------|----------| ! | 1.0 | 08/Jun/2021 | Original code | ! | 1.1 | 27/Jan/2023 | subroutine HargreavesSamaniModified added | ! | 1.2 | 08/Mar/2023 | etEnergyBalanceGround | ! !### License ! license: GNU GPL ! !### Module Description ! Module to compute evapotranspiration ! MODULE Evapotranspiration ! Modules used: USE DataTypeSizes, ONLY : & ! Imported Parameters: float, short USE Loglib, ONLY : & !Imported routines: Catch USE StringManipulation, ONLY : & !imported routines ToString USE GridLib, ONLY : & !Imported types: grid_real, grid_integer, & !Imported routines: NewGrid , GetDtGrid !, & !GridDestroy, ExportGrid, & !SetLongName, SetStandardName, & !SetUnits, SetCurrentTime, & !Imported parameters: !NET_CDF, ESRI_ASCII, & !ESRI_BINARY USE GridOperations, ONLY : & !imported routines: CRSisEqual, GridByIni, & !imported operators: ASSIGNMENT (=) USE IniLib, ONLY : & !Imported types: IniList, & !Imported routines: IniOpen, IniClose, & IniReadInt, IniReadReal, & KeyIsPresent, IniReadString, & SectionIsPresent USE Chronos, ONLY : & !imported definitions: DateTime, & !Imported routines: DayOfYear, & !Imported operations: OPERATOR (+), & OPERATOR (==), & OPERATOR (<), & ASSIGNMENT (=) USE Units, ONLY : & !imported parameters: pi, millimeter, day USE DomainProperties, ONLY : & !imported variables: mask, latCentroid USE MorphologicalProperties, ONLY : & !imported variables: dem, dem_loaded USE AirTemperature, ONLY : & !Imported variables: dtTemperature, temperatureAir USE AirTemperatureDailyMax , ONLY : & !imported variables: dtTemperatureDailyMax, temperatureAirDailyMax USE AirTemperatureDailyMin , ONLY : & !imported variables: dtTemperatureDailyMin, temperatureAirDailyMin USE AirTemperatureDailyMean , ONLY : & !imported variables: dtTemperatureDailyMean, temperatureAirDailyMean USE AirRelativeHumidity, ONLY : & !Imported variables: dtRelHumidity, relHumidityAir, hygrometers USE WindFlux, ONLY : & !Imported variables: dtWindSpeed, windSpeed, & anemometersWS USE SolarRadiation, ONLY : & !Imported routines: dtRadiation, netRadiation, netRadiationFAO USE Plants, ONLY : & !Imported variables: fvcover, fvcoverLoaded, & lai, laiLoaded, & plantsHeight, plantsHeightLoaded, & rsMinLoaded, rsMin USE ObservationalNetworks, ONLY : & !Imported types: ObservationalNetwork, & !Imported routines: ReadMetadata, ReadData !, & !CopyNetwork , & !Imported operators: !ASSIGNMENT (=) USE Utilities, ONLY : & !imported routines: GetUnit USE MeteoUtilities, ONLY: & !Imported routines: ReadField IMPLICIT NONE ! Global (i.e. public) Declarations: TYPE (grid_real) :: pet !!potential evapotranspiration rate [m/s] TYPE (grid_real) :: pe !!potential evaporation rate [m/s] TYPE (grid_real) :: pt !!potential transpiration rate [m/s] INTEGER (KIND = short) :: dtET !! time step computation [s] !Private declarations INTEGER (KIND = short), PRIVATE, PARAMETER :: ET_MODELS = 6 INTEGER (KIND = short), PRIVATE, PARAMETER :: PENMAN_MONTEITH = 1 INTEGER (KIND = short), PRIVATE, PARAMETER :: PRIESTLEY_TAYLOR = 2 INTEGER (KIND = short), PRIVATE, PARAMETER :: HARGREAVES = 3 INTEGER (KIND = short), PRIVATE, PARAMETER :: HARGREAVES_MOD = 4 INTEGER (KIND = short), PRIVATE, PARAMETER :: FAO56_PENMAN_MONTEITH = 5 INTEGER (KIND = short), PRIVATE, PARAMETER :: ENERGY_BALANCE = 6 TYPE (grid_integer), PRIVATE :: model_map TYPE (grid_integer), PRIVATE :: kc_code_map !!map of crop coefficient code TYPE (grid_real), PRIVATE :: kc_map !! crop coefficient map INTEGER (KIND = short), PRIVATE :: model_vector ( ET_MODELS ) !!defines active models INTEGER (KIND = short), PRIVATE :: model !!model to compute ET INTEGER (KIND = short), PRIVATE :: model_assignment !!method to assign computation !!1 = one method for the entire domain, 2 = a map with model codes INTEGER (KIND = short), PRIVATE :: fileunitKc INTEGER (KIND = short), PRIVATE :: dtKc = 0 INTEGER (KIND = short), PRIVATE :: interpolationMethodKc INTEGER (KIND = short), PRIVATE :: dtGridKc CHARACTER (LEN = 300), PRIVATE :: filenameKc TYPE (DateTime), PRIVATE :: tnewET TYPE (DateTime), PRIVATE :: tNewKc LOGICAL, PRIVATE :: compute_hargreaves = .FALSE. LOGICAL, PRIVATE :: useCropCoefficient = .FALSE. TYPE (ObservationalNetwork), PRIVATE :: kc_stations !! pseudo station to read kc time series values !Public routines PUBLIC :: ETinit PUBLIC :: PETupdate PUBLIC :: etEnergyBalanceGround !Local routines PRIVATE :: HargreavesSamani PRIVATE :: HargreavesSamaniModified PRIVATE :: PriestleyTaylor PRIVATE :: PenmanMonteith PRIVATE :: FAO56PenmanMonteith PRIVATE :: KcUpdate !======= CONTAINS !======= ! Define procedures contained in this module. !============================================================================== !| Description: ! Initialize evapotranspiration computation SUBROUTINE ETinit & ! ( inifile, time ) IMPLICIT NONE !Arguments with intent(in): CHARACTER (LEN = *), INTENT(IN) :: inifile TYPE (DateTime), INTENT(IN) :: time !local declarations: TYPE (IniList) :: etini INTEGER (KIND = short) :: i, j !------------------------------end of declarations----------------------------- !open and read configuration file CALL IniOpen (inifile, etini) !dt IF (KeyIsPresent('dt', etini) ) THEN dtET = IniReadInt ('dt', etini) ELSE CALL Catch ('error', 'Evapotranspiration', & 'dt missing in configuration file' ) END IF !initialize PET map CALL NewGrid (pet, mask) CALL NewGrid (pe, mask) CALL NewGrid (pt, mask) !model assignment method IF (KeyIsPresent('model-assignment', etini ) ) THEN model_assignment = IniReadInt ('model-assignment', etini) ELSE CALL Catch ('error', 'Evapotranspiration', & 'model-assignment missing in configuration file') END IF !set model IF (model_assignment == 1) THEN model = IniReadInt ('model', etini ) CALL NewGrid (model_map, mask) CALL CheckSpecificProperties (model, etini) model_map = model ELSE model = -1 !check map is present IF ( .NOT. SectionIsPresent ('model-map', etini) ) THEN CALL Catch ('error', 'Evapotranspiration', & 'model-map missing in configuration file') END IF !read map CALL GridByIni (etini, model_map, 'model-map') IF ( .NOT. CRSisEqual (mask, model_map, .TRUE.) ) THEN CALL Catch ('error', 'Evapotranspiration', & 'something seems wrong in model-map') END IF !scan for et models model_vector = -1 DO i = 1, model_map % idim DO j = 1, model_map % jdim IF (model_map % mat(i,j) /= model_map % nodata) THEN model_vector (model_map % mat (i,j)) = model_map % mat (i,j) END IF END DO END DO DO i = 1, ET_MODELS CALL CheckSpecificProperties (model_vector (i), etini) END DO END IF !crop coefficient IF ( KeyIsPresent ('use-crop-coefficient', etini) ) THEN IF (IniReadInt ('use-crop-coefficient', etini) == 1 ) THEN useCropCoefficient = .TRUE. END IF END IF IF (useCropCoefficient) THEN IF ( .NOT. SectionIsPresent ('crop-coefficient', etini) ) THEN CALL Catch ('error', 'Evapotranspiration', & 'crop-coefficient section is missing in configuration file' ) END IF !allocate map CALL NewGrid (kc_map, mask) !file filenameKc = IniReadString ('file', etini, section = 'crop-coefficient') !interpolation method interpolationMethodKc = IniReadInt ('interpolation', etini, section = 'crop-coefficient') IF (interpolationMethodKc == 0) THEN !data are stored in net-cdf file IF ( KeyIsPresent ('variable', etini, section = 'crop-coefficient') ) THEN kc_map % var_name = IniReadString ('variable', etini, section = 'crop-coefficient') ELSE IF (KeyIsPresent ('standard_name', etini, section = 'crop-coefficient') ) THEN kc_map % standard_name = IniReadString ('standard_name', etini, section = 'crop-coefficient') ELSE CALL Catch ('error', 'Evapotranspiration', & 'standard_name or variable missing in section crop-coefficient' ) END IF !Get the dt of imported field. Assume dt is regular dtKc = GetDtGrid (filenameKc, .TRUE.) ELSE !open file containing local measurements fileunitKc = GetUnit () OPEN ( fileunitKc, file = filenameKc (1:LEN_TRIM(filenameKc)), status = 'old') !populate metadata CALL ReadMetadata (fileunitKc, kc_stations) !set dt dtKc = kc_stations % timeIncrement !read map of crop coefficient code CALL GridByIni (ini = etini, grid = kc_code_map, & section = 'crop-coefficient', subsection = 'code-map') END IF !set time tnewKc = time END IF !set time tnewET = time ! Configuration terminated. Deallocate ini database CALL IniClose (etini) RETURN END SUBROUTINE ETinit !============================================================================== !| Description: ! Compute potential evapotranspiration SUBROUTINE PETupdate & ! ( time ) IMPLICIT NONE !Arguments with intent(in): TYPE (DateTime), INTENT(IN) :: time !local declarations: INTEGER (KIND = short) :: i, j INTEGER (KIND = short) :: jDay !!julian day REAL (KIND = float) :: sunsetHourAngle !!sunset hour angle [radians] REAL (KIND = float) :: relDist !!relative distance between the earth and the sun REAL (KIND = float) :: declination !! declination REAL (KIND = float) :: etRad !!extra terrestrial solar radiation [mm/day] !------------------------------end of declarations----------------------------- !Update Kc IF (dtKc > 0 ) THEN IF( time == tNewKc ) THEN CALL KcUpdate (time) tNewKc = tNewKc + dtKc END IF END IF IF ( time == tnewET ) THEN !it's time to update ET !set next time to update PET tnewET = tnewET + dtET IF ( compute_hargreaves ) THEN !compute values for applying Hargreaves !calculate solar declination jDay = DayOfYear(time,'noleap') declination = 0.4093 * SIN( 2. * pi * jDay / 365. - 1.405 ) !calculate sunset hour angle sunsetHourAngle = ACOS( - TAN (latCentroid) * TAN (declination) ) !calculate relative distance between the earth and the sun relDist = 1. + 0.033 * COS(2. * pi * jDay / 365.) !calculate extra terrestrial solar radiation (Allen et al. 1998) etRad = 15.392 * relDist * ( sunsetHourAngle * SIN(latCentroid) * & SIN(declination) + COS(latCentroid) * & COS(declination) * SIN(sunsetHourAngle) ) END IF DO i = 1, model_map % idim DO j = 1, model_map % jdim IF ( model_map % mat (i,j) /= model_map % nodata) THEN SELECT CASE (model_map % mat (i,j) ) CASE (HARGREAVES) CALL HargreavesSamani (time, temperatureAirDailyMean % mat(i,j), & temperatureAirDailyMax % mat(i,j), & temperatureAirDailyMin % mat (i,j), & etRad, pet % mat(i,j) ) pe % mat (i,j) = pet % mat(i,j) pt % mat (i,j) = pet % mat(i,j) CASE (HARGREAVES_MOD) CALL HargreavesSamaniModified (time, & temperatureAirDailyMean % mat(i,j), & temperatureAirDailyMax % mat(i,j), & temperatureAirDailyMin % mat (i,j), & etRad, dem % mat (i,j), & pet % mat(i,j) ) pe % mat (i,j) = pet % mat(i,j) pt % mat (i,j) = pet % mat(i,j) CASE (PRIESTLEY_TAYLOR) CALL PriestleyTaylor (temperatureAir % mat (i,j), & netRadiation % mat (i,j), & fvcover % mat (i,j), & dem % mat (i,j), & pt % mat (i,j), & pe % mat (i,j), & pet % mat (i,j) ) CASE (PENMAN_MONTEITH) !CALL PetPM (R = netRadiation % mat (i,j), & ! T = temperatureAir % mat (i,j), & ! W = windSpeed % mat (i,j), & ! rs = rsMin % mat (i,j), & ! v = fvcover % mat (i,j), & ! lai = lai % mat (i,j), & ! z = plantsHeight % mat (i,j), & ! um = relHumidityAir % mat (i,j), & ! quota = dem % mat (i,j), & ! pet = pet % mat (i,j), & ! pe = pe % mat (i,j), & ! pt = pt % mat (i,j)) CALL PenmanMonteith (temperatureAir % mat (i,j), & netRadiation % mat (i,j), & relHumidityAir % mat (i,j), & windSpeed % mat (i,j), & fvcover % mat (i,j), & plantsHeight % mat (i,j), & dem % mat (i,j), & anemometersWS % offsetZ, & hygrometers % offsetZ, & lai % mat (i,j), & rsMin % mat (i,j), & pt % mat (i,j), & pe % mat (i,j), & pet % mat (i,j) ) CASE (FAO56_PENMAN_MONTEITH) CALL FAO56PenmanMonteith (temperatureAir % mat (i,j), & netRadiation % mat (i,j), & netRadiationFAO % mat (i,j), & relHumidityAir % mat (i,j), & windSpeed % mat (i,j), & fvcover % mat (i,j), & dem % mat (i,j), & anemometersWS % offsetZ, & hygrometers % offsetZ, & lai % mat (i,j), & pt % mat (i,j), & pe % mat (i,j), & pet % mat (i,j) ) END SELECT IF ( useCropCoefficient) THEN pt % mat (i,j) = pet % mat(i,j) * kc_map % mat (i,j) !update pet pet % mat (i,j) = fvcover % mat (i,j) * pt % mat (i,j) + & ( 1. - fvcover % mat (i,j) ) * pe % mat (i,j) ELSE pt % mat (i,j) = pet % mat(i,j) END IF !check negative values IF ( pt % mat (i,j) < 0.) pt % mat (i,j) = 0. IF ( pe % mat (i,j) < 0.) pe % mat (i,j) = 0. IF ( pet % mat (i,j) < 0.) pet % mat (i,j) = 0. END IF END DO END DO END IF RETURN END SUBROUTINE PETupdate !============================================================================== !| Description: ! read new Kc values SUBROUTINE KcUpdate & ! ( time ) IMPLICIT NONE !Arguments with intent(in): TYPE (DateTime), INTENT(IN) :: time !local declarations: INTEGER (KIND = short) :: i, j, k !------------------------------end of declarations----------------------------- SELECT CASE (interpolationMethodKc) CASE (0) !update map from netcdf CALL ReadField (filenameKc, time, dtKc, dtKc, 'M', kc_map) CASE (1) !update kc map from map of crop coefficient code !read new data CALL ReadData (network = kc_stations, fileunit = fileunitKc, & time = time, aggr_time = dtKc, & aggr_type = 'ave') !interpolation DO i = 1, kc_map % idim DO j = 1, kc_map % jdim IF ( kc_map % mat(i,j) == kc_map % nodata ) CYCLE DO k = 1, kc_stations % countObs IF ( ToString ( kc_code_map % mat(i,j) ) == & kc_stations % obs(k) % id ) THEN kc_map % mat(i,j) = kc_stations % obs(k) % value EXIT END IF END DO END DO END DO END SELECT RETURN END SUBROUTINE KcUpdate !============================================================================== !| Description: ! Compute potential evapotranspiration with Hargreaves Samani model ! at daily time scale ! ! References: ! Hargreaves, G.H., and Z.A. Samani (1982). Estimating potential ! evapotranspiration. J. Irrig. Drain. Eng., ASCE, 108(3), 223-230 ! ! Allen, R.G.; Pereira, L.S.; Raes, D.; Smith, M. Crop ! Evapotranspiration-Guidelines for Computing Crop Water Requirements-FAO ! Irrigation and Drainage Paper 56, 9th ed.; Food and Agriculture ! Organization of the United Nations: Rome, Italy, 1998; ISBN 92-5-104219-5. SUBROUTINE HargreavesSamani & ! (time, Tavg, Tmax, Tmin, etrad, pet) IMPLICIT NONE !Arguments with intent(in): TYPE(DateTime) , INTENT(in) :: time !!simulation time REAL (KIND = float), INTENT(in) :: Tavg !!average daily temperature [°C] REAL (KIND = float), INTENT(in) :: Tmax !!maximum daily temperature [°C] REAL (KIND = float), INTENT(in) :: Tmin !!minimum daily temperature [°C] REAL (KIND = float), INTENT(in) :: etRad !!extra terrestrial solar radiation [mm/day] !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration [m/s] !local declarations. REAL (KIND = float), PARAMETER :: HC = 0.0023 !!empirical coefficient REAL (KIND = float), PARAMETER :: HE = 0.5 !!empirical exponent REAL (KIND = float), PARAMETER :: HT = 17.8 !!empirical temperature coefficient !-----------------------------------------end of declarations------------------ !calculate evapotranspiration IF ( ( Tmax - Tmin) < 0.) THEN CALL Catch ('warning', 'Evapotranspiration', '(Tmax - Tmin) < 0.' ) pet = 0. RETURN ELSE pet = HC * etRad * (Tmax - Tmin) ** HE * (Tavg + HT) END IF !conversion from mm/day to m/s pet = pet * millimeter / day RETURN END SUBROUTINE HargreavesSamani !============================================================================== !| Description: ! Compute potential evapotranspiration at daily time scale with ! Hargreaves Samani model modified by Ravazzani et al. (2012) ! to include an elevation correction factor ! ! References: ! Hargreaves, G.H., and Z.A. Samani (1982). Estimating potential ! evapotranspiration. J. Irrig. Drain. Eng., ASCE, 108(3), 223-230 ! ! Ravazzani, G., Corbari, C., Morella, S., Gianoli, P., & ! Mancini, M.. (2012). Modified Hargreaves-Samani equation ! for the assessment of reference evapotranspiration in ! Alpine river basins. Journal of irrigation and drainage ! engineering, 138(7), 592–599. SUBROUTINE HargreavesSamaniModified & ! (time, Tavg, Tmax, Tmin, etrad, elevation, pet) IMPLICIT NONE !Arguments with intent(in): TYPE(DateTime) , INTENT(in) :: time !!simulation time REAL (KIND = float), INTENT(in) :: Tavg !!average daily temperature [°C] REAL (KIND = float), INTENT(in) :: Tmax !!maximum daily temperature [°C] REAL (KIND = float), INTENT(in) :: Tmin !!minimum daily temperature [°C] REAL (KIND = float), INTENT(in) :: etRad !!extra terrestrial solar radiation [mm/day] REAL (KIND = float), INTENT(in) :: elevation !!elevation above sea level [m] !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration [m/s] !local declarations. REAL (KIND = float), PARAMETER :: HC = 0.0023 !!empirical coefficient REAL (KIND = float), PARAMETER :: HE = 0.5 !!empirical exponent REAL (KIND = float), PARAMETER :: HT = 17.8 !!empirical temperature coefficient REAL (KIND = float), PARAMETER :: c0 = 0.817 !!empirical coefficient for elevation correlation REAL (KIND = float), PARAMETER :: c1 = 0.00022 !!empirical coefficient for elevation correlation !-----------------------------------------end of declarations------------------ !calculate evapotranspiration IF ( ( Tmax - Tmin) < 0.) THEN CALL Catch ('warning', 'Evapotranspiration', '(Tmax - Tmin) < 0.' ) pet = 0. RETURN ELSE pet = (c0 + c1 * elevation) * HC * etRad * (Tmax - Tmin) ** HE * (Tavg + HT) END IF !conversion from mm/day to m/s pet = pet * millimeter / day RETURN END SUBROUTINE HargreavesSamaniModified !============================================================================== !| Description: ! Compute potential evapotranspiration with Priestley-Taylor model ! ! References: ! Priestley C.H.B., Taylor R.J., 1972. On the assessment ! of surface heat flux and evaporation using largescale ! parameters. Monthly Weather Review, 100:81-92. ! ! Allen, R.G.; Pereira, L.S.; Raes, D.; Smith, M. Crop ! Evapotranspiration-Guidelines for Computing Crop Water Requirements-FAO ! Irrigation and Drainage Paper 56, 9th ed.; Food and Agriculture ! Organization of the United Nations: Rome, Italy, 1998; ISBN 92-5-104219-5. ! ! Anderson, M. C., J. M. Norman, J. R. Mecikalski, J. P. Otkin, and W. P. ! Kustas (2007), A climatological study of evapotranspiration and moisture ! stress across the continental U.S. based on the thermal remote sensing: I. ! Model formulation, J. Geophys. Res., 112, D10117, doi:10.1029/2006JD007506 ! ! ASCE–EWRI. (2005). “The ASCE standardized reference evapotranspiration ! equation.” ASCE–EWRI Standardization of Reference Evapotranspiration ! Task Committe Rep., ASCE Reston, Va ! SUBROUTINE PriestleyTaylor & ! (airTemp, netRad, fc, elevation, pt, pe, pet) IMPLICIT NONE !Arguments with intent(in): REAL (KIND = float), INTENT(in) :: airTemp !!air temperature [°C] REAL (KIND = float), INTENT(in) :: netRad !! net radiawion [W/m2] REAL (KIND = float), INTENT(in) :: fc !! fractional coverage by vegetation [0-1] REAL (KIND = float), INTENT(in) :: elevation !! terrain elevation [m a.s.l.] !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pt !! potential transpiration (from vegetation) [m/s] REAL (KIND = float), INTENT(out) :: pe !! potential evaporation (from water or saturated soil) [m/s] REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration [m/s] !local declarations. REAL (KIND = float), PARAMETER :: alpha = 1.26 !! priestely taylor advection coefficient REAL (KIND = float), PARAMETER :: toMJm2 = 0.000001 !! factor to convert W/me to MJ m-2 s-1 REAL (KIND = float), PARAMETER :: lambda = 2.453 !2.2647 !!latent heat of vaporization (MJ / kg) REAL (KIND = float) :: netRadMJ !!net radiation flux in MJ / m2 /s REAL (KIND = float) :: es !!saturation vapor pressure REAL (KIND = float) :: des !!the slope of the relationship between saturation vapour pressure and ] REAL (KIND = float) :: airPress !!air pressure [KPa] REAL (KIND = float) :: gamma !!psychrometric constant [kPa °C-1] REAL (KIND = float) :: groundHeat !!ground heat flux [MJ m-2 s-1] !-----------------------------------------end of declarations------------------ ! compute saturation vapor pressure es = 0.6108 * EXP ( ( 17.27 * airTemp ) / ( airTemp + 237.3 ) ) !compute the slope of saturation vapour pressure curve (Allen. et al. 1998) des = ( 4098. * es ) / ( ( airTemp + 237.3 )**2. ) !compute atmospheric pressure (ASCE-EWRI, 2005) airPress = 101.3 * ( ( 293. - 0.0065 * elevation ) / 293. )** 5.26 !compute psychrometric constant gamma = 0.665 * 0.001 * airPress !compute neat radiation in MJ / m2 / s netRadMJ = netRad * toMJm2 ! compute ground heat flux as a fraction of net radiation Anderson et al. (2007) ! groundHeat is assumed to affect evaporation from bare soil groundHeat = 0.1 * netRadMJ !compute potential evaporation (from saturated bare soil or water) pe = alpha * ( des / ( des + gamma ) ) * ( netRadMJ - groundHeat) / lambda * millimeter ! (m/s) !compute potential transpiration from vegetation pt = alpha * ( des / ( des + gamma ) ) * netRadMJ / lambda * millimeter ! (m/s) !compute potential as a weighted average of bare soil and vegetated fluxes pet = ( 1. - fc) * pe + fc * pt RETURN END SUBROUTINE PriestleyTaylor !============================================================================== !| Description: ! Compute potential evapotranspiration with Penman-Monteith model ! ! Allen, R.G.; Pereira, L.S.; Raes, D.; Smith, M. Crop ! Evapotranspiration-Guidelines for Computing Crop Water Requirements-FAO ! Irrigation and Drainage Paper 56, 9th ed.; Food and Agriculture ! Organization of the United Nations: Rome, Italy, 1998; ISBN 92-5-104219-5. ! ! ASCE–EWRI. 2005. “The ASCE standardized reference evapotranspiration ! equation.” ASCE–EWRI Standardization of Reference Evapotranspiration ! Task Committe Rep., ASCE Reston, Va ! ! https://wetlandscapes.github.io/blog/blog/penman-monteith-and-priestley-taylor/ ! SUBROUTINE PenmanMonteith & ! (airTemp, netRad, rh, wind, fc, z, elevation, zws, zrhum, lai, srmin, pt, pe, pet) IMPLICIT NONE !Arguments with intent(in): REAL (KIND = float), INTENT(in) :: airTemp !!air temperature [°C] REAL (KIND = float), INTENT(in) :: netRad !! net radiawion [W/m2] REAL (KIND = float), INTENT(in) :: rh !! air relative humidity [0-100] REAL (KIND = float), INTENT(in) :: wind !! wind speed [m/s] REAL (KIND = float), INTENT(in) :: fc !! fractional coverage by vegetation [0-1] REAL (KIND = float), INTENT(in) :: z !! vegetation height [m] REAL (KIND = float), INTENT(in) :: elevation !! terrain elevation [m a.s.l.] REAL (KIND = float), INTENT(in) :: zws !! wind speed measurement heigth [m] REAL (KIND = float), INTENT(in) :: zrhum !! relative humidity measurement heigth [m] REAL (KIND = float), INTENT(in) :: lai !! leaf area index [m2/m2] REAL (KIND = float), INTENT(in) :: srmin !! minimum stomatal resistance !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pt !! potential transpiration (from vegetation) [m/s] REAL (KIND = float), INTENT(out) :: pe !! potential evaporation (from water or saturated soil) [m/s] REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration [m/s] !local declarations: REAL (KIND = float) :: groundHeat !!ground heat flux [MJ m-2 s-1] REAL (KIND = float) :: es !!saturation vapor pressure (Pa) REAL (KIND = float) :: ea !!actual vapor pressure (Pa) REAL (KIND = float) :: des !!the slope of the relationship between saturation vapour pressure and temperature (kPa°C-1) REAL (KIND = float) :: airPress !!air pressure [KPa] REAL (KIND = float) :: gamma !!psychrometric constant [kPa °C-1] REAL (KIND = float) :: ws !!wind speed (m/s) REAL (KIND = float) :: z1 !!bare soil heigth (m) REAL (KIND = float) :: zm1 !! wind speed measurement heigth + z1 (m) REAL (KIND = float) :: zh1 !! relative humidity measurement heigth + z1 (m) REAL (KIND = float) :: zd1 !! bare soil zero plane displacement height (m) REAL (KIND = float) :: zrw1 !! Roughness length governing momentum transfer above zd1 (m) REAL (KIND = float) :: zrh1 !! Roughness length governing transfer of heat and vapor above zd1 (m) REAL (KIND = float) :: rabs !! aerodynamic resistance of bare soil (s/m) REAL (KIND = float) :: zm !! wind speed measurement heigth + z (m) REAL (KIND = float) :: zd !! vegetated soil zero plane displacement height (m) REAL (KIND = float) :: zrw !! Roughness length governing momentum transfer above zd (m) REAL (KIND = float) :: zh !! relative humidity measurement heigth + z (m) REAL (KIND = float) :: zrh !! Roughness length governing transfer of heat and vapor above zd (m) REAL (KIND = float) :: ra !! aerodynamic resistance of vegetated soil (s/m) REAL (KIND = float) :: cp !! humid air specific heat (MJkg^-1°C^-1) REAL (KIND = float) :: Tkv !! virtual air temperature (K) REAL (KIND = float) :: rhoAir !!air density (kgm^-3) REAL (KIND = float) :: netRadMJ !! net radiation in MJm^-2s^-1 REAL (KIND = float) :: rc !! total vegetation resistance (s/m) REAL (KIND = float), PARAMETER :: k = 0.41 !!von Karman’s constant REAL (KIND = float), PARAMETER :: epsilon = 0.622 ! ratio molecular weight of water vapour/dry air REAL (KIND = float), PARAMETER :: lambda = 2.453 !2.2647 !!latent heat of vaporization (MJ / kg) REAL (KIND = float), PARAMETER :: R1 = 0.287 !!gas specific constant (kJkg^-1K^-1) !-----------------------------------------end of declarations------------------ ! compute saturation vapor pressure es = 0.6108 * EXP ( ( 17.27 * airTemp ) / ( airTemp + 237.3 ) ) !actual vapor pressure ea = rh / 100. * es !compute the slope of saturation vapour pressure curve (Allen. et al. 1998) des = ( 4098. * es ) / ( ( airTemp + 237.3 )**2. ) !compute atmospheric pressure (ASCE-EWRI, 2005) airPress = 101.3 * ( ( 293. - 0.0065 * elevation ) / 293. )** 5.26 !compute psychrometric constant gamma = 0.665 * 0.001 * airPress !check wind speed: set minimum to 0.01 m/s IF ( wind <= 0 ) THEN ws = 0.01 ELSE ws = wind END IF !aerodynamic variables of bare soil z1 = 0.1 zm1 = zws + z1 zd1 = 2. / 3. * z1 zrw1 = 0.123 * z1 zh1 = zrhum + z1 zrh1 = 0.1 * zrw1 !compute aerodynamic resistance of bare soil rabs = LOG ( (zm1 - zd1) / zrw1 ) * LOG ( (zh1 - zd1) / zrh1 ) / ( k**2 * ws ) !aerodynamic variables of vegetated soil zm = zws + z zd = 2. / 3. * z zrw = 0.123 * z zh = zrhum + z zrh = 0.1 * zrw !compute aerodynamic resistance of bare soil IF (z == 0 ) THEN !vegetation not present ra = rabs ELSE ra = LOG ( ( zm - zd ) / zrw ) * LOG ( ( zh - zd ) / zrh ) / ( k**2 * ws) END IF ! humid air specific heat (MJkg^-1°C^-1) cp = gamma * epsilon * lambda / airPress !virtual air temperature (K) Tkv = 1.01 * ( airTemp + 273. ) !air density (kgm^-3) rhoAir = airPress / ( Tkv * R1 ) !check and convert net radiation IF ( netRad < 0 ) THEN netRadMJ = 0. ELSE netRadMJ = netRad * 0.000001 END IF ! compute ground heat flux as a fraction of net radiation Anderson et al. (2007) ! groundHeat is assumed to affect evaporation from bare soil !groundHeat = 0.31 * ( 1. - fc ) * netRadMJ groundHeat = 0.1 * netRadMJ !compute potential evaporation (from saturated bare soil or water) pe = ( des * ( netRadMJ - groundHeat ) + rhoAir * cp * ( es - ea ) / rabs ) / ( lambda * ( des + gamma ) ) * millimeter !compute potential transpiration from vegetation IF (fc > 0.) THEN IF ( lai == 0.) THEN rc = srmin / 1. ELSE rc = srmin / lai END IF pt = ( des * netRadMJ + rhoAir * cp * ( es - ea ) / ra ) / ( lambda * ( des + gamma * (1. + rc / ra) ) ) * millimeter ELSE pt = 0. END IF !compute potential as a weighted average of bare soil and vegetated fluxes pet = ( 1. - fc) * pe + fc * pt !IF (isnan (pet)) then ! write(*,*) pe, pt, des, ra, rc, lai, srmin ! pause !end if RETURN END SUBROUTINE PenmanMonteith !============================================================================== !| Description: ! Compute potential evapotranspiration with FAO56 Penman-Monteith model ! for a reference grass ! "A hypothetical reference crop with an assumed crop height of 0.12 m, ! a fixed surface resistance of 70 s m-1 and an albedo of 0.23." ! ! References: ! ! Allen, R.G.; Pereira, L.S.; Raes, D.; Smith, M. Crop ! Evapotranspiration-Guidelines for Computing Crop Water Requirements-FAO ! Irrigation and Drainage Paper 56, 9th ed.; Food and Agriculture ! Organization of the United Nations: Rome, Italy, 1998; ISBN 92-5-104219-5. ! ! Lincoln Zotarelli, Michael D. Dukes, Consuelo C. Romero, ! Kati W. Migliaccio, and Kelly T. Morgan, Step by Step Calculation ! of the Penman-Monteith Evapotranspiration (FAO-56 Method), ! Agricultural and Biological Engineering Department, University of Florida, ! 2009. https://edis.ifas.ufl.edu/pdf/AE/AE45900.pdf ! ! https://wetlandscapes.github.io/blog/blog/penman-monteith-and-priestley-taylor/ ! SUBROUTINE FAO56PenmanMonteith & ! (airTemp, netRad, netRadFAO, rh, wind, fc, elevation, zws, zrhum, lai, pt, pe, pet) IMPLICIT NONE !Arguments with intent(in): REAL (KIND = float), INTENT(in) :: airTemp !!air temperature [°C] REAL (KIND = float), INTENT(in) :: netRad !! net radiation [W/m2] REAL (KIND = float), INTENT(in) :: netRadFAO !! net radiation for reference vegetation, with albedo = 0.23 [W/m2] REAL (KIND = float), INTENT(in) :: rh !! air relative humidity [0-100] REAL (KIND = float), INTENT(in) :: wind !! wind speed [m/s] REAL (KIND = float), INTENT(in) :: fc !! fractional coverage by vegetation [0-1] REAL (KIND = float), INTENT(in) :: elevation !! terrain elevation [m a.s.l.] REAL (KIND = float), INTENT(in) :: zws !! wind speed measurement heigth [m] REAL (KIND = float), INTENT(in) :: zrhum !! relative humidity measurement heigth [m] REAL (KIND = float), INTENT(in) :: lai !! leaf area index [m2/m2] !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pt !! potential transpiration (from vegetation) [m/s] REAL (KIND = float), INTENT(out) :: pe !! potential evaporation (from water or saturated soil) [m/s] REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration [m/s] !local declarations: REAL (KIND = float) :: z = 0.12 !! reference grass height [m] REAL (KIND = float) :: srmin = 70 !! minimum stomatal resistance of reference grass [s/m] REAL (KIND = float) :: groundHeat !!ground heat flux [MJ m-2 s-1] REAL (KIND = float) :: es !!saturation vapor pressure (Pa) REAL (KIND = float) :: ea !!actual vapor pressure (Pa) REAL (KIND = float) :: des !!the slope of the relationship between saturation vapour pressure and temperature REAL (KIND = float) :: airPress !!air pressure [KPa] REAL (KIND = float) :: gamma !!psychrometric constant [kPa °C-1] REAL (KIND = float) :: ws2m !!wind speed at 2m (m/s) REAL (KIND = float) :: z1 !!bare soil heigth (m) REAL (KIND = float) :: zm1 !! wind speed measurement heigth + z1 (m) REAL (KIND = float) :: zh1 !! relative humidity measurement heigth + z1 (m) REAL (KIND = float) :: zd1 !! bare soil zero plane displacement height (m) REAL (KIND = float) :: zrw1 !! Roughness length governing momentum transfer (m) REAL (KIND = float) :: zrh1 !! Roughness length governing transfer of heat and vapor above zd1 (m) REAL (KIND = float) :: rabs !! aerodynamic resistance of bare soil (s/m) REAL (KIND = float) :: cp !! humid air specific heat (MJkg^-1°C^-1) REAL (KIND = float) :: Tkv !! virtual air temperature (K) REAL (KIND = float) :: rhoAir !!air density (kgm^-3) REAL (KIND = float) :: netRadMJ !! net radiation in MJm^-2s^-1 REAL (KIND = float) :: netRadFAO_MJ !! FAO net radiation in MJm^-2s^-1 REAL (KIND = float), PARAMETER :: k = 0.41 !!von Karman’s constant REAL (KIND = float), PARAMETER :: epsilon = 0.622 ! ratio molecular weight of water vapour/dry air REAL (KIND = float), PARAMETER :: lambda = 2.453 !2.2647 !!latent heat of vaporization (MJ / kg) REAL (KIND = float), PARAMETER :: R1 = 0.287 !!gas specific constant (kJkg^-1K^-1) !-----------------------------------------end of declarations------------------ ! compute saturation vapor pressure es = 0.6108 * EXP ( ( 17.27 * airTemp ) / ( airTemp + 237.3 ) ) !actual vapor pressure ea = rh / 100. * es !compute the slope of saturation vapour pressure curve (Allen. et al. 1998) des = ( 4098. * es ) / ( ( airTemp + 237.3 )**2. ) !compute atmospheric pressure airPress = 101.3 * ( ( 293. - 0.0065 * elevation ) / 293. )** 5.26 !compute psychrometric constant gamma = 0.665 * 0.001 * airPress !move wind speed to 2 m reference height (Zotarelli et al., 2009) IF ( zws /= 2. ) THEN ws2m = wind ELSE ws2m = wind * 4.87 / LOG ( 67.8 * zws - 5.42 ) END IF !aerodynamic variables of bare soil z1 = 0.1 zm1 = zws + z1 zd1 = 2. / 3. * z1 zrw1 = 0.123 * z1 zh1 = zrhum + z1 zrh1 = 0.1 * zrw1 !compute aerodynamic resistance of bare soil rabs = LOG ( (zm1 - zd1) / zrw1 ) * LOG ( (zh1 - zd1) / zrh1 ) / ( k**2 * wind ) ! humid air specific heat (MJkg^-1°C^-1) cp = gamma * epsilon * lambda / airPress !virtual air temperature (K) Tkv = 1.01 * ( airTemp + 273. ) !air density (kgm^-3) rhoAir = airPress / ( Tkv * R1 ) !check and convert net radiation IF ( netRad < 0 ) THEN netRadMJ = 0. ELSE netRadMJ = netRad * 0.000001 END IF IF ( netRadFAO < 0 ) THEN netRadFAO_MJ = 0. ELSE netRadFAO_MJ = netRadFAO * 0.000001 END IF ! compute ground heat flux as a fraction of net radiation Anderson et al. (2007) ! groundHeat is assumed to affect evaporation from bare soil only groundHeat = 0.31 * netRadMJ !compute evaporation (from saturated bare soil or water) pe = ( des * ( netRadMJ - groundHeat ) + rhoAir * cp * ( es - ea ) / rabs ) / & ( lambda * ( des + gamma ) ) * millimeter !compute transpiration from vegetation IF (fc > 0.) THEN pt = ( 0.408 * des * ( netRadMJ - groundHeat ) + gamma * (900. / day ) / & ( airTemp + 273. ) * ws2m * (es - ea) ) / & (des + gamma * ( 1. + 0.34 * ws2m ) ) * millimeter ELSE pt = 0. END IF !compute evapotranspiration pet = ( 1. - fc) * pe + fc * pt RETURN END SUBROUTINE FAO56PenmanMonteith !============================================================================== !| Description: ! Compute actual evapotranspiration from ground ! by solving energy balance ! Original code written by Chiara Corbari and Jacopo Martinelli ! SUBROUTINE etEnergyBalanceGround & ! (airTemp, netRad, rh, wind, fc, z, elevation, zws, zrhum, lai, srmin, pt, pe, pet) IMPLICIT NONE !Arguments with intent(in): REAL (KIND = float), INTENT(in) :: airTemp !!air temperature (°C) REAL (KIND = float), INTENT(in) :: netRad !! net radiawion (W/m2) REAL (KIND = float), INTENT(in) :: rh !! air relative humidity (0-100) REAL (KIND = float), INTENT(in) :: wind !! wind speed(m/s) REAL (KIND = float), INTENT(in) :: fc !! fractional coverage by vegetation (0-1) REAL (KIND = float), INTENT(in) :: z !! vegetation height (m) REAL (KIND = float), INTENT(in) :: elevation !! terrain elevation (m a.s.l.) REAL (KIND = float), INTENT(in) :: zws !! wind speed measurement heigth (m) REAL (KIND = float), INTENT(in) :: zrhum !! relative humidity measurement heigth (m) REAL (KIND = float), INTENT(in) :: lai !! leaf area index (m2/m2) REAL (KIND = float), INTENT(in) :: srmin !! minimum stomatal resistance !Arguments with intent(out): REAL (KIND = float), INTENT(out) :: pt !! potential transpiration (from vegetation) (m/s) REAL (KIND = float), INTENT(out) :: pe !! potential evaporation (from water or saturated soil) (m/s) REAL (KIND = float), INTENT(out) :: pet !! potential evapotranspiration (m/s) !local declarations: REAL (KIND = float) :: groundHeat !!ground heat flux (MJ m-2 s-1) REAL (KIND = float) :: es !!saturation vapor pressure (Pa) REAL (KIND = float) :: ea !!actual vapor pressure (Pa) REAL (KIND = float) :: des !!the slope of the relationship between saturation vapour pressure and temperature REAL (KIND = float) :: airPress !!air pressure (KPa) REAL (KIND = float) :: gamma !!psychrometric constant (kPa °C-1) REAL (KIND = float) :: ws !!wind speed (m/s) REAL (KIND = float) :: z1 !!bare soil heigth (m) REAL (KIND = float) :: zm1 !! wind speed measurement heigth + z1 (m) REAL (KIND = float) :: zh1 !! relative humidity measurement heigth + z1 (m) REAL (KIND = float) :: zd1 !! bare soil zero plane displacement height (m) REAL (KIND = float) :: zrw1 !! Roughness length governing momentum transfer above zd1 (m) REAL (KIND = float) :: zrh1 !! Roughness length governing transfer of heat and vapor above zd1 (m) REAL (KIND = float) :: rabs !! aerodynamic resistance of bare soil (s/m) REAL (KIND = float) :: zm !! wind speed measurement heigth + z (m) REAL (KIND = float) :: zd !! vegetated soil zero plane displacement height (m) REAL (KIND = float) :: zrw !! Roughness length governing momentum transfer above zd (m) REAL (KIND = float) :: zh !! relative humidity measurement heigth + z (m) REAL (KIND = float) :: zrh !! Roughness length governing transfer of heat and vapor above zd (m) REAL (KIND = float) :: ra !! aerodynamic resistance of vegetated soil (s/m) REAL (KIND = float) :: cp !! humid air specific heat (MJkg^-1°C^-1) REAL (KIND = float) :: Tkv !! virtual air temperature (K) REAL (KIND = float) :: rhoAir !!air density (kgm^-3) REAL (KIND = float) :: netRadMJ !! net radiation in MJm^-2s^-1 REAL (KIND = float) :: rc !! total vegetation resistance (s/m) REAL (KIND = float), PARAMETER :: k = 0.41 !!von Karman’s constant REAL (KIND = float), PARAMETER :: epsilon = 0.622 ! ratio molecular weight of water vapour/dry air REAL (KIND = float), PARAMETER :: lambda = 2.453 !2.2647 !!latent heat of vaporization (MJ / kg) REAL (KIND = float), PARAMETER :: R1 = 0.287 !!gas specific constant (kJkg^-1K^-1) !-----------------------------------------end of declarations------------------ ! compute saturation vapor pressure es = 0.6108 * EXP ( ( 17.27 * airTemp ) / ( airTemp + 237.3 ) ) !actual vapor pressure ea = rh / 100. * es !compute the slope of saturation vapour pressure curve (Allen. et al. 1998) des = ( 4098. * es ) / ( ( airTemp + 237.3 )**2. ) !compute atmospheric pressure (ASCE-EWRI, 2005) airPress = 101.3 * ( ( 293. - 0.0065 * elevation ) / 293. )** 5.26 !compute psychrometric constant gamma = 0.665 * 0.001 * airPress !check wind speed: set minimum to 0.01 m/s IF ( wind <= 0 ) THEN ws = 0.01 ELSE ws = wind END IF !aerodynamic variables of bare soil z1 = 0.1 zm1 = zws + z1 zd1 = 2. / 3. * z1 zrw1 = 0.123 * z1 zh1 = zrhum + z1 zrh1 = 0.1 * zrw1 !compute aerodynamic resistance of bare soil rabs = LOG ( (zm1 - zd1) / zrw1 ) * LOG ( (zh1 - zd1) / zrh1 ) / ( k**2 * ws ) !aerodynamic variables of vegetated soil zm = zws + z zd = 2. / 3. * z zrw = 0.123 * z zh = zrhum + z zrh = 0.1 * zrw !compute aerodynamic resistance of bare soil IF (z == 0 ) THEN !vegetation not present ra = rabs ELSE ra = LOG ( ( zm - zd ) / zrw ) * LOG ( ( zh - zd ) / zrh ) / ( k**2 * ws) END IF ! humid air specific heat (MJkg^-1°C^-1) cp = gamma * epsilon * lambda / airPress !virtual air temperature (K) Tkv = 1.01 * ( airTemp + 273. ) !air density (kgm^-3) rhoAir = airPress / ( Tkv * R1 ) !check and convert net radiation IF ( netRad < 0 ) THEN netRadMJ = 0. ELSE netRadMJ = netRad * 0.000001 END IF ! compute ground heat flux as a fraction of net radiation Anderson et al. (2007) ! groundHeat is assumed to affect evaporation from bare soil !groundHeat = 0.31 * ( 1. - fc ) * netRadMJ groundHeat = 0.1 * netRadMJ !compute potential evaporation (from saturated bare soil or water) pe = ( des * ( netRadMJ - groundHeat ) + rhoAir * cp * ( es - ea ) / rabs ) / ( lambda * ( des + gamma ) ) * millimeter !compute potential transpiration from vegetation IF (fc > 0.) THEN IF ( lai == 0.) THEN rc = srmin / 1. ELSE rc = srmin / lai END IF pt = ( des * netRadMJ + rhoAir * cp * ( es - ea ) / ra ) / ( lambda * ( des + gamma * (1. + rc / ra) ) ) * millimeter ELSE pt = 0. END IF !compute potential as a weighted average of bare soil and vegetated fluxes pet = ( 1. - fc) * pe + fc * pt !IF (isnan (pet)) then ! write(*,*) pe, pt, des, ra, rc, lai, srmin ! pause !end if RETURN END SUBROUTINE etEnergyBalanceGround !============================================================================== !| Description: ! check properties for each ET model SUBROUTINE CheckSpecificProperties & ! ( model, ini ) IMPLICIT NONE !Arguments with intent(in): INTEGER (KIND = short), INTENT(in) :: model TYPE (IniList) , INTENT(in) :: ini !----------------------------end of declarations------------------------------- !check data specific for each ET model SELECT CASE (model) CASE ( PENMAN_MONTEITH ) IF ( dtTemperature <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air temperature' ) END IF IF ( dtRelHumidity <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air relative humidity' ) END IF IF ( dtWindSpeed <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires wind speed' ) END IF IF ( dtRadiation <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires net radiation' ) END IF IF ( .NOT. fvcoverLoaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires vegetation fraction coverage' ) END IF IF ( .NOT. laiLoaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires leaf area index' ) END IF IF ( .NOT. dem_loaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires digital elevation model' ) END IF IF ( .NOT. rsMinloaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires minimum stomatal resistance' ) END IF CASE ( FAO56_PENMAN_MONTEITH ) IF ( dtTemperature <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air temperature' ) END IF IF ( dtRelHumidity <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air relative humidity' ) END IF IF ( dtWindSpeed <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires wind speed' ) END IF IF ( dtRadiation <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires net radiation' ) END IF IF ( .NOT. fvcoverLoaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires vegetation fraction coverage' ) END IF IF ( .NOT. dem_loaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires digital elevation model' ) END IF CASE (PRIESTLEY_TAYLOR) IF ( dtTemperature <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air temperature' ) END IF IF ( dtRadiation <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires net radiation' ) END IF IF ( .NOT. fvcoverLoaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires vegetation fraction coverage' ) END IF IF ( .NOT. dem_loaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires digital elevation model' ) END IF !IF ( .NOT. plantsHeightLoaded ) THEN ! CALL Catch ('error', 'Evapotranspiration', & ! 'ET model requires vegetation height' ) !END IF CASE (HARGREAVES) compute_hargreaves = .TRUE. IF ( dtET /= day ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily dt' ) END IF IF ( dtTemperatureDailyMean <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily air temperature' ) END IF IF ( dtTemperatureDailyMin <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily minimum air temperature' ) END IF IF ( dtTemperatureDailyMax <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily maximum air temperature' ) END IF CASE (HARGREAVES_MOD) compute_hargreaves = .TRUE. IF ( dtET /= day ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily dt' ) END IF IF ( dtTemperatureDailyMean <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily air temperature' ) END IF IF ( dtTemperatureDailyMin <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily minimum air temperature' ) END IF IF ( dtTemperatureDailyMax <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires daily maximum air temperature' ) END IF IF ( .NOT. dem_loaded ) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires digital elevation model' ) END IF CASE (ENERGY_BALANCE) IF ( dtTemperature <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air temperature' ) END IF IF ( dtRelHumidity <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires air relative humidity' ) END IF IF ( dtWindSpeed <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires wind speed' ) END IF IF ( dtRadiation <= 0) THEN CALL Catch ('error', 'Evapotranspiration', & 'ET model requires net radiation' ) END IF END SELECT RETURN END SUBROUTINE CheckSpecificProperties END MODULE Evapotranspiration