1 |
C $Header: /u/gcmpack/MITgcm/pkg/gchem/gchem_forcing_sep.F,v 1.44 2017/03/29 15:46:27 mmazloff Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "GCHEM_OPTIONS.h" |
5 |
#ifdef ALLOW_DIC |
6 |
# include "DIC_OPTIONS.h" |
7 |
#endif |
8 |
#ifdef ALLOW_BLING |
9 |
# include "BLING_OPTIONS.h" |
10 |
#endif |
11 |
#ifdef ALLOW_DARWIN |
12 |
# include "DARWIN_OPTIONS.h" |
13 |
#endif |
14 |
|
15 |
CBOP |
16 |
C !ROUTINE: GCHEM_FORCING_SEP |
17 |
C !INTERFACE: ========================================================== |
18 |
SUBROUTINE GCHEM_FORCING_SEP( myTime, myIter, myThid ) |
19 |
|
20 |
C !DESCRIPTION: |
21 |
C calls subroutine that will update passive tracers values |
22 |
C with a separate timestep. Since GCHEM_FORCING_SEP is now |
23 |
C called before DO_FIELDS_BLOCKING_EXCHANGES, the passive |
24 |
C tracer values in the halo regions are not up to date and |
25 |
C must not be used. |
26 |
|
27 |
C !USES: =============================================================== |
28 |
IMPLICIT NONE |
29 |
#include "SIZE.h" |
30 |
#include "EEPARAMS.h" |
31 |
#include "PARAMS.h" |
32 |
#include "GRID.h" |
33 |
#include "DYNVARS.h" |
34 |
#include "PTRACERS_SIZE.h" |
35 |
#include "PTRACERS_PARAMS.h" |
36 |
#include "PTRACERS_FIELDS.h" |
37 |
#include "GCHEM.h" |
38 |
#ifdef ALLOW_DIC |
39 |
# include "DIC_VARS.h" |
40 |
#endif /* ALLOW_DIC */ |
41 |
#ifdef ALLOW_BLING |
42 |
# include "BLING_VARS.h" |
43 |
#endif /* ALLOW_BLING */ |
44 |
#ifdef ALLOW_DARWIN |
45 |
# include "DARWIN_FLUX.h" |
46 |
# include "DARWIN_SIZE.h" |
47 |
#endif |
48 |
|
49 |
C !INPUT PARAMETERS: =================================================== |
50 |
C myThid :: thread number |
51 |
_RL myTime |
52 |
INTEGER myIter, myThid |
53 |
CEOP |
54 |
|
55 |
#ifdef ALLOW_GCHEM |
56 |
#ifdef GCHEM_SEPARATE_FORCING |
57 |
|
58 |
C!LOCAL VARIABLES: ==================================================== |
59 |
C i,j :: loop indices |
60 |
C bi,bj :: tile indices |
61 |
C k :: vertical level |
62 |
INTEGER bi,bj,iMin,iMax,jMin,jMax |
63 |
c INTEGER i,j |
64 |
PARAMETER( iMin = 1 , iMax = sNx ) |
65 |
PARAMETER( jMin = 1 , jMax = sNy ) |
66 |
#if (defined ALLOW_OBCS) || (defined ALLOW_DIAGNOSTICS) |
67 |
INTEGER iTr |
68 |
#endif |
69 |
#ifdef ALLOW_DIAGNOSTICS |
70 |
CHARACTER*8 diagName |
71 |
#endif /* ALLOW_DIAGNOSTICS */ |
72 |
|
73 |
#ifdef ALLOW_DEBUG |
74 |
IF (debugMode) CALL DEBUG_ENTER('GCHEM_FORCING_SEP',myThid) |
75 |
#endif |
76 |
|
77 |
#ifdef ALLOW_DIAGNOSTICS |
78 |
IF ( useDiagnostics ) THEN |
79 |
C-- fill-in tracer diagnostics before any GChem udate |
80 |
DO iTr = 1,gchem_sepFTr_num |
81 |
diagName = ' ' |
82 |
WRITE(diagName,'(A5,A2)') 'GC_Tr', PTRACERS_ioLabel(iTr) |
83 |
CALL DIAGNOSTICS_FILL( pTracer(1-OLx,1-OLy,1,1,1,iTr), diagName, |
84 |
& 0, Nr, 0, 1, 1, myThid ) |
85 |
ENDDO |
86 |
ENDIF |
87 |
#endif /* ALLOW_DIAGNOSTICS */ |
88 |
|
89 |
ccccccccccccccccccccccccc |
90 |
c global calculations c |
91 |
ccccccccccccccccccccccccc |
92 |
#ifdef ALLOW_OLD_VIRTUALFLUX |
93 |
#ifdef ALLOW_DIC |
94 |
# ifdef ALLOW_AUTODIFF |
95 |
IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (1)' |
96 |
# else /* ALLOW_AUTODIFF */ |
97 |
IF ( useDIC ) THEN |
98 |
# endif /* ALLOW_AUTODIFF */ |
99 |
c find global surface averages |
100 |
gsm_s = 0. _d 0 |
101 |
gsm_dic = 0. _d 0 |
102 |
gsm_alk = 0. _d 0 |
103 |
CALL GCHEM_SURFMEAN(salt,gsm_s,myThid) |
104 |
CALL GCHEM_SURFMEAN( |
105 |
& pTracer(1-OLx,1-OLy,1,1,1,1), gsm_dic, myThid ) |
106 |
print*,'mean surface dic', gsm_dic,gsm_s |
107 |
CALL GCHEM_SURFMEAN( |
108 |
& pTracer(1-OLx,1-OLy,1,1,1,2), gsm_alk, myThid ) |
109 |
# ifndef ALLOW_AUTODIFF |
110 |
ENDIF |
111 |
# endif /* ALLOW_AUTODIFF */ |
112 |
#endif /* ALLOW_DIC */ |
113 |
#ifdef ALLOW_DARWIN |
114 |
c IF ( useDARWIN ) THEN |
115 |
c find global surface averages |
116 |
gsm_s = 0. _d 0 |
117 |
gsm_dic = 0. _d 0 |
118 |
gsm_alk = 0. _d 0 |
119 |
CALL GCHEM_SURFMEAN(salt,gsm_s,myThid) |
120 |
CALL GCHEM_SURFMEAN( |
121 |
& pTracer(1-OLx,1-OLy,1,1,1,iDIC), gsm_dic, myThid ) |
122 |
print*,'mean surface dic', gsm_dic,gsm_s |
123 |
CALL GCHEM_SURFMEAN( |
124 |
& pTracer(1-OLx,1-OLy,1,1,1,iALK), gsm_alk, myThid ) |
125 |
c ENDIF |
126 |
#endif |
127 |
ccccccccccccccccccccccccccccccccccccccccccc |
128 |
#endif /* ALLOW_OLD_VIRTUALFLUX */ |
129 |
|
130 |
#ifdef ALLOW_DARWIN |
131 |
IF ( useDARWIN ) THEN |
132 |
CALL DARWIN_CONS( myIter, myTime, myThid ) |
133 |
ENDIF |
134 |
#endif |
135 |
|
136 |
ccccccccccccccccccccccccc |
137 |
c chemical forcing c |
138 |
ccccccccccccccccccccccccc |
139 |
C$taf loop = parallel |
140 |
DO bj=myByLo(myThid),myByHi(myThid) |
141 |
C$taf loop = parallel |
142 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
143 |
|
144 |
ccccccccccccccccccccccccccc DIC cccccccccccccccccccccccccccccccc |
145 |
#ifdef ALLOW_DIC |
146 |
# ifdef ALLOW_AUTODIFF |
147 |
IF (.NOT.useDIC) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (2)' |
148 |
# else /* ALLOW_AUTODIFF */ |
149 |
IF ( useDIC ) THEN |
150 |
# endif /* ALLOW_AUTODIFF */ |
151 |
#ifdef ALLOW_DEBUG |
152 |
IF (debugMode) CALL DEBUG_CALL('DIC_BIOTIC_FORCING',myThid) |
153 |
#endif |
154 |
#ifdef ALLOW_FE |
155 |
CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), |
156 |
& pTracer(1-OLx,1-OLy,1,bi,bj,2), |
157 |
& pTracer(1-OLx,1-OLy,1,bi,bj,3), |
158 |
& pTracer(1-OLx,1-OLy,1,bi,bj,4), |
159 |
& pTracer(1-OLx,1-OLy,1,bi,bj,5), |
160 |
& pTracer(1-OLx,1-OLy,1,bi,bj,6), |
161 |
& bi, bj, iMin, iMax, jMin, jMax, |
162 |
& myIter, myTime, myThid ) |
163 |
#else |
164 |
#ifdef ALLOW_O2 |
165 |
CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), |
166 |
& pTracer(1-OLx,1-OLy,1,bi,bj,2), |
167 |
& pTracer(1-OLx,1-OLy,1,bi,bj,3), |
168 |
& pTracer(1-OLx,1-OLy,1,bi,bj,4), |
169 |
& pTracer(1-OLx,1-OLy,1,bi,bj,5), |
170 |
& bi, bj, iMin, iMax, jMin, jMax, |
171 |
& myIter, myTime, myThid ) |
172 |
#else |
173 |
CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), |
174 |
& pTracer(1-OLx,1-OLy,1,bi,bj,2), |
175 |
& pTracer(1-OLx,1-OLy,1,bi,bj,3), |
176 |
& pTracer(1-OLx,1-OLy,1,bi,bj,4), |
177 |
& bi, bj, iMin, iMax, jMin, jMax, |
178 |
& myIter, myTime, myThid ) |
179 |
#endif |
180 |
#endif |
181 |
# ifndef ALLOW_AUTODIFF |
182 |
ENDIF |
183 |
# endif /* ALLOW_AUTODIFF */ |
184 |
#endif /* ALLOW_DIC */ |
185 |
cccccccccccccccccccccccccc END DIC cccccccccccccccccccccccccccccccccc |
186 |
|
187 |
ccccccccccccccccccccccccccc BLING cccccccccccccccccccccccccccccccc |
188 |
#ifdef ALLOW_BLING |
189 |
IF ( useBLING ) THEN |
190 |
CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1), |
191 |
& pTracer(1-OLx,1-OLy,1,bi,bj,2), |
192 |
& pTracer(1-OLx,1-OLy,1,bi,bj,3), |
193 |
& pTracer(1-OLx,1-OLy,1,bi,bj,4), |
194 |
& pTracer(1-OLx,1-OLy,1,bi,bj,5), |
195 |
& pTracer(1-OLx,1-OLy,1,bi,bj,6), |
196 |
& pTracer(1-OLx,1-OLy,1,bi,bj,7), |
197 |
& pTracer(1-OLx,1-OLy,1,bi,bj,8), |
198 |
# ifdef ADVECT_PHYTO |
199 |
& pTracer(1-OLx,1-OLy,1,bi,bj,9), |
200 |
# endif |
201 |
& bi, bj, iMin, iMax, jMin, jMax, |
202 |
& myIter, myTime, myThid ) |
203 |
ENDIF |
204 |
#endif /* ALLOW_BLING */ |
205 |
cccccccccccccccccccccccccc END BLING cccccccccccccccccccccccccccccccccc |
206 |
|
207 |
#ifdef ALLOW_DARWIN |
208 |
IF ( useDARWIN ) THEN |
209 |
#ifdef NUT_SUPPLY |
210 |
c articficial supply of nutrients |
211 |
#ifdef ALLOW_DEBUG |
212 |
IF (debugMode) CALL DEBUG_CALL('DARWIN_NUT_SUPPLY',myThid) |
213 |
#endif |
214 |
CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,1), |
215 |
& bi, bj, iMin, iMax, jMin, jMax, |
216 |
& myIter, myTime, myThid ) |
217 |
CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,2), |
218 |
& bi, bj, iMin, iMax, jMin, jMax, |
219 |
& myIter, myTime, myThid ) |
220 |
CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,3), |
221 |
& bi, bj, iMin, iMax, jMin, jMax, |
222 |
& myIter, myTime, myThid ) |
223 |
CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,4), |
224 |
& bi, bj, iMin, iMax, jMin, jMax, |
225 |
& myIter, myTime, myThid ) |
226 |
#endif |
227 |
ccccccccccccccc |
228 |
C darwin_forcing operates on bi,bj part only, but needs to get full |
229 |
C array because of last (iPtr) index |
230 |
#ifdef ALLOW_DEBUG |
231 |
IF (debugMode) CALL DEBUG_CALL('DARWIN_FORCING',myThid) |
232 |
#endif |
233 |
CALL DARWIN_FORCING( pTracer(1-OLx,1-OLy,1,1,1,1), |
234 |
& bi, bj, iMin, iMax, jMin, jMax, |
235 |
& myIter, myTime, myThid ) |
236 |
ENDIF |
237 |
#endif /* ALLOW_DARWIN */ |
238 |
|
239 |
#ifdef ALLOW_OBCS |
240 |
C-- Apply (again) open boundary conditions for each passive tracer |
241 |
C Note: could skip this 2nd call to OBCS_APPLY if all DIC/DARWIN |
242 |
C updates of ptracers were only done in the interior (i.e. with |
243 |
C tendency multiplied by maskInC) |
244 |
IF ( useOBCS .AND. .NOT.useDIC ) THEN |
245 |
#ifdef ALLOW_DEBUG |
246 |
IF (debugMode) CALL DEBUG_CALL('OBCS_APPLY_PTRACER',myThid) |
247 |
#endif |
248 |
DO iTr = 1,gchem_sepFTr_num |
249 |
CALL OBCS_APPLY_PTRACER( |
250 |
I bi, bj, 0, iTr, |
251 |
U pTracer(1-OLx,1-OLy,1,bi,bj,iTr), |
252 |
I myThid ) |
253 |
ENDDO |
254 |
ENDIF |
255 |
#endif /* ALLOW_OBCS */ |
256 |
|
257 |
ENDDO |
258 |
ENDDO |
259 |
|
260 |
#ifdef ALLOW_DARWIN |
261 |
IF ( useDARWIN ) THEN |
262 |
CALL DARWIN_CONS( myIter, myTime, myThid ) |
263 |
#ifdef ALLOW_CARBON |
264 |
CALL DIC_ATMOS( 1, myTime, myIter, myThid ) |
265 |
#endif |
266 |
ENDIF |
267 |
#endif /* ALLOW_DARWIN */ |
268 |
|
269 |
#ifdef ALLOW_DIC |
270 |
# ifdef ALLOW_AUTODIFF |
271 |
IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (3)' |
272 |
# else /* ALLOW_AUTODIFF */ |
273 |
IF ( useDIC ) THEN |
274 |
# endif /* ALLOW_AUTODIFF */ |
275 |
#ifdef ALLOW_DEBUG |
276 |
IF (debugMode) CALL DEBUG_CALL('DIC_ATMOS',myThid) |
277 |
#endif |
278 |
CALL DIC_ATMOS( myTime, myIter, myThid ) |
279 |
# ifdef COMPONENT_MODULE |
280 |
CALL DIC_STORE_FLUXCO2( myTime, myIter, myThid ) |
281 |
# endif |
282 |
# ifdef ALLOW_COST |
283 |
CALL DIC_COST( myTime, myIter, myThid ) |
284 |
# endif |
285 |
# ifndef ALLOW_AUTODIFF |
286 |
ENDIF |
287 |
# endif /* ALLOW_AUTODIFF */ |
288 |
#endif /* ALLOW_DIC */ |
289 |
|
290 |
#ifdef ALLOW_DEBUG |
291 |
IF (debugMode) CALL DEBUG_LEAVE('GCHEM_FORCING_SEP',myThid) |
292 |
#endif |
293 |
|
294 |
#endif /* GCHEM_SEPARATE_FORCING */ |
295 |
#endif /* ALLOW_GCHEM */ |
296 |
|
297 |
RETURN |
298 |
END |