source: branches/dev_001_GM/NEMO/TOP_SRC/PISCES_SMS/p4zbio.F90 @ 775

Last change on this file since 775 was 775, checked in by gm, 13 years ago

dev_001_GM - PISCES in F90 : encapsulation of all p4z…F files in module F90 + doctor norme for local variables - compilation OK

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 14.5 KB
Line 
1MODULE 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
43CONTAINS
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   !!======================================================================
342CONTAINS
343   SUBROUTINE p4z_bio                         ! Empty routine
344   END SUBROUTINE p4z_bio
345#endif 
346
347   !!======================================================================
348END MODULE  p4zbio
Note: See TracBrowser for help on using the repository browser.