source: NEMO/branches/2019/fix_sn_cfctl_ticket2328/src/TOP/PISCES/P4Z/p5zmort.F90 @ 11872

Last change on this file since 11872 was 11872, checked in by acc, 11 months ago

Branch 2019/fix_sn_cfctl_ticket2328. See #2328. Replacement of ln_ctl and activation of full functionality with
sn_cfctl structure. These changes rename structure components l_mppout and l_mpptop as l_prtctl and l_prttrc
and introduce l_glochk to activate former ln_ctl code in stpctl.F90 to perform global location of min and max
checks. Also added is l_allon which can be used to activate all output (much like the former ln_ctl). If l_allon
is .false. then l_config decides whether or not the suboptions are used.

   sn_cfctl%l_glochk = .FALSE.    ! Range sanity checks are local (F) or global (T). Set T for debugging only
   sn_cfctl%l_allon  = .FALSE.    ! IF T activate all options. If F deactivate all unless l_config is T
   sn_cfctl%l_config = .TRUE.     ! IF .true. then control which reports are written with the remaining options

Note, these changes pass SETTE tests but all references to ln_ctl need to be removed from the sette scripts.

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