source: branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zmort.F90 @ 4147

Last change on this file since 4147 was 4147, checked in by cetlod, 8 years ago

merge in dev_LOCEAN_2013, the 1st development branch dev_r3853_CNRS9_Confsetting, from its starting point ( r3853 ) on the trunk: see ticket #1169

File size: 12.5 KB
Line 
1MODULE p4zmort
2   !!======================================================================
3   !!                         ***  MODULE p4zmort  ***
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   !!----------------------------------------------------------------------
9#if defined key_pisces
10   !!----------------------------------------------------------------------
11   !!   'key_pisces'                                       PISCES bio-model
12   !!----------------------------------------------------------------------
13   !!   p4z_mort       :   Compute the mortality terms for phytoplankton
14   !!   p4z_mort_init  :   Initialize the mortality params for phytoplankton
15   !!----------------------------------------------------------------------
16   USE oce_trc         !  shared variables between ocean and passive tracers
17   USE trc             !  passive tracers common variables
18   USE sms_pisces      !  PISCES Source Minus Sink variables
19   USE p4zsink         !  vertical flux of particulate matter due to sinking
20   USE prtctl_trc      !  print control for debugging
21
22   IMPLICIT NONE
23   PRIVATE
24
25   PUBLIC   p4z_mort   
26   PUBLIC   p4z_mort_init   
27
28   !! * Shared module variables
29   REAL(wp), PUBLIC :: wchl    !:
30   REAL(wp), PUBLIC :: wchld   !:
31   REAL(wp), PUBLIC :: wchldm  !:
32   REAL(wp), PUBLIC :: mprat   !:
33   REAL(wp), PUBLIC :: mprat2  !:
34
35
36   !!* Substitution
37#  include "top_substitute.h90"
38   !!----------------------------------------------------------------------
39   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
40   !! $Id: p4zmort.F90 3160 2011-11-20 14:27:18Z cetlod $
41   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
42   !!----------------------------------------------------------------------
43
44CONTAINS
45
46   SUBROUTINE p4z_mort( kt )
47      !!---------------------------------------------------------------------
48      !!                     ***  ROUTINE p4z_mort  ***
49      !!
50      !! ** Purpose :   Calls the different subroutine to initialize and compute
51      !!                the different phytoplankton mortality terms
52      !!
53      !! ** Method  : - ???
54      !!---------------------------------------------------------------------
55      INTEGER, INTENT(in) ::   kt ! ocean time step
56      !!---------------------------------------------------------------------
57
58      CALL p4z_nano            ! nanophytoplankton
59
60      CALL p4z_diat            ! diatoms
61
62   END SUBROUTINE p4z_mort
63
64
65   SUBROUTINE p4z_nano
66      !!---------------------------------------------------------------------
67      !!                     ***  ROUTINE p4z_nano  ***
68      !!
69      !! ** Purpose :   Compute the mortality terms for nanophytoplankton
70      !!
71      !! ** Method  : - ???
72      !!---------------------------------------------------------------------
73      INTEGER  :: ji, jj, jk
74      REAL(wp) :: zcompaph
75      REAL(wp) :: zfactfe, zfactch, zprcaca, zfracal
76      REAL(wp) :: ztortp , zrespp , zmortp , zstep
77      CHARACTER (len=25) :: charout
78      !!---------------------------------------------------------------------
79      !
80      IF( nn_timing == 1 )  CALL timing_start('p4z_nano')
81      !
82      prodcal(:,:,:) = 0.  !: calcite production variable set to zero
83      DO jk = 1, jpkm1
84         DO jj = 1, jpj
85            DO ji = 1, jpi
86               zcompaph = MAX( ( trn(ji,jj,jk,jpphy) - 1e-8 ), 0.e0 )
87               zstep    = xstep
88# if defined key_degrad
89               zstep    = zstep * facvol(ji,jj,jk)
90# endif
91               !     Squared mortality of Phyto similar to a sedimentation term during
92               !     blooms (Doney et al. 1996)
93               zrespp = wchl * 1.e6 * zstep * xdiss(ji,jj,jk) * zcompaph * trn(ji,jj,jk,jpphy) 
94
95               !     Phytoplankton mortality. This mortality loss is slightly
96               !     increased when nutrients are limiting phytoplankton growth
97               !     as observed for instance in case of iron limitation.
98               ztortp = mprat * xstep * trn(ji,jj,jk,jpphy) / ( xkmort + trn(ji,jj,jk,jpphy) ) * zcompaph
99
100               zmortp = zrespp + ztortp
101
102               !   Update the arrays TRA which contains the biological sources and sinks
103
104               zfactfe = trn(ji,jj,jk,jpnfe)/(trn(ji,jj,jk,jpphy)+rtrn)
105               zfactch = trn(ji,jj,jk,jpnch)/(trn(ji,jj,jk,jpphy)+rtrn)
106               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zmortp
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               zprcaca = xfracal(ji,jj,jk) * zmortp
110               !
111               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
112               !
113               zfracal = 0.5 * xfracal(ji,jj,jk)
114               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
115               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
116               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
117#if defined key_kriest
118               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp
119               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) + ztortp * xkr_dnano + zrespp * xkr_ddiat
120               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp * zfactfe
121#else
122               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zfracal * zmortp
123               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + ( 1. - zfracal ) * zmortp
124               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ( 1. - zfracal ) * zmortp * zfactfe
125               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zfracal * zmortp * zfactfe
126#endif
127            END DO
128         END DO
129      END DO
130      !
131       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
132         WRITE(charout, FMT="('nano')")
133         CALL prt_ctl_trc_info(charout)
134         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
135       ENDIF
136      !
137      IF( nn_timing == 1 )  CALL timing_stop('p4z_nano')
138      !
139   END SUBROUTINE p4z_nano
140
141   SUBROUTINE p4z_diat
142      !!---------------------------------------------------------------------
143      !!                     ***  ROUTINE p4z_diat  ***
144      !!
145      !! ** Purpose :   Compute the mortality terms for diatoms
146      !!
147      !! ** Method  : - ???
148      !!---------------------------------------------------------------------
149      INTEGER  ::  ji, jj, jk
150      REAL(wp) ::  zfactfe,zfactsi,zfactch, zcompadi
151      REAL(wp) ::  zrespp2, ztortp2, zmortp2, zstep
152      REAL(wp) ::  zlim2, zlim1
153      CHARACTER (len=25) :: charout
154      !!---------------------------------------------------------------------
155      !
156      IF( nn_timing == 1 )  CALL timing_start('p4z_diat')
157      !
158
159      !    Aggregation term for diatoms is increased in case of nutrient
160      !    stress as observed in reality. The stressed cells become more
161      !    sticky and coagulate to sink quickly out of the euphotic zone
162      !     ------------------------------------------------------------
163
164      DO jk = 1, jpkm1
165         DO jj = 1, jpj
166            DO ji = 1, jpi
167
168               zcompadi = MAX( ( trn(ji,jj,jk,jpdia) - 1e-8), 0. )
169
170               !    Aggregation term for diatoms is increased in case of nutrient
171               !    stress as observed in reality. The stressed cells become more
172               !    sticky and coagulate to sink quickly out of the euphotic zone
173               !     ------------------------------------------------------------
174               zstep   = xstep
175# if defined key_degrad
176               zstep = zstep * facvol(ji,jj,jk)
177# endif
178               !  Phytoplankton respiration
179               !     ------------------------
180               zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk)
181               zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) 
182               zrespp2 = 1.e6 * zstep * (  wchld + wchldm * zlim1 ) * xdiss(ji,jj,jk) * zcompadi * trn(ji,jj,jk,jpdia)
183              ! zlim1   = 1.0 - xlimdia(ji,jj,jk)
184              ! zrespp2 = 1.e6 * zstep * (  wchl + wchld * zlim1 ) * xdiss(ji,jj,jk) * zcompadi * trn(ji,jj,jk,jpdia)
185
186               !     Phytoplankton mortality.
187               !     ------------------------
188               ztortp2 = mprat2 * zstep * trn(ji,jj,jk,jpdia)  / ( xkmort + trn(ji,jj,jk,jpdia) ) * zcompadi 
189
190               zmortp2 = zrespp2 + ztortp2
191
192               !   Update the arrays tra which contains the biological sources and sinks
193               !   ---------------------------------------------------------------------
194               zfactch = trn(ji,jj,jk,jpdch) / ( trn(ji,jj,jk,jpdia) + rtrn )
195               zfactfe = trn(ji,jj,jk,jpdfe) / ( trn(ji,jj,jk,jpdia) + rtrn )
196               zfactsi = trn(ji,jj,jk,jpdsi) / ( trn(ji,jj,jk,jpdia) + rtrn )
197               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zmortp2 
198               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zmortp2 * zfactch
199               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zmortp2 * zfactfe
200               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zmortp2 * zfactsi
201               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zmortp2 * zfactsi
202#if defined key_kriest
203               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortp2 
204               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) + ztortp2 * xkr_ddiat + zrespp2 * xkr_daggr
205               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zmortp2 * zfactfe
206#else
207               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zrespp2 + 0.5 * ztortp2
208               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + 0.5 * ztortp2
209               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + 0.5 * ztortp2 * zfactfe
210               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + ( zrespp2 + 0.5 * ztortp2 ) * zfactfe
211#endif
212            END DO
213         END DO
214      END DO
215      !
216      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
217         WRITE(charout, FMT="('diat')")
218         CALL prt_ctl_trc_info(charout)
219         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
220      ENDIF
221      !
222      IF( nn_timing == 1 )  CALL timing_stop('p4z_diat')
223      !
224   END SUBROUTINE p4z_diat
225
226   SUBROUTINE p4z_mort_init
227
228      !!----------------------------------------------------------------------
229      !!                  ***  ROUTINE p4z_mort_init  ***
230      !!
231      !! ** Purpose :   Initialization of phytoplankton parameters
232      !!
233      !! ** Method  :   Read the nampismort namelist and check the parameters
234      !!      called at the first timestep
235      !!
236      !! ** input   :   Namelist nampismort
237      !!
238      !!----------------------------------------------------------------------
239
240      NAMELIST/nampismort/ wchl, wchld, wchldm, mprat, mprat2
241      INTEGER :: ios                 ! Local integer output status for namelist read
242
243      REWIND( numnatp_ref )              ! Namelist nampismort in reference namelist : Pisces phytoplankton
244      READ  ( numnatp_ref, nampismort, IOSTAT = ios, ERR = 901)
245901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismort in reference namelist', lwp )
246
247      REWIND( numnatp_cfg )              ! Namelist nampismort in configuration namelist : Pisces phytoplankton
248      READ  ( numnatp_cfg, nampismort, IOSTAT = ios, ERR = 902 )
249902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismort in configuration namelist', lwp )
250      WRITE ( numonp, nampismort )
251
252      IF(lwp) THEN                         ! control print
253         WRITE(numout,*) ' '
254         WRITE(numout,*) ' Namelist parameters for phytoplankton mortality, nampismort'
255         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
256         WRITE(numout,*) '    quadratic mortality of phytoplankton      wchl      =', wchl
257         WRITE(numout,*) '    maximum quadratic mortality of diatoms    wchld     =', wchld
258         WRITE(numout,*) '    maximum quadratic mortality of diatoms    wchldm    =', wchldm
259         WRITE(numout,*) '    phytoplankton mortality rate              mprat     =', mprat
260         WRITE(numout,*) '    Diatoms mortality rate                    mprat2    =', mprat2
261      ENDIF
262
263   END SUBROUTINE p4z_mort_init
264
265#else
266   !!======================================================================
267   !!  Dummy module :                                   No PISCES bio-model
268   !!======================================================================
269CONTAINS
270   SUBROUTINE p4z_mort                    ! Empty routine
271   END SUBROUTINE p4z_mort
272#endif 
273
274   !!======================================================================
275END MODULE  p4zmort
Note: See TracBrowser for help on using the repository browser.