44 MODULE PROCEDURE day2mon_average_dp
68 MODULE PROCEDURE hour2day_average_dp
89 MODULE PROCEDURE day2mon_sum_dp
100 SUBROUTINE day2mon_average_dp(daily_data, yearS, monthS, dayS, mon_avg, misval, rm_misval)
104 REAL(dp),
dimension(:),
INTENT(IN) :: daily_data
105 INTEGER(i4),
INTENT(IN) :: yearS
106 INTEGER(i4),
INTENT(IN) :: monthS
107 INTEGER(i4),
INTENT(IN) :: dayS
109 REAL(dp),
dimension(:),
allocatable,
INTENT(OUT) :: mon_avg
111 REAL(dp),
optional,
INTENT(IN) :: misval
112 logical,
optional,
INTENT(IN) :: rm_misval
115 INTEGER(i4) :: ndays, tt, kk
116 INTEGER(i4) :: start_day, end_day
118 INTEGER(i4) :: year, month, day
119 INTEGER(i4) :: yearE, monthE, dayE
122 REAL(dp),
dimension(:, :),
allocatable :: nCounter_m
123 REAL(dp),
dimension(:, :),
allocatable :: nCounter_m_full
124 REAL(dp),
dimension(:, :),
allocatable :: mon_sum
126 INTEGER(i4) :: nmonths
130 if (
present(misval))
then
136 if (
present(rm_misval))
then
143 ndays =
SIZE(daily_data)
146 start_day =
julday(days, months, years)
149 end_day = start_day + ndays - 1_i4
152 call dec2date(real(end_day, dp), yy = yeare, mm = monthe, dd = daye)
155 allocate(ncounter_m(years : yeare, 12))
156 allocate(ncounter_m_full(years : yeare, 12))
157 allocate(mon_sum(years : yeare, 12))
159 ncounter_m_full(:, :) = 0
160 mon_sum(:, :) = 0.0_dp
162 newtime = real(start_day, dp)
164 do tt = 1, (end_day - start_day + 1)
165 call dec2date((newtime + tt - 1), yy = year, mm = month, dd = day)
166 ncounter_m_full(year, month) = ncounter_m_full(year, month) + 1.0_dp
167 if (abs(daily_data(tt) - missing) .lt.
eps_dp) cycle
168 mon_sum(year, month) = mon_sum(year, month) + daily_data(tt)
169 ncounter_m(year, month) = ncounter_m(year, month) + 1.0_dp
176 if ((y .EQ. years) .AND. (m .LT. months)) cycle
177 if ((y .EQ. yeare) .AND. (m .GT. monthe)) cycle
178 nmonths = nmonths + 1
183 if(
allocated(mon_avg))
deallocate(mon_avg)
184 allocate(mon_avg(nmonths))
189 if ((y .EQ. years) .AND. (m .LT. months)) cycle
190 if ((y .EQ. yeare) .AND. (m .GT. monthe)) cycle
192 if ((ncounter_m(y, m) .GT. 0) .AND. &
193 (abs(ncounter_m_full(y, m) - ncounter_m(y, m)) .LT.
eps_dp))
then
194 mon_avg(kk) = mon_sum(y, m) / real(ncounter_m(y, m), dp)
195 else if ((ncounter_m(y, m) .GT. 0) .AND. remove)
then
196 mon_avg(kk) = mon_sum(y, m) / real(ncounter_m(y, m), dp)
201 deallocate(ncounter_m_full)
202 deallocate(ncounter_m)
205 END SUBROUTINE day2mon_average_dp
208 SUBROUTINE hour2day_average_dp(hourly_data, yearS, monthS, dayS, hourS, day_avg, misval, rm_misval)
212 REAL(dp),
dimension(:),
INTENT(IN) :: hourly_data
213 INTEGER(i4),
INTENT(IN) :: yearS
214 INTEGER(i4),
INTENT(IN) :: monthS
215 INTEGER(i4),
INTENT(IN) :: dayS
216 INTEGER(i4),
INTENT(IN) :: hourS
218 REAL(dp),
dimension(:),
allocatable,
INTENT(INOUT) :: day_avg
220 REAL(dp),
optional,
INTENT(IN) :: misval
221 logical,
optional,
INTENT(IN) :: rm_misval
224 INTEGER(i4) :: nhours, ndays_dummy, tt, dd, kk
225 REAL(dp) :: start_day, end_day
226 INTEGER(i4) :: yearE, monthE, dayE, hourE, hourEd
228 REAL(dp),
dimension(:),
allocatable :: nCounter_h
229 REAL(dp),
dimension(:),
allocatable :: nCounter_h_full
230 REAL(dp),
dimension(:),
allocatable :: day_sum
235 if (
present(misval))
then
241 if (
present(rm_misval))
then
248 nhours =
SIZE(hourly_data)
250 start_day =
julday(days, months, years) - 0.5_dp + real(hours, dp) / 24._dp
253 end_day = start_day + real(nhours - 1._dp, dp) / 24._dp
256 call dec2date(end_day, yy = yeare, mm = monthe, dd = daye, hh = houre)
259 ndays_dummy = ceiling(real(nhours, dp) / 24._dp + 2._dp)
261 allocate(day_sum(ndays_dummy))
262 allocate(ncounter_h(ndays_dummy))
263 allocate(ncounter_h_full(ndays_dummy))
266 ncounter_h_full(:) = 0
271 call dec2date(start_day + real(tt - 1, dp) / 24._dp, hh = houred)
272 ncounter_h_full(dd) = ncounter_h_full(dd) + 1
273 if (abs(hourly_data(tt) - missing) .lt.
eps_dp)
then
274 day_sum(dd) = day_sum(dd)
276 day_sum(dd) = day_sum(dd) + hourly_data(tt)
277 ncounter_h(dd) = ncounter_h(dd) + 1
279 if ((houred .EQ. 23) .AND. (tt .LT. nhours)) dd = dd + 1
283 allocate(day_avg(dd))
288 if ((ncounter_h(kk) .GT. 0) .AND. &
289 (abs(ncounter_h_full(kk) - ncounter_h(kk)) .LT.
eps_dp))
then
290 day_avg(kk) = day_sum(kk) / real(ncounter_h(kk), dp)
291 else if ((ncounter_h(kk) .GT. 0) .AND. remove)
then
292 day_avg(kk) = day_sum(kk) / real(ncounter_h(kk), dp)
296 deallocate(ncounter_h_full)
297 deallocate(ncounter_h)
300 END SUBROUTINE hour2day_average_dp
304 SUBROUTINE day2mon_sum_dp(daily_data, yearS, monthS, dayS, mon_sum, misval, rm_misval)
308 REAL(dp),
dimension(:),
INTENT(IN) :: daily_data
309 INTEGER(i4),
INTENT(IN) :: yearS
310 INTEGER(i4),
INTENT(IN) :: monthS
311 INTEGER(i4),
INTENT(IN) :: dayS
313 REAL(dp),
dimension(:),
allocatable,
INTENT(OUT) :: mon_sum
315 REAL(dp),
optional,
INTENT(IN) :: misval
316 logical,
optional,
INTENT(IN) :: rm_misval
319 INTEGER(i4) :: ndays, tt, kk
320 INTEGER(i4) :: start_day, end_day
322 INTEGER(i4) :: year, month, day
323 INTEGER(i4) :: yearE, monthE, dayE
326 REAL(dp),
dimension(:, :),
allocatable :: nCounter_m
327 REAL(dp),
dimension(:, :),
allocatable :: nCounter_m_full
328 REAL(dp),
dimension(:, :),
allocatable :: mon_sum_temp_2d
329 REAL(dp),
dimension(:),
allocatable :: mon_sum_temp_1d
331 INTEGER(i4) :: nmonths
335 if (
present(misval))
then
341 if (
present(rm_misval))
then
348 ndays =
SIZE(daily_data)
351 start_day =
julday(days, months, years)
354 end_day = start_day + ndays - 1_i4
357 call dec2date(real(end_day, dp), yy = yeare, mm = monthe, dd = daye)
360 allocate(ncounter_m(years : yeare, 12))
361 allocate(ncounter_m_full(years : yeare, 12))
362 allocate(mon_sum_temp_2d(years : yeare, 12))
364 ncounter_m_full(:, :) = 0
365 mon_sum_temp_2d(:, :) = 0.0_dp
367 newtime = real(start_day, dp)
369 do tt = 1, (end_day - start_day + 1)
370 call dec2date((newtime + tt - 1), yy = year, mm = month, dd = day)
371 ncounter_m_full(year, month) = ncounter_m_full(year, month) + 1.0_dp
372 if (abs(daily_data(tt) - missing) .lt.
eps_dp) cycle
373 mon_sum_temp_2d(year, month) = mon_sum_temp_2d(year, month) + daily_data(tt)
374 ncounter_m(year, month) = ncounter_m(year, month) + 1.0_dp
381 if ((y .EQ. years) .AND. (m .LT. months)) cycle
382 if ((y .EQ. yeare) .AND. (m .GT. monthe)) cycle
383 nmonths = nmonths + 1
389 allocate(mon_sum_temp_1d(nmonths))
390 mon_sum_temp_1d(:) = missing
394 if ((y .EQ. years) .AND. (m .LT. months)) cycle
395 if ((y .EQ. yeare) .AND. (m .GT. monthe)) cycle
397 if ((ncounter_m(y, m) .GT. 0) .AND. &
398 (abs(ncounter_m_full(y, m) - ncounter_m(y, m)) .LT.
eps_dp))
then
399 mon_sum_temp_1d(kk) = mon_sum_temp_2d(y, m)
400 else if ((ncounter_m(y, m) .GT. 0) .AND. remove)
then
401 mon_sum_temp_1d(kk) = mon_sum_temp_2d(y, m)
406 if(
allocated(mon_sum))
deallocate(mon_sum)
407 allocate(mon_sum(nmonths))
408 mon_sum = mon_sum_temp_1d
410 deallocate(ncounter_m_full)
411 deallocate(ncounter_m)
412 deallocate(mon_sum_temp_2d)
413 deallocate(mon_sum_temp_1d)
415 END SUBROUTINE day2mon_sum_dp
Day-to-month average (day2mon_average)
Day-to-month sum (day2mon_sum)
Hour-to-day average (hour2day_average)
Provides computational, mathematical, physical, and file constants.
real(dp), parameter, public eps_dp
epsilon(1.0) in double precision
Julian date conversion routines.
elemental subroutine, public dec2date(julian, dd, mm, yy, hh, nn, ss, calendar)
Day, month, year, hour, minute, and second from fractional Julian day in the current or given calenda...
elemental integer(i4) function, public julday(dd, mm, yy, calendar)
Julian day from day, month and year in the current or given calendar.
Define number representations.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
Temporal aggregation for time series (averaging)