Soil Water Balance (SWB2)
Loading...
Searching...
No Matches
actual_et__fao56.F90
Go to the documentation of this file.
1!> @file
2!! Contains module @ref actual_et__fao56. The module calculates actual evapotranspiration
3!! by means of the SINGLE CROP COEFFICIENT procedure outlined in the FAO56 publication.
4!! See @ref https://www.fao.org/3/x0490e/x0490e0b.htm for details.
5
6!> Calculates actual evapotranspiration
7!! by means of the SINGLE CROP COEFFICIENT procedure outlined in the FAO56 publication.
8!! See @ref https://www.fao.org/3/x0490e/x0490e0b.htm for details.
10
11 use iso_c_binding, only : c_short, c_int, c_float, c_double
13 use parameters, only : params
14 implicit none
15
16 real (c_float), allocatable :: depletion_fraction(:)
17
18contains
19
21
22 call params%get_parameters( skey="Depletion_Fraction", fvalues=depletion_fraction, lfatal=true )
23
24 end subroutine initialize_actual_et_fao56
25
26 !> Adjust the depletion fraction based on current reference ET0.
27 !!
28 !! From FAO-56: "The fraction p is a function of the evaporation power of the atmosphere.
29 !! At low rates of ETc, the p values listed in Table 22 are higher than at high rates of ETc.
30 !! For hot dry weather conditions, where ETc is high, p is 10-25% less than the values
31 !! presented in Table 22, and the soil is still relatively wet when the stress starts to occur.
32 !! When the crop evapotranspiration is low, p will be up to 20% more than the listed values.
33 !!
34 !! @param[in] p_table_22 This is the unadjusted depletion fraction value; FAO-56
35 !! table 22 gives values of the depletion fraction relative to a reference ET0 value of 5mm.
36 !! @param[in] reference_et0 The reference ET0 to which the depletion fraction will be
37 !! adjusted.
38 !! @note Discussed as a footnote to Table 22, FAO-56, Allen and others.
39 !! See @ref http://www.fao.org/docrep/x0490e/x0490e0e.htm#TopOfPage for details.
40
41 elemental function adjust_depletion_fraction_p( p_table_22, reference_et0 ) result( p )
42
43 real (c_float), intent(in) :: p_table_22
44 real (c_double), intent(in) :: reference_et0
45 real (c_float) :: p
46
47 p = real(p_table_22 + 0.04_c_float * ( 5.0_c_float - in_to_mm( reference_et0 ) ), c_float)
48
49 p = min( p, 0.8_c_float )
50 p = max( p, 0.1_c_float )
51
53
54!----------------------------------------------------------------------------------------------------
55
56 elemental subroutine calculate_actual_et_fao56( actual_et, &
57 adjusted_depletion_fraction_p, &
58 soil_storage, &
59 depletion_fraction_p, &
60 soil_storage_max, &
61 infiltration, &
62 crop_etc )
63
64
65 real (c_double), intent(inout) :: actual_et
66 real (c_double), intent(inout) :: adjusted_depletion_fraction_p
67 real (c_float), intent(in) :: depletion_fraction_p
68 real (c_double), intent(in) :: soil_storage
69 real (c_float), intent(in) :: soil_storage_max
70 real (c_float), intent(in) :: infiltration
71 real (c_float), intent(in) :: crop_etc
72
73 ! [ LOCALS ]
74 real (c_float) :: p
75 real (c_double) :: interim_soil_storage
76 real (c_float) :: fraction_full_pet
77 real (c_float) :: root_constant_ci
78
79 if ( soil_storage_max >= 0.0_c_float .and. soil_storage_max <= near_zero ) then
80
81 ! by convention, if the soil_storage_max is approximately zero, we are dealing
82 ! with a water body and the actual et should be the potential/crop et
83 actual_et = crop_etc
84
85 else
86
87 p = adjust_depletion_fraction_p( p_table_22=depletion_fraction_p, &
88 reference_et0=real(crop_etc, c_double))
89
90 adjusted_depletion_fraction_p = p
91
92 ! soil storage value at which actual et begins to decline
93 root_constant_ci = ( 1.0_c_float - p ) * soil_storage_max
94
95 interim_soil_storage = soil_storage + infiltration
96
97 ! root constant of 0 implies a depletion fraction of 1; in other words,
98 ! there is no declining portion of the AET/PET to AW/AWC relation.
99 ! ENTIRE DAY at PET
100 if ( root_constant_ci <= 0.0_c_float ) then
101
102 actual_et = min( real(crop_etc, c_double), interim_soil_storage )
103
104 ! ALL or PARTIAL DAY at PET
105 elseif ( interim_soil_storage > root_constant_ci ) then
106
107 ! calculate fraction of day that would be at full reference ET values
108 if ( crop_etc > 0.0_c_float ) then
109
110 fraction_full_pet = real((interim_soil_storage - root_constant_ci) / crop_etc, c_float)
111
112 else
113
114 fraction_full_pet = 99.
115
116 endif
117
118 ! there is enough soil storage to cover withdrawal of soil moisture at full reference ET values
119 ! for the entire day
120 if ( fraction_full_pet >= 1 ) then
121
122 actual_et = crop_etc
123
124 ! part of day at full PET
125 else
126
127 actual_et = crop_etc * fraction_full_pet &
128 + root_constant_ci &
129 * ( 1.0_c_float - exp( - crop_etc * ( 1.0_c_float - fraction_full_pet ) &
130 / root_constant_ci ) )
131
132 endif
133
134 ! ENTIRE DAY at LESS THAN PET
135 else
136
137 actual_et = interim_soil_storage * ( 1.0_c_float - exp( - crop_etc / root_constant_ci ) )
138
139 endif
140
141 endif
142
143 end subroutine calculate_actual_et_fao56
144
145
146end module actual_et__fao56
Calculates actual evapotranspiration by means of the SINGLE CROP COEFFICIENT procedure outlined in th...
elemental subroutine calculate_actual_et_fao56(actual_et, adjusted_depletion_fraction_p, soil_storage, depletion_fraction_p, soil_storage_max, infiltration, crop_etc)
subroutine initialize_actual_et_fao56()
elemental real(c_float) function adjust_depletion_fraction_p(p_table_22, reference_et0)
Adjust the depletion fraction based on current reference ET0.
real(c_float), dimension(:), allocatable depletion_fraction
This module contains physical constants and convenience functions aimed at performing unit conversion...
logical(c_bool), parameter, public true
real(c_float), parameter, public near_zero
logical(c_bool), parameter, public false
type(parameters_t), public params