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.
p4zsms.F90 in branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zsms.F90 @ 7068

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

ROBUST5_CNRS : implementation of part I of new TOP interface - 1st step -, see ticket #1782

File size: 24.8 KB
Line 
1MODULE p4zsms
2   !!======================================================================
3   !!                         ***  MODULE p4zsms  ***
4   !! TOP :   PISCES Source Minus Sink manager
5   !!======================================================================
6   !! History :   1.0  !  2004-03 (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!----------------------------------------------------------------------
9   !!   p4zsms         :  Time loop of passive tracers sms
10   !!----------------------------------------------------------------------
11   USE oce_trc         !  shared variables between ocean and passive tracers
12   USE trc             !  passive tracers common variables
13   USE trcdta
14   USE sms_pisces      !  PISCES Source Minus Sink variables
15   USE p4zbio          !  Biological model
16   USE p4zche          !  Chemical model
17   USE p4zlys          !  Calcite saturation
18   USE p4zflx          !  Gas exchange
19   USE p4zsbc          !  External source of nutrients
20   USE p4zsed          !  Sedimentation
21   USE p4zint          !  time interpolation
22   USE p4zrem          !  remineralisation
23   USE iom             !  I/O manager
24   USE trd_oce         !  Ocean trends variables
25   USE trdtrc          !  TOP trends variables
26   USE sedmodel        !  Sediment model
27   USE prtctl_trc      !  print control for debugging
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   p4z_sms_init   ! called in p4zsms.F90
33   PUBLIC   p4z_sms        ! called in p4zsms.F90
34
35   REAL(wp) :: alkbudget, no3budget, silbudget, ferbudget, po4budget
36   REAL(wp) :: xfact1, xfact2, xfact3
37   INTEGER ::  numco2, numnut, numnit  !: logical unit for co2 budget
38
39   !!* Array used to indicate negative tracer values
40   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xnegtr     !: ???
41
42
43   !!----------------------------------------------------------------------
44   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
45   !! $Id: p4zsms.F90 3320 2012-03-05 16:37:52Z cetlod $
46   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
47   !!----------------------------------------------------------------------
48
49CONTAINS
50
51   SUBROUTINE p4z_sms( kt )
52      !!---------------------------------------------------------------------
53      !!                     ***  ROUTINE p4z_sms  ***
54      !!
55      !! ** Purpose :   Managment of the call to Biological sources and sinks
56      !!              routines of PISCES bio-model
57      !!
58      !! ** Method  : - at each new day ...
59      !!              - several calls of bio and sed ???
60      !!              - ...
61      !!---------------------------------------------------------------------
62      !
63      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
64      !!
65      INTEGER ::   ji, jj, jk, jnt, jn, jl
66      REAL(wp) ::  ztra
67      CHARACTER (len=25) :: charout
68      !!---------------------------------------------------------------------
69      !
70      IF( nn_timing == 1 )  CALL timing_start('p4z_sms')
71      !
72      IF( kt == nittrc000 ) THEN
73        !
74        ALLOCATE( xnegtr(jpi,jpj,jpk) )
75        !
76        CALL p4z_che                              ! initialize the chemical constants
77        !
78        IF( .NOT. ln_rsttr ) THEN  ;   CALL p4z_ph_ini   !  set PH at kt=nit000
79        ELSE                       ;   CALL p4z_rst( nittrc000, 'READ' )  !* read or initialize all required fields
80        ENDIF
81        !
82      ENDIF
83      !
84      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt )      ! Relaxation of some tracers
85      !
86      !                                                                    !   set time step size (Euler/Leapfrog)
87      IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN   ;    rfact = rdttrc     !  at nittrc000
88      ELSEIF( kt <= nittrc000 + nn_dttrc )                          THEN   ;    rfact = 2. * rdttrc   ! at nittrc000 or nittrc000+nn_dttrc (Leapfrog)
89      ENDIF
90      !
91      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + nn_dttrc ) ) THEN
92         rfactr  = 1. / rfact
93         rfact2  = rfact / FLOAT( nrdttrc )
94         rfact2r = 1. / rfact2
95         xstep = rfact2 / rday         ! Time step duration for biology
96         IF(lwp) WRITE(numout,*) 
97         IF(lwp) WRITE(numout,*) '    Passive Tracer  time step    rfact  = ', rfact, ' rdt = ', rdt
98         IF(lwp) write(numout,*) '    PISCES  Biology time step    rfact2 = ', rfact2
99         IF(lwp) WRITE(numout,*)
100      ENDIF
101
102      IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN
103         DO jn = jp_pcs0, jp_pcs1              !   SMS on tracer without Asselin time-filter
104            trb(:,:,:,jn) = trn(:,:,:,jn)
105         END DO
106      ENDIF
107      !
108      IF( ndayflxtr /= nday_year ) THEN      ! New days
109         !
110         ndayflxtr = nday_year
111
112         IF(lwp) write(numout,*)
113         IF(lwp) write(numout,*) ' New chemical constants and various rates for biogeochemistry at new day : ', nday_year
114         IF(lwp) write(numout,*) '~~~~~~'
115
116         CALL p4z_che              ! computation of chemical constants
117         CALL p4z_int( kt )        ! computation of various rates for biogeochemistry
118         !
119      ENDIF
120
121      IF( ll_sbc ) CALL p4z_sbc( kt )   ! external sources of nutrients
122
123      DO jnt = 1, nrdttrc          ! Potential time splitting if requested
124         !
125         CALL p4z_bio( kt, jnt )   ! Biology
126         CALL p4z_lys( kt, jnt )   ! Compute CaCO3 saturation
127         CALL p4z_sed( kt, jnt )   ! Surface and Bottom boundary conditions
128         CALL p4z_flx( kt, jnt )   ! Compute surface fluxes
129         !
130         xnegtr(:,:,:) = 1.e0
131         DO jn = jp_pcs0, jp_pcs1
132            DO jk = 1, jpk
133               DO jj = 1, jpj
134                  DO ji = 1, jpi
135                     IF( ( trb(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) < 0.e0 ) THEN
136                        ztra             = ABS( trb(ji,jj,jk,jn) ) / ( ABS( tra(ji,jj,jk,jn) ) + rtrn )
137                        xnegtr(ji,jj,jk) = MIN( xnegtr(ji,jj,jk),  ztra )
138                     ENDIF
139                 END DO
140               END DO
141            END DO
142         END DO
143         !                                ! where at least 1 tracer concentration becomes negative
144         !                                !
145         DO jn = jp_pcs0, jp_pcs1
146           trb(:,:,:,jn) = trb(:,:,:,jn) + xnegtr(:,:,:) * tra(:,:,:,jn)
147         END DO
148        !
149         DO jn = jp_pcs0, jp_pcs1
150            tra(:,:,:,jn) = 0._wp
151         END DO
152         !
153         IF( ln_top_euler ) THEN
154            DO jn = jp_pcs0, jp_pcs1
155               trn(:,:,:,jn) = trb(:,:,:,jn)
156            END DO
157         ENDIF
158      END DO
159
160      !
161      IF( l_trdtrc ) THEN
162         DO jn = jp_pcs0, jp_pcs1
163           CALL trd_trc( tra(:,:,:,jn), jn, jptra_sms, kt )   ! save trends
164         END DO
165      END IF
166      !
167      IF( lk_sed ) THEN 
168         !
169         CALL sed_model( kt )     !  Main program of Sediment model
170         !
171         DO jn = jp_pcs0, jp_pcs1
172           CALL lbc_lnk( trb(:,:,:,jn), 'T', 1. )
173         END DO
174         !
175      ENDIF
176      !
177      IF( lrst_trc )  CALL p4z_rst( kt, 'WRITE' )  !* Write PISCES informations in restart file
178      !
179
180      IF( lk_iomput .OR. ln_check_mass )  CALL p4z_chk_mass( kt ) ! Mass conservation checking
181
182      IF ( lwm .AND. kt == nittrc000 ) CALL FLUSH    ( numonp )     ! flush output namelist PISCES
183      IF( nn_timing == 1 )  CALL timing_stop('p4z_sms')
184      !
185      !
186   END SUBROUTINE p4z_sms
187
188   SUBROUTINE p4z_sms_init
189      !!----------------------------------------------------------------------
190      !!                     ***  p4z_sms_init  *** 
191      !!
192      !! ** Purpose :   read PISCES namelist
193      !!
194      !! ** input   :   file 'namelist.trc.s' containing the following
195      !!             namelist: natext, natbio, natsms
196      !!----------------------------------------------------------------------
197      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, niter1max, niter2max
198      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp
199      NAMELIST/nampismass/ ln_check_mass
200      INTEGER :: ios                 ! Local integer output status for namelist read
201      !!----------------------------------------------------------------------
202
203      REWIND( numnatp_ref )              ! Namelist nampisbio in reference namelist : Pisces variables
204      READ  ( numnatp_ref, nampisbio, IOSTAT = ios, ERR = 901)
205901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisbio in reference namelist', lwp )
206
207      REWIND( numnatp_cfg )              ! Namelist nampisbio in configuration namelist : Pisces variables
208      READ  ( numnatp_cfg, nampisbio, IOSTAT = ios, ERR = 902 )
209902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisbio in configuration namelist', lwp )
210      IF(lwm) WRITE ( numonp, nampisbio )
211
212      IF(lwp) THEN                         ! control print
213         WRITE(numout,*) ' Namelist : nampisbio'
214         WRITE(numout,*) '    frequence pour la biologie                nrdttrc   =', nrdttrc
215         WRITE(numout,*) '    POC sinking speed                         wsbio     =', wsbio
216         WRITE(numout,*) '    half saturation constant for mortality    xkmort    =', xkmort
217         WRITE(numout,*) '    Fe/C in zooplankton                       ferat3    =', ferat3
218         WRITE(numout,*) '    Big particles sinking speed               wsbio2    =', wsbio2
219         WRITE(numout,*) '    Maximum number of iterations for POC      niter1max =', niter1max
220         WRITE(numout,*) '    Maximum number of iterations for GOC      niter2max =', niter2max
221      ENDIF
222
223      REWIND( numnatp_ref )              ! Namelist nampisdmp in reference namelist : Pisces damping
224      READ  ( numnatp_ref, nampisdmp, IOSTAT = ios, ERR = 905)
225905   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisdmp in reference namelist', lwp )
226
227      REWIND( numnatp_cfg )              ! Namelist nampisdmp in configuration namelist : Pisces damping
228      READ  ( numnatp_cfg, nampisdmp, IOSTAT = ios, ERR = 906 )
229906   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisdmp in configuration namelist', lwp )
230      IF(lwm) WRITE ( numonp, nampisdmp )
231
232      IF(lwp) THEN                         ! control print
233         WRITE(numout,*)
234         WRITE(numout,*) ' Namelist : nampisdmp'
235         WRITE(numout,*) '    Relaxation of tracer to glodap mean value             ln_pisdmp      =', ln_pisdmp
236         WRITE(numout,*) '    Frequency of Relaxation                               nn_pisdmp      =', nn_pisdmp
237         WRITE(numout,*) ' '
238      ENDIF
239
240      REWIND( numnatp_ref )              ! Namelist nampismass in reference namelist : Pisces mass conservation check
241      READ  ( numnatp_ref, nampismass, IOSTAT = ios, ERR = 907)
242907   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismass in reference namelist', lwp )
243
244      REWIND( numnatp_cfg )              ! Namelist nampismass in configuration namelist : Pisces mass conservation check
245      READ  ( numnatp_cfg, nampismass, IOSTAT = ios, ERR = 908 )
246908   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismass in configuration namelist', lwp )
247      IF(lwm) WRITE ( numonp, nampismass )
248
249      IF(lwp) THEN                         ! control print
250         WRITE(numout,*) ' '
251         WRITE(numout,*) ' Namelist parameter for mass conservation checking'
252         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
253         WRITE(numout,*) '    Flag to check mass conservation of NO3/Si/TALK ln_check_mass = ', ln_check_mass
254      ENDIF
255
256   END SUBROUTINE p4z_sms_init
257
258   SUBROUTINE p4z_ph_ini
259      !!---------------------------------------------------------------------
260      !!                   ***  ROUTINE p4z_ini_ph  ***
261      !!
262      !!  ** Purpose : Initialization of chemical variables of the carbon cycle
263      !!---------------------------------------------------------------------
264      INTEGER  ::  ji, jj, jk
265      REAL(wp) ::  zcaralk, zbicarb, zco3
266      REAL(wp) ::  ztmas, ztmas1
267      !!---------------------------------------------------------------------
268
269      ! Set PH from  total alkalinity, borat (???), akb3 (???) and ak23 (???)
270      ! --------------------------------------------------------
271      DO jk = 1, jpk
272         DO jj = 1, jpj
273            DO ji = 1, jpi
274               ztmas   = tmask(ji,jj,jk)
275               ztmas1  = 1. - tmask(ji,jj,jk)
276               zcaralk = trb(ji,jj,jk,jptal) - borat(ji,jj,jk) / (  1. + 1.E-8 / ( rtrn + akb3(ji,jj,jk) )  )
277               zco3    = ( zcaralk - trb(ji,jj,jk,jpdic) ) * ztmas + 0.5e-3 * ztmas1
278               zbicarb = ( 2. * trb(ji,jj,jk,jpdic) - zcaralk )
279               hi(ji,jj,jk) = ( ak23(ji,jj,jk) * zbicarb / zco3 ) * ztmas + 1.e-9 * ztmas1
280            END DO
281         END DO
282     END DO
283     !
284   END SUBROUTINE p4z_ph_ini
285
286   SUBROUTINE p4z_rst( kt, cdrw )
287      !!---------------------------------------------------------------------
288      !!                   ***  ROUTINE p4z_rst  ***
289      !!
290      !!  ** Purpose : Read or write variables in restart file:
291      !!
292      !!  WRITE(READ) mode:
293      !!       kt        : number of time step since the begining of the experiment at the
294      !!                   end of the current(previous) run
295      !!---------------------------------------------------------------------
296      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
297      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
298      !
299      INTEGER  ::  ji, jj, jk
300      REAL(wp) ::  zcaralk, zbicarb, zco3
301      REAL(wp) ::  ztmas, ztmas1
302      !!---------------------------------------------------------------------
303
304      IF( TRIM(cdrw) == 'READ' ) THEN
305         !
306         IF(lwp) WRITE(numout,*)
307         IF(lwp) WRITE(numout,*) ' p4z_rst : Read specific variables from pisces model '
308         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
309         !
310         IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN
311            CALL iom_get( numrtr, jpdom_autoglo, 'PH' , hi(:,:,:)  )
312         ELSE
313!            hi(:,:,:) = 1.e-9
314            CALL p4z_ph_ini
315         ENDIF
316         CALL iom_get( numrtr, jpdom_autoglo, 'Silicalim', xksi(:,:) )
317         IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN
318            CALL iom_get( numrtr, jpdom_autoglo, 'Silicamax' , xksimax(:,:)  )
319         ELSE
320            xksimax(:,:) = xksi(:,:)
321         ENDIF
322         !
323         IF( iom_varid( numrtr, 'tcflxcum', ldstop = .FALSE. ) > 0 ) THEN  ! cumulative total flux of carbon
324            CALL iom_get( numrtr, 'tcflxcum' , t_oce_co2_flx_cum  )
325         ELSE
326            t_oce_co2_flx_cum = 0._wp
327         ENDIF
328         !
329      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
330         IF( kt == nitrst ) THEN
331            IF(lwp) WRITE(numout,*)
332            IF(lwp) WRITE(numout,*) 'p4z_rst : write pisces restart file  kt =', kt
333            IF(lwp) WRITE(numout,*) '~~~~~~~'
334         ENDIF
335         CALL iom_rstput( kt, nitrst, numrtw, 'PH', hi(:,:,:) )
336         CALL iom_rstput( kt, nitrst, numrtw, 'Silicalim', xksi(:,:) )
337         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) )
338         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum )
339      ENDIF
340      !
341   END SUBROUTINE p4z_rst
342
343   SUBROUTINE p4z_dmp( kt )
344      !!----------------------------------------------------------------------
345      !!                    ***  p4z_dmp  ***
346      !!
347      !! ** purpose  : Relaxation of some tracers
348      !!----------------------------------------------------------------------
349      !
350      INTEGER, INTENT( in )  ::     kt ! time step
351      !
352      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. )
353      REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates
354      REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate
355      REAL(wp) ::  silmean = 91.51     ! mean value of silicate
356      !
357      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn
358      REAL(wp) :: zalksumb, zpo4sumb, zno3sumb, zsilsumb
359      !!---------------------------------------------------------------------
360
361
362      IF(lwp)  WRITE(numout,*)
363      IF(lwp)  WRITE(numout,*) ' p4z_dmp : Restoring of nutrients at time-step kt = ', kt
364      IF(lwp)  WRITE(numout,*)
365
366      IF( cp_cfg == "orca" .AND. .NOT. lk_c1d ) THEN      ! ORCA configuration (not 1D) !
367         !                                                    ! --------------------------- !
368         ! set total alkalinity, phosphate, nitrate & silicate
369         zarea          = 1._wp / glob_sum( cvol(:,:,:) ) * 1e6             
370
371         zalksumn = glob_sum( trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
372         zpo4sumn = glob_sum( trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r
373         zno3sumn = glob_sum( trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3
374         zsilsumn = glob_sum( trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
375 
376         IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn
377         trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksumn
378
379         IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn
380         trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sumn
381
382         IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn
383         trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sumn
384
385         IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn
386         trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsumn )
387         !
388         !
389         IF( .NOT. ln_top_euler ) THEN
390            zalksumb = glob_sum( trb(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
391            zpo4sumb = glob_sum( trb(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r
392            zno3sumb = glob_sum( trb(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3
393            zsilsumb = glob_sum( trb(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
394 
395            IF(lwp) WRITE(numout,*) ' '
396            IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb
397            trb(:,:,:,jptal) = trb(:,:,:,jptal) * alkmean / zalksumb
398
399            IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb
400            trb(:,:,:,jppo4) = trb(:,:,:,jppo4) * po4mean / zpo4sumb
401
402            IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb
403            trb(:,:,:,jpno3) = trb(:,:,:,jpno3) * no3mean / zno3sumb
404
405            IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb
406            trb(:,:,:,jpsil) = MIN( 400.e-6,trb(:,:,:,jpsil) * silmean / zsilsumb )
407        ENDIF
408        !
409      ENDIF
410        !
411   END SUBROUTINE p4z_dmp
412
413
414   SUBROUTINE p4z_chk_mass( kt )
415      !!----------------------------------------------------------------------
416      !!                  ***  ROUTINE p4z_chk_mass  ***
417      !!
418      !! ** Purpose :  Mass conservation check
419      !!
420      !!---------------------------------------------------------------------
421      !
422      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
423      REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot
424      CHARACTER(LEN=100)   ::   cltxt
425      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zvol
426      INTEGER :: jk
427      !!----------------------------------------------------------------------
428
429      !
430      !!---------------------------------------------------------------------
431
432      IF( kt == nittrc000 ) THEN
433         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si, Fer
434            CALL ctl_opn( numco2, 'carbon.budget'  , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
435            CALL ctl_opn( numnut, 'nutrient.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
436            CALL ctl_opn( numnit, 'nitrogen.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
437            xfact1 = rfact2r * 12. / 1.e15 * ryyss    ! conversion molC/kt --> PgC/yr
438            xfact2 = 1.e+3 * rno3 * 14. / 1.e12 * ryyss   ! conversion molC/l/s ----> TgN/m3/yr
439            xfact3 = 1.e+3 * rfact2r * rno3   ! conversion molC/l/kt ----> molN/m3/s
440            cltxt='time-step   Alkalinity        Nitrate        Phosphorus         Silicate           Iron'
441            IF( lwp ) WRITE(numnut,*)  TRIM(cltxt)
442            IF( lwp ) WRITE(numnut,*) 
443         ENDIF
444      ENDIF
445
446      !
447      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
448         !   Compute the budget of NO3, ALK, Si, Fer
449         no3budget = glob_sum( (   trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)  &
450            &                    + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  &
451            &                    + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  &
452            &                    + trn(:,:,:,jppoc)                     &
453            &                    + trn(:,:,:,jpgoc)                     &
454            &                    + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  )
455         !
456         no3budget = no3budget / areatot
457         CALL iom_put( "pno3tot", no3budget )
458      ENDIF
459      !
460      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
461         po4budget = glob_sum( (   trn(:,:,:,jppo4)                     &
462            &                    + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  &
463            &                    + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  &
464            &                    + trn(:,:,:,jppoc)                     &
465            &                    + trn(:,:,:,jpgoc)                     &
466            &                    + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  )
467         po4budget = po4budget / areatot
468         CALL iom_put( "ppo4tot", po4budget )
469      ENDIF
470      !
471      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
472         silbudget = glob_sum( (   trn(:,:,:,jpsil) + trn(:,:,:,jpgsi)  &
473            &                    + trn(:,:,:,jpdsi)                     ) * cvol(:,:,:)  )
474         !
475         silbudget = silbudget / areatot
476         CALL iom_put( "psiltot", silbudget )
477      ENDIF
478      !
479      IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
480         alkbudget = glob_sum( (   trn(:,:,:,jpno3) * rno3              &
481            &                    + trn(:,:,:,jptal)                     &
482            &                    + trn(:,:,:,jpcal) * 2.                ) * cvol(:,:,:)  )
483         !
484         alkbudget = alkbudget / areatot
485         CALL iom_put( "palktot", alkbudget )
486      ENDIF
487      !
488      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
489         ferbudget = glob_sum( (   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe)  &
490            &                    + trn(:,:,:,jpdfe)                     &
491            &                    + trn(:,:,:,jpbfe)                     &
492            &                    + trn(:,:,:,jpsfe)                     &
493            &                    + trn(:,:,:,jpzoo) * ferat3            &
494            &                    + trn(:,:,:,jpmes) * ferat3            ) * cvol(:,:,:)  )
495         !
496         ferbudget = ferbudget / areatot
497         CALL iom_put( "pfertot", ferbudget )
498      ENDIF
499      !
500
501      ! Global budget of N SMS : denitrification in the water column and in the sediment
502      !                          nitrogen fixation by the diazotrophs
503      ! --------------------------------------------------------------------------------
504      IF( iom_use( "tnfix" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
505         znitrpottot  = glob_sum ( nitrpot(:,:,:) * nitrfix * cvol(:,:,:) )
506         CALL iom_put( "tnfix"  , znitrpottot * 1.e+3 * rno3 )  ! Global  nitrogen fixation molC/l  to molN/m3
507      ENDIF
508      !
509      IF( iom_use( "tdenit" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
510         zrdenittot   = glob_sum ( denitr(:,:,:) * rdenit * xnegtr(:,:,:) * cvol(:,:,:) )
511         CALL iom_put( "tdenit"  , zrdenittot * 1.e+3 * rno3 )  ! Total denitrification molC/l to molN/m3
512      ENDIF
513      !
514      IF( iom_use( "Sdenit" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
515         zsdenittot   = glob_sum ( sdenit(:,:) * e1e2t(:,:) )
516         CALL iom_put( "Sdenit", sdenit(:,:) * xfact3 * tmask(:,:,1) )  ! Nitrate reduction in the sediments
517      ENDIF
518
519      IF( ln_check_mass .AND. kt == nitend ) THEN   ! Compute the budget of NO3, ALK, Si, Fer
520         t_atm_co2_flx  = t_atm_co2_flx / glob_sum( e1e2t(:,:) )
521         t_oce_co2_flx  = t_oce_co2_flx         * xfact1 * (-1 )
522         tpp            = tpp           * 1000. * xfact1
523         t_oce_co2_exp  = t_oce_co2_exp * 1000. * xfact1
524         IF( lwp ) WRITE(numco2,9000) ndastp, t_atm_co2_flx, t_oce_co2_flx, tpp, t_oce_co2_exp
525         IF( lwp ) WRITE(numnut,9100) ndastp, alkbudget        * 1.e+06, &
526             &                                no3budget * rno3 * 1.e+06, &
527             &                                po4budget * po4r * 1.e+06, &
528             &                                silbudget        * 1.e+06, &
529             &                                ferbudget        * 1.e+09
530         !
531         IF( lwp ) WRITE(numnit,9200) ndastp, znitrpottot * xfact2  , &
532         &                             zrdenittot  * xfact2  , &
533         &                             zsdenittot  * xfact2
534
535      ENDIF
536      !
537 9000  FORMAT(i8,f10.5,e18.10,f10.5,f10.5)
538 9100  FORMAT(i8,5e18.10)
539 9200  FORMAT(i8,3f10.5)
540
541       !
542   END SUBROUTINE p4z_chk_mass
543
544   !!======================================================================
545END MODULE p4zsms 
Note: See TracBrowser for help on using the repository browser.