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.
p4zmicro.F90 in trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zmicro.F90 @ 4641

Last change on this file since 4641 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: 14.5 KB
Line 
1MODULE p4zmicro
2   !!======================================================================
3   !!                         ***  MODULE p4zmicro  ***
4   !! TOP :   PISCES Compute the sources/sinks for microzooplankton
5   !!======================================================================
6   !! History :   1.0  !  2004     (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_micro       :   Compute the sources/sinks for microzooplankton
15   !!   p4z_micro_init  :   Initialize and read the appropriate namelist
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 p4zlim          !  Co-limitations
21   USE p4zsink         !  vertical flux of particulate matter due to sinking
22   USE p4zint          !  interpolation and computation of various fields
23   USE p4zprod         !  production
24   USE iom             !  I/O manager
25   USE prtctl_trc      !  print control for debugging
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   p4z_micro         ! called in p4zbio.F90
31   PUBLIC   p4z_micro_init    ! called in trcsms_pisces.F90
32
33   !! * Shared module variables
34   REAL(wp), PUBLIC ::  part        !: part of calcite not dissolved in microzoo guts
35   REAL(wp), PUBLIC ::  xpref2c     !: microzoo preference for POC
36   REAL(wp), PUBLIC ::  xpref2p     !: microzoo preference for nanophyto
37   REAL(wp), PUBLIC ::  xpref2d     !: microzoo preference for diatoms
38   REAL(wp), PUBLIC ::  xthreshdia  !: diatoms feeding threshold for microzooplankton
39   REAL(wp), PUBLIC ::  xthreshphy  !: nanophyto threshold for microzooplankton
40   REAL(wp), PUBLIC ::  xthreshpoc  !: poc threshold for microzooplankton
41   REAL(wp), PUBLIC ::  xthresh     !: feeding threshold for microzooplankton
42   REAL(wp), PUBLIC ::  resrat      !: exsudation rate of microzooplankton
43   REAL(wp), PUBLIC ::  mzrat       !: microzooplankton mortality rate
44   REAL(wp), PUBLIC ::  grazrat     !: maximal microzoo grazing rate
45   REAL(wp), PUBLIC ::  xkgraz      !: non assimilated fraction of P by microzoo
46   REAL(wp), PUBLIC ::  unass       !: Efficicency of microzoo growth
47   REAL(wp), PUBLIC ::  sigma1      !: Fraction of microzoo excretion as DOM
48   REAL(wp), PUBLIC ::  epsher      !: half sturation constant for grazing 1
49
50
51   !!* Substitution
52#  include "top_substitute.h90"
53   !!----------------------------------------------------------------------
54   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
55   !! $Id: p4zmicro.F90 3160 2011-11-20 14:27:18Z cetlod $
56   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
57   !!----------------------------------------------------------------------
58
59CONTAINS
60
61   SUBROUTINE p4z_micro( kt, jnt )
62      !!---------------------------------------------------------------------
63      !!                     ***  ROUTINE p4z_micro  ***
64      !!
65      !! ** Purpose :   Compute the sources/sinks for microzooplankton
66      !!
67      !! ** Method  : - ???
68      !!---------------------------------------------------------------------
69      INTEGER, INTENT(in) ::  kt  ! ocean time step
70      INTEGER, INTENT(in) ::  jnt 
71      !
72      INTEGER  :: ji, jj, jk
73      REAL(wp) :: zcompadi, zcompaz , zcompaph, zcompapoc
74      REAL(wp) :: zgraze  , zdenom, zdenom2
75      REAL(wp) :: zfact   , zstep, zfood, zfoodlim
76      REAL(wp) :: zepshert, zepsherv, zgrarsig, zgraztot, zgraztotn, zgraztotf
77      REAL(wp) :: zgrarem, zgrafer, zgrapoc, zprcaca, zmortz
78      REAL(wp) :: zrespz, ztortz, zgrasrat, zgrasratn
79      REAL(wp) :: zgrazp, zgrazm, zgrazsd
80      REAL(wp) :: zgrazmf, zgrazsf, zgrazpf
81      REAL(wp) :: zrfact2
82      REAL(wp), POINTER, DIMENSION(:,:,:) :: zgrazing
83      CHARACTER (len=25) :: charout
84      !!---------------------------------------------------------------------
85      !
86      IF( nn_timing == 1 )  CALL timing_start('p4z_micro')
87      !
88      IF( ln_diatrc .AND. lk_iomput )  CALL wrk_alloc( jpi, jpj, jpk, zgrazing )
89      !
90      DO jk = 1, jpkm1
91         DO jj = 1, jpj
92            DO ji = 1, jpi
93               zcompaz = MAX( ( trn(ji,jj,jk,jpzoo) - 1.e-9 ), 0.e0 )
94               zstep   = xstep
95# if defined key_degrad
96               zstep = zstep * facvol(ji,jj,jk)
97# endif
98               zfact   = zstep * tgfunc2(ji,jj,jk) * zcompaz
99
100               !  Respiration rates of both zooplankton
101               !  -------------------------------------
102               zrespz = resrat * zfact * trn(ji,jj,jk,jpzoo) / ( xkmort + trn(ji,jj,jk,jpzoo) )  &
103                  &   + resrat * zfact * 3. * nitrfac(ji,jj,jk)
104
105               !  Zooplankton mortality. A square function has been selected with
106               !  no real reason except that it seems to be more stable and may mimic predation.
107               !  ---------------------------------------------------------------
108               ztortz = mzrat * 1.e6 * zfact * trn(ji,jj,jk,jpzoo)
109
110               zcompadi  = MIN( MAX( ( trn(ji,jj,jk,jpdia) - xthreshdia ), 0.e0 ), xsizedia )
111               zcompaph  = MAX( ( trn(ji,jj,jk,jpphy) - xthreshphy ), 0.e0 )
112               zcompapoc = MAX( ( trn(ji,jj,jk,jppoc) - xthreshpoc ), 0.e0 )
113               
114               !     Microzooplankton grazing
115               !     ------------------------
116               zfood     = xpref2p * zcompaph + xpref2c * zcompapoc + xpref2d * zcompadi
117               zfoodlim  = MAX( 0. , zfood - min(xthresh,0.5*zfood) )
118               zdenom    = zfoodlim / ( xkgraz + zfoodlim )
119               zdenom2   = zdenom / ( zfood + rtrn )
120               zgraze    = grazrat * zstep * tgfunc2(ji,jj,jk) * trn(ji,jj,jk,jpzoo) 
121
122               zgrazp    = zgraze  * xpref2p * zcompaph  * zdenom2 
123               zgrazm    = zgraze  * xpref2c * zcompapoc * zdenom2 
124               zgrazsd   = zgraze  * xpref2d * zcompadi  * zdenom2 
125
126               zgrazpf   = zgrazp  * trn(ji,jj,jk,jpnfe) / (trn(ji,jj,jk,jpphy) + rtrn)
127               zgrazmf   = zgrazm  * trn(ji,jj,jk,jpsfe) / (trn(ji,jj,jk,jppoc) + rtrn)
128               zgrazsf   = zgrazsd * trn(ji,jj,jk,jpdfe) / (trn(ji,jj,jk,jpdia) + rtrn)
129               !
130               zgraztot  = zgrazp  + zgrazm  + zgrazsd 
131               zgraztotf = zgrazpf + zgrazsf + zgrazmf 
132               zgraztotn = zgrazp * quotan(ji,jj,jk) + zgrazm + zgrazsd * quotad(ji,jj,jk)
133
134               ! Grazing by microzooplankton
135               IF( ln_diatrc .AND. lk_iomput )  zgrazing(ji,jj,jk) = zgraztot
136
137               !    Various remineralization and excretion terms
138               !    --------------------------------------------
139               zgrasrat  = zgraztotf / ( zgraztot + rtrn )
140               zgrasratn = zgraztotn / ( zgraztot + rtrn )
141               zepshert  =  MIN( 1., zgrasratn, zgrasrat / ferat3)
142               zepsherv  = zepshert * MIN( epsher, (1. - unass) * zgrasrat / ferat3, (1. - unass) * zgrasratn )
143               zgrafer   = zgraztot * MAX( 0. , ( 1. - unass ) * zgrasrat - ferat3 * zepsherv ) 
144               zgrarem   = zgraztot * ( 1. - zepsherv - unass )
145               zgrapoc   = zgraztot * unass
146
147               !  Update of the TRA arrays
148               !  ------------------------
149               zgrarsig  = zgrarem * sigma1
150               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig
151               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig
152               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem - zgrarsig
153               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig
154               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer
155               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zgrapoc
156               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zgraztotf * unass
157               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig
158               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig
159#if defined key_kriest
160               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) + zgrapoc * xkr_dmicro
161#endif
162               !   Update the arrays TRA which contain the biological sources and sinks
163               !   --------------------------------------------------------------------
164               zmortz = ztortz + zrespz
165               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zmortz + zepsherv * zgraztot 
166               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazp
167               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazsd
168               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazp  * trn(ji,jj,jk,jpnch)/(trn(ji,jj,jk,jpphy)+rtrn)
169               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazsd * trn(ji,jj,jk,jpdch)/(trn(ji,jj,jk,jpdia)+rtrn)
170               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazsd * trn(ji,jj,jk,jpdsi)/(trn(ji,jj,jk,jpdia)+rtrn)
171               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazsd * trn(ji,jj,jk,jpdsi)/(trn(ji,jj,jk,jpdia)+rtrn)
172               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgrazpf
173               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazsf
174               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortz - zgrazm
175               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ferat3 * zmortz - zgrazmf
176               !
177               ! calcite production
178               zprcaca = xfracal(ji,jj,jk) * zgrazp
179               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
180               !
181               zprcaca = part * zprcaca
182               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
183               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
184               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
185#if defined key_kriest
186               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) + zmortz * xkr_dmicro &
187                                                         - zgrazm * trn(ji,jj,jk,jpnum) / ( trn(ji,jj,jk,jppoc) + rtrn )
188#endif
189            END DO
190         END DO
191      END DO
192      !
193      IF( ln_diatrc .AND. lk_iomput .AND. jnt == nrdttrc ) THEN
194         zrfact2 = 1.e3 * rfact2r
195         CALL iom_put( "GRAZ1" , zgrazing(:,:,:) * zrfact2 * tmask(:,:,:) )  ! Total grazing of phyto by zooplankton
196      ENDIF
197      !
198      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
199         WRITE(charout, FMT="('micro')")
200         CALL prt_ctl_trc_info(charout)
201         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
202      ENDIF
203      !
204      IF( ln_diatrc .AND. lk_iomput )  CALL wrk_dealloc( jpi, jpj, jpk, zgrazing )
205      !
206      IF( nn_timing == 1 )  CALL timing_stop('p4z_micro')
207      !
208   END SUBROUTINE p4z_micro
209
210
211   SUBROUTINE p4z_micro_init
212
213      !!----------------------------------------------------------------------
214      !!                  ***  ROUTINE p4z_micro_init  ***
215      !!
216      !! ** Purpose :   Initialization of microzooplankton parameters
217      !!
218      !! ** Method  :   Read the nampiszoo namelist and check the parameters
219      !!                called at the first timestep (nittrc000)
220      !!
221      !! ** input   :   Namelist nampiszoo
222      !!
223      !!----------------------------------------------------------------------
224
225      NAMELIST/nampiszoo/ part, grazrat, resrat, mzrat, xpref2c, xpref2p, &
226         &                xpref2d,  xthreshdia,  xthreshphy,  xthreshpoc, &
227         &                xthresh, xkgraz, epsher, sigma1, unass
228      INTEGER :: ios                 ! Local integer output status for namelist read
229
230      REWIND( numnatp_ref )              ! Namelist nampiszoo in reference namelist : Pisces microzooplankton
231      READ  ( numnatp_ref, nampiszoo, IOSTAT = ios, ERR = 901)
232901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiszoo in reference namelist', lwp )
233
234      REWIND( numnatp_cfg )              ! Namelist nampiszoo in configuration namelist : Pisces microzooplankton
235      READ  ( numnatp_cfg, nampiszoo, IOSTAT = ios, ERR = 902 )
236902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiszoo in configuration namelist', lwp )
237      IF(lwm) WRITE ( numonp, nampiszoo )
238
239      IF(lwp) THEN                         ! control print
240         WRITE(numout,*) ' '
241         WRITE(numout,*) ' Namelist parameters for microzooplankton, nampiszoo'
242         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
243         WRITE(numout,*) '    part of calcite not dissolved in microzoo guts  part        =', part
244         WRITE(numout,*) '    microzoo preference for POC                     xpref2c     =', xpref2c
245         WRITE(numout,*) '    microzoo preference for nano                    xpref2p     =', xpref2p
246         WRITE(numout,*) '    microzoo preference for diatoms                 xpref2d     =', xpref2d
247         WRITE(numout,*) '    diatoms feeding threshold  for microzoo         xthreshdia  =', xthreshdia
248         WRITE(numout,*) '    nanophyto feeding threshold for microzoo        xthreshphy  =', xthreshphy
249         WRITE(numout,*) '    poc feeding threshold for microzoo              xthreshpoc  =', xthreshpoc
250         WRITE(numout,*) '    feeding threshold for microzooplankton          xthresh     =', xthresh
251         WRITE(numout,*) '    exsudation rate of microzooplankton             resrat      =', resrat
252         WRITE(numout,*) '    microzooplankton mortality rate                 mzrat       =', mzrat
253         WRITE(numout,*) '    maximal microzoo grazing rate                   grazrat     =', grazrat
254         WRITE(numout,*) '    non assimilated fraction of P by microzoo       unass       =', unass
255         WRITE(numout,*) '    Efficicency of microzoo growth                  epsher      =', epsher
256         WRITE(numout,*) '    Fraction of microzoo excretion as DOM           sigma1      =', sigma1
257         WRITE(numout,*) '    half sturation constant for grazing 1           xkgraz      =', xkgraz
258      ENDIF
259
260   END SUBROUTINE p4z_micro_init
261
262#else
263   !!======================================================================
264   !!  Dummy module :                                   No PISCES bio-model
265   !!======================================================================
266CONTAINS
267   SUBROUTINE p4z_micro                    ! Empty routine
268   END SUBROUTINE p4z_micro
269#endif 
270
271   !!======================================================================
272END MODULE  p4zmicro
Note: See TracBrowser for help on using the repository browser.