source: NEMO/trunk/src/TOP/PISCES/P4Z/p5zmort.F90 @ 10070

Last change on this file since 10070 was 10070, checked in by nicolasmartin, 2 years ago

Fix wrong SVN property svn:executable on routines

  • Property svn:keywords set to Id
File size: 14.5 KB
Line 
1MODULE p5zmort
2   !!======================================================================
3   !!                         ***  MODULE p5zmort  ***
4   !! TOP :   PISCES 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 p5zice          !  Phytoplankton limitation terms
17   USE prtctl_trc      !  print control for debugging
18
19   IMPLICIT NONE
20   PRIVATE
21
22   PUBLIC   p5z_mort   
23   PUBLIC   p5z_mort_init   
24
25   !! * Shared module variables
26   REAL(wp), PUBLIC :: wchln    !:
27   REAL(wp), PUBLIC :: wchlp   !:
28   REAL(wp), PUBLIC :: wchld   !:
29   REAL(wp), PUBLIC :: wchldm  !:
30   REAL(wp), PUBLIC :: mpratn   !:
31   REAL(wp), PUBLIC :: mpratp  !:
32   REAL(wp), PUBLIC :: mpratd  !:
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 initialize and compute
47      !!                the different phytoplankton mortality terms
48      !!
49      !! ** Method  : - ???
50      !!---------------------------------------------------------------------
51      INTEGER, INTENT(in) ::   kt ! ocean time step
52      !!---------------------------------------------------------------------
53
54      CALL p5z_nano            ! nanophytoplankton
55      CALL p5z_pico            ! picophytoplankton
56      CALL p5z_diat            ! diatoms
57
58   END SUBROUTINE p5z_mort
59
60
61   SUBROUTINE p5z_nano
62      !!---------------------------------------------------------------------
63      !!                     ***  ROUTINE p5z_nano  ***
64      !!
65      !! ** Purpose :   Compute the mortality terms for nanophytoplankton
66      !!
67      !! ** Method  : - ???
68      !!---------------------------------------------------------------------
69      INTEGER  :: ji, jj, jk
70      REAL(wp) :: zcompaph
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_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               !   Squared mortality of Phyto similar to a sedimentation term during
84               !   blooms (Doney et al. 1996)
85               !   -----------------------------------------------------------------
86               zrespp = wchln * 1.e6 * xstep * xdiss(ji,jj,jk) * zcompaph * trb(ji,jj,jk,jpphy)
87
88               !   Phytoplankton linear mortality
89               !   ------------------------------
90               ztortp = mpratn * xstep  * zcompaph
91               zmortp = zrespp + ztortp
92
93               !   Update the arrays TRA which contains the biological sources and sinks
94
95               zfactn  = trb(ji,jj,jk,jpnph)/(trb(ji,jj,jk,jpphy)+rtrn)
96               zfactp  = trb(ji,jj,jk,jppph)/(trb(ji,jj,jk,jpphy)+rtrn)
97               zfactfe = trb(ji,jj,jk,jpnfe)/(trb(ji,jj,jk,jpphy)+rtrn)
98               zfactch = trb(ji,jj,jk,jpnch)/(trb(ji,jj,jk,jpphy)+rtrn)
99               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zmortp
100               tra(ji,jj,jk,jpnph) = tra(ji,jj,jk,jpnph) - zmortp * zfactn
101               tra(ji,jj,jk,jppph) = tra(ji,jj,jk,jppph) - zmortp * zfactp
102               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zmortp * zfactch
103               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zmortp * zfactfe
104               zprcaca = xfracal(ji,jj,jk) * zmortp
105               !
106               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
107               !
108               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
109               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
110               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
111               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp
112               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + zmortp * zfactn
113               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + zmortp * zfactp
114               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp
115               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp * zfactfe
116            END DO
117         END DO
118      END DO
119      !
120       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
121         WRITE(charout, FMT="('nano')")
122         CALL prt_ctl_trc_info(charout)
123         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
124       ENDIF
125      !
126      IF( ln_timing )   CALL timing_stop('p5z_nano')
127      !
128   END SUBROUTINE p5z_nano
129
130
131   SUBROUTINE p5z_pico
132      !!---------------------------------------------------------------------
133      !!                     ***  ROUTINE p5z_pico  ***
134      !!
135      !! ** Purpose :   Compute the mortality terms for picophytoplankton
136      !!
137      !! ** Method  : - ???
138      !!---------------------------------------------------------------------
139      INTEGER  :: ji, jj, jk
140      REAL(wp) :: zcompaph
141      REAL(wp) :: zfactfe, zfactch, zfactn, zfactp
142      REAL(wp) :: ztortp , zrespp , zmortp 
143      CHARACTER (len=25) :: charout
144      !!---------------------------------------------------------------------
145      !
146      IF( ln_timing )   CALL timing_start('p5z_pico')
147      !
148      DO jk = 1, jpkm1
149         DO jj = 1, jpj
150            DO ji = 1, jpi
151               zcompaph = MAX( ( trb(ji,jj,jk,jppic) - 1e-9 ), 0.e0 )
152               !  Squared mortality of Phyto similar to a sedimentation term during
153               !  blooms (Doney et al. 1996)
154               !  -----------------------------------------------------------------
155               zrespp = wchlp * 1.e6 * xstep * xdiss(ji,jj,jk) * zcompaph * trb(ji,jj,jk,jppic)
156
157               !     Phytoplankton mortality
158               ztortp = mpratp * xstep  * zcompaph
159               zmortp = zrespp + ztortp
160
161               !   Update the arrays TRA which contains the biological sources and sinks
162
163               zfactn = trb(ji,jj,jk,jpnpi)/(trb(ji,jj,jk,jppic)+rtrn)
164               zfactp = trb(ji,jj,jk,jpppi)/(trb(ji,jj,jk,jppic)+rtrn)
165               zfactfe = trb(ji,jj,jk,jppfe)/(trb(ji,jj,jk,jppic)+rtrn)
166               zfactch = trb(ji,jj,jk,jppch)/(trb(ji,jj,jk,jppic)+rtrn)
167               tra(ji,jj,jk,jppic) = tra(ji,jj,jk,jppic) - zmortp
168               tra(ji,jj,jk,jpnpi) = tra(ji,jj,jk,jpnpi) - zmortp * zfactn
169               tra(ji,jj,jk,jpppi) = tra(ji,jj,jk,jpppi) - zmortp * zfactp
170               tra(ji,jj,jk,jppch) = tra(ji,jj,jk,jppch) - zmortp * zfactch
171               tra(ji,jj,jk,jppfe) = tra(ji,jj,jk,jppfe) - zmortp * zfactfe
172               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp
173               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + zmortp * zfactn
174               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + zmortp * zfactp
175               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp * zfactfe
176               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp
177            END DO
178         END DO
179      END DO
180      !
181       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
182         WRITE(charout, FMT="('pico')")
183         CALL prt_ctl_trc_info(charout)
184         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
185       ENDIF
186      !
187      IF( ln_timing )   CALL timing_stop('p5z_pico')
188      !
189   END SUBROUTINE p5z_pico
190
191
192   SUBROUTINE p5z_diat
193      !!---------------------------------------------------------------------
194      !!                     ***  ROUTINE p5z_diat  ***
195      !!
196      !! ** Purpose :   Compute the mortality terms for diatoms
197      !!
198      !! ** Method  : - ???
199      !!---------------------------------------------------------------------
200      INTEGER  ::  ji, jj, jk
201      REAL(wp) ::  zfactfe,zfactsi,zfactch, zfactn, zfactp, zcompadi
202      REAL(wp) ::  zrespp2, ztortp2, zmortp2
203      REAL(wp) ::  zlim2, zlim1
204      CHARACTER (len=25) :: charout
205      !!---------------------------------------------------------------------
206      !
207      IF( ln_timing )   CALL timing_start('p5z_diat')
208      !
209
210      DO jk = 1, jpkm1
211         DO jj = 1, jpj
212            DO ji = 1, jpi
213
214               zcompadi = MAX( ( trb(ji,jj,jk,jpdia) - 1E-9), 0. )
215
216               !   Aggregation term for diatoms is increased in case of nutrient
217               !   stress as observed in reality. The stressed cells become more
218               !   sticky and coagulate to sink quickly out of the euphotic zone
219               !   -------------------------------------------------------------
220               !  Phytoplankton squared mortality
221               !  -------------------------------
222               zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk)
223               zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) 
224               zrespp2 = 1.e6 * xstep * (  wchld + wchldm * zlim1 ) * xdiss(ji,jj,jk) * zcompadi * trb(ji,jj,jk,jpdia)
225
226               !  Phytoplankton linear mortality
227               !  ------------------------------
228               ztortp2 = mpratd * xstep  * zcompadi
229               zmortp2 = zrespp2 + ztortp2
230
231               !   Update the arrays tra which contains the biological sources and sinks
232               !   ---------------------------------------------------------------------
233               zfactn  = trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn )
234               zfactp  = trb(ji,jj,jk,jppdi) / ( trb(ji,jj,jk,jpdia) + rtrn )
235               zfactch = trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpdia) + rtrn )
236               zfactfe = trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) + rtrn )
237               zfactsi = trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
238               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zmortp2 
239               tra(ji,jj,jk,jpndi) = tra(ji,jj,jk,jpndi) - zmortp2 * zfactn
240               tra(ji,jj,jk,jppdi) = tra(ji,jj,jk,jppdi) - zmortp2 * zfactp
241               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zmortp2 * zfactch
242               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zmortp2 * zfactfe
243               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zmortp2 * zfactsi
244               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zmortp2 * zfactsi
245               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zrespp2 
246               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zrespp2 * zfactn
247               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zrespp2 * zfactp
248               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zrespp2 * zfactfe
249               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + ztortp2
250               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) + ztortp2 * zfactn
251               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) + ztortp2 * zfactp
252               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ztortp2 * zfactfe
253               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + ztortp2
254               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zrespp2
255            END DO
256         END DO
257      END DO
258      !
259      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
260         WRITE(charout, FMT="('diat')")
261         CALL prt_ctl_trc_info(charout)
262         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
263      ENDIF
264      !
265      IF( ln_timing )   CALL timing_stop('p5z_diat')
266      !
267   END SUBROUTINE p5z_diat
268
269
270   SUBROUTINE p5z_mort_init
271      !!----------------------------------------------------------------------
272      !!                  ***  ROUTINE p5z_mort_init  ***
273      !!
274      !! ** Purpose :   Initialization of phytoplankton parameters
275      !!
276      !! ** Method  :   Read the nampismort namelist and check the parameters
277      !!      called at the first timestep
278      !!
279      !! ** input   :   Namelist nampismort
280      !!
281      !!----------------------------------------------------------------------
282      INTEGER :: ios                 ! Local integer output status for namelist read
283      !!
284      NAMELIST/namp5zmort/ wchln, wchlp, wchld, wchldm, mpratn, mpratp, mpratd
285      !!----------------------------------------------------------------------
286
287      REWIND( numnatp_ref )              ! Namelist nampismort in reference namelist : Pisces phytoplankton
288      READ  ( numnatp_ref, namp5zmort, IOSTAT = ios, ERR = 901)
289901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmort in reference namelist', lwp )
290
291      REWIND( numnatp_cfg )              ! Namelist nampismort in configuration namelist : Pisces phytoplankton
292      READ  ( numnatp_cfg, namp5zmort, IOSTAT = ios, ERR = 902 )
293902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmort in configuration namelist', lwp )
294      IF(lwm) WRITE ( numonp, namp5zmort )
295
296      IF(lwp) THEN                         ! control print
297         WRITE(numout,*) ' '
298         WRITE(numout,*) ' Namelist parameters for phytoplankton mortality, namp5zmort'
299         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
300         WRITE(numout,*) '    quadratic mortality of phytoplankton      wchln     =', wchln
301         WRITE(numout,*) '    quadratic mortality of picophyto.         wchlp     =', wchlp
302         WRITE(numout,*) '    quadratic mortality of diatoms            wchld     =', wchld
303         WRITE(numout,*) '    Additional quadratic mortality of diatoms wchldm    =', wchldm
304         WRITE(numout,*) '    nanophyto. mortality rate                 mpratn    =', mpratn
305         WRITE(numout,*) '    picophyto. mortality rate                 mpratp    =', mpratp
306         WRITE(numout,*) '    Diatoms mortality rate                    mpratd    =', mpratd
307      ENDIF
308
309   END SUBROUTINE p5z_mort_init
310
311   !!======================================================================
312END MODULE p5zmort
Note: See TracBrowser for help on using the repository browser.