1 |
C $Header: $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "BLING_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
subroutine BLING_MAIN( PTR_DIC, PTR_ALK, PTR_NUT, |
8 |
& PTR_DOM, PTR_O2, PTR_FE, |
9 |
& bi, bj, imin, imax, jmin, jmax, |
10 |
& myIter, myTime, myThid) |
11 |
|
12 |
C ========================================================== |
13 |
C | subroutine bling_main |
14 |
C | o updates all the tracers for the effects of air-sea exchange, |
15 |
C | biological production, and remineralization. |
16 |
C ========================================================== |
17 |
|
18 |
implicit none |
19 |
|
20 |
C === Global variables === |
21 |
#include "SIZE.h" |
22 |
#include "EEPARAMS.h" |
23 |
#include "PARAMS.h" |
24 |
#include "GRID.h" |
25 |
#include "BLING_VARS.h" |
26 |
#include "PTRACERS_SIZE.h" |
27 |
#include "PTRACERS_PARAMS.h" |
28 |
#ifdef ALLOW_EXF |
29 |
# include "EXF_FIELDS.h" |
30 |
#endif |
31 |
#ifdef ALLOW_AUTODIFF_TAMC |
32 |
# include "tamc.h" |
33 |
#endif |
34 |
|
35 |
C === Routine arguments === |
36 |
C bi,bj :: tile indices |
37 |
C iMin,iMax :: computation domain: 1rst index range |
38 |
C jMin,jMax :: computation domain: 2nd index range |
39 |
C myTime :: current time |
40 |
C myIter :: current timestep |
41 |
C myThid :: thread Id. number |
42 |
INTEGER bi, bj, imin, imax, jmin, jmax |
43 |
_RL myTime |
44 |
INTEGER myIter |
45 |
INTEGER myThid |
46 |
C === Input === |
47 |
C PTR_DIC :: dissolved inorganic carbon |
48 |
C PTR_ALK :: alkalinity |
49 |
C PTR_NUT :: macro-nutrient concentration |
50 |
C PTR_DOM :: dissolved organic matter concentration |
51 |
C PTR_O2 :: oxygen concentration |
52 |
C PTR_FE :: iron concentration |
53 |
_RL PTR_DIC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
54 |
_RL PTR_ALK(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
55 |
_RL PTR_NUT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
56 |
_RL PTR_DOM(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
57 |
_RL PTR_O2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
58 |
_RL PTR_FE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
59 |
|
60 |
|
61 |
C === Local variables === |
62 |
C i,j,k :: loop indices |
63 |
C G* :: tendency term for the tracers |
64 |
C SURC :: tendency of DIC due to air-sea exchange |
65 |
C SURO :: tendency of O2 due to air-sea exchange |
66 |
C NUT_uptake :: nutrient uptake for biological production |
67 |
C POM_prod :: nutrient converted to particulate |
68 |
C organic matter |
69 |
C DOM_prod :: nutrient converted to dissolved organic |
70 |
C matter |
71 |
C DOM_remin :: DOM remineralization |
72 |
C POM_remin :: POM sinking and instant remineralization |
73 |
C NUT_remin :: Total nutrient remineralization |
74 |
C NUT_recyc :: Fast nutrient recycling |
75 |
C Fe_uptake :: iron converted to particulate organic or |
76 |
C inorganic (colloidal) iron |
77 |
C Fe_remin :: particulate iron converted to total iron |
78 |
C CaCO3_prod :: uptake of carbonate ions for CaCO3 formation |
79 |
C CaCO3_diss :: dissolution of CaCO3 |
80 |
C Car :: carbonate ion biological production |
81 |
C BioUp :: DIC biological production (<0) |
82 |
C Remin :: DIC remineralization |
83 |
C runoff* :: tendency due to river runoff |
84 |
|
85 |
INTEGER i,j,k |
86 |
_RL GDIC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
87 |
_RL GALK(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
88 |
_RL GNUT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
89 |
_RL GDOM(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
90 |
_RL GO2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
91 |
_RL GFE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
92 |
_RL SURC(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
93 |
_RL SURO(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
94 |
_RL NUT_uptake(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
95 |
_RL NUT_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
96 |
_RL NUT_recyc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
97 |
_RL POM_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
98 |
_RL POM_diss (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
99 |
_RL POM_prod (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
100 |
_RL DOM_prod (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
101 |
_RL DOM_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
102 |
_RL CaCO3_prod(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
103 |
_RL CaCO3_diss(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
104 |
_RL Fe_uptake (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
105 |
_RL Fe_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
106 |
_RL runoff_dic(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
107 |
_RL runoff_alk(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
108 |
_RL runoff_nut(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
109 |
_RL runoff_dom(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
110 |
_RL runoff_o2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
111 |
_RL runoff_fe (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
112 |
_RL BioUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
113 |
_RL Remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
114 |
_RL Car (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
115 |
|
116 |
CEOP |
117 |
|
118 |
C----------------------------------------------------------- |
119 |
C Initialize local variables |
120 |
|
121 |
DO k=1,Nr |
122 |
DO j=1-OLy,sNy+OLy |
123 |
DO i=1-OLx,sNx+OLx |
124 |
GDIC(i,j,k) = 0. _d 0 |
125 |
GALK(i,j,k) = 0. _d 0 |
126 |
GNUT(i,j,k) = 0. _d 0 |
127 |
GDOM(i,j,k) = 0. _d 0 |
128 |
GO2(i,j,k) = 0. _d 0 |
129 |
GFE(i,j,k) = 0. _d 0 |
130 |
NUT_uptake(i,j,k) = 0. _d 0 |
131 |
NUT_remin(i,j,k) = 0. _d 0 |
132 |
NUT_recyc(i,j,k) = 0. _d 0 |
133 |
DOM_remin(i,j,k) = 0. _d 0 |
134 |
POM_remin(i,j,k) = 0. _d 0 |
135 |
DOM_prod(i,j,k) = 0. _d 0 |
136 |
POM_prod(i,j,k) = 0. _d 0 |
137 |
CaCO3_prod(i,j,k) = 0. _d 0 |
138 |
CaCO3_diss(i,j,k) = 0. _d 0 |
139 |
Fe_uptake(i,j,k) = 0. _d 0 |
140 |
Fe_remin(i,j,k) = 0. _d 0 |
141 |
BioUp(i,j,k) = 0. _d 0 |
142 |
Remin(i,j,k) = 0. _d 0 |
143 |
Car(i,j,k) = 0. _d 0 |
144 |
ENDDO |
145 |
ENDDO |
146 |
ENDDO |
147 |
DO j=1-OLy,sNy+OLy |
148 |
DO i=1-OLx,sNx+OLx |
149 |
SURC(i,j) = 0. _d 0 |
150 |
SURO(i,j) = 0. _d 0 |
151 |
runoff_dic(i,j) = 0. _d 0 |
152 |
runoff_alk(i,j) = 0. _d 0 |
153 |
runoff_NUT(i,j) = 0. _d 0 |
154 |
runoff_DOM(i,j) = 0. _d 0 |
155 |
runoff_o2(i,j) = 0. _d 0 |
156 |
runoff_fe(i,j) = 0. _d 0 |
157 |
ENDDO |
158 |
ENDDO |
159 |
|
160 |
C----------------------------------------------------------- |
161 |
C carbon and oxygen air-sea interaction |
162 |
CALL BLING_AIRSEAFLUX( |
163 |
I PTR_DIC, PTR_ALK, PTR_NUT, PTR_O2, |
164 |
U SURC, SURO, |
165 |
I bi, bj, imin, imax, jmin, jmax, |
166 |
I myIter, myTime, myThid) |
167 |
|
168 |
C$TAF STORE irr_mem = comlev1, key = ikey_dynamics, kind=isbyte |
169 |
C$TAF STORE irr_inst = comlev1, key = ikey_dynamics, kind=isbyte |
170 |
C$TAF STORE P_sm = comlev1, key = ikey_dynamics, kind=isbyte |
171 |
C$TAF STORE P_lg = comlev1, key = ikey_dynamics, kind=isbyte |
172 |
|
173 |
C----------------------------------------------------------- |
174 |
C biological production of organic matter |
175 |
CALL BLING_PROD( |
176 |
I PTR_NUT, PTR_FE, PTR_DOM, PTR_O2, |
177 |
U NUT_uptake, POM_prod, DOM_prod, |
178 |
U Fe_uptake, CaCO3_prod, |
179 |
I bi, bj, imin, imax, jmin, jmax, |
180 |
I myIter, myTime, myThid) |
181 |
|
182 |
C----------------------------------------------------------- |
183 |
C determine calcite saturation for use in bling_remin |
184 |
CALL BLING_CARBONATE_SYS( |
185 |
I PTR_DIC, PTR_ALK, PTR_NUT, |
186 |
I bi, bj, imin, imax, jmin, jmax, |
187 |
I myIter, myTime, myThid) |
188 |
|
189 |
C----------------------------------------------------------- |
190 |
C flux of NUT, CaCO3, and Fe from remineralization |
191 |
CALL BLING_REMIN( |
192 |
I PTR_O2, PTR_FE, |
193 |
U POM_prod, Fe_uptake, CaCO3_prod, |
194 |
U POM_remin, POM_diss, Fe_remin, CaCO3_diss, |
195 |
I bi, bj, imin, imax, jmin, jmax, |
196 |
I myIter, myTime, myThid) |
197 |
|
198 |
C$TAF STORE P_sm = comlev1, key = ikey_dynamics, kind=isbyte |
199 |
C$TAF STORE P_lg = comlev1, key = ikey_dynamics, kind=isbyte |
200 |
|
201 |
C----------------------------------------------------------- |
202 |
C Calculate river runoff source |
203 |
C Tracers are already diluted by freswater input, P-E+R |
204 |
C This accounts for tracer concentration in river runoff |
205 |
DO j=jmin,jmax |
206 |
DO i=imin,imax |
207 |
#ifdef ALLOW_EXF |
208 |
runoff_dic(i,j) = riverconc_DIC*runoff(i,j,bi,bj) |
209 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
210 |
runoff_alk(i,j) = riverconc_ALK*runoff(i,j,bi,bj) |
211 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
212 |
runoff_nut(i,j) = riverconc_NUT*runoff(i,j,bi,bj) |
213 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
214 |
runoff_dom(i,j) = riverconc_DOM*runoff(i,j,bi,bj) |
215 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
216 |
runoff_o2(i,j) = riverconc_O2 *runoff(i,j,bi,bj) |
217 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
218 |
runoff_fe(i,j) = riverconc_FE *runoff(i,j,bi,bj) |
219 |
& *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) |
220 |
C else it is 0 as initialized |
221 |
#endif |
222 |
ENDDO |
223 |
ENDDO |
224 |
|
225 |
C----------------------------------------------------------- |
226 |
C add all tendencies |
227 |
DO k=1,Nr |
228 |
DO j=jmin,jmax |
229 |
DO i=imin,imax |
230 |
|
231 |
C Dissolved organic matter slow remineralization |
232 |
#ifdef BLING_NO_NEG |
233 |
DOM_remin(i,j,k) = MAX(maskC(i,j,k,bi,bj)*gamma_DOM |
234 |
& *PTR_DOM(i,j,k),0. _d 0) |
235 |
#else |
236 |
DOM_remin(i,j,k) = maskC(i,j,k,bi,bj)*gamma_DOM |
237 |
& *PTR_DOM(i,j,k) |
238 |
#endif |
239 |
C Total nutrient remin, recycling |
240 |
NUT_remin(i,j,k) = POM_remin(i,j,k) + DOM_remin(i,j,k) |
241 |
NUT_recyc(i,j,k) = NUT_uptake(i,j,k) - POM_prod(i,j,k) |
242 |
& - DOM_prod(i,j,k) |
243 |
|
244 |
C Carbon system diagnostics |
245 |
C Change in DIC from primary production, from recycling and |
246 |
C remineralization, change in carbonate ions concentration |
247 |
C from biological activity: |
248 |
BioUp(i,j,k) = -NUT_uptake(i,j,k)*CtoP/NUTfac |
249 |
Remin(i,j,k) = (DOM_remin(i,j,k) + NUT_recyc(i,j,k) |
250 |
& + POM_remin(i,j,k))*CtoP/NUTfac |
251 |
Car(i,j,k) = CaCO3_diss(i,j,k) - CaCO3_prod(i,j,k) |
252 |
|
253 |
C Tendencies |
254 |
GNUT(i,j,k) = -NUT_uptake(i,j,k) + NUT_recyc(i,j,k) |
255 |
& + DOM_remin(i,j,k) + POM_remin(i,j,k) |
256 |
|
257 |
GDOM(i,j,k) = DOM_prod(i,j,k) - DOM_remin(i,j,k) |
258 |
& + POM_diss(i,j,k) |
259 |
|
260 |
GALK(i,j,k) = 2. _d 0*Car(i,j,k) - NtoP/NUTfac*GNUT(i,j,k) |
261 |
|
262 |
GDIC(i,j,k) = BioUp(i,j,k) + Remin(i,j,k) + Car(i,j,k) |
263 |
|
264 |
if ( PTR_O2(i,j,k) .GT. O2_min ) then |
265 |
GO2(i,j,k) = O2toP/NUTfac*GNUT(i,j,k) |
266 |
else |
267 |
GO2(i,j,k) = 0. _d 0 |
268 |
endif |
269 |
|
270 |
GFE(i,j,k) = Fe_remin(i,j,k) - Fe_uptake(i,j,k) |
271 |
|
272 |
ENDDO |
273 |
ENDDO |
274 |
ENDDO |
275 |
|
276 |
C----------------------------------------------------------- |
277 |
C adding surface tendencies due to air-sea exchange |
278 |
C adding surface tendencies due to river runoff |
279 |
C adding aeolian iron source |
280 |
DO j=jmin,jmax |
281 |
DO i=imin,imax |
282 |
GDIC(i,j,1)=GDIC(i,j,1)+runoff_dic(i,j)+SURC(i,j) |
283 |
GALK(i,j,1)=GALK(i,j,1)+runoff_alk(i,j) |
284 |
GNUT(i,j,1)=GNUT(i,j,1)+runoff_nut(i,j) |
285 |
GDOM(i,j,1)=GDOM(i,j,1)+runoff_dom(i,j) |
286 |
GO2(i,j,1) =GO2(i,j,1) +runoff_o2(i,j) +SURO(i,j) |
287 |
GFE(i,j,1) =GFE(i,j,1) +runoff_fe(i,j) |
288 |
& +alpfe*InputFe(i,j,bi,bj)*recip_drF(1) |
289 |
& *recip_hFacC(i,j,1,bi,bj) |
290 |
ENDDO |
291 |
ENDDO |
292 |
|
293 |
C----------------------------------------------------------- |
294 |
C update |
295 |
DO k=1,Nr |
296 |
DO j=jmin,jmax |
297 |
DO i=imin,imax |
298 |
PTR_DIC(i,j,k)= PTR_DIC(i,j,k)+GDIC(i,j,k)*PTRACERS_dTLev(k) |
299 |
PTR_ALK(i,j,k)= PTR_ALK(i,j,k)+GALK(i,j,k)*PTRACERS_dTLev(k) |
300 |
PTR_NUT(i,j,k)= PTR_NUT(i,j,k)+GNUT(i,j,k)*PTRACERS_dTLev(k) |
301 |
PTR_DOM(i,j,k)= PTR_DOM(i,j,k)+GDOM(i,j,k)*PTRACERS_dTLev(k) |
302 |
PTR_O2(i,j,k) = PTR_O2(i,j,k) +GO2(i,j,k) *PTRACERS_dTLev(k) |
303 |
PTR_FE(i,j,k) = PTR_FE(i,j,k) +GFE(i,j,k) *PTRACERS_dTLev(k) |
304 |
ENDDO |
305 |
ENDDO |
306 |
ENDDO |
307 |
|
308 |
C----------------------------------------------------------- |
309 |
#ifdef ALLOW_DIAGNOSTICS |
310 |
IF ( useDiagnostics ) THEN |
311 |
CALL DIAGNOSTICS_FILL(BioUp ,'BLGBIOA ',0,Nr,2,bi,bj,myThid) |
312 |
CALL DIAGNOSTICS_FILL(Remin ,'BLGREMI ',0,Nr,2,bi,bj,myThid) |
313 |
CALL DIAGNOSTICS_FILL(Car ,'BLGCARB ',0,Nr,2,bi,bj,myThid) |
314 |
CALL DIAGNOSTICS_FILL(pH ,'BLGPH3D ',0,Nr,1,bi,bj,myThid) |
315 |
CALL DIAGNOSTICS_FILL(OmegaAr ,'BLGOMAR ',0,Nr,1,bi,bj,myThid) |
316 |
CALL DIAGNOSTICS_FILL(pCO2 ,'BLGPCO2 ',0,1 ,1,bi,bj,myThid) |
317 |
CALL DIAGNOSTICS_FILL(fluxCO2 ,'BLGCFLX ',0,1 ,1,bi,bj,myThid) |
318 |
CALL DIAGNOSTICS_FILL(SURC ,'BLGTFLX ',0,1 ,2,bi,bj,myThid) |
319 |
CALL DIAGNOSTICS_FILL(SURO ,'BLGOFLX ',0,1 ,2,bi,bj,myThid) |
320 |
ENDIF |
321 |
#endif /* ALLOW_DIAGNOSTICS */ |
322 |
|
323 |
RETURN |
324 |
END |
325 |
|
326 |
|
327 |
|