5.13.2-dev0
mHM
The mesoscale Hydrological Model
Loading...
Searching...
No Matches
mo_meteo_temporal_tools.f90
Go to the documentation of this file.
1!> \file mo_meteo_temporal_tools.f90
2!> \brief \copybrief mo_meteo_temporal_tools
3!> \details \copydetails mo_meteo_temporal_tools
4
5!> \brief Temporal disaggregation of daily input values
6!> \details Calculate actual values for precipitation, PET and temperature from daily mean inputs
7!> \note There is not PET correction for aspect in this routine. Use pet * fasp before or after the routine.
8!> \authors Matthias Cuntz
9!> \date Dec 2012
10!> \copyright Copyright 2005-\today, the mHM Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
11!! mHM is released under the LGPLv3+ license \license_note
12!> \ingroup f_meteo
14
15 USE mo_kind, ONLY : dp
16
17 IMPLICIT NONE
18
19 PRIVATE
20
21 PUBLIC :: temporal_disagg_meteo_weights ! Temporally distribute meteo value by weights correction
22 PUBLIC :: temporal_disagg_flux_daynight ! Temporally distribute meteo flux by day/night correction
23 PUBLIC :: temporal_disagg_state_daynight ! Temporally distribute meteo state variable by day/night correction
24
25CONTAINS
26
27 !> \brief Temporally distribute daily mean forcings onto time step
28 !> \details Calculates actual meteo forcings from daily mean inputs.
29 !! They are distributed with predefined weights onto the day.
30 !> \authors Sebastian Mueller
31 !> \date Jun 2020
32 elemental subroutine temporal_disagg_meteo_weights( &
33 meteo_val_day, &
34 meteo_val_weights, &
35 meteo_val, &
36 weights_correction &
37 )
38 implicit none
39
40 !> Daily meteo_val
41 real(dp), intent(in) :: meteo_val_day
42 !> weights for meteo_val
43 real(dp), intent(in) :: meteo_val_weights
44 !> Actual meteo_val
45 real(dp), intent(out) :: meteo_val
46 !> Additive correction before applying weights (e.g. for temperature conversion)
47 real(dp), intent(in), optional :: weights_correction
48
49 real(dp) :: weights_correction_
50
51 ! default values (can't be initialized directly in a pure function)
52 weights_correction_ = 0.0_dp
53 ! set potential given optional values
54 if ( present(weights_correction) ) weights_correction_ = weights_correction
55
56 ! use weights to distribute meteo values
57 meteo_val = (meteo_val_day + weights_correction_) * meteo_val_weights - weights_correction_
58
60
61 !> \brief Temporally distribute daily mean forcings onto time step
62 !> \details Calculates actual meteo forcings from daily mean inputs.
63 !! They are distributed with predefined factors/summands for day and night.
64 !> \authors Sebastian Mueller
65 !> \date Jun 2020
66 elemental subroutine temporal_disagg_flux_daynight( &
67 isday, &
68 ntimesteps_day, &
69 meteo_val_day, &
70 fday_meteo_val, &
71 fnight_meteo_val, &
72 meteo_val &
73 )
74 implicit none
75
76 !> is day (False for night)
77 logical, intent(in) :: isday
78 !> number of time steps per day
79 real(dp), intent(in) :: ntimesteps_day
80 !> Daily meteo_val
81 real(dp), intent(in) :: meteo_val_day
82 !> Daytime fraction of meteo_val
83 real(dp), intent(in) :: fday_meteo_val
84 !> Nighttime fraction of meteo_val
85 real(dp), intent(in) :: fnight_meteo_val
86 !> Actual meteo_val
87 real(dp), intent(out) :: meteo_val
88
89 ! Distribute into time steps night/day
90 if(ntimesteps_day .gt. 1.0_dp) then
91 if ( isday ) then ! DAY-TIME
92 meteo_val = 2.0_dp * meteo_val_day * fday_meteo_val / ntimesteps_day
93 else ! NIGHT-TIME
94 meteo_val = 2.0_dp * meteo_val_day * fnight_meteo_val / ntimesteps_day
95 end if
96 else
97 ! default vaule used if ntimesteps_day = 1 (i.e., e.g. daily values)
98 meteo_val = meteo_val_day
99 end if
100
101 end subroutine temporal_disagg_flux_daynight
102
103 !> \brief Temporally distribute daily mean state forcings onto time step
104 !> \details Calculates meteo forcings from daily mean inputs of a state variable.
105 !> They are distributed with predefined factors/summands for day and night.
106 !> \authors Sebastian Mueller
107 !> \date Jun 2020
108 elemental subroutine temporal_disagg_state_daynight( &
109 isday, &
110 ntimesteps_day, &
111 meteo_val_day, &
112 fday_meteo_val, &
113 fnight_meteo_val, &
114 meteo_val, &
115 add_correction &
116 )
117 implicit none
118
119 !> is day (False for night)
120 logical, intent(in) :: isday
121 !> number of time steps per day
122 real(dp), intent(in) :: ntimesteps_day
123 !> Daily meteo_val
124 real(dp), intent(in) :: meteo_val_day
125 !> Daytime fraction of meteo_val
126 real(dp), intent(in) :: fday_meteo_val
127 !> Nighttime fraction of meteo_val
128 real(dp), intent(in) :: fnight_meteo_val
129 !> Actual meteo_val
130 real(dp), intent(out) :: meteo_val
131 !> if True, correcting values will be added (e.g. for temperature), otherwise used as percentage
132 logical, intent(in), optional :: add_correction
133
134 logical :: add_correction_
135
136 ! default values (can't be initialized directly in a pure function)
137 add_correction_ = .false.
138 ! set potential given optional values
139 if ( present(add_correction) ) add_correction_ = add_correction
140
141 ! Distribute into time steps night/day
142 if(ntimesteps_day .gt. 1.0_dp) then
143 if ( add_correction_ ) then ! for e.g. temperature
144 if ( isday ) then ! DAY-TIME
145 meteo_val = meteo_val_day + fday_meteo_val
146 else ! NIGHT-TIME
147 meteo_val = meteo_val_day + fnight_meteo_val
148 end if
149 else
150 if ( isday ) then ! DAY-TIME
151 meteo_val = 2.0_dp * meteo_val_day * fday_meteo_val
152 else ! NIGHT-TIME
153 meteo_val = 2.0_dp * meteo_val_day * fnight_meteo_val
154 end if
155 end if
156 else
157 ! default vaule used if ntimesteps_day = 1 (i.e., e.g. daily values)
158 meteo_val = meteo_val_day
159 end if
160
161 end subroutine temporal_disagg_state_daynight
162
Temporal disaggregation of daily input values.
elemental subroutine, public temporal_disagg_state_daynight(isday, ntimesteps_day, meteo_val_day, fday_meteo_val, fnight_meteo_val, meteo_val, add_correction)
Temporally distribute daily mean state forcings onto time step.
elemental subroutine, public temporal_disagg_meteo_weights(meteo_val_day, meteo_val_weights, meteo_val, weights_correction)
Temporally distribute daily mean forcings onto time step.
elemental subroutine, public temporal_disagg_flux_daynight(isday, ntimesteps_day, meteo_val_day, fday_meteo_val, fnight_meteo_val, meteo_val)
Temporally distribute daily mean forcings onto time step.