Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hco_tidx_mod.F90
7 : !
8 : ! !DESCRIPTION: Module HCO\_tIdx\_Mod contains routines and variables
9 : ! to organize and index data array time slices.
10 : !\\
11 : !\\
12 : ! The HEMCO data containers can hold multiple 2D or 3D data arrays
13 : ! (aligned in a vector), providing a 4th dimension (time). During
14 : ! emission calculation, only the vector element ('time slice')
15 : ! representative for the given time will be used. Currently, the
16 : ! following time slice intervals are supported:
17 : !
18 : ! \begin{itemize}
19 : ! \item Constant: Only one time slice (default)
20 : ! \item Hourly: Between 2-24 time slices. These slices will be split
21 : ! into even day bins, and are cycled through accordingly.
22 : ! the local time is used to obtain the current valid index at
23 : ! each longitude.
24 : ! \item Hourly\_gridded: As hourly, but uses the same time slice index
25 : ! across all longitudes (based upon UTC time).
26 : ! \item Weekdaily: Seven time slices, representing the days of the
27 : ! week: Sun, Mon, ..., Sat. Uses local time.
28 : ! \item Monthly: 12 time slices, representing the months of the year:
29 : ! Jan, ..., Dec. Uses local time.
30 : ! \end{itemize}
31 : !
32 : ! The time slice cycling frequency is automatically determined during
33 : ! creation of a data container - based upon the time stamp settings in
34 : ! the HEMCO configuration file and the time information read from the
35 : ! data (netCDF) file.
36 : !\\
37 : !\\
38 : ! Spatial uniform data (i.e. nx = ny = 1) is always assigned the local
39 : ! time cycle intervals (hourly, weekdaily, or monthly), e.g. the local
40 : ! time is used at every grid box when picking the time slice at a given
41 : ! time. For gridded data, it's assumed that local-time effects are already
42 : ! taken into account and UTC time is used at all locations to select the
43 : ! currently valid time slice. The exception is weekdaily data, which is
44 : ! always assumed to be in local time.
45 : !\\
46 : !\\
47 : ! Structure AlltIDx organizes the indexing of the vector arrays. It
48 : ! contains the current valid time slice index for each of the above
49 : ! defined time slice intervals. Each data container points to one of the
50 : ! elements of AlltIDx, according to the temporal dimension of its array.
51 : ! The values of AlltIDx become update on every HEMCO time step.
52 : !\\
53 : !\\
54 : !
55 : ! !INTERFACE:
56 : !
57 : MODULE HCO_tIdx_Mod
58 : !
59 : ! !USES:
60 : !
61 : USE HCO_Error_Mod
62 : USE HCO_Types_Mod, ONLY : TimeIdx
63 : USE HCO_Types_Mod, ONLY : TimeIdxCollection
64 :
65 : IMPLICIT NONE
66 : PRIVATE
67 : !
68 : ! !PUBLIC MEMBER FUNCTIONS:
69 : !
70 : PUBLIC :: tIDx_Assign
71 : PUBLIC :: tIDx_Init
72 : PUBLIC :: tIDx_GetIndx
73 : PUBLIC :: tIDx_Cleanup
74 : PUBLIC :: tIDx_IsInRange
75 : PUBLIC :: HCO_GetPrefTimeAttr
76 : PUBLIC :: HCO_ExtractTime
77 : !
78 : ! !REMARKS:
79 : ! The current local time implementation assumes a regular grid,
80 : ! i.e. local time does not change with latitude!
81 : !
82 : ! !REVISION HISTORY:
83 : ! 29 Dec 2012 - C. Keller - Initialization
84 : ! See https://github.com/geoschem/hemco for complete history
85 : !EOP
86 : !------------------------------------------------------------------------------
87 : !BOC
88 : !
89 : ! !PRIVATE TYPES:
90 : !
91 : CONTAINS
92 : !EOC
93 : !------------------------------------------------------------------------------
94 : ! Harmonized Emissions Component (HEMCO) !
95 : !------------------------------------------------------------------------------
96 : !BOP
97 : !
98 : ! !ROUTINE: tIDx_Init
99 : !
100 : ! !DESCRIPTION: Subroutine tIDx\_Init initializes the time slice index
101 : ! collection.
102 : !\\
103 : !\\
104 : ! !INTERFACE:
105 : !
106 0 : SUBROUTINE tIDx_Init( HcoState, RC )
107 : !
108 : ! !USES:
109 : !
110 : USE HCO_State_Mod, ONLY : HCO_State
111 : !
112 : ! !INPUT/OUTPUT PARAMETERS:
113 : !
114 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
115 : INTEGER, INTENT(INOUT) :: RC ! Return code
116 : !
117 : ! !REVISION HISTORY:
118 : ! 29 Dec 2012 - C. Keller - Initialization
119 : ! See https://github.com/geoschem/hemco for complete history
120 : !EOP
121 : !------------------------------------------------------------------------------
122 : !BOC
123 : !
124 : ! !LOCAL VARIABLES:
125 : !
126 : CHARACTER(LEN=255) :: LOC
127 :
128 : !======================================================================
129 : ! tIDx_Init begins here!
130 : !======================================================================
131 0 : LOC = 'tIDx_Init (HCO_TIDX_MOD.F90)'
132 :
133 : ! Enter
134 0 : CALL HCO_ENTER ( HcoState%Config%Err, LOC, RC )
135 0 : IF ( RC /= HCO_SUCCESS ) THEN
136 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
137 0 : RETURN
138 : ENDIF
139 :
140 : ! Allocate collection of time indeces
141 0 : ALLOCATE ( HcoState%AlltIDx )
142 :
143 : ! Initialize the vectors holding the currently valid time slice
144 : ! indices for the various cycle intervals. Only create longitude-
145 : ! dependent time slice vector if cycle interval changes with
146 : ! longitude, i.e. if it is time-zone dependent.
147 :
148 : ! ----------------------------------------------------------------
149 : ! "CONSTANT" => only one time slice, no cycling.
150 : ! ----------------------------------------------------------------
151 0 : ALLOCATE ( HcoState%AlltIDx%CONSTANT )
152 0 : HcoState%AlltIDx%CONSTANT%TypeID = 0
153 0 : HcoState%AlltIDx%CONSTANT%TempRes = "Constant"
154 :
155 : ! ----------------------------------------------------------------
156 : ! "HOURLY" => changes every hour, longitude-dependent
157 : ! ----------------------------------------------------------------
158 0 : ALLOCATE ( HcoState%AlltIDx%HOURLY )
159 0 : HcoState%AlltIDx%HOURLY%TypeID = 24
160 0 : HcoState%AlltIDx%HOURLY%TempRes = "Hourly"
161 :
162 : ! ----------------------------------------------------------------
163 : ! "HOURLY_GRID" => changes every hour, longitude-independent
164 : ! ----------------------------------------------------------------
165 0 : ALLOCATE ( HcoState%AlltIDx%HOURLY_GRID )
166 0 : HcoState%AlltIDx%HOURLY_GRID%TypeID = 241
167 0 : HcoState%AlltIDx%HOURLY_GRID%TempRes = "Hourly_Grid"
168 :
169 : ! ----------------------------------------------------------------
170 : ! "WEEKDAY" => changes every weekday, longitude-dependent
171 : ! ----------------------------------------------------------------
172 0 : ALLOCATE ( HcoState%AlltIDx%WEEKDAY )
173 0 : HcoState%AlltIDx%WEEKDAY%TypeID = 7
174 0 : HcoState%AlltIDx%WEEKDAY%TempRes = "Weekday"
175 :
176 : ! ----------------------------------------------------------------
177 : ! "MONTHLY" => changes every month, longitude-dependent
178 : ! ----------------------------------------------------------------
179 0 : ALLOCATE ( HcoState%AlltIDx%MONTHLY )
180 0 : HcoState%AlltIDx%MONTHLY%TypeID = 12
181 0 : HcoState%AlltIDx%MONTHLY%TempRes = "Monthly"
182 :
183 : ! Return w/ success
184 0 : CALL HCO_LEAVE ( HcoState%Config%Err, RC )
185 :
186 : END SUBROUTINE tIDx_Init
187 : !EOC
188 : !------------------------------------------------------------------------------
189 : ! Harmonized Emissions Component (HEMCO) !
190 : !------------------------------------------------------------------------------
191 : !BOP
192 : !
193 : ! !ROUTINE: tIDx_Set
194 : !
195 : ! !DESCRIPTION: Subroutine tIDx\_Set linkes the passed TimeIDx type to the
196 : ! corresponding element in the TimeIdx collection, according to the given
197 : ! TypeID. TypeID can be one of the following:
198 : !
199 : ! \begin{itemize}
200 : ! \item 1: Constant
201 : ! \item 24: Hourly
202 : ! \item 241: Hourly\_Grid
203 : ! \item 7: Weekday
204 : ! \item 71: Weekday\_Grid
205 : ! \item 12: Monthly
206 : ! \end{itemize}
207 : !
208 : ! !INTERFACE:
209 : !
210 0 : SUBROUTINE tIDx_Set( HcoState, ctIDx, TypeID )
211 : !
212 : ! !USES:
213 : !
214 : USE HCO_State_Mod, ONLY : HCO_State
215 : !
216 : ! !INPUT PARAMETERS:
217 : !
218 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO state
219 : TYPE(TimeIdx), POINTER :: ctIDx ! container TimeIDx
220 : INTEGER, INTENT(IN) :: TypeID ! type ID
221 : !
222 : ! !REVISION HISTORY:
223 : ! 29 Dec 2012 - C. Keller - Initialization
224 : ! See https://github.com/geoschem/hemco for complete history
225 : !EOP
226 : !------------------------------------------------------------------------------
227 : !BOC
228 :
229 : !======================================================================
230 : ! tIDx_Set begins here!
231 : !======================================================================
232 :
233 : ! Set pointer according to TempRes
234 0 : SELECT CASE ( TypeID )
235 :
236 : CASE ( 1 )
237 0 : ctIDx => HcoState%AlltIDx%CONSTANT
238 :
239 : CASE ( 24 )
240 0 : ctIDx => HcoState%AlltIDx%HOURLY
241 :
242 : CASE ( 241 )
243 0 : ctIDx => HcoState%AlltIDx%HOURLY_GRID
244 :
245 : CASE ( 7 )
246 0 : ctIDx => HcoState%AlltIDx%WEEKDAY
247 :
248 : CASE ( 12 )
249 0 : ctIDx => HcoState%AlltIDx%MONTHLY
250 :
251 : CASE DEFAULT
252 0 : ctIDx => HcoState%AlltIDx%CONSTANT
253 :
254 : END SELECT
255 :
256 0 : END SUBROUTINE tIDx_Set
257 : !EOC
258 : !------------------------------------------------------------------------------
259 : ! Harmonized Emissions Component (HEMCO) !
260 : !------------------------------------------------------------------------------
261 : !BOP
262 : !
263 : ! !ROUTINE: tIDx_Cleanup
264 : !
265 : ! !DESCRIPTION: Subroutine tIDx\_Cleanup deallocates the time slice
266 : ! index collection.
267 : !\\
268 : !\\
269 : ! !INTERFACE:
270 : !
271 0 : SUBROUTINE tIDx_Cleanup( AlltIDx )
272 : !
273 : ! !Input/output arguments:
274 : !
275 : TYPE(TimeIdxCollection), POINTER :: AlltIDx
276 : !
277 : ! !REVISION HISTORY:
278 : ! 29 Dec 2012 - C. Keller - Initialization
279 : ! See https://github.com/geoschem/hemco for complete history
280 : !EOP
281 : !------------------------------------------------------------------------------
282 : !BOC
283 :
284 : !======================================================================
285 : ! tIDx_Cleanup begins here!
286 : !======================================================================
287 :
288 0 : IF ( ASSOCIATED( AlltIDx ) ) THEN
289 :
290 0 : IF ( ASSOCIATED(AlltIDx%CONSTANT) ) THEN
291 0 : DEALLOCATE(AlltIDx%CONSTANT)
292 : ENDIF
293 :
294 0 : IF ( ASSOCIATED(AlltIDx%HOURLY) ) THEN
295 0 : DEALLOCATE(AlltIDx%HOURLY)
296 : ENDIF
297 :
298 0 : IF ( ASSOCIATED(AlltIDx%HOURLY_GRID) ) THEN
299 0 : DEALLOCATE(AlltIDx%HOURLY_GRID)
300 : ENDIF
301 :
302 0 : IF ( ASSOCIATED(AlltIDx%WEEKDAY) ) THEN
303 0 : DEALLOCATE(AlltIDx%WEEKDAY)
304 : ENDIF
305 :
306 0 : IF ( ASSOCIATED(AlltIDx%MONTHLY) ) THEN
307 0 : DEALLOCATE(AlltIDx%MONTHLY)
308 : ENDIF
309 :
310 : ! Also deallocate AlltIDx pointer
311 0 : DEALLOCATE( AlltIDx )
312 : ENDIF
313 0 : AlltIDx => NULL()
314 :
315 0 : END SUBROUTINE tIDx_Cleanup
316 : !EOC
317 : !------------------------------------------------------------------------------
318 : ! Harmonized Emissions Component (HEMCO) !
319 : !------------------------------------------------------------------------------
320 : !BOP
321 : !
322 : ! !ROUTINE: tIDx_GetIndx
323 : !
324 : ! !DESCRIPTION: Subroutine tIDx\_GetIndx calculates the current valid
325 : ! index values for the given file data time slice type and longitude
326 : ! location
327 : !\\
328 : ! !INTERFACE:
329 : !
330 0 : FUNCTION tIDx_GetIndx ( HcoState, Dta, I, J ) RESULT ( Indx )
331 : !
332 : ! !USES:
333 : !
334 : USE HCO_State_Mod, ONLY : HCO_State
335 : USE HCO_Types_Mod, ONLY : FileData
336 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Get, HcoClock_GetLocal
337 : !
338 : ! !INPUT PARAMETERS:
339 : !
340 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
341 : TYPE(FileData), POINTER :: Dta ! File data object
342 : INTEGER, INTENT(IN) :: I ! Longitude index of interest
343 : INTEGER, INTENT(IN) :: J ! Latitude index of interest
344 : !
345 : ! !INPUT/OUTPUT PARAMETERS:
346 : !
347 : INTEGER :: Indx ! Index
348 : !
349 : ! !REVISION HISTORY:
350 : ! 02 Dec 2014 - C. Keller - Initial version
351 : ! See https://github.com/geoschem/hemco for complete history
352 : !EOP
353 : !------------------------------------------------------------------------------
354 : !BOC
355 : !
356 : ! !LOCAL VARIABLES:
357 : !
358 : INTEGER :: HH, WD, MM, RC
359 : REAL(hp) :: LonHH
360 : REAL(dp) :: frac
361 : CHARACTER(LEN=255) :: LOC
362 :
363 : !======================================================================
364 : ! tIDx_GetIndx begins here!
365 : !======================================================================
366 0 : LOC = 'tIDx_GetIndx (HCO_TIDX_MOD.F90)'
367 :
368 : ! Default value (=> This will cause the code to crash!)
369 0 : Indx = -1
370 :
371 : ! ----------------------------------------------------------------
372 : ! Calculate time slice index for the given time slice type
373 : ! ----------------------------------------------------------------
374 0 : SELECT CASE ( Dta%tIDx%TypeID )
375 :
376 : ! Constant: there is only one time slice
377 : CASE ( 1 )
378 0 : Indx = 1
379 :
380 : ! Hourly data (local time)
381 : ! Indx returns the time slice representative for the LOCAL time
382 : ! at longitude Lon.
383 : CASE ( 24 )
384 0 : CALL HcoClock_GetLocal( HcoState, I, J, cH=LonHH, RC=RC )
385 0 : IF ( RC /= HCO_SUCCESS ) THEN
386 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
387 0 : RETURN
388 : ENDIF
389 0 : Indx = FLOOR(LonHH) + 1
390 :
391 : ! Hourly data (already gridded)
392 : ! Gridded hourly data is assumed to be already adjusted for
393 : ! local time effects, hence just point to the time slice
394 : ! of current UTC time. Add one since hour starts at 0.
395 : CASE ( 241 )
396 0 : CALL HcoClock_Get( HcoState%Clock, cH=HH, RC=RC )
397 0 : IF ( RC /= HCO_SUCCESS ) THEN
398 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
399 0 : RETURN
400 : ENDIF
401 0 : Indx = HH + 1
402 :
403 : ! Weekday data (local time)
404 : ! Indx returns the time slice representative for the LOCAL
405 : ! weekday at longitude Lon.
406 : CASE ( 7 )
407 :
408 0 : CALL HcoClock_GetLocal( HcoState, I, J, cWeekday=WD, RC=RC )
409 0 : IF ( RC /= HCO_SUCCESS ) THEN
410 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
411 0 : RETURN
412 : ENDIF
413 0 : Indx = WD + 1
414 :
415 : ! Monthly data (local time)
416 : ! Monthly data is always in local time.
417 : ! For gridded monthly data, only the current valid time slice
418 : ! is kept in memory (and updated whenever a new month is entered).
419 : CASE ( 12 )
420 0 : CALL HcoClock_GetLocal( HcoState, I, J, cMM = MM, RC=RC )
421 0 : IF ( RC /= HCO_SUCCESS ) THEN
422 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
423 0 : RETURN
424 : ENDIF
425 0 : Indx = MM
426 :
427 : ! Default: assume it's constant
428 : CASE DEFAULT
429 0 : Indx = 1
430 :
431 : END SELECT
432 :
433 : ! For hourly data with less than 24 time slices, i.e. time
434 : ! intervals of more than 1 hour, map 24 hour index onto the
435 : ! reduced time slice.
436 : ! For example, for 3-hourly data (8 vector elements), this will
437 : ! return index 1 for hours 0-2am, index 2 for 3-5am, etc.
438 : ! Dta%DeltaT denotes the time difference between between two time
439 : ! slices (in hours).
440 0 : IF ( Dta%DeltaT > 1 .AND. Dta%DeltaT < 24 ) THEN
441 0 : frac = DBLE(Indx) / DBLE(Dta%DeltaT)
442 0 : Indx = CEILING( frac )
443 : ENDIF
444 :
445 : ! Sanity check: index must not exceed time dimension
446 0 : IF ( Indx > Dta%nt ) THEN
447 0 : WRITE(*,*) 'Indx exceeds # of time slices! ', Indx, Dta%nt, TRIM(Dta%ncFile)
448 0 : Indx = -1
449 : ENDIF
450 :
451 0 : END FUNCTION tIDx_GetIndx
452 : !EOC
453 : !------------------------------------------------------------------------------
454 : ! Harmonized Emissions Component (HEMCO) !
455 : !------------------------------------------------------------------------------
456 : !BOP
457 : !
458 : ! !IROUTINE: tIDx_Assign
459 : !
460 : ! !DESCRIPTION: Subroutine tIDx\_Assign assigns the time index
461 : ! pointer of the file data object of the passed list container
462 : ! to the corresponding time index element of the time index
463 : ! collection. The time slice cycle interval is determined from
464 : ! the number of time slices (length of the data array vector) and
465 : ! the time difference (deltaT) between them.
466 : !\\
467 : !\\
468 : ! Note: Scale factors read directly from the HEMCO configuration file
469 : ! become their delta T assigned upon reading from file (see
470 : ! subroutine Register\_Scal in hco\_config\_mod.F90).
471 : !\\
472 : !\\
473 : ! !INTERFACE:
474 : !
475 0 : SUBROUTINE tIDx_Assign( HcoState, Dct, RC )
476 : !
477 : ! !USES:
478 : !
479 : USE HCO_State_Mod, ONLY : HCO_State
480 : USE HCO_Types_Mod, ONLY : DataCont
481 : !
482 : ! !INPUT PARAMETERS:
483 : !
484 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
485 : TYPE(DataCont), POINTER :: Dct ! Data container
486 : !
487 : ! !INPUT/OUTPUT PARAMETERS:
488 : !
489 : INTEGER, INTENT(INOUT) :: RC ! Success or failure?
490 : !
491 : ! !REVISION HISTORY:
492 : ! 13 Jan 2014 - C. Keller - Initial version
493 : ! See https://github.com/geoschem/hemco for complete history
494 : !EOP
495 : !------------------------------------------------------------------------------
496 : !BOC
497 : !
498 : ! !LOCAL VARIABLES:
499 : !
500 : INTEGER :: nx, ny, nt, ntexp, dt
501 : INTEGER :: cTypeID
502 : CHARACTER(LEN=255) :: MSG, LOC
503 :
504 : !-----------------------------------
505 : ! tIDx_Assign begins here!
506 : !-----------------------------------
507 0 : LOC = 'tIDx_Assign (HCO_TIDX_MOD.F90)'
508 :
509 : ! Enter
510 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
511 0 : IF ( RC /= HCO_SUCCESS ) THEN
512 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
513 0 : RETURN
514 : ENDIF
515 :
516 : ! Check if already done
517 0 : IF ( ASSOCIATED( Dct%Dta%tIDx ) ) THEN
518 0 : CALL HCO_LEAVE( HcoState%Config%Err, RC )
519 0 : RETURN
520 : ENDIF
521 :
522 : ! Get array dimensions
523 0 : nt = Dct%Dta%nt
524 :
525 : ! Do the following only for defined data arrays
526 0 : IF ( nt > 0 ) THEN
527 :
528 : ! -------------------------------------------------------------
529 : ! Extract data array dimensions and delta t [h] between time
530 : ! slices
531 : ! -------------------------------------------------------------
532 0 : dt = Dct%Dta%DeltaT
533 0 : IF ( Dct%Dta%SpaceDim <= 2 ) THEN
534 0 : nx = SIZE(Dct%Dta%V2(1)%Val,1)
535 0 : ny = SIZE(Dct%Dta%V2(1)%Val,2)
536 : ELSE
537 0 : nx = SIZE(Dct%Dta%V3(1)%Val,1)
538 0 : ny = SIZE(Dct%Dta%V3(1)%Val,2)
539 : ENDIF
540 :
541 : ! -------------------------------------------------------------
542 : ! Auto detection of temporal resolution.
543 : ! -------------------------------------------------------------
544 :
545 : ! No time variation
546 0 : IF ( nt == 1 ) THEN
547 0 : cTypeID = 1
548 :
549 : ! -------------------------------------------------------------
550 : ! Daily varying data.
551 : ! For now, these arrays must contain seven time slices, i.e.
552 : ! one for every weekday (starting w/ sunday!).
553 : ! -------------------------------------------------------------
554 0 : ELSEIF ( nt == 7 ) THEN
555 :
556 : ! Sanity check if dt = 24 hours
557 0 : IF ( dt /= 24 ) THEN
558 : MSG = '7 time slices but delta t is not 24 hours!' // &
559 0 : TRIM(Dct%cName)
560 0 : CALL HCO_ERROR( MSG, RC )
561 0 : RETURN
562 : ENDIF
563 :
564 : ! Check if data is in local time or not, set TempRes attribute
565 : ! accordingly. Data will only be in local time if data is
566 : ! spatially uniform or country-specific data. The IsLocTime
567 : ! flag is set in hco_config_mod.F90 (for data read from other
568 : ! sources than netCDF) or in hcoio_dataread_mod.F90 (for
569 : ! weekdaily data read from netCDF).
570 0 : IF ( .NOT. Dct%Dta%IsLocTime ) THEN
571 : MSG = 'Weekday data must be in local time!' // &
572 0 : TRIM(Dct%cName)
573 0 : CALL HCO_ERROR( MSG, RC )
574 0 : RETURN
575 :
576 : ELSE
577 0 : cTypeID = 7
578 : ! cTypeID = 71
579 : ENDIF
580 :
581 : ! -------------------------------------------------------------
582 : ! Monthly varying data
583 : ! This must be a scalar. Gridded monthly data should be read
584 : ! slice by slice!
585 : ! -------------------------------------------------------------
586 0 : ELSEIF ( nt == 12 .AND. dt /= 2 ) THEN
587 0 : IF ( nx == 1 .AND. ny == 1 ) THEN
588 0 : cTypeID = 12
589 : ELSE
590 : MSG = 'Monthly data must not be gridded:' // &
591 0 : TRIM(Dct%cName)
592 0 : CALL HCO_ERROR( MSG, RC )
593 0 : RETURN
594 : ENDIF
595 :
596 : ! -------------------------------------------------------------
597 : ! Hourly varying data.
598 : ! Hourly time slices can represent more than just one hour,
599 : ! e.g. an array can hold only 8 time slices, each representing
600 : ! 3-hourly intervals of the day. The only constraint is that
601 : ! the number of time slices have to be a factor of 24!
602 : ! -------------------------------------------------------------
603 0 : ELSEIF ( dt < 24 .AND. dt > 0 ) THEN
604 :
605 : ! Check if we can evenly split up data within a day
606 0 : IF ( MOD(24,dt) /= 0 ) THEN
607 : MSG = 'Cannot properly split up hourly data!' // &
608 0 : TRIM(Dct%cName)
609 0 : CALL HCO_ERROR( MSG, RC )
610 0 : RETURN
611 : ENDIF
612 :
613 : ! Also check if nt is indeed of expected size
614 0 : ntexp = 24/dt
615 0 : IF ( ntexp /= nt ) THEN
616 : MSG = 'Wrong delta t and/or number of time slices!' // &
617 0 : TRIM(Dct%cName)
618 0 : CALL HCO_ERROR( MSG, RC )
619 0 : RETURN
620 : ENDIF
621 :
622 : ! Check if data is in local time or not, set TempRes attribute
623 : ! accordingly. Data will only be in local time if data is
624 : ! read from other sources than netCDF. The corresponding
625 : ! IsLocTime flag is set in hco_config_mod.F90.
626 0 : IF ( Dct%Dta%IsLocTime ) THEN
627 0 : cTypeID = 24
628 : ELSE
629 0 : cTypeID = 241
630 : ENDIF
631 :
632 : ! -------------------------------------------------------------
633 : ! Return w/ error otherwise
634 : ! -------------------------------------------------------------
635 : ELSE
636 : MSG = 'Invalid time slice for field ' // &
637 0 : TRIM(Dct%cName)
638 0 : CALL HCO_ERROR( MSG, RC )
639 0 : RETURN
640 : ENDIF
641 :
642 : ! -------------------------------------------------------------
643 : ! Establish the appropriate pointer for the
644 : ! 4th dimension (temporal resolution) of the field array
645 : ! -------------------------------------------------------------
646 0 : CALL tIDx_Set( HcoState, Dct%Dta%tIDx, cTypeID )
647 :
648 : ENDIF
649 :
650 : ! Leave w/ success
651 0 : CALL HCO_LEAVE( HcoState%Config%Err, RC )
652 :
653 : END SUBROUTINE tIDx_Assign
654 : !EOC
655 : !------------------------------------------------------------------------------
656 : ! Harmonized Emissions Component (HEMCO) !
657 : !------------------------------------------------------------------------------
658 : !BOP
659 : !
660 : ! !ROUTINE: tIDx_IsInRange
661 : !
662 : ! !DESCRIPTION: Subroutine tIDx\_IsInRange returns true if the passed datetime
663 : ! is within the range of the date ranges of the data container.
664 : !\\
665 : ! !INTERFACE:
666 : !
667 0 : FUNCTION tIDx_IsInRange ( Lct, Yr, Mt, Dy, Hr ) RESULT ( InRange )
668 : !
669 : ! !USES:
670 : !
671 : USE HCO_TYPES_MOD, ONLY : ListCont
672 : !
673 : ! !INPUT PARAMETERS:
674 : !
675 : TYPE(ListCont), POINTER :: Lct ! File data object
676 : INTEGER, INTENT(IN) :: Yr
677 : INTEGER, INTENT(IN) :: Mt
678 : INTEGER, INTENT(IN) :: Dy
679 : INTEGER, INTENT(IN) :: Hr
680 : !
681 : ! !INPUT/OUTPUT PARAMETERS:
682 : !
683 : LOGICAL :: InRange
684 : !
685 : ! !REVISION HISTORY:
686 : ! 04 Mar 2015 - C. Keller - Initial version
687 : ! See https://github.com/geoschem/hemco for complete history
688 : !EOP
689 : !------------------------------------------------------------------------------
690 : !BOC
691 : !
692 : ! !LOCAL VARIABLES:
693 : !
694 : ! Init
695 0 : InRange = .TRUE.
696 :
697 0 : IF ( Lct%Dct%Dta%ncYrs(1) /= Lct%Dct%Dta%ncYrs(2) ) THEN
698 0 : IF ( Yr < Lct%Dct%Dta%ncYrs(1) .OR. &
699 : Yr > Lct%Dct%Dta%ncYrs(2) ) THEN
700 0 : InRange = .FALSE.
701 : ENDIF
702 : ENDIF
703 :
704 0 : IF ( Lct%Dct%Dta%ncMts(1) /= Lct%Dct%Dta%ncMts(2) ) THEN
705 0 : IF ( Mt < Lct%Dct%Dta%ncMts(1) .OR. &
706 : Mt > Lct%Dct%Dta%ncMts(2) ) THEN
707 0 : InRange = .FALSE.
708 : ENDIF
709 : ENDIF
710 :
711 0 : IF ( Lct%Dct%Dta%ncDys(1) /= Lct%Dct%Dta%ncDys(2) ) THEN
712 0 : IF ( Dy < Lct%Dct%Dta%ncDys(1) .OR. &
713 : Dy > Lct%Dct%Dta%ncDys(2) ) THEN
714 0 : InRange = .FALSE.
715 : ENDIF
716 : ENDIF
717 :
718 0 : IF ( Lct%Dct%Dta%ncHrs(1) /= Lct%Dct%Dta%ncHrs(2) ) THEN
719 0 : IF ( Hr < Lct%Dct%Dta%ncHrs(1) .OR. &
720 : Hr > Lct%Dct%Dta%ncHrs(2) ) THEN
721 0 : InRange = .FALSE.
722 : ENDIF
723 : ENDIF
724 :
725 0 : END FUNCTION tIDx_IsInRange
726 : !EOC
727 : !------------------------------------------------------------------------------
728 : ! Harmonized Emissions Component (HEMCO) !
729 : !------------------------------------------------------------------------------
730 : !BOP
731 : !
732 : ! !IROUTINE: HCO_GetPrefTimeAttr
733 : !
734 : ! !DESCRIPTION: Subroutine HCO\_GetPrefTimeAttr returns the preferred time
735 : ! reading attributes for a given field, based upon the specs set in the HEMCO
736 : ! configuration file and the current simulation date. This routine is used
737 : ! to select the proper time slice to be read at the given time.
738 : !\\
739 : !\\
740 : ! The time reading attributes are set to the value that is closest (or equal)
741 : ! to the current datetime but within the range provided in the configuration
742 : ! file. If the year, month, or day is not specified, the current simulation
743 : ! date values are taken. For unspecified hours, a value of -1 is returned
744 : ! (this allows to read all hourly slices at once).
745 : !\\
746 : !\\
747 : ! !INTERFACE:
748 : !
749 0 : SUBROUTINE HCO_GetPrefTimeAttr( HcoState, Lct, &
750 : readYr, readMt, readDy, &
751 : readHr, readMn, RC )
752 : !
753 : ! !USES:
754 : !
755 : USE HCO_STATE_MOD, ONLY : HCO_State
756 : USE HCO_TYPES_MOD, ONLY : ListCont
757 : USE HCO_TYPES_MOD, ONLY : HCO_CFLAG_RANGE, HCO_CFLAG_EXACT
758 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Get
759 : USE HCO_TIMESHIFT_MOD, ONLY : TimeShift_Apply
760 : !
761 : ! !INPUT PARAMETERS:
762 : !
763 : TYPE(HCO_State), POINTER :: HcoState ! List container
764 : TYPE(ListCont), POINTER :: Lct ! List container
765 : !
766 : ! !OUTPUT PARAMETERS:
767 : !
768 : INTEGER, INTENT( OUT) :: readYr ! preferred year
769 : INTEGER, INTENT( OUT) :: readMt ! preferred month
770 : INTEGER, INTENT( OUT) :: readDy ! preferred day
771 : INTEGER, INTENT( OUT) :: readHr ! preferred hour
772 : INTEGER, INTENT( OUT) :: readMn ! preferred minute
773 : !
774 : ! !INPUT/OUTPUT PARAMETERS:
775 : !
776 : INTEGER, INTENT(INOUT) :: RC ! Success or failure?
777 : !
778 : ! !REVISION HISTORY:
779 : ! 13 Jan 2014 - C. Keller - Initial version
780 : ! See https://github.com/geoschem/hemco for complete history
781 : !EOP
782 : !------------------------------------------------------------------------------
783 : !BOC
784 : !
785 : ! !LOCAL VARIABLES:
786 : !
787 : INTEGER :: cYr, cMt, cDy, cWd, cHr, cMn, sYr
788 : LOGICAL :: InRange
789 : CHARACTER(LEN=255) :: LOC
790 :
791 : !-----------------------------------
792 : ! HCO_GetPrefTimeAttr begins here!
793 : !-----------------------------------
794 0 : LOC = 'HCO_GetPrefTimeAttr (HCO_TIDX_MOD.F90)'
795 :
796 : ! Init
797 0 : RC = HCO_SUCCESS
798 :
799 : ! Get current time
800 : CALL HcoClock_Get( HcoState%Clock, &
801 : cYYYY = cYr, cMM = cMt, cDD = cDy, &
802 : cWEEKDAY = cWd, cH = cHr, cM = cMn, &
803 0 : sYYYY = sYr, RC = RC )
804 0 : IF ( RC /= HCO_SUCCESS ) THEN
805 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
806 0 : RETURN
807 : ENDIF
808 :
809 : ! Always use simulation year when specified
810 0 : IF ( Lct%Dct%Dta%UseSimYear ) cYr = sYr
811 :
812 : ! preferred minute is always current one
813 0 : readMn = cMn
814 :
815 : ! If data is in weekdays, set day to weekday: 1=Sun, ..., 7=Sat
816 0 : IF ( Lct%Dct%Dta%ncDys(1) == 1 .AND. &
817 : Lct%Dct%Dta%ncDys(2) == 7 ) THEN
818 0 : cDy = cWd + 1
819 : ENDIF
820 :
821 : ! -------------------------------------------------------------
822 : ! If CycleFlag is set to range, the preferred datetime is
823 : ! the current date if we are within the provided range, and
824 : ! invalid otherwise.
825 : ! -------------------------------------------------------------
826 0 : IF ( Lct%Dct%Dta%CycleFlag == HCO_CFLAG_RANGE ) THEN
827 :
828 : ! Are we in range?
829 0 : InRange = tIDx_IsInRange ( Lct, cYr, cMt, cDy, cHr )
830 :
831 0 : IF ( InRange ) THEN
832 0 : readYr = cYr
833 0 : readMt = cMt
834 0 : readDy = cDy
835 0 : IF ( Lct%Dct%Dta%ncHrs(1) == -1 ) THEN
836 0 : readHr = -1
837 : ELSE
838 0 : readHr = cHr
839 : ENDIF
840 : ELSE
841 0 : readYr = -1
842 0 : readMt = -1
843 0 : readDy = -1
844 0 : readHr = -1
845 : ENDIF
846 :
847 : ! Eventually shift reference time by amount specified
848 : ! in HEMCO configuration file
849 : CALL TimeShift_Apply ( HcoState, Lct, &
850 0 : readYr, readMt, readDy, readHr, readMn, RC )
851 :
852 : ! Don't need below
853 0 : RETURN
854 : ENDIF
855 :
856 : ! -------------------------------------------------------------
857 : ! If CycleFlag is set to exact, the preferred datetime is
858 : ! always the current date.
859 : ! -------------------------------------------------------------
860 0 : IF ( Lct%Dct%Dta%CycleFlag == HCO_CFLAG_EXACT ) THEN
861 0 : readYr = cYr
862 0 : readMt = cMt
863 0 : readDy = cDy
864 0 : IF ( Lct%Dct%Dta%ncHrs(1) == -1 ) THEN
865 0 : readHr = -1
866 : ELSE
867 0 : readHr = cHr
868 : ENDIF
869 :
870 : ! Eventually shift reference time by amount specified
871 : ! in HEMCO configuration file
872 : CALL TimeShift_Apply ( HcoState, Lct, &
873 0 : readYr, readMt, readDy, readHr, readMn, RC )
874 :
875 : ! Don't need below
876 0 : RETURN
877 : ENDIF
878 :
879 : ! -------------------------------------------------------------
880 : ! If CycleFlag is anything else, select the time attributes
881 : ! as specified in the configuration file and closest to
882 : ! current simulation date.
883 : ! -------------------------------------------------------------
884 :
885 : ! Year
886 0 : IF ( Lct%Dct%Dta%ncYrs(1) == Lct%Dct%Dta%ncYrs(2) ) THEN
887 0 : readYr = Lct%Dct%Dta%ncYrs(1)
888 : ELSE
889 : readYr = MIN( MAX(cYr,Lct%Dct%Dta%ncYrs(1)), &
890 0 : Lct%Dct%Dta%ncYrs(2) )
891 : ENDIF
892 :
893 : ! Month
894 0 : IF ( Lct%Dct%Dta%ncMts(1) == Lct%Dct%Dta%ncMts(2) ) THEN
895 0 : readMt = Lct%Dct%Dta%ncMts(1)
896 : ELSE
897 : readMt = MIN( MAX(cMt,Lct%Dct%Dta%ncMts(1)), &
898 0 : Lct%Dct%Dta%ncMts(2) )
899 : ENDIF
900 :
901 : ! Day
902 0 : IF ( Lct%Dct%Dta%ncDys(1) == Lct%Dct%Dta%ncDys(2) ) THEN
903 0 : readDy = Lct%Dct%Dta%ncDys(1)
904 : ELSE
905 : readDy = MIN( MAX(cDy,Lct%Dct%Dta%ncDys(1)), &
906 0 : Lct%Dct%Dta%ncDys(2) )
907 : ENDIF
908 :
909 : ! Hour
910 0 : IF ( Lct%Dct%Dta%ncHrs(1) == Lct%Dct%Dta%ncHrs(2) ) THEN
911 0 : readHr = Lct%Dct%Dta%ncHrs(1)
912 : ELSE
913 : readHr = MIN( MAX(cHr,Lct%Dct%Dta%ncHrs(1)), &
914 0 : Lct%Dct%Dta%ncHrs(2) )
915 : ENDIF
916 :
917 : ! For weekday data, set day to 1. The seven day slices to be
918 : ! read will be detected based upon the current year/month.
919 0 : IF ( Lct%Dct%Dta%ncDys(1) == -10 ) readDy = 1
920 :
921 : ! Don't allow invalid entries for years, months or days, i.e.
922 : ! force readYr, readMt and readDy to be positive!
923 : ! readHr can be negative, in which case all hourly fields will
924 : ! become read!
925 0 : IF ( readYr < 0 ) readYr = cYr
926 0 : IF ( readMt < 0 ) readMt = cMt
927 0 : IF ( readDy < 0 ) readDy = cDy
928 :
929 : ! Eventually shift reference time by amount specified
930 : ! in HEMCO configuration file
931 : CALL TimeShift_Apply ( HcoState, Lct, &
932 0 : readYr, readMt, readDy, readHr, readMn, RC )
933 0 : IF ( RC /= HCO_SUCCESS ) THEN
934 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
935 0 : RETURN
936 : ENDIF
937 :
938 : ! Return w/ success
939 0 : RC = HCO_SUCCESS
940 :
941 : END SUBROUTINE HCO_GetPrefTimeAttr
942 : !EOC
943 : !------------------------------------------------------------------------------
944 : ! Harmonized Emissions Component (HEMCO) !
945 : !------------------------------------------------------------------------------
946 : !BOP
947 : !
948 : ! !IROUTINE: HCO_ExtractTime
949 : !
950 : ! !DESCRIPTION: Subroutine HCO\_ExtractTime extracts the time stamp (ranges)
951 : ! from the passed character string. The string is expected to be in
952 : ! format Yr/Mt/Dy/Hr. Valid values for Yr, Mt, Dy and Hr are:
953 : !
954 : ! \begin{enumerate}
955 : ! \item Range of values, separated by - sign: e.g. 2000-2010.
956 : ! \item Single value: 2000
957 : ! \item Wildcard character (default = *). In this case, the data interval
958 : ! is determined automatically by HEMCO based on the number of time slices
959 : ! found in the data set.
960 : ! \item Time tokens: $YYYY, $MM, $DD, $HH. When reading the data, these values
961 : ! will be substituted by the current simulation date.
962 : ! \item String 'WD'. Denotes that the data contains weekday data. It is
963 : ! expected that the first slice represents Sunday. Weekday data can be used
964 : ! in combination with annual or monthly data. In that case, there need to be
965 : ! seven entries for every year and/or month, respectively.
966 : ! \end{enumerate}
967 : !
968 : ! The extracted time stamp is written into the arrays ncYrs, ncMts,
969 : ! ncDys and ncHrs of the passed data structure Dta.
970 : !\\
971 : !\\
972 : ! !INTERFACE:
973 : !
974 0 : SUBROUTINE HCO_ExtractTime ( HcoConfig, CharStr, Dta, RC )
975 : !
976 : ! !USES:
977 : !
978 : USE HCO_CHARPAK_MOD, ONLY : STRSPLIT
979 : USE HCO_TYPES_MOD, ONLY : FileData
980 : USE HCO_TYPES_MOD, ONLY : ConfigObj
981 : USE HCO_TYPES_MOD, ONLY : HCO_UFLAG_ALWAYS
982 : USE HCO_EXTLIST_MOD, ONLY : HCO_GetOpt
983 : USE HCO_TIMESHIFT_MOD, ONLY : TimeShift_Set
984 : !
985 : ! !INPUT PARAMETERS:
986 : !
987 : TYPE(ConfigObj), POINTER :: HcoConfig ! config obj
988 : CHARACTER(LEN=*), INTENT(IN ) :: CharStr
989 : TYPE(FileData), POINTER :: Dta
990 : !
991 : ! !OUTPUT PARAMETERS:
992 : !
993 : INTEGER, INTENT(INOUT) :: RC
994 : !
995 : ! !REVISION HISTORY:
996 : ! 18 Sep 2013 - C. Keller - Initial version (update)
997 : ! See https://github.com/geoschem/hemco for complete history
998 : !EOP
999 : !------------------------------------------------------------------------------
1000 : !BOC
1001 : !
1002 : ! !LOCAL VARIABLES:
1003 : !
1004 : INTEGER :: I, I0, I1, N, M
1005 : INTEGER :: TimeVec(8)
1006 : CHARACTER(LEN=255) :: SUBSTR(255), DATERNG(255), MSG
1007 : CHARACTER(LEN=255) :: LOC = 'HCO_ExtractTime (hco_tidx_mod.F90)'
1008 :
1009 : !=================================================================
1010 : ! HCO_ExtractTime begins here!
1011 : !=================================================================
1012 :
1013 : ! Check for case where time flag is set to just one wildcard
1014 : ! character. In this case, we want to update the file on every
1015 : ! HEMCO time step, i.e. it will be added to readlist 'Always'
1016 : ! (in hco_readlist_mod.F90).
1017 0 : IF ( TRIM(CharStr) == HCO_GetOpt(HcoConfig%ExtList,'Wildcard') ) THEN
1018 0 : Dta%UpdtFlag = HCO_UFLAG_ALWAYS
1019 0 : Dta%ncYrs = -999
1020 0 : Dta%ncMts = -999
1021 0 : Dta%ncDys = -999
1022 0 : Dta%ncHrs = -999
1023 :
1024 0 : RC = HCO_SUCCESS
1025 0 : RETURN
1026 : ENDIF
1027 :
1028 : ! Init
1029 0 : TimeVec(:) = -1
1030 :
1031 : ! Extract strings to be translated into integers
1032 0 : CALL STRSPLIT( CharStr, HCO_GetOpt(HcoConfig%ExtList,'Separator'), SUBSTR, N )
1033 0 : IF ( N < 4 ) THEN
1034 0 : MSG = 'Time stamp must have at least 4 elements: ' // TRIM(CharStr)
1035 0 : CALL HCO_ERROR( MSG, RC, THISLOC=LOC )
1036 0 : RETURN
1037 : ENDIF
1038 :
1039 : ! Extract year, month, day, and hour range from the four
1040 : ! substrings
1041 :
1042 : ! Do for each substring:
1043 0 : DO I = 1,4
1044 :
1045 : ! Indices in TimeVec:
1046 0 : I0 = (I-1) * 2 + 1
1047 0 : I1 = I0 + 1
1048 :
1049 : ! For wildcard character, set lower and upper limit both to -1.
1050 : ! In this case, the whole time slice will be read into file!
1051 0 : IF ( TRIM(SUBSTR(I)) == TRIM(HCO_GetOpt(HcoConfig%ExtList,'Wildcard') ) ) THEN
1052 0 : TimeVec(I0:I1) = -1
1053 :
1054 : ! Characters YYYY, MM, DD, and/or HH can be used to ensure that
1055 : ! the current simulation time is being used.
1056 : ELSEIF ( INDEX( TRIM(SUBSTR(I)), 'YYYY' ) > 0 .OR. &
1057 : INDEX( TRIM(SUBSTR(I)), 'MM' ) > 0 .OR. &
1058 0 : INDEX( TRIM(SUBSTR(I)), 'DD' ) > 0 .OR. &
1059 : INDEX( TRIM(SUBSTR(I)), 'HH' ) > 0 ) THEN
1060 0 : TimeVec(I0:I1) = -999
1061 :
1062 : ! For weekdaily data in UTC coordinates, set day flags to 1-7.
1063 0 : ELSEIF ( I==3 .AND. INDEX( TRIM(SUBSTR(I)), 'UTCWD' ) > 0 ) THEN
1064 0 : TimeVec(I0) = 1
1065 0 : TimeVec(I1) = 7
1066 0 : Dta%IsLocTime = .FALSE.
1067 :
1068 : ! For the daily index, value 'WD' is also supported. This
1069 : ! indicates weekdays (Sun, Mon, ..., Sat). Use a special
1070 : ! flag here to expliclity state that these are weekday data.
1071 0 : ELSEIF ( I==3 .AND. INDEX( TRIM(SUBSTR(I)), 'WD' ) > 0 ) THEN
1072 0 : TimeVec(I0:I1) = -10
1073 :
1074 : ! For the hourly index, value 'LH' is also supported. This
1075 : ! indicates local hours. Use a special flag here to expliclity
1076 : ! state that these data are local hours.
1077 0 : ELSEIF ( I==4 .AND. INDEX( TRIM(SUBSTR(I)), 'LH' ) > 0 ) THEN
1078 0 : TimeVec(I0:I1) = -10
1079 0 : Dta%IsLocTime = .TRUE.
1080 :
1081 : ! Otherwise, check for date range and set lower and upper bound
1082 : ! accordingly.
1083 : ELSE
1084 : CALL STRSPLIT( SUBSTR(I), '-', DATERNG, M )
1085 :
1086 : ! If range is given:
1087 0 : IF ( M == 2 ) THEN
1088 0 : READ( DATERNG(1), * ) TimeVec(I0)
1089 0 : READ( DATERNG(2), * ) TimeVec(I1)
1090 :
1091 : ! Use same value if only one value is given:
1092 0 : ELSEIF ( M == 1 ) THEN
1093 0 : READ( DATERNG(1), * ) TimeVec(I0)
1094 0 : TimeVec(I1) = TimeVec(I0)
1095 : ELSE
1096 0 : MSG = 'Cannot extract time stamp: ' // TRIM(CharStr)
1097 0 : CALL HCO_ERROR( MSG, RC, THISLOC=LOC )
1098 0 : RETURN
1099 : ENDIF
1100 : ENDIF
1101 :
1102 : ENDDO !I
1103 :
1104 : ! Pass to list container
1105 0 : Dta%ncYrs = TimeVec(1:2)
1106 0 : Dta%ncMts = TimeVec(3:4)
1107 0 : Dta%ncDys = TimeVec(5:6)
1108 0 : Dta%ncHrs = TimeVec(7:8)
1109 :
1110 : ! Check for local times.
1111 : ! Hourly and daily data that is in local time shall be completely
1112 : ! read into memory. This will ensure that for every time zone, the
1113 : ! correct values can be selected.
1114 : ! !IF ( Dta%IsLocTime ) THEN
1115 : ! !Dta%ncDys = -1
1116 : ! !Dta%ncHrs = -1
1117 : ! ENDIF
1118 :
1119 : ! Weekdaily data is always in local time. All seven time slices will
1120 : ! be read into memory.
1121 0 : IF ( Dta%ncDys(1) == -10 ) Dta%IsLocTime = .TRUE.
1122 :
1123 : ! If time shift is specified, archive it in attribute 'tShift'.
1124 0 : IF ( N > 4 ) THEN
1125 0 : CALL TimeShift_Set( HcoConfig, Dta, SUBSTR(5), RC )
1126 0 : IF ( RC /= HCO_SUCCESS ) THEN
1127 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
1128 0 : RETURN
1129 : ENDIF
1130 : ENDIF
1131 :
1132 : ! Leave w/ success
1133 0 : RC = HCO_SUCCESS
1134 :
1135 : END SUBROUTINE HCO_ExtractTime
1136 : !EOC
1137 : END MODULE HCO_TIDX_MOD
|