Line data Source code
1 : !EOC
2 : !------------------------------------------------------------------------------
3 : ! Harmonized Emissions Component (HEMCO) !
4 : !------------------------------------------------------------------------------
5 : !BOP
6 : !
7 : ! !MODULE: hcoio_diagn_mod.F90
8 : !
9 : ! !DESCRIPTION: Module HCOIO\_Diagn\_Mod.F90 is the data interface module
10 : ! for the HEMCO diagnostics. It contains routines to write out diagnostics
11 : ! into a netCDF file.
12 : !\\
13 : !\\
14 : ! In an ESMF/MAPL environment, the HEMCO diagnostics are not directly
15 : ! written to disk but passed to the gridded component export state, where
16 : ! they can be picked up by the MAPL HISTORY component.
17 : !\\
18 : !\\
19 : ! !INTERFACE:
20 : !
21 : MODULE HCOIO_DIAGN_MOD
22 : !
23 : ! !USES:
24 : !
25 : USE HCO_ERROR_MOD
26 :
27 : IMPLICIT NONE
28 : PRIVATE
29 : !
30 : ! !PUBLIC MEMBER FUNCTIONS:
31 : !
32 : PUBLIC :: HcoDiagn_Write
33 : PUBLIC :: HCOIO_Diagn_WriteOut
34 : !
35 : ! !REMARKS:
36 : ! HEMCO diagnostics are still in testing mode. We will fully activate them
37 : ! at a later time. They will be turned on when debugging & unit testing.
38 : !
39 : ! !REVISION HISTORY:
40 : ! 04 May 2014 - C. Keller - Initial version.
41 : ! See https://github.com/geoschem/hemco for complete history
42 : !EOP
43 : !------------------------------------------------------------------------------
44 : !BOC
45 : !
46 : ! !DEFINED PARAMETERS:
47 : !
48 : ! Fill value used in HEMCO diagnostics netCDF files.
49 : ! REAL(hp), PARAMETER :: FillValue = 1.e-31_hp
50 : REAL(sp), PARAMETER :: FillValue = HCO_MISSVAL
51 :
52 : CONTAINS
53 : !EOC
54 : !------------------------------------------------------------------------------
55 : ! Harmonized Emissions Component (HEMCO) !
56 : !------------------------------------------------------------------------------
57 : !BOP
58 : !
59 : ! !IROUTINE: HcoDiagn_Write
60 : !
61 : ! !DESCRIPTION: Subroutine HcoDiagn\_Write is the wrapper routine to write out
62 : ! the content of the built-in HEMCO diagnostics. If input argument Restart is
63 : ! set to TRUE, only the restart collection will be written out. Otherwise,
64 : ! the default collection
65 : !\\
66 : !\\
67 : ! !INTERFACE:
68 : !
69 0 : SUBROUTINE HcoDiagn_Write( HcoState, Restart, RC )
70 : !
71 : ! !USES:
72 : !
73 : USE HCO_State_Mod, ONLY : HCO_State
74 : USE HCO_Clock_Mod, ONLY : HcoClock_SetLast
75 : !
76 : ! !INPUT/OUTPUT PARAMETERS:
77 : !
78 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO state object
79 : LOGICAL, INTENT(IN ) :: Restart ! write restart (enforced)?
80 : !
81 : ! !INPUT/OUTPUT PARAMETERS:
82 : !
83 : INTEGER, INTENT(INOUT) :: RC ! Return code
84 : !
85 : ! !REVISION HISTORY:
86 : ! 03 Apr 2015 - C. Keller - Initial version
87 : ! See https://github.com/geoschem/hemco for complete history
88 : !EOP
89 : !------------------------------------------------------------------------------
90 : !BOC
91 : !
92 : ! !LOCAL VARIABLES:
93 : !
94 : INTEGER :: I, COL
95 : CHARACTER(LEN=255) :: MSG, LOC
96 : #ifdef ADJOINT
97 : INTEGER :: MaxIdx
98 : #endif
99 :
100 : !=================================================================
101 : ! HcoDiagn_Write begins here!
102 : !=================================================================
103 :
104 : ! Init
105 0 : LOC = 'HcoDiagn_Write (hcoio_diagn_mod.F90)'
106 :
107 : ! To write restart (enforced)
108 0 : IF ( RESTART ) THEN
109 : CALL HCOIO_DIAGN_WRITEOUT ( HcoState, &
110 : ForceWrite = .TRUE., &
111 : UsePrevTime = .FALSE., &
112 : COL = HcoState%Diagn%HcoDiagnIDRestart, &
113 0 : RC = RC )
114 0 : IF( RC /= HCO_SUCCESS) RETURN
115 :
116 : ! Set last flag for use below
117 0 : CALL HcoClock_SetLast ( HcoState%Clock, .TRUE., RC )
118 0 : IF( RC /= HCO_SUCCESS) RETURN
119 :
120 : CALL HCOIO_DIAGN_WRITEOUT ( HcoState, &
121 : ForceWrite = .FALSE., &
122 : UsePrevTime = .FALSE., &
123 : COL = HcoState%Diagn%HcoDiagnIDDefault, &
124 0 : RC = RC )
125 0 : IF( RC /= HCO_SUCCESS) RETURN
126 :
127 : #ifdef ADJOINT
128 : IF (HcoState%isAdjoint) THEN
129 : CALL HCOIO_DIAGN_WRITEOUT ( HcoState, &
130 : ForceWrite = .FALSE., &
131 : UsePrevTime = .FALSE., &
132 : COL = HcoState%Diagn%HcoDiagnIDAdjoint, &
133 : RC = RC )
134 : IF( RC /= HCO_SUCCESS) RETURN
135 : ENDIF
136 : #endif
137 :
138 : ! Reset IsLast flag. This is to ensure that the last flag is not
139 : ! carried over (ckeller, 11/1/16).
140 0 : CALL HcoClock_SetLast ( HcoState%Clock, .FALSE., RC )
141 0 : IF( RC /= HCO_SUCCESS) RETURN
142 :
143 : ELSE
144 :
145 : ! Loop over all collections that shall be written out.
146 : ! HCOIO_DIAGN_WRITEOUT will determine whether it is time to
147 : ! write a collection or not.
148 : #ifndef ADJOINT
149 0 : DO I = 1, 3
150 : #else
151 : MaxIdx = 3
152 : IF (HcoState%isAdjoint) MaxIdx = 4
153 : DO I = 1, MaxIdx
154 : #endif
155 :
156 : ! Define collection ID
157 0 : SELECT CASE ( I )
158 : CASE ( 1 )
159 0 : COL = HcoState%Diagn%HcoDiagnIDDefault
160 : CASE ( 2 )
161 0 : COL = HcoState%Diagn%HcoDiagnIDRestart
162 : CASE ( 3 )
163 0 : COL = HcoState%Diagn%HcoDiagnIDManual
164 : #ifdef ADJOINT
165 : CASE ( 4 )
166 : COL = HcoState%Diagn%HcoDiagnIDAdjoint
167 : #endif
168 : END SELECT
169 :
170 : #if !defined ( ESMF_ )
171 : ! If not ESMF environment, never write the manual diagnostics
172 : ! to disk. Instead, the content of the manual diagnostics needs
173 : ! to be fetched explicitly.
174 0 : IF ( I == 3 ) CYCLE
175 : #else
176 : ! Don't write restart variables to EXPORT in an ESMF environment.
177 : ! They are already passed to the INTERNAL state when calling
178 : ! HCO_RestartWrite. (ckeller, 10/9/17)
179 : IF ( I == 2 ) CYCLE
180 : #endif
181 :
182 : ! Restart file
183 : CALL HCOIO_DIAGN_WRITEOUT ( HcoState, &
184 : ForceWrite = .FALSE., &
185 : UsePrevTime = .FALSE., &
186 : COL = COL, &
187 0 : RC = RC )
188 0 : IF(RC /= HCO_SUCCESS) RETURN
189 : ENDDO
190 : ENDIF
191 :
192 : END SUBROUTINE HcoDiagn_Write
193 : !EOC
194 : !------------------------------------------------------------------------------
195 : ! Harmonized Emissions Component (HEMCO) !
196 : !------------------------------------------------------------------------------
197 : !BOP
198 : !
199 : ! !IROUTINE: HCOIO_Diagn_WriteOut
200 : !
201 : ! !DESCRIPTION: Subroutine HCOIO\_Diagn\_WriteOut writes diagnostics to
202 : ! output. Depending on the model environment, different subroutines will
203 : ! be invoked.
204 : !\\
205 : !\\
206 : ! !INTERFACE:
207 : !
208 0 : SUBROUTINE HCOIO_Diagn_WriteOut( HcoState, ForceWrite, &
209 : RC, PREFIX, UsePrevTime, &
210 : OnlyIfFirst, COL )
211 : !
212 : ! !USES:
213 : !
214 : USE HCO_State_Mod, ONLY : HCO_State
215 : USE HCOIO_Write_Mod, ONLY : HCOIO_Write
216 : !
217 : ! !INPUT PARAMETERS:
218 : !
219 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO state object
220 : LOGICAL, INTENT(IN ) :: ForceWrite ! Write all diagnostics?
221 : CHARACTER(LEN=*), OPTIONAL, INTENT(IN ) :: PREFIX ! File prefix
222 : LOGICAL, OPTIONAL, INTENT(IN ) :: UsePrevTime ! Use previous time
223 : LOGICAL, OPTIONAL, INTENT(IN ) :: OnlyIfFirst ! Only write if nnDiagn is 1
224 : INTEGER, OPTIONAL, INTENT(IN ) :: COL ! Collection Nr.
225 : !
226 : ! !INPUT/OUTPUT PARAMETERS:
227 : !
228 : INTEGER, INTENT(INOUT) :: RC ! Failure or success
229 : !
230 : ! !REVISION HISTORY:
231 : ! 12 Sep 2013 - C. Keller - Initial version
232 : ! See https://github.com/geoschem/hemco for complete history
233 : !EOP
234 : !------------------------------------------------------------------------------
235 : !BOC
236 : !
237 : ! !LOCAL VARIABLES:
238 : !
239 : ! Strings
240 : CHARACTER(LEN=255) :: errMsg, thisLoc
241 :
242 : !=================================================================
243 : ! HCOIO_DIAGN_WRITEOUT begins here!
244 : !=================================================================
245 :
246 : ! Initialize
247 0 : RC = HCO_SUCCESS
248 0 : errMsg = ''
249 0 : thisLoc = 'HCOIO_DIAGN_WRITEOUT (src/Core/hcoio_diagn_mod.F90)'
250 :
251 :
252 : #if defined(ESMF_)
253 : !------------------------------------------------------------------------
254 : ! ESMF environment: call ESMF output routines
255 : !------------------------------------------------------------------------
256 : CALL HCOIO_Write( HcoState, &
257 : RC, &
258 : OnlyIfFirst = OnlyIfFirst, &
259 : COL = COL )
260 :
261 : ! Trap errors
262 : IF ( RC /= HCO_SUCCESS ) THEN
263 : errMsg = 'Error encountered in routine "HCOIO_Write"!'
264 : CALL HCO_ERROR( errMsg, RC, thisLoc )
265 : RETURN
266 : ENDIF
267 :
268 : #else
269 : !------------------------------------------------------------------------
270 : ! Standard environment: call default output routines
271 : !------------------------------------------------------------------------
272 : CALL HCOIO_Write( HcoState, &
273 : ForceWrite, &
274 : RC, &
275 : PREFIX = PREFIX, &
276 : UsePrevTime = UsePrevTime, &
277 : OnlyIfFirst = OnlyIfFirst, &
278 0 : COL = COL )
279 :
280 : ! Trap errors
281 0 : IF ( RC /= HCO_SUCCESS ) THEN
282 0 : errMsg = 'Error encountered in routine "HCOIO_Write"!'
283 0 : CALL HCO_ERROR( errMsg, RC, thisLoc )
284 0 : RETURN
285 : ENDIF
286 :
287 : #endif
288 :
289 : ! Return
290 0 : RC = HCO_SUCCESS
291 :
292 : END SUBROUTINE HCOIO_DIAGN_WRITEOUT
293 : !EOC
294 : END MODULE HCOIO_Diagn_Mod
295 :
|