New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
p4zmeso.F90 in trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zmeso.F90 @ 4624

Last change on this file since 4624 was 4624, checked in by acc, 10 years ago

#1305. Fix slow start-up problems on some systems by introducing and using lwm logical to restrict output of merged namelists to the first (or only) processor. lwm is true only on the first processor regardless of ln_ctl. Small changes to all flavours of nemogcm.F90 are also required to write namctl and namcfg after the call to mynode which now opens output.namelist.dyn and writes nammpp.

File size: 18.7 KB
Line 
1MODULE p4zmeso
2   !!======================================================================
3   !!                         ***  MODULE p4zmeso  ***
4   !! TOP :   PISCES Compute the sources/sinks for mesozooplankton
5   !!======================================================================
6   !! History :   1.0  !  2002     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron
9   !!----------------------------------------------------------------------
10#if defined key_pisces
11   !!----------------------------------------------------------------------
12   !!   'key_pisces'                                       PISCES bio-model
13   !!----------------------------------------------------------------------
14   !!   p4z_meso       :   Compute the sources/sinks for mesozooplankton
15   !!   p4z_meso_init  :   Initialization of the parameters for mesozooplankton
16   !!----------------------------------------------------------------------
17   USE oce_trc         !  shared variables between ocean and passive tracers
18   USE trc             !  passive tracers common variables
19   USE sms_pisces      !  PISCES Source Minus Sink variables
20   USE p4zsink         !  vertical flux of particulate matter due to sinking
21   USE p4zint          !  interpolation and computation of various fields
22   USE p4zprod         !  production
23   USE prtctl_trc      !  print control for debugging
24   USE iom             !  I/O manager
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   p4z_meso              ! called in p4zbio.F90
30   PUBLIC   p4z_meso_init         ! called in trcsms_pisces.F90
31
32   !! * Shared module variables
33   REAL(wp), PUBLIC ::  part2        !: part of calcite not dissolved in mesozoo guts
34   REAL(wp), PUBLIC ::  xprefc       !: mesozoo preference for POC
35   REAL(wp), PUBLIC ::  xprefp       !: mesozoo preference for nanophyto
36   REAL(wp), PUBLIC ::  xprefz       !: mesozoo preference for diatoms
37   REAL(wp), PUBLIC ::  xprefpoc     !: mesozoo preference for POC
38   REAL(wp), PUBLIC ::  xthresh2zoo  !: zoo feeding threshold for mesozooplankton
39   REAL(wp), PUBLIC ::  xthresh2dia  !: diatoms feeding threshold for mesozooplankton
40   REAL(wp), PUBLIC ::  xthresh2phy  !: nanophyto feeding threshold for mesozooplankton
41   REAL(wp), PUBLIC ::  xthresh2poc  !: poc feeding threshold for mesozooplankton
42   REAL(wp), PUBLIC ::  xthresh2     !: feeding threshold for mesozooplankton
43   REAL(wp), PUBLIC ::  resrat2      !: exsudation rate of mesozooplankton
44   REAL(wp), PUBLIC ::  mzrat2       !: microzooplankton mortality rate
45   REAL(wp), PUBLIC ::  grazrat2     !: maximal mesozoo grazing rate
46   REAL(wp), PUBLIC ::  xkgraz2      !: non assimilated fraction of P by mesozoo
47   REAL(wp), PUBLIC ::  unass2       !: Efficicency of mesozoo growth
48   REAL(wp), PUBLIC ::  sigma2       !: Fraction of mesozoo excretion as DOM
49   REAL(wp), PUBLIC ::  epsher2      !: half sturation constant for grazing 2
50   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
51
52   !!* Substitution
53#  include "top_substitute.h90"
54   !!----------------------------------------------------------------------
55   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
56   !! $Id: p4zmeso.F90 3160 2011-11-20 14:27:18Z cetlod $
57   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
58   !!----------------------------------------------------------------------
59
60CONTAINS
61
62   SUBROUTINE p4z_meso( kt, jnt )
63      !!---------------------------------------------------------------------
64      !!                     ***  ROUTINE p4z_meso  ***
65      !!
66      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
67      !!
68      !! ** Method  : - ???
69      !!---------------------------------------------------------------------
70      INTEGER, INTENT(in) ::   kt, jnt ! ocean time step
71      INTEGER  :: ji, jj, jk
72      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam
73      REAL(wp) :: zgraze2 , zdenom, zdenom2
74      REAL(wp) :: zfact   , zstep, zfood, zfoodlim, zproport
75      REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2
76      REAL(wp) :: zepshert, zepsherv, zgrarsig, zgraztot, zgraztotn, zgraztotf
77      REAL(wp) :: zgrarem2, zgrafer2, zgrapoc2, zprcaca, zmortz2, zgrasrat, zgrasratn
78#if defined key_kriest
79      REAL znumpoc
80#endif
81      REAL(wp) :: zrespz2, ztortz2, zgrazd, zgrazz, zgrazpof
82      REAL(wp) :: zgrazn, zgrazpoc, zgraznf, zgrazf
83      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg
84      CHARACTER (len=25) :: charout
85      REAL(wp) :: zrfact2
86      REAL(wp), POINTER, DIMENSION(:,:,:) :: zgrazing
87
88      !!---------------------------------------------------------------------
89      !
90      IF( nn_timing == 1 )  CALL timing_start('p4z_meso')
91      !
92      IF( ln_diatrc .AND. lk_iomput ) THEN
93         CALL wrk_alloc( jpi, jpj, jpk, zgrazing )
94         zgrazing(:,:,:) = 0._wp
95      ENDIF
96
97      DO jk = 1, jpkm1
98         DO jj = 1, jpj
99            DO ji = 1, jpi
100               zcompam   = MAX( ( trn(ji,jj,jk,jpmes) - 1.e-9 ), 0.e0 )
101# if defined key_degrad
102               zstep     = xstep * facvol(ji,jj,jk)
103# else
104               zstep     = xstep
105# endif
106               zfact     = zstep * tgfunc2(ji,jj,jk) * zcompam
107
108               !  Respiration rates of both zooplankton
109               !  -------------------------------------
110               zrespz2   = resrat2 * zfact * trn(ji,jj,jk,jpmes) / ( xkmort + trn(ji,jj,jk,jpmes) )  &
111                  &      + resrat2 * zfact * 3. * nitrfac(ji,jj,jk)
112
113               !  Zooplankton mortality. A square function has been selected with
114               !  no real reason except that it seems to be more stable and may mimic predation
115               !  ---------------------------------------------------------------
116               ztortz2   = mzrat2 * 1.e6 * zfact * trn(ji,jj,jk,jpmes)
117               !
118               zcompadi  = MAX( ( trn(ji,jj,jk,jpdia) - xthresh2dia ), 0.e0 )
119               zcompaz   = MAX( ( trn(ji,jj,jk,jpzoo) - xthresh2zoo ), 0.e0 )
120               ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone
121               ! it is to predation by mesozooplankton
122               ! -------------------------------------------------------------------------------
123               zcompaph  = MAX( ( trn(ji,jj,jk,jpphy) - xthresh2phy ), 0.e0 ) &
124                  &      * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) )
125               zcompapoc = MAX( ( trn(ji,jj,jk,jppoc) - xthresh2poc ), 0.e0 )
126
127               zfood     = xprefc * zcompadi + xprefz * zcompaz + xprefp * zcompaph + xprefpoc * zcompapoc 
128               zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
129               zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
130               zdenom2   = zdenom / ( zfood + rtrn )
131               zgraze2   = grazrat2 * zstep * tgfunc2(ji,jj,jk) * trn(ji,jj,jk,jpmes) 
132
133               zgrazd    = zgraze2  * xprefc   * zcompadi  * zdenom2 
134               zgrazz    = zgraze2  * xprefz   * zcompaz   * zdenom2 
135               zgrazn    = zgraze2  * xprefp   * zcompaph  * zdenom2 
136               zgrazpoc  = zgraze2  * xprefpoc * zcompapoc * zdenom2 
137
138               zgraznf   = zgrazn   * trn(ji,jj,jk,jpnfe) / ( trn(ji,jj,jk,jpphy) + rtrn)
139               zgrazf    = zgrazd   * trn(ji,jj,jk,jpdfe) / ( trn(ji,jj,jk,jpdia) + rtrn)
140               zgrazpof  = zgrazpoc * trn(ji,jj,jk,jpsfe) / ( trn(ji,jj,jk,jppoc) + rtrn)
141
142               !  Mesozooplankton flux feeding on GOC
143               !  ----------------------------------
144               !  ----------------------------------
145# if ! defined key_kriest
146               zgrazffeg = grazflux  * zstep * wsbio4(ji,jj,jk)      &
147               &           * tgfunc2(ji,jj,jk) * trn(ji,jj,jk,jpgoc) * trn(ji,jj,jk,jpmes)
148               zgrazfffg = zgrazffeg * trn(ji,jj,jk,jpbfe) / (trn(ji,jj,jk,jpgoc) + rtrn)
149# endif
150               zgrazffep = grazflux  * zstep *  wsbio3(ji,jj,jk)     &
151               &           * tgfunc2(ji,jj,jk) * trn(ji,jj,jk,jppoc) * trn(ji,jj,jk,jpmes)
152               zgrazfffp = zgrazffep * trn(ji,jj,jk,jpsfe) / (trn(ji,jj,jk,jppoc) + rtrn)
153              !
154# if ! defined key_kriest
155              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
156              ! Compute the proportion of filter feeders
157              zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztot)
158              ! Compute fractionation of aggregates. It is assumed that
159              ! diatoms based aggregates are more prone to fractionation
160              ! since they are more porous (marine snow instead of fecal pellets)
161              zratio    = trn(ji,jj,jk,jpgsi) / ( trn(ji,jj,jk,jpgoc) + rtrn )
162              zratio2   = zratio * zratio
163              zfrac     = zproport * grazflux  * zstep * wsbio4(ji,jj,jk)      &
164               &          * trn(ji,jj,jk,jpgoc) * trn(ji,jj,jk,jpmes)          &
165               &          * ( 0.1 + 3.9 * zratio2 / ( 1.**2 + zratio2 ) )
166              zfracfe   = zfrac * trn(ji,jj,jk,jpbfe) / (trn(ji,jj,jk,jpgoc) + rtrn)
167
168              zgrazffep = zproport * zgrazffep
169              zgrazffeg = zproport * zgrazffeg
170              zgrazfffp = zproport * zgrazfffp
171              zgrazfffg = zproport * zgrazfffg
172              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
173              zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk)   &
174              &   + zgrazpoc + zgrazffep + zgrazffeg
175              zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp + zgrazfffg
176# else
177              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep
178              ! Compute the proportion of filter feeders
179              zproport  = zgrazffep / ( zgraztot + rtrn )
180              zgrazffep = zproport * zgrazffep
181              zgrazfffp = zproport * zgrazfffp
182              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep
183              zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk) + zgrazpoc + zgrazffep
184              zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp
185# endif
186
187              ! Total grazing ( grazing by microzoo is already computed in p4zmicro )
188              IF( ln_diatrc .AND. lk_iomput )  zgrazing(ji,jj,jk) = zgraztot
189
190              !    Mesozooplankton efficiency
191              !    --------------------------
192               zgrasrat  =  ( zgraztotf +rtrn )/ ( zgraztot + rtrn )
193               zgrasratn =  ( zgraztotn +rtrn )/ ( zgraztot + rtrn )
194               zepshert  = MIN( 1., zgrasratn, zgrasrat / ferat3)
195               zepsherv  = zepshert * MIN( epsher2, (1. - unass2) * zgrasrat / ferat3, (1. - unass2) * zgrasratn )
196               zgrarem2  = zgraztot * ( 1. - zepsherv - unass2 ) &
197                &       + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz2
198               zgrafer2  = zgraztot * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv )    &
199                &       + ferat3 * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz2 )
200               zgrapoc2  = zgraztot * unass2
201
202               !   Update the arrays TRA which contain the biological sources and sinks
203               zgrarsig  = zgrarem2 * sigma2
204               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig
205               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig
206               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem2 - zgrarsig
207               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig
208               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer2
209               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig
210               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig             
211
212               zmortz2 = ztortz2 + zrespz2
213               zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz2 + zrespz2
214               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) - zmortz2 + zepsherv * zgraztot 
215               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazd
216               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz
217               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazn
218               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazn * trn(ji,jj,jk,jpnch) / ( trn(ji,jj,jk,jpphy) + rtrn )
219               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazd * trn(ji,jj,jk,jpdch) / ( trn(ji,jj,jk,jpdia) + rtrn )
220               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazd * trn(ji,jj,jk,jpdsi) / ( trn(ji,jj,jk,jpdia) + rtrn )
221               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazd * trn(ji,jj,jk,jpdsi) / ( trn(ji,jj,jk,jpdia) + rtrn )
222               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf
223               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazf
224
225               ! calcite production
226               zprcaca = xfracal(ji,jj,jk) * zgrazn
227               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
228               !
229               zprcaca = part2 * zprcaca
230               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
231               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
232               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
233#if defined key_kriest
234              znumpoc = trn(ji,jj,jk,jpnum) / ( trn(ji,jj,jk,jppoc) + rtrn )
235              tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortzgoc - zgrazpoc - zgrazffep + zgrapoc2
236              tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) - zgrazpoc * znumpoc + zgrapoc2 * xkr_dmeso      &
237                 &   + zmortzgoc * xkr_dmeso - zgrazffep * znumpoc * wsbio4(ji,jj,jk) / ( wsbio3(ji,jj,jk) + rtrn )
238              tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ferat3 * zmortzgoc - zgrazfffp - zgrazpof    &
239                 &                 + zgraztotf * unass2
240#else
241              tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfrac
242              tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zmortzgoc - zgrazffeg + zgrapoc2 - zfrac
243              tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe
244              tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + ferat3 * zmortzgoc - zgrazfffg     &
245                 &                + zgraztotf * unass2 - zfracfe
246#endif
247            END DO
248         END DO
249      END DO
250      !
251      IF( ln_diatrc .AND. lk_iomput .AND. jnt == nrdttrc ) THEN
252         zrfact2 = 1.e3 * rfact2r
253         CALL iom_put( "GRAZ2", zgrazing(:,:,:) * zrfact2 * tmask(:,:,:) )  ! Total grazing of phyto by zooplankton
254         CALL iom_put( "PCAL" , prodcal(:,:,:)  * zrfact2 * tmask(:,:,:) )  ! Calcite production
255      ENDIF
256      !
257      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
258        WRITE(charout, FMT="('meso')")
259        CALL prt_ctl_trc_info(charout)
260        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
261      ENDIF
262      !
263      IF( ln_diatrc .AND. lk_iomput )  CALL wrk_dealloc( jpi, jpj, jpk, zgrazing )
264      !
265      IF( nn_timing == 1 )  CALL timing_stop('p4z_meso')
266      !
267   END SUBROUTINE p4z_meso
268
269   SUBROUTINE p4z_meso_init
270
271      !!----------------------------------------------------------------------
272      !!                  ***  ROUTINE p4z_meso_init  ***
273      !!
274      !! ** Purpose :   Initialization of mesozooplankton parameters
275      !!
276      !! ** Method  :   Read the nampismes namelist and check the parameters
277      !!      called at the first timestep (nittrc000)
278      !!
279      !! ** input   :   Namelist nampismes
280      !!
281      !!----------------------------------------------------------------------
282
283      NAMELIST/nampismes/ part2, grazrat2, resrat2, mzrat2, xprefc, xprefp, xprefz,   &
284         &                xprefpoc, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
285         &                xthresh2, xkgraz2, epsher2, sigma2, unass2, grazflux
286      INTEGER :: ios                 ! Local integer output status for namelist read
287
288      REWIND( numnatp_ref )              ! Namelist nampismes in reference namelist : Pisces mesozooplankton
289      READ  ( numnatp_ref, nampismes, IOSTAT = ios, ERR = 901)
290901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in reference namelist', lwp )
291
292      REWIND( numnatp_cfg )              ! Namelist nampismes in configuration namelist : Pisces mesozooplankton
293      READ  ( numnatp_cfg, nampismes, IOSTAT = ios, ERR = 902 )
294902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in configuration namelist', lwp )
295      IF(lwm) WRITE ( numonp, nampismes )
296
297
298      IF(lwp) THEN                         ! control print
299         WRITE(numout,*) ' ' 
300         WRITE(numout,*) ' Namelist parameters for mesozooplankton, nampismes'
301         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
302         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2        =', part2
303         WRITE(numout,*) '    mesozoo preference for phyto                   xprefc       =', xprefc
304         WRITE(numout,*) '    mesozoo preference for POC                     xprefp       =', xprefp
305         WRITE(numout,*) '    mesozoo preference for zoo                     xprefz       =', xprefz
306         WRITE(numout,*) '    mesozoo preference for poc                     xprefpoc     =', xprefpoc
307         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo  =', xthresh2zoo
308         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia  =', xthresh2dia
309         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy  =', xthresh2phy
310         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc  =', xthresh2poc
311         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2     =', xthresh2
312         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2      =', resrat2
313         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2       =', mzrat2
314         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2     =', grazrat2
315         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux     =', grazflux
316         WRITE(numout,*) '    non assimilated fraction of P by mesozoo       unass2       =', unass2
317         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2      =', epsher2
318         WRITE(numout,*) '    Fraction of mesozoo excretion as DOM           sigma2       =', sigma2
319         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2      =', xkgraz2
320      ENDIF
321
322
323   END SUBROUTINE p4z_meso_init
324
325
326#else
327   !!======================================================================
328   !!  Dummy module :                                   No PISCES bio-model
329   !!======================================================================
330CONTAINS
331   SUBROUTINE p4z_meso                    ! Empty routine
332   END SUBROUTINE p4z_meso
333#endif 
334
335   !!======================================================================
336END MODULE  p4zmeso
Note: See TracBrowser for help on using the repository browser.