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 NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z/p4zmicro.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
File size: 14.4 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   !!   p4z_micro      : Compute the sources/sinks for microzooplankton
11   !!   p4z_micro_init : Initialize and read the appropriate namelist
12   !!----------------------------------------------------------------------
13   USE oce_trc         ! shared variables between ocean and passive tracers
14   USE trc             ! passive tracers common variables
15   USE sms_pisces      ! PISCES Source Minus Sink variables
16   USE p4zlim          ! Co-limitations
17   USE p4zprod         ! production
18   USE iom             ! I/O manager
19   USE prtctl_trc      ! print control for debugging
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p4z_micro         ! called in p4zbio.F90
25   PUBLIC   p4z_micro_init    ! called in trcsms_pisces.F90
26
27   REAL(wp), PUBLIC ::   part        !: part of calcite not dissolved in microzoo guts
28   REAL(wp), PUBLIC ::   xprefc      !: microzoo preference for POC
29   REAL(wp), PUBLIC ::   xprefn      !: microzoo preference for nanophyto
30   REAL(wp), PUBLIC ::   xprefd      !: microzoo preference for diatoms
31   REAL(wp), PUBLIC ::   xthreshdia  !: diatoms feeding threshold for microzooplankton
32   REAL(wp), PUBLIC ::   xthreshphy  !: nanophyto threshold for microzooplankton
33   REAL(wp), PUBLIC ::   xthreshpoc  !: poc threshold for microzooplankton
34   REAL(wp), PUBLIC ::   xthresh     !: feeding threshold for microzooplankton
35   REAL(wp), PUBLIC ::   resrat      !: exsudation rate of microzooplankton
36   REAL(wp), PUBLIC ::   mzrat       !: microzooplankton mortality rate
37   REAL(wp), PUBLIC ::   grazrat     !: maximal microzoo grazing rate
38   REAL(wp), PUBLIC ::   xkgraz      !: Half-saturation constant of assimilation
39   REAL(wp), PUBLIC ::   unass       !: Non-assimilated part of food
40   REAL(wp), PUBLIC ::   sigma1      !: Fraction of microzoo excretion as DOM
41   REAL(wp), PUBLIC ::   epsher      !: growth efficiency for grazing 1
42   REAL(wp), PUBLIC ::   epshermin   !: minimum growth efficiency for grazing 1
43
44   !!----------------------------------------------------------------------
45   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
46   !! $Id$
47   !! Software governed by the CeCILL license (see ./LICENSE)
48   !!----------------------------------------------------------------------
49CONTAINS
50
51   SUBROUTINE p4z_micro( kt, knt )
52      !!---------------------------------------------------------------------
53      !!                     ***  ROUTINE p4z_micro  ***
54      !!
55      !! ** Purpose :   Compute the sources/sinks for microzooplankton
56      !!
57      !! ** Method  : - ???
58      !!---------------------------------------------------------------------
59      INTEGER, INTENT(in) ::   kt    ! ocean time step
60      INTEGER, INTENT(in) ::   knt   ! ???
61      !
62      INTEGER  :: ji, jj, jk
63      REAL(wp) :: zcompadi, zcompaz , zcompaph, zcompapoc
64      REAL(wp) :: zgraze  , zdenom, zdenom2
65      REAL(wp) :: zfact   , zfood, zfoodlim, zbeta
66      REAL(wp) :: zepsherf, zepshert, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf
67      REAL(wp) :: zgrarem, zgrafer, zgrapoc, zprcaca, zmortz
68      REAL(wp) :: zrespz, ztortz, zgrasrat, zgrasratn
69      REAL(wp) :: zgrazp, zgrazm, zgrazsd
70      REAL(wp) :: zgrazmf, zgrazsf, zgrazpf
71      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo
72      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zw3d, zzligprod
73      CHARACTER (len=25) :: charout
74      !!---------------------------------------------------------------------
75      !
76      IF( ln_timing )   CALL timing_start('p4z_micro')
77      !
78      IF (ln_ligand) THEN
79         ALLOCATE( zzligprod(jpi,jpj,jpk) )
80         zzligprod(:,:,:) = 0._wp
81      ENDIF
82      !
83      DO jk = 1, jpkm1
84         DO jj = 1, jpj
85            DO ji = 1, jpi
86               zcompaz = MAX( ( trb(ji,jj,jk,jpzoo) - 1.e-9 ), 0.e0 )
87               zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz
88
89               !  Respiration rates of both zooplankton
90               !  -------------------------------------
91               zrespz = resrat * zfact * trb(ji,jj,jk,jpzoo) / ( xkmort + trb(ji,jj,jk,jpzoo) )  &
92                  &   + resrat * zfact * 3. * nitrfac(ji,jj,jk)
93
94               !  Zooplankton mortality. A square function has been selected with
95               !  no real reason except that it seems to be more stable and may mimic predation.
96               !  ---------------------------------------------------------------
97               ztortz = mzrat * 1.e6 * zfact * trb(ji,jj,jk,jpzoo) * (1. - nitrfac(ji,jj,jk))
98
99               zcompadi  = MIN( MAX( ( trb(ji,jj,jk,jpdia) - xthreshdia ), 0.e0 ), xsizedia )
100               zcompaph  = MAX( ( trb(ji,jj,jk,jpphy) - xthreshphy ), 0.e0 )
101               zcompapoc = MAX( ( trb(ji,jj,jk,jppoc) - xthreshpoc ), 0.e0 )
102               
103               !     Microzooplankton grazing
104               !     ------------------------
105               zfood     = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi
106               zfoodlim  = MAX( 0. , zfood - min(xthresh,0.5*zfood) )
107               zdenom    = zfoodlim / ( xkgraz + zfoodlim )
108               zdenom2   = zdenom / ( zfood + rtrn )
109               zgraze    = grazrat * xstep * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpzoo) * (1. - nitrfac(ji,jj,jk))
110
111               zgrazp    = zgraze  * xprefn * zcompaph  * zdenom2 
112               zgrazm    = zgraze  * xprefc * zcompapoc * zdenom2 
113               zgrazsd   = zgraze  * xprefd * zcompadi  * zdenom2 
114
115               zgrazpf   = zgrazp  * trb(ji,jj,jk,jpnfe) / (trb(ji,jj,jk,jpphy) + rtrn)
116               zgrazmf   = zgrazm  * trb(ji,jj,jk,jpsfe) / (trb(ji,jj,jk,jppoc) + rtrn)
117               zgrazsf   = zgrazsd * trb(ji,jj,jk,jpdfe) / (trb(ji,jj,jk,jpdia) + rtrn)
118               !
119               zgraztotc = zgrazp  + zgrazm  + zgrazsd 
120               zgraztotf = zgrazpf + zgrazsf + zgrazmf 
121               zgraztotn = zgrazp * quotan(ji,jj,jk) + zgrazm + zgrazsd * quotad(ji,jj,jk)
122
123               ! Grazing by microzooplankton
124               zgrazing(ji,jj,jk) = zgraztotc
125
126               !    Various remineralization and excretion terms
127               !    --------------------------------------------
128               zgrasrat  = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn )
129               zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn )
130               zepshert  =  MIN( 1., zgrasratn, zgrasrat / ferat3)
131               zbeta     = MAX(0., (epsher - epshermin) )
132               zepsherf  = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )
133               zepsherv  = zepsherf * zepshert 
134
135               zgrafer   = zgraztotc * MAX( 0. , ( 1. - unass ) * zgrasrat - ferat3 * zepsherv ) 
136               zgrarem   = zgraztotc * ( 1. - zepsherv - unass )
137               zgrapoc   = zgraztotc * unass
138
139               !  Update of the TRA arrays
140               !  ------------------------
141               zgrarsig  = zgrarem * sigma1
142               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig
143               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig
144               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem - zgrarsig
145               !
146               IF( ln_ligand ) THEN
147                  tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + (zgrarem - zgrarsig) * ldocz
148                  zzligprod(ji,jj,jk) = (zgrarem - zgrarsig) * ldocz
149               ENDIF
150               !
151               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig
152               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer
153               zfezoo(ji,jj,jk)    = zgrafer
154               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zgrapoc
155               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + 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               !   Update the arrays TRA which contain the biological sources and sinks
160               !   --------------------------------------------------------------------
161               zmortz = ztortz + zrespz
162               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zmortz + zepsherv * zgraztotc 
163               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazp
164               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazsd
165               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazp  * trb(ji,jj,jk,jpnch)/(trb(ji,jj,jk,jpphy)+rtrn)
166               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazsd * trb(ji,jj,jk,jpdch)/(trb(ji,jj,jk,jpdia)+rtrn)
167               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazsd * trb(ji,jj,jk,jpdsi)/(trb(ji,jj,jk,jpdia)+rtrn)
168               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazsd * trb(ji,jj,jk,jpdsi)/(trb(ji,jj,jk,jpdia)+rtrn)
169               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgrazpf
170               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazsf
171               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortz - zgrazm
172               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortz
173               conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazm
174               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ferat3 * zmortz - zgrazmf
175               !
176               ! calcite production
177               zprcaca = xfracal(ji,jj,jk) * zgrazp
178               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
179               !
180               zprcaca = part * zprcaca
181               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
182               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
183               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
184            END DO
185         END DO
186      END DO
187      !
188      IF( lk_iomput ) THEN
189         IF( knt == nrdttrc ) THEN
190           ALLOCATE( zw3d(jpi,jpj,jpk) )
191           IF( iom_use( "GRAZ1" ) ) THEN
192              zw3d(:,:,:) = zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)  !  Total grazing of phyto by zooplankton
193              CALL iom_put( "GRAZ1", zw3d )
194           ENDIF
195           IF( iom_use( "FEZOO" ) ) THEN
196              zw3d(:,:,:) = zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)   !
197              CALL iom_put( "FEZOO", zw3d )
198           ENDIF
199           IF( iom_use( "LPRODZ" ) .AND. ln_ligand )  THEN
200              zw3d(:,:,:) = zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)
201              CALL iom_put( "LPRODZ"  , zw3d )
202           ENDIF
203           DEALLOCATE( zw3d )
204         ENDIF
205      ENDIF
206      !
207      IF (ln_ligand)  DEALLOCATE( zzligprod )
208      !
209      IF(ln_ctl) THEN      ! print mean trends (used for debugging)
210         WRITE(charout, FMT="('micro')")
211         CALL prt_ctl_trc_info(charout)
212         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
213      ENDIF
214      !
215      IF( ln_timing )   CALL timing_stop('p4z_micro')
216      !
217   END SUBROUTINE p4z_micro
218
219
220   SUBROUTINE p4z_micro_init
221      !!----------------------------------------------------------------------
222      !!                  ***  ROUTINE p4z_micro_init  ***
223      !!
224      !! ** Purpose :   Initialization of microzooplankton parameters
225      !!
226      !! ** Method  :   Read the nampiszoo namelist and check the parameters
227      !!                called at the first timestep (nittrc000)
228      !!
229      !! ** input   :   Namelist nampiszoo
230      !!
231      !!----------------------------------------------------------------------
232      INTEGER ::   ios   ! Local integer
233      !
234      NAMELIST/namp4zzoo/ part, grazrat, resrat, mzrat, xprefn, xprefc, &
235         &                xprefd,  xthreshdia,  xthreshphy,  xthreshpoc, &
236         &                xthresh, xkgraz, epsher, epshermin, sigma1, unass
237      !!----------------------------------------------------------------------
238      !
239      IF(lwp) THEN
240         WRITE(numout,*) 
241         WRITE(numout,*) 'p4z_micro_init : Initialization of microzooplankton parameters'
242         WRITE(numout,*) '~~~~~~~~~~~~~~'
243      ENDIF
244      !
245      READ  ( numnatp_ref, namp4zzoo, IOSTAT = ios, ERR = 901)
246901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zzoo in reference namelist' )
247      READ  ( numnatp_cfg, namp4zzoo, IOSTAT = ios, ERR = 902 )
248902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zzoo in configuration namelist' )
249      IF(lwm) WRITE( numonp, namp4zzoo )
250      !
251      IF(lwp) THEN                         ! control print
252         WRITE(numout,*) '   Namelist : namp4zzoo'
253         WRITE(numout,*) '      part of calcite not dissolved in microzoo guts  part        =', part
254         WRITE(numout,*) '      microzoo preference for POC                     xprefc      =', xprefc
255         WRITE(numout,*) '      microzoo preference for nano                    xprefn      =', xprefn
256         WRITE(numout,*) '      microzoo preference for diatoms                 xprefd      =', xprefd
257         WRITE(numout,*) '      diatoms feeding threshold  for microzoo         xthreshdia  =', xthreshdia
258         WRITE(numout,*) '      nanophyto feeding threshold for microzoo        xthreshphy  =', xthreshphy
259         WRITE(numout,*) '      poc feeding threshold for microzoo              xthreshpoc  =', xthreshpoc
260         WRITE(numout,*) '      feeding threshold for microzooplankton          xthresh     =', xthresh
261         WRITE(numout,*) '      exsudation rate of microzooplankton             resrat      =', resrat
262         WRITE(numout,*) '      microzooplankton mortality rate                 mzrat       =', mzrat
263         WRITE(numout,*) '      maximal microzoo grazing rate                   grazrat     =', grazrat
264         WRITE(numout,*) '      non assimilated fraction of P by microzoo       unass       =', unass
265         WRITE(numout,*) '      Efficicency of microzoo growth                  epsher      =', epsher
266         WRITE(numout,*) '      Minimum efficicency of microzoo growth          epshermin   =', epshermin
267         WRITE(numout,*) '      Fraction of microzoo excretion as DOM           sigma1      =', sigma1
268         WRITE(numout,*) '      half sturation constant for grazing 1           xkgraz      =', xkgraz
269      ENDIF
270      !
271   END SUBROUTINE p4z_micro_init
272
273   !!======================================================================
274END MODULE p4zmicro
Note: See TracBrowser for help on using the repository browser.