1 | MODULE p4zbio |
---|
2 | !!====================================================================== |
---|
3 | !! *** MODULE p4zbio *** |
---|
4 | !! TOP : PISCES bio-model |
---|
5 | !!====================================================================== |
---|
6 | !! History : 1.0 ! 2004 (O. Aumont) Original code |
---|
7 | !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 |
---|
8 | !!---------------------------------------------------------------------- |
---|
9 | #if defined key_pisces |
---|
10 | !!---------------------------------------------------------------------- |
---|
11 | !! 'key_pisces' PISCES bio-model |
---|
12 | !!---------------------------------------------------------------------- |
---|
13 | !! p4z_bio : computes the interactions between the different |
---|
14 | !! compartments of PISCES |
---|
15 | !!---------------------------------------------------------------------- |
---|
16 | USE oce_trc ! |
---|
17 | USE trp_trc ! |
---|
18 | USE sms ! |
---|
19 | USE p4zsink ! |
---|
20 | USE p4zsink_kriest ! |
---|
21 | USE p4zopt ! |
---|
22 | USE p4zlim ! |
---|
23 | USE p4zprod ! |
---|
24 | USE p4znano ! |
---|
25 | USE p4zdiat ! |
---|
26 | USE p4zmicro ! |
---|
27 | USE p4zmeso ! |
---|
28 | USE p4zrem ! |
---|
29 | |
---|
30 | IMPLICIT NONE |
---|
31 | PRIVATE |
---|
32 | |
---|
33 | PUBLIC p4z_bio ! called in p4zprg.F90 |
---|
34 | |
---|
35 | !!* Substitution |
---|
36 | # include "domzgr_substitute.h90" |
---|
37 | !!---------------------------------------------------------------------- |
---|
38 | !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007) |
---|
39 | !! $Header:$ |
---|
40 | !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) |
---|
41 | !!---------------------------------------------------------------------- |
---|
42 | |
---|
43 | CONTAINS |
---|
44 | |
---|
45 | SUBROUTINE p4z_bio |
---|
46 | !!--------------------------------------------------------------------- |
---|
47 | !! *** ROUTINE p4z_bio *** |
---|
48 | !! |
---|
49 | !! ** Purpose : Ecosystem model in the whole ocean: computes the |
---|
50 | !! different interactions between the different compartments |
---|
51 | !! of PISCES |
---|
52 | !! |
---|
53 | !! ** Method : - ??? |
---|
54 | !!--------------------------------------------------------------------- |
---|
55 | INTEGER :: ji, jj, jk, jn |
---|
56 | REAL(wp) :: zdenom, ztemp |
---|
57 | REAL(wp) :: zprodt, zprodca |
---|
58 | REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdenom1 |
---|
59 | REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfracal |
---|
60 | #if defined key_kriest |
---|
61 | REAL(wp) :: znumpoc, znumdoc |
---|
62 | #else |
---|
63 | REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdenom2 |
---|
64 | #endif |
---|
65 | !!--------------------------------------------------------------------- |
---|
66 | |
---|
67 | ! ASSIGN THE SHEAR RATE THAT IS USED FOR AGGREGATION |
---|
68 | ! OF PHYTOPLANKTON AND DETRITUS |
---|
69 | |
---|
70 | zdiss(:,:,:) = 0.01 |
---|
71 | |
---|
72 | !!gm the use of nmld should be better here? |
---|
73 | DO jk = 1, jpkm1 |
---|
74 | DO jj = 1, jpj |
---|
75 | DO ji = 1, jpi |
---|
76 | IF( fsdepw(ji,jj,jk+1) .le. hmld(ji,jj) ) zdiss(ji,jj,jk) = 1.e0 |
---|
77 | END DO |
---|
78 | END DO |
---|
79 | END DO |
---|
80 | |
---|
81 | ! Compute de different ratios for scavenging of iron |
---|
82 | ! -------------------------------------------------- |
---|
83 | |
---|
84 | DO jk = 1, jpk |
---|
85 | DO jj = 1, jpj |
---|
86 | DO ji = 1, jpi |
---|
87 | #if ! defined key_kriest |
---|
88 | zdenom = 1. / ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc) & |
---|
89 | & + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) |
---|
90 | zdenom1(ji,jj,jk) = trn(ji,jj,jk,jppoc) * zdenom |
---|
91 | zdenom2(ji,jj,jk) = trn(ji,jj,jk,jpgoc) * zdenom |
---|
92 | #else |
---|
93 | zdenom = 1. / ( trn(ji,jj,jk,jppoc) & |
---|
94 | & + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) |
---|
95 | zdenom1(ji,jj,jk) = trn(ji,jj,jk,jppoc) * zdenom |
---|
96 | #endif |
---|
97 | END DO |
---|
98 | END DO |
---|
99 | END DO |
---|
100 | |
---|
101 | ! Compute the fraction of nanophytoplankton that is made of calcifiers |
---|
102 | ! -------------------------------------------------------------------- |
---|
103 | |
---|
104 | DO jk = 1, jpkm1 |
---|
105 | DO jj = 1, jpj |
---|
106 | DO ji = 1, jpi |
---|
107 | ztemp = MAX( 0., tn(ji,jj,jk) ) |
---|
108 | zfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) & |
---|
109 | & * MAX( 0.0001, ztemp / ( 2.+ ztemp ) ) & |
---|
110 | & * MAX( 1., trn(ji,jj,jk,jpphy) * 1.e6 / 2. ) |
---|
111 | zfracal(ji,jj,jk) = MIN( 0.8 , zfracal(ji,jj,jk) ) |
---|
112 | zfracal(ji,jj,jk) = MAX( 0.01, zfracal(ji,jj,jk) ) |
---|
113 | END DO |
---|
114 | END DO |
---|
115 | END DO |
---|
116 | |
---|
117 | ! computation of the vertical flux of particulate organic matter |
---|
118 | ! -------------------------------------------------------------- |
---|
119 | |
---|
120 | IF( lk_kriest ) THEN ; CALL p4z_sink_kriest ! Sink due to vertical flux of POM |
---|
121 | ELSE ; CALL p4z_sink ! |
---|
122 | ENDIF |
---|
123 | |
---|
124 | ! compute the PAR in the water column |
---|
125 | ! ----------------------------------- |
---|
126 | |
---|
127 | CALL p4z_opt ! Optical |
---|
128 | |
---|
129 | ! compute the co-limitations by the various nutrients |
---|
130 | ! ---------------------------------------------------- |
---|
131 | |
---|
132 | CALL p4z_lim |
---|
133 | |
---|
134 | ! compute phytoplankton growth rate over the global ocean. |
---|
135 | ! ------------------------------------------------------- |
---|
136 | ! (Growth rates for each element is computed (C, Si, Fe, Chl)) |
---|
137 | |
---|
138 | CALL p4z_prod |
---|
139 | |
---|
140 | ! phytoplankton mortality (Mortality losses for each elements are computed (C, Fe, Si, Chl) ) |
---|
141 | ! ----------------------- |
---|
142 | |
---|
143 | CALL p4z_nano ! nanophytoplankton |
---|
144 | |
---|
145 | CALL p4z_diat ! diatoms |
---|
146 | |
---|
147 | ! zooplankton sources/sinks routines (each elements are computed (C, Fe, Si, Chl) ) |
---|
148 | ! ---------------------------------- |
---|
149 | |
---|
150 | CALL p4z_micro ! microzooplankton |
---|
151 | |
---|
152 | CALL p4z_meso ! mesozooplankton |
---|
153 | |
---|
154 | ! computation of remineralization terms of organic matter + scavenging of Fe |
---|
155 | ! -------------------------------------------------------------------------- |
---|
156 | |
---|
157 | CALL p4z_rem ! remineralization |
---|
158 | |
---|
159 | |
---|
160 | ! Determination of tracers concentration as a function of biological sources and sinks |
---|
161 | ! ------------------------------------------------------------------------------------ |
---|
162 | |
---|
163 | DO jk = 1, jpkm1 |
---|
164 | |
---|
165 | ! Evolution of PO4 |
---|
166 | ! ---------------- |
---|
167 | trn(:,:,jk,jppo4) = trn(:,:,jk,jppo4) - prorca(:,:,jk) - prorca2(:,:,jk) & |
---|
168 | & + olimi (:,:,jk) + grarem (:,:,jk) * sigma1 & |
---|
169 | & + denitr(:,:,jk) + grarem2(:,:,jk) * sigma2 |
---|
170 | |
---|
171 | ! Evolution of NO3 and NH4 |
---|
172 | ! ------------------------ |
---|
173 | trn(:,:,jk,jpno3) = trn(:,:,jk,jpno3) - pronew(:,:,jk) - pronew2(:,:,jk) & |
---|
174 | & + onitr (:,:,jk) - denitr (:,:,jk) * rdenit |
---|
175 | |
---|
176 | trn(:,:,jk,jpnh4) = trn(:,:,jk,jpnh4) - proreg(:,:,jk) - proreg2(:,:,jk) & |
---|
177 | & + olimi (:,:,jk) + grarem (:,:,jk) * sigma1 & |
---|
178 | & + grarem2(:,:,jk) * sigma2 & |
---|
179 | & - onitr (:,:,jk) + denitr (:,:,jk) |
---|
180 | |
---|
181 | ! Evolution of Phytoplankton |
---|
182 | ! -------------------------- |
---|
183 | trn(:,:,jk,jpphy) = trn(:,:,jk,jpphy) + prorca (:,:,jk) * ( 1.- excret ) - tortp(:,:,jk) & |
---|
184 | & - grazp (:,:,jk) - grazn(:,:,jk) - respp(:,:,jk) |
---|
185 | |
---|
186 | trn(:,:,jk,jpnch) = trn(:,:,jk,jpnch) + prorca6(:,:,jk) * ( 1.- excret ) - tortnch(:,:,jk) & |
---|
187 | & - grazpch(:,:,jk) - graznch(:,:,jk)- respnch(:,:,jk) |
---|
188 | |
---|
189 | ! Evolution of Diatoms |
---|
190 | ! -------------------- |
---|
191 | trn(:,:,jk,jpdia) = trn(:,:,jk,jpdia) + prorca2(:,:,jk) * ( 1.- excret2 ) - tortp2(:,:,jk) & |
---|
192 | & - respp2 (:,:,jk) - grazd(:,:,jk) - grazsd(:,:,jk) |
---|
193 | |
---|
194 | trn(:,:,jk,jpdch) = trn(:,:,jk,jpdch) + prorca7(:,:,jk) * ( 1.- excret2 ) - tortdch(:,:,jk) & |
---|
195 | & - respdch(:,:,jk) - grazdch(:,:,jk) - grazsch(:,:,jk) |
---|
196 | |
---|
197 | ! Evolution of Zooplankton |
---|
198 | ! ------------------------ |
---|
199 | trn(:,:,jk,jpzoo) = trn(:,:,jk,jpzoo) + epsher * ( grazp(:,:,jk) + grazm(:,:,jk) + grazsd(:,:,jk) ) & |
---|
200 | & - grazz(:,:,jk) - tortz(:,:,jk) - respz(:,:,jk) |
---|
201 | |
---|
202 | ! Evolution of Mesozooplankton |
---|
203 | ! ------------------------ |
---|
204 | trn(:,:,jk,jpmes) = trn(:,:,jk,jpmes) + epsher2 * ( grazd (:,:,jk) + grazz (:,:,jk) + grazn(:,:,jk) & |
---|
205 | & + grazpoc(:,:,jk) + grazffe(:,:,jk) ) & |
---|
206 | & - tortz2(:,:,jk) - respz2(:,:,jk) |
---|
207 | |
---|
208 | ! Evolution of O2 |
---|
209 | ! --------------- |
---|
210 | trn(:,:,jk,jpoxy) = trn(:,:,jk,jpoxy) + o2ut * ( proreg(:,:,jk) + proreg2(:,:,jk) - olimi(:,:,jk) & |
---|
211 | & -grarem(:,:,jk) * sigma1 - grarem2(:,:,jk) * sigma2 ) & |
---|
212 | & + ( o2ut + o2nit ) * ( pronew(:,:,jk) + pronew2(:,:,jk) ) & |
---|
213 | & - o2nit * onitr(:,:,jk) |
---|
214 | |
---|
215 | ! Evolution of IRON |
---|
216 | ! ----------------- |
---|
217 | trn(:,:,jk,jpfer) = trn(:,:,jk,jpfer) + ( excret - 1.) * prorca5(:,:,jk) - xaggdfe (:,:,jk) & |
---|
218 | & + ( excret2 - 1.) * prorca4(:,:,jk) - xbactfer(:,:,jk) & |
---|
219 | & + grafer(:,:,jk) + grafer2(:,:,jk) & |
---|
220 | & + ofer (:,:,jk) - xscave (:,:,jk) |
---|
221 | ! |
---|
222 | END DO |
---|
223 | |
---|
224 | |
---|
225 | #if defined key_kriest |
---|
226 | |
---|
227 | #include "p4zbio_kriest.h90" |
---|
228 | |
---|
229 | #else |
---|
230 | |
---|
231 | #include "p4zbio_std.h90" |
---|
232 | |
---|
233 | #endif |
---|
234 | |
---|
235 | |
---|
236 | DO jk = 1, jpkm1 |
---|
237 | |
---|
238 | ! Evolution of biogenic Silica |
---|
239 | ! ---------------------------- |
---|
240 | trn(:,:,jk,jpbsi) = trn(:,:,jk,jpbsi) + prorca3(:,:,jk) * ( 1.- excret2 ) - grazss(:,:,jk) & |
---|
241 | & - tortds (:,:,jk) - respds(:,:,jk) - grazs (:,:,jk) |
---|
242 | |
---|
243 | ! Evolution of sinking biogenic silica |
---|
244 | ! ------------------------------------ |
---|
245 | trn(:,:,jk,jpdsi) = trn(:,:,jk,jpdsi) + tortds (:,:,jk) + respds(:,:,jk) + grazs(:,:,jk) & |
---|
246 | & - osil (:,:,jk) + grazss(:,:,jk) |
---|
247 | |
---|
248 | ! Evolution of biogenic diatom Iron |
---|
249 | ! --------------------------------- |
---|
250 | trn(:,:,jk,jpdfe) = trn(:,:,jk,jpdfe) + prorca4(:,:,jk) * ( 1.- excret2 ) - grazsf(:,:,jk) & |
---|
251 | & - tortdf (:,:,jk) - respdf(:,:,jk) - grazf (:,:,jk) |
---|
252 | |
---|
253 | ! Evolution of biogenic nanophytoplankton Iron |
---|
254 | ! -------------------------------------------- |
---|
255 | trn(:,:,jk,jpnfe) = trn(:,:,jk,jpnfe) + prorca5(:,:,jk) * ( 1.- excret ) - graznf(:,:,jk) & |
---|
256 | & - tortnf (:,:,jk) - respnf(:,:,jk) - grazpf(:,:,jk) |
---|
257 | |
---|
258 | ! Evolution of dissolved Silica |
---|
259 | ! ----------------------------- |
---|
260 | trn(:,:,jk,jpsil) = trn(:,:,jk,jpsil) - ( 1.- excret2 ) * prorca3(:,:,jk) + osil(:,:,jk) |
---|
261 | |
---|
262 | END DO |
---|
263 | |
---|
264 | ! Evolution of calcite and silicates as a function of the two tracers |
---|
265 | ! ------------------------------------------------------------------- |
---|
266 | DO jk = 1, jpkm1 |
---|
267 | DO jj = 1, jpj |
---|
268 | DO ji = 1, jpi |
---|
269 | |
---|
270 | zprodt = prorca(ji,jj,jk) + prorca2(ji,jj,jk) - olimi(ji,jj,jk) - grarem(ji,jj,jk) * sigma1 & |
---|
271 | & - grarem2(ji,jj,jk) * sigma2 - denitr(ji,jj,jk) |
---|
272 | zprodca = pronew(ji,jj,jk) + pronew2(ji,jj,jk) - onitr(ji,jj,jk) + rdenit * denitr(ji,jj,jk) |
---|
273 | |
---|
274 | ! potential production of calcite and biogenic silicate |
---|
275 | ! ------------------------------------------------------ |
---|
276 | prcaca(ji,jj,jk) = zfracal(ji,jj,jk) & |
---|
277 | & * ( part * ( unass*grazp(ji,jj,jk) + unass2*grazn(ji,jj,jk) ) & |
---|
278 | & + tortp(ji,jj,jk) + respp(ji,jj,jk) ) |
---|
279 | |
---|
280 | ! Consumption of Total (12C)O2 |
---|
281 | ! ---------------------------- |
---|
282 | trn(ji,jj,jk,jpdic) = trn(ji,jj,jk,jpdic) - zprodt - prcaca(ji,jj,jk) |
---|
283 | |
---|
284 | ! Consumption of alkalinity due to ca++ uptake and increase of |
---|
285 | ! alkalinity due to nitrate consumption during organic soft tissue production |
---|
286 | ! --------------------------------------------------------- |
---|
287 | trn(ji,jj,jk,jptal) = trn(ji,jj,jk,jptal) + rno3 * zprodca - 2.* prcaca(ji,jj,jk) |
---|
288 | ! |
---|
289 | END DO |
---|
290 | END DO |
---|
291 | END DO |
---|
292 | |
---|
293 | |
---|
294 | ! Production of calcite due to biological production |
---|
295 | ! -------------------------------------------------- |
---|
296 | DO jk = 1, jpkm1 |
---|
297 | trn(:,:,jk,jpcal) = trn(:,:,jk,jpcal) + prcaca(:,:,jk) |
---|
298 | END DO |
---|
299 | |
---|
300 | |
---|
301 | ! Loop to test if tracers concentrations fall below 0. |
---|
302 | ! ---------------------------------------------------- |
---|
303 | |
---|
304 | znegtr(:,:,:) = 1.e0 |
---|
305 | DO jn = 1, jptra |
---|
306 | DO jk = 1, jpk |
---|
307 | DO jj = 1, jpj |
---|
308 | DO ji = 1, jpi |
---|
309 | IF( trn(ji,jj,jk,jn) < 0.e0 ) znegtr(ji,jj,jk) = 0.e0 |
---|
310 | END DO |
---|
311 | END DO |
---|
312 | END DO |
---|
313 | END DO |
---|
314 | ! ! where at least 1 tracer concentration becomes negative |
---|
315 | ! ! all tracer tendancy are set to zero (i.e. trn = trb) |
---|
316 | DO jn = 1, jptra |
---|
317 | trn(:,:,:,jn) = trb(:,:,:,jn) + znegtr(:,:,:) * ( trn(:,:,:,jn) - trb(:,:,:,jn) ) |
---|
318 | END DO |
---|
319 | |
---|
320 | # if defined key_trc_dia3d |
---|
321 | !!gm potential bug hard coded index on trc3d |
---|
322 | trc3d(:,:,:, 4) = etot(:,:,:) |
---|
323 | trc3d(:,:,:, 5) = prorca (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
324 | trc3d(:,:,:, 6) = prorca2(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
325 | trc3d(:,:,:, 7) = pronew (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
326 | trc3d(:,:,:, 8) = pronew2(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
327 | trc3d(:,:,:, 9) = prorca3(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
328 | trc3d(:,:,:,10) = prorca4(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
329 | # if ! defined key_kriest |
---|
330 | trc3d(:,:,:,11) = prorca5(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
331 | # else |
---|
332 | trc3d(:,:,:,11) = prcaca (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r |
---|
333 | # endif |
---|
334 | # endif |
---|
335 | ! |
---|
336 | END SUBROUTINE p4z_bio |
---|
337 | |
---|
338 | #else |
---|
339 | !!====================================================================== |
---|
340 | !! Dummy module : No PISCES bio-model |
---|
341 | !!====================================================================== |
---|
342 | CONTAINS |
---|
343 | SUBROUTINE p4z_bio ! Empty routine |
---|
344 | END SUBROUTINE p4z_bio |
---|
345 | #endif |
---|
346 | |
---|
347 | !!====================================================================== |
---|
348 | END MODULE p4zbio |
---|