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