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.
p5zmort.F90 in NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p5zmort.F90 @ 14276

Last change on this file since 14276 was 14276, checked in by aumont, 3 years ago

numerous updates to PISCES, PISCES-QUOTA and the sediment module

  • Property svn:keywords set to Id
File size: 15.8 KB
Line 
1MODULE p5zmort
2   !!======================================================================
3   !!                         ***  MODULE p5zmort  ***
4   !! TOP :   PISCES-QUOTA Compute the mortality terms for phytoplankton
5   !!======================================================================
6   !! History :   1.0  !  2002     (O. Aumont)  Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
9   !!----------------------------------------------------------------------
10   !!   p5z_mort       :   Compute the mortality terms for phytoplankton
11   !!   p5z_mort_init  :   Initialize the mortality params for phytoplankton
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          !  Phytoplankton limitation terms (p4z)
17   USE p5zlim          !  Phytoplankton limitation terms (p5z)
18   USE prtctl_trc      !  print control for debugging
19
20   IMPLICIT NONE
21   PRIVATE
22
23   PUBLIC   p5z_mort           ! Called from p4zbio.F90
24   PUBLIC   p5z_mort_init      ! Called from trcini_pisces.F90
25
26   !! * Shared module variables
27   REAL(wp), PUBLIC :: wchln   !! Quadratic mortality rate of nanophytoplankton
28   REAL(wp), PUBLIC :: wchlp   !: Quadratic mortality rate of picophytoplankton
29   REAL(wp), PUBLIC :: wchld   !: Quadratic mortality rate of diatoms
30   REAL(wp), PUBLIC :: mpratn  !: Linear mortality rate of nanophytoplankton
31   REAL(wp), PUBLIC :: mpratp  !: Linear mortality rate of picophytoplankton
32   REAL(wp), PUBLIC :: mpratd  !: Linear mortality rate of diatoms
33
34   !!----------------------------------------------------------------------
35   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
36   !! $Id$
37   !! Software governed by the CeCILL license (see ./LICENSE)
38   !!----------------------------------------------------------------------
39
40CONTAINS
41
42   SUBROUTINE p5z_mort( kt )
43      !!---------------------------------------------------------------------
44      !!                     ***  ROUTINE p5z_mort  ***
45      !!
46      !! ** Purpose :   Calls the different subroutine to compute
47      !!                the different phytoplankton mortality terms
48      !!
49      !! ** Method  : - ???
50      !!---------------------------------------------------------------------
51      INTEGER, INTENT(in) ::   kt ! ocean time step
52      !!---------------------------------------------------------------------
53
54      CALL p5z_mort_nano            ! nanophytoplankton
55      CALL p5z_mort_pico            ! picophytoplankton
56      CALL p5z_mort_diat            ! diatoms
57
58   END SUBROUTINE p5z_mort
59
60
61   SUBROUTINE p5z_mort_nano
62      !!---------------------------------------------------------------------
63      !!                     ***  ROUTINE p5z_mort_nano  ***
64      !!
65      !! ** Purpose :   Compute the mortality terms for nanophytoplankton
66      !!
67      !! ** Method  : - Both quadratic and simili linear mortality terms
68      !!---------------------------------------------------------------------
69      INTEGER  :: ji, jj, jk
70      REAL(wp) :: zcompaph, zlim1, zlim2
71      REAL(wp) :: zfactfe, zfactch, zfactn, zfactp, zprcaca
72      REAL(wp) :: ztortp , zrespp , zmortp
73      CHARACTER (len=25) :: charout
74      !!---------------------------------------------------------------------
75      !
76      IF( ln_timing )   CALL timing_start('p5z_mort_nano')
77      !
78      prodcal(:,:,:) = 0.  !: calcite production variable set to zero
79      DO jk = 1, jpkm1
80         DO jj = 1, jpj
81            DO ji = 1, jpi
82               zcompaph = MAX( ( trb(ji,jj,jk,jpphy) - 1e-9 ), 0.e0 )
83
84               ! Quadratic mortality of nano due to aggregation during
85               ! blooms (Doney et al. 1996)
86               ! -----------------------------------------------------
87               zlim2   = xlimphy(ji,jj,jk) * xlimphy(ji,jj,jk)
88               zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * trb(ji,jj,jk,jpphy)
89               zrespp = wchln * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph
90
91               ! Phytoplankton linear mortality
92               ! A michaelis-menten like term is introduced to avoid
93               ! extinction of nanophyto in highly limited areas
94               ! ----------------------------------------------------
95               ztortp = mpratn * xstep * zcompaph * trb(ji,jj,jk,jpphy) / ( xkmort + trb(ji,jj,jk,jpphy) )
96               zmortp = zrespp + ztortp
97
98               ! Update the arrays TRA which contains the biological sources and sinks
99
100               zfactn  = trb(ji,jj,jk,jpnph)/(trb(ji,jj,jk,jpphy)+rtrn)
101               zfactp  = trb(ji,jj,jk,jppph)/(trb(ji,jj,jk,jpphy)+rtrn)
102               zfactfe = trb(ji,jj,jk,jpnfe)/(trb(ji,jj,jk,jpphy)+rtrn)
103               zfactch = trb(ji,jj,jk,jpnch)/(trb(ji,jj,jk,jpphy)+rtrn)
104               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zmortp
105               tra(ji,jj,jk,jpnph) = tra(ji,jj,jk,jpnph) - zmortp * zfactn
106               tra(ji,jj,jk,jppph) = tra(ji,jj,jk,jppph) - zmortp * zfactp
107               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zmortp * zfactch
108               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zmortp * zfactfe
109               ! Production PIC particles due to mortality
110               zprcaca = xfracal(ji,jj,jk) * zmortp
111               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
112               !
113               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
114               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
115               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
116               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp
117               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + zmortp * zfactn
118               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + zmortp * zfactp
119               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp
120               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp * zfactfe
121            END DO
122         END DO
123      END DO
124      !
125       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
126         WRITE(charout, FMT="('nano')")
127         CALL prt_ctl_trc_info(charout)
128         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
129       ENDIF
130      !
131      IF( ln_timing )   CALL timing_stop('p5z_mort_nano')
132      !
133   END SUBROUTINE p5z_mort_nano
134
135
136   SUBROUTINE p5z_mort_pico
137      !!---------------------------------------------------------------------
138      !!                     ***  ROUTINE p5z_mort_pico  ***
139      !!
140      !! ** Purpose :   Compute the mortality terms for picophytoplankton
141      !!
142      !! ** Method  : - Both quadratic and semilininear terms are used
143      !!---------------------------------------------------------------------
144      INTEGER  :: ji, jj, jk
145      REAL(wp) :: zcompaph, zlim1, zlim2
146      REAL(wp) :: zfactfe, zfactch, zfactn, zfactp
147      REAL(wp) :: ztortp , zrespp , zmortp 
148      CHARACTER (len=25) :: charout
149      !!---------------------------------------------------------------------
150      !
151      IF( ln_timing )   CALL timing_start('p5z_mort_pico')
152      !
153      DO jk = 1, jpkm1
154         DO jj = 1, jpj
155            DO ji = 1, jpi
156               zcompaph = MAX( ( trb(ji,jj,jk,jppic) - 1e-9 ), 0.e0 )
157
158               ! Quadratic mortality of pico due to aggregation during
159               ! blooms (Doney et al. 1996)
160               ! -----------------------------------------------------
161               zlim2   = xlimpic(ji,jj,jk) * xlimpic(ji,jj,jk)
162               zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * trb(ji,jj,jk,jppic)
163               zrespp = wchlp * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph
164
165               ! Phytoplankton linear mortality
166               ! A michaelis-menten like term is introduced to avoid
167               ! extinction of picophyto in highly limited areas
168               ! ----------------------------------------------------
169               ztortp = mpratp * xstep  * zcompaph * trb(ji,jj,jk,jppic) /  ( xkmort + trb(ji,jj,jk,jppic) )
170               zmortp = zrespp + ztortp
171
172               !   Update the arrays TRA which contains the biological sources and sinks
173               zfactn = trb(ji,jj,jk,jpnpi)/(trb(ji,jj,jk,jppic)+rtrn)
174               zfactp = trb(ji,jj,jk,jpppi)/(trb(ji,jj,jk,jppic)+rtrn)
175               zfactfe = trb(ji,jj,jk,jppfe)/(trb(ji,jj,jk,jppic)+rtrn)
176               zfactch = trb(ji,jj,jk,jppch)/(trb(ji,jj,jk,jppic)+rtrn)
177               tra(ji,jj,jk,jppic) = tra(ji,jj,jk,jppic) - zmortp
178               tra(ji,jj,jk,jpnpi) = tra(ji,jj,jk,jpnpi) - zmortp * zfactn
179               tra(ji,jj,jk,jpppi) = tra(ji,jj,jk,jpppi) - zmortp * zfactp
180               tra(ji,jj,jk,jppch) = tra(ji,jj,jk,jppch) - zmortp * zfactch
181               tra(ji,jj,jk,jppfe) = tra(ji,jj,jk,jppfe) - zmortp * zfactfe
182               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp
183               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + zmortp * zfactn
184               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + zmortp * zfactp
185               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp * zfactfe
186               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp
187            END DO
188         END DO
189      END DO
190      !
191       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
192         WRITE(charout, FMT="('pico')")
193         CALL prt_ctl_trc_info(charout)
194         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
195       ENDIF
196      !
197      IF( ln_timing )   CALL timing_stop('p5z_mort_pico')
198      !
199   END SUBROUTINE p5z_mort_pico
200
201
202   SUBROUTINE p5z_mort_diat
203      !!---------------------------------------------------------------------
204      !!                     ***  ROUTINE p5z_mort_diat  ***
205      !!
206      !! ** Purpose :   Compute the mortality terms for diatoms
207      !!
208      !! ** Method  : - ???
209      !!---------------------------------------------------------------------
210      INTEGER  ::  ji, jj, jk
211      REAL(wp) ::  zfactfe,zfactsi,zfactch, zfactn, zfactp, zcompadi
212      REAL(wp) ::  zrespp2, ztortp2, zmortp2
213      REAL(wp) ::  zlim2, zlim1
214      CHARACTER (len=25) :: charout
215      !!---------------------------------------------------------------------
216      !
217      IF( ln_timing )   CALL timing_start('p5z_mort_diat')
218      !
219
220      DO jk = 1, jpkm1
221         DO jj = 1, jpj
222            DO ji = 1, jpi
223
224               zcompadi = MAX( ( trb(ji,jj,jk,jpdia) - 1E-9), 0. )
225
226               !   Aggregation term for diatoms is increased in case of nutrient
227               !   stress as observed in reality. The stressed cells become more
228               !   sticky and coagulate to sink quickly out of the euphotic zone
229               !   -------------------------------------------------------------
230               !  Phytoplankton squared mortality
231               !  -------------------------------
232               zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk)
233               zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) 
234               zrespp2 = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * trb(ji,jj,jk,jpdia)
235
236               ! Phytoplankton linear mortality
237               ! A michaelis-menten like term is introduced to avoid
238               ! extinction of diatoms in highly limited areas
239               !  ---------------------------------------------------
240               ztortp2 = mpratd * xstep  * zcompadi * trb(ji,jj,jk,jpdia) /  ( xkmort + trb(ji,jj,jk,jpdia) )
241               zmortp2 = zrespp2 + ztortp2
242
243               !   Update the arrays tra which contains the biological sources and sinks
244               !   ---------------------------------------------------------------------
245               zfactn  = trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn )
246               zfactp  = trb(ji,jj,jk,jppdi) / ( trb(ji,jj,jk,jpdia) + rtrn )
247               zfactch = trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpdia) + rtrn )
248               zfactfe = trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) + rtrn )
249               zfactsi = trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
250               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zmortp2 
251               tra(ji,jj,jk,jpndi) = tra(ji,jj,jk,jpndi) - zmortp2 * zfactn
252               tra(ji,jj,jk,jppdi) = tra(ji,jj,jk,jppdi) - zmortp2 * zfactp
253               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zmortp2 * zfactch
254               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zmortp2 * zfactfe
255               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zmortp2 * zfactsi
256               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zmortp2 * zfactsi
257               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zrespp2 
258               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zrespp2 * zfactn
259               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zrespp2 * zfactp
260               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zrespp2 * zfactfe
261               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + ztortp2
262               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + ztortp2 * zfactn
263               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + ztortp2 * zfactp
264               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ztortp2 * zfactfe
265               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + ztortp2
266               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zrespp2
267            END DO
268         END DO
269      END DO
270      !
271      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
272         WRITE(charout, FMT="('diat')")
273         CALL prt_ctl_trc_info(charout)
274         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
275      ENDIF
276      !
277      IF( ln_timing )   CALL timing_stop('p5z_mort_diat')
278      !
279   END SUBROUTINE p5z_mort_diat
280
281
282   SUBROUTINE p5z_mort_init
283      !!----------------------------------------------------------------------
284      !!                  ***  ROUTINE p5z_mort_init  ***
285      !!
286      !! ** Purpose :   Initialization of phytoplankton mortality parameters
287      !!
288      !! ** Method  :   Read the namp5zmort namelist and check the parameters
289      !!      called at the first timestep
290      !!
291      !! ** input   :   Namelist namp5zmort
292      !!
293      !!----------------------------------------------------------------------
294      INTEGER :: ios   ! Local integer output status for namelist read
295      !!
296      NAMELIST/namp5zmort/ wchln, wchlp, wchld, mpratn, mpratp, mpratd
297      !!----------------------------------------------------------------------
298
299      REWIND( numnatp_ref )              ! Namelist namp5zmort in reference namelist : Pisces phytoplankton
300      READ  ( numnatp_ref, namp5zmort, IOSTAT = ios, ERR = 901)
301901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmort in reference namelist' )
302
303      REWIND( numnatp_cfg )              ! Namelist namp5zmort in configuration namelist : Pisces phytoplankton
304      READ  ( numnatp_cfg, namp5zmort, IOSTAT = ios, ERR = 902 )
305902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmort in configuration namelist' )
306      IF(lwm) WRITE ( numonp, namp5zmort )
307
308      IF(lwp) THEN                         ! control print
309         WRITE(numout,*) ' '
310         WRITE(numout,*) ' Namelist parameters for phytoplankton mortality, namp5zmort'
311         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
312         WRITE(numout,*) '    quadratic mortality of phytoplankton      wchln     =', wchln
313         WRITE(numout,*) '    quadratic mortality of picophyto.         wchlp     =', wchlp
314         WRITE(numout,*) '    quadratic mortality of diatoms            wchld     =', wchld
315         WRITE(numout,*) '    nanophyto. mortality rate                 mpratn    =', mpratn
316         WRITE(numout,*) '    picophyto. mortality rate                 mpratp    =', mpratp
317         WRITE(numout,*) '    Diatoms mortality rate                    mpratd    =', mpratd
318      ENDIF
319
320   END SUBROUTINE p5z_mort_init
321
322   !!======================================================================
323END MODULE p5zmort
Note: See TracBrowser for help on using the repository browser.