source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z/p4zsms.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 16 months ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
File size: 24.3 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   !!   p4z_sms        : 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   INTEGER ::    numco2, numnut, numnit      ! logical unit for co2 budget
36   REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget
37   REAL(wp) ::   xfact1, xfact2, xfact3
38
39   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xnegtr     ! Array used to indicate negative tracer values
40
41   !!----------------------------------------------------------------------
42   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
43   !! $Id$
44   !! Software governed by the CeCILL license (see ./LICENSE)
45   !!----------------------------------------------------------------------
46CONTAINS
47
48   SUBROUTINE p4z_sms( kt )
49      !!---------------------------------------------------------------------
50      !!                     ***  ROUTINE p4z_sms  ***
51      !!
52      !! ** Purpose :   Managment of the call to Biological sources and sinks
53      !!              routines of PISCES bio-model
54      !!
55      !! ** Method  : - at each new day ...
56      !!              - several calls of bio and sed ???
57      !!              - ...
58      !!---------------------------------------------------------------------
59      !
60      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
61      !!
62      INTEGER ::   ji, jj, jk, jnt, jn, jl
63      REAL(wp) ::  ztra
64      CHARACTER (len=25) :: charout
65      !!---------------------------------------------------------------------
66      !
67      IF( ln_timing )   CALL timing_start('p4z_sms')
68      !
69      IF( kt == nittrc000 ) THEN
70        !
71        ALLOCATE( xnegtr(jpi,jpj,jpk) )
72        !
73        IF( .NOT. ln_rsttr ) THEN
74            CALL p4z_che                              ! initialize the chemical constants
75            CALL ahini_for_at(hi)   !  set PH at kt=nit000
76            t_oce_co2_flx_cum = 0._wp
77        ELSE
78            CALL p4z_rst( nittrc000, 'READ' )  !* read or initialize all required fields
79        ENDIF
80        !
81      ENDIF
82      !
83      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt )      ! Relaxation of some tracers
84      !
85      rfact = r2dttrc
86      !
87      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + nn_dttrc ) ) THEN
88         rfactr  = 1. / rfact
89         rfact2  = rfact / REAL( nrdttrc, wp )
90         rfact2r = 1. / rfact2
91         xstep = rfact2 / rday         ! Time step duration for biology
92         IF(lwp) WRITE(numout,*) 
93         IF(lwp) WRITE(numout,*) '    Passive Tracer  time step    rfact  = ', rfact, ' rdt = ', rdt
94         IF(lwp) write(numout,*) '    PISCES  Biology time step    rfact2 = ', rfact2
95         IF(lwp) WRITE(numout,*)
96      ENDIF
97
98      IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN
99         DO jn = jp_pcs0, jp_pcs1              !   SMS on tracer without Asselin time-filter
100            trb(:,:,:,jn) = trn(:,:,:,jn)
101         END DO
102      ENDIF
103      !
104      IF( ll_sbc ) CALL p4z_sbc( kt )   ! external sources of nutrients
105      !
106#if ! defined key_sed_off
107      CALL p4z_che              ! computation of chemical constants
108      CALL p4z_int( kt )        ! computation of various rates for biogeochemistry
109      !
110      DO jnt = 1, nrdttrc          ! Potential time splitting if requested
111         !
112         CALL p4z_bio( kt, jnt )   ! Biology
113         CALL p4z_lys( kt, jnt )   ! Compute CaCO3 saturation
114         CALL p4z_sed( kt, jnt )   ! Surface and Bottom boundary conditions
115         CALL p4z_flx( kt, jnt )   ! Compute surface fluxes
116         !
117         xnegtr(:,:,:) = 1.e0
118         DO jn = jp_pcs0, jp_pcs1
119            DO jk = 1, jpk
120               DO jj = 1, jpj
121                  DO ji = 1, jpi
122                     IF( ( trb(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) < 0.e0 ) THEN
123                        ztra             = ABS( trb(ji,jj,jk,jn) ) / ( ABS( tra(ji,jj,jk,jn) ) + rtrn )
124                        xnegtr(ji,jj,jk) = MIN( xnegtr(ji,jj,jk),  ztra )
125                     ENDIF
126                 END DO
127               END DO
128            END DO
129         END DO
130         !                                ! where at least 1 tracer concentration becomes negative
131         !                                !
132         DO jn = jp_pcs0, jp_pcs1
133           trb(:,:,:,jn) = trb(:,:,:,jn) + xnegtr(:,:,:) * tra(:,:,:,jn)
134         END DO
135        !
136         DO jn = jp_pcs0, jp_pcs1
137            tra(:,:,:,jn) = 0._wp
138         END DO
139         !
140         IF( ln_top_euler ) THEN
141            DO jn = jp_pcs0, jp_pcs1
142               trn(:,:,:,jn) = trb(:,:,:,jn)
143            END DO
144         ENDIF
145      END DO
146
147      !
148      IF( l_trdtrc ) THEN
149         DO jn = jp_pcs0, jp_pcs1
150           CALL trd_trc( tra(:,:,:,jn), jn, jptra_sms, kt )   ! save trends
151         END DO
152      END IF
153#endif
154      !
155      IF( ln_sediment ) THEN 
156         !
157         CALL sed_model( kt )     !  Main program of Sediment model
158         !
159         IF( ln_top_euler ) THEN
160            DO jn = jp_pcs0, jp_pcs1
161               trn(:,:,:,jn) = trb(:,:,:,jn)
162            END DO
163         ENDIF
164         !
165      ENDIF
166      !
167      IF( lrst_trc )  CALL p4z_rst( kt, 'WRITE' )  !* Write PISCES informations in restart file
168      !
169
170      IF( lk_iomput .OR. ln_check_mass )  CALL p4z_chk_mass( kt )    ! Mass conservation checking
171
172      IF( lwm .AND. kt == nittrc000    )  CALL FLUSH( numonp )       ! flush output namelist PISCES
173      !
174      IF( ln_timing )  CALL timing_stop('p4z_sms')
175      !
176   END SUBROUTINE p4z_sms
177
178
179   SUBROUTINE p4z_sms_init
180      !!----------------------------------------------------------------------
181      !!                     ***  p4z_sms_init  *** 
182      !!
183      !! ** Purpose :   read PISCES namelist
184      !!
185      !! ** input   :   file 'namelist.trc.s' containing the following
186      !!             namelist: natext, natbio, natsms
187      !!----------------------------------------------------------------------
188      INTEGER :: ios                 ! Local integer output status for namelist read
189      !!
190      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, wsbio2max, wsbio2scale,    &
191         &                   ldocp, ldocz, lthet, no3rat3, po4rat3
192         !
193      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp
194      NAMELIST/nampismass/ ln_check_mass
195      !!----------------------------------------------------------------------
196      !
197      IF(lwp) THEN
198         WRITE(numout,*)
199         WRITE(numout,*) 'p4z_sms_init : PISCES initialization'
200         WRITE(numout,*) '~~~~~~~~~~~~'
201      ENDIF
202
203      READ  ( numnatp_ref, nampisbio, IOSTAT = ios, ERR = 901)
204901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisbio in reference namelist' )
205      READ  ( numnatp_cfg, nampisbio, IOSTAT = ios, ERR = 902 )
206902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisbio in configuration namelist' )
207      IF(lwm) WRITE( numonp, nampisbio )
208      !
209      IF(lwp) THEN                         ! control print
210         WRITE(numout,*) '   Namelist : nampisbio'
211         WRITE(numout,*) '      frequency for the biology                 nrdttrc     =', nrdttrc
212         WRITE(numout,*) '      POC sinking speed                         wsbio       =', wsbio
213         WRITE(numout,*) '      half saturation constant for mortality    xkmort      =', xkmort 
214         IF( ln_p5z ) THEN
215            WRITE(numout,*) '      N/C in zooplankton                        no3rat3     =', no3rat3
216            WRITE(numout,*) '      P/C in zooplankton                        po4rat3     =', po4rat3
217         ENDIF
218         WRITE(numout,*) '      Fe/C in zooplankton                       ferat3      =', ferat3
219         WRITE(numout,*) '      Big particles sinking speed               wsbio2      =', wsbio2
220         WRITE(numout,*) '      Big particles maximum sinking speed       wsbio2max   =', wsbio2max
221         WRITE(numout,*) '      Big particles sinking speed length scale  wsbio2scale =', wsbio2scale
222         IF( ln_ligand ) THEN
223            IF( ln_p4z ) THEN
224               WRITE(numout,*) '      Phyto ligand production per unit doc           ldocp  =', ldocp
225               WRITE(numout,*) '      Zoo ligand production per unit doc             ldocz  =', ldocz
226               WRITE(numout,*) '      Proportional loss of ligands due to Fe uptake  lthet  =', lthet
227            ENDIF
228         ENDIF
229      ENDIF
230
231
232      READ  ( numnatp_ref, nampisdmp, IOSTAT = ios, ERR = 905)
233905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisdmp in reference namelist' )
234      READ  ( numnatp_cfg, nampisdmp, IOSTAT = ios, ERR = 906 )
235906   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisdmp in configuration namelist' )
236      IF(lwm) WRITE( numonp, nampisdmp )
237      !
238      IF(lwp) THEN                         ! control print
239         WRITE(numout,*)
240         WRITE(numout,*) '   Namelist : nampisdmp --- relaxation to GLODAP'
241         WRITE(numout,*) '      Relaxation of tracer to glodap mean value   ln_pisdmp =', ln_pisdmp
242         WRITE(numout,*) '      Frequency of Relaxation                     nn_pisdmp =', nn_pisdmp
243      ENDIF
244
245      READ  ( numnatp_ref, nampismass, IOSTAT = ios, ERR = 907)
246907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampismass in reference namelist' )
247      READ  ( numnatp_cfg, nampismass, IOSTAT = ios, ERR = 908 )
248908   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampismass in configuration namelist' )
249      IF(lwm) WRITE( numonp, nampismass )
250
251      IF(lwp) THEN                         ! control print
252         WRITE(numout,*)
253         WRITE(numout,*) '   Namelist : nampismass  --- mass conservation checking'
254         WRITE(numout,*) '      Flag to check mass conservation of NO3/Si/TALK   ln_check_mass = ', ln_check_mass
255      ENDIF
256      !
257   END SUBROUTINE p4z_sms_init
258
259
260   SUBROUTINE p4z_rst( kt, cdrw )
261      !!---------------------------------------------------------------------
262      !!                   ***  ROUTINE p4z_rst  ***
263      !!
264      !!  ** Purpose : Read or write variables in restart file:
265      !!
266      !!  WRITE(READ) mode:
267      !!       kt        : number of time step since the begining of the experiment at the
268      !!                   end of the current(previous) run
269      !!---------------------------------------------------------------------
270      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
271      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
272      !!---------------------------------------------------------------------
273      !
274      IF( TRIM(cdrw) == 'READ' ) THEN
275         !
276         IF(lwp) WRITE(numout,*)
277         IF(lwp) WRITE(numout,*) ' p4z_rst : Read specific variables from pisces model '
278         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
279         !
280         IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN
281            CALL iom_get( numrtr, jpdom_autoglo, 'PH' , hi(:,:,:)  )
282         ELSE
283            CALL p4z_che                              ! initialize the chemical constants
284            CALL ahini_for_at(hi)
285         ENDIF
286         CALL iom_get( numrtr, jpdom_autoglo, 'Silicalim', xksi(:,:) )
287         IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN
288            CALL iom_get( numrtr, jpdom_autoglo, 'Silicamax' , xksimax(:,:)  )
289         ELSE
290            xksimax(:,:) = xksi(:,:)
291         ENDIF
292         !
293         IF( iom_varid( numrtr, 'tcflxcum', ldstop = .FALSE. ) > 0 ) THEN  ! cumulative total flux of carbon
294            CALL iom_get( numrtr, 'tcflxcum' , t_oce_co2_flx_cum  )
295         ELSE
296            t_oce_co2_flx_cum = 0._wp
297         ENDIF
298         !
299         IF( ln_p5z ) THEN
300            IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN
301               CALL iom_get( numrtr, jpdom_autoglo, 'sizep' , sizep(:,:,:)  )
302               CALL iom_get( numrtr, jpdom_autoglo, 'sizen' , sizen(:,:,:)  )
303               CALL iom_get( numrtr, jpdom_autoglo, 'sized' , sized(:,:,:)  )
304            ELSE
305               sizep(:,:,:) = 1.
306               sizen(:,:,:) = 1.
307               sized(:,:,:) = 1.
308            ENDIF
309        ENDIF
310        !
311      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
312         IF( kt == nitrst ) THEN
313            IF(lwp) WRITE(numout,*)
314            IF(lwp) WRITE(numout,*) 'p4z_rst : write pisces restart file  kt =', kt
315            IF(lwp) WRITE(numout,*) '~~~~~~~'
316         ENDIF
317         CALL iom_rstput( kt, nitrst, numrtw, 'PH', hi(:,:,:) )
318         CALL iom_rstput( kt, nitrst, numrtw, 'Silicalim', xksi(:,:) )
319         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) )
320         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum )
321         IF( ln_p5z ) THEN
322            CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) )
323            CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) )
324            CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) )
325         ENDIF
326      ENDIF
327      !
328   END SUBROUTINE p4z_rst
329
330
331   SUBROUTINE p4z_dmp( kt )
332      !!----------------------------------------------------------------------
333      !!                    ***  p4z_dmp  ***
334      !!
335      !! ** purpose  : Relaxation of some tracers
336      !!----------------------------------------------------------------------
337      !
338      INTEGER, INTENT( in )  ::     kt ! time step
339      !
340      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. )
341      REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates
342      REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate
343      REAL(wp) ::  silmean = 91.51     ! mean value of silicate
344      !
345      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn
346      REAL(wp) :: zalksumb, zpo4sumb, zno3sumb, zsilsumb
347      !!---------------------------------------------------------------------
348
349      IF(lwp)  WRITE(numout,*)
350      IF(lwp)  WRITE(numout,*) ' p4z_dmp : Restoring of nutrients at time-step kt = ', kt
351      IF(lwp)  WRITE(numout,*)
352
353      IF( cn_cfg == "ORCA" .OR. cn_cfg == "orca") THEN
354         IF( .NOT. lk_c1d ) THEN      ! ORCA configuration (not 1D) !
355            !                                                ! --------------------------- !
356            ! set total alkalinity, phosphate, nitrate & silicate
357            zarea          = 1._wp / glob_sum( 'p4zsms', cvol(:,:,:) ) * 1e6             
358
359            zalksumn = glob_sum( 'p4zsms', trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
360            zpo4sumn = glob_sum( 'p4zsms', trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r
361            zno3sumn = glob_sum( 'p4zsms', trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3
362            zsilsumn = glob_sum( 'p4zsms', trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
363 
364            IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn
365            trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksumn
366
367            IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn
368            trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sumn
369
370            IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn
371            trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sumn
372
373            IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn
374            trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsumn )
375            !
376            !
377            IF( .NOT. ln_top_euler ) THEN
378               zalksumb = glob_sum( 'p4zsms', trb(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
379               zpo4sumb = glob_sum( 'p4zsms', trb(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r
380               zno3sumb = glob_sum( 'p4zsms', trb(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3
381               zsilsumb = glob_sum( 'p4zsms', trb(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
382 
383               IF(lwp) WRITE(numout,*) ' '
384               IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb
385               trb(:,:,:,jptal) = trb(:,:,:,jptal) * alkmean / zalksumb
386
387               IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb
388               trb(:,:,:,jppo4) = trb(:,:,:,jppo4) * po4mean / zpo4sumb
389
390               IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb
391               trb(:,:,:,jpno3) = trb(:,:,:,jpno3) * no3mean / zno3sumb
392
393               IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb
394               trb(:,:,:,jpsil) = MIN( 400.e-6,trb(:,:,:,jpsil) * silmean / zsilsumb )
395           ENDIF
396        ENDIF
397        !
398      ENDIF
399        !
400   END SUBROUTINE p4z_dmp
401
402
403   SUBROUTINE p4z_chk_mass( kt )
404      !!----------------------------------------------------------------------
405      !!                  ***  ROUTINE p4z_chk_mass  ***
406      !!
407      !! ** Purpose :  Mass conservation check
408      !!
409      !!---------------------------------------------------------------------
410      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
411      REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot
412      CHARACTER(LEN=100)   ::   cltxt
413      INTEGER :: jk
414      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwork
415      !!----------------------------------------------------------------------
416      !
417      IF( kt == nittrc000 ) THEN
418         xfact1 = rfact2r * 12. / 1.e15 * ryyss    ! conversion molC/kt --> PgC/yr
419         xfact2 = 1.e+3 * rno3 * 14. / 1.e12 * ryyss   ! conversion molC/l/s ----> TgN/m3/yr
420         xfact3 = 1.e+3 * rfact2r * rno3   ! conversion molC/l/kt ----> molN/m3/s
421         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si, Fer
422            CALL ctl_opn( numco2, 'carbon.budget'  , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
423            CALL ctl_opn( numnut, 'nutrient.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
424            CALL ctl_opn( numnit, 'nitrogen.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
425            cltxt='time-step   Alkalinity        Nitrate        Phosphorus         Silicate           Iron'
426            IF( lwp ) WRITE(numnut,*)  TRIM(cltxt)
427            IF( lwp ) WRITE(numnut,*) 
428         ENDIF
429      ENDIF
430
431      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
432         !   Compute the budget of NO3, ALK, Si, Fer
433         IF( ln_p4z ) THEN
434            zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)                      &
435               &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      &
436               &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &       
437               &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) 
438        ELSE
439            zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4) + trn(:,:,:,jpnph)   &
440               &          +   trn(:,:,:,jpndi) + trn(:,:,:,jpnpi)                      & 
441               &          +   trn(:,:,:,jppon) + trn(:,:,:,jpgon) + trn(:,:,:,jpdon)   &
442               &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * no3rat3 
443        ENDIF
444        !
445        no3budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
446        no3budget = no3budget / areatot
447        CALL iom_put( "pno3tot", no3budget )
448      ENDIF
449      !
450      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
451         IF( ln_p4z ) THEN
452            zwork(:,:,:) =    trn(:,:,:,jppo4)                                         &
453               &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      &
454               &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &       
455               &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) 
456        ELSE
457            zwork(:,:,:) =    trn(:,:,:,jppo4) + trn(:,:,:,jppph)                      &
458               &          +   trn(:,:,:,jppdi) + trn(:,:,:,jpppi)                      & 
459               &          +   trn(:,:,:,jppop) + trn(:,:,:,jpgop) + trn(:,:,:,jpdop)   &
460               &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * po4rat3 
461        ENDIF
462        !
463        po4budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
464        po4budget = po4budget / areatot
465        CALL iom_put( "ppo4tot", po4budget )
466      ENDIF
467      !
468      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
469         zwork(:,:,:) =  trn(:,:,:,jpsil) + trn(:,:,:,jpgsi) + trn(:,:,:,jpdsi) 
470         !
471         silbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
472         silbudget = silbudget / areatot
473         CALL iom_put( "psiltot", silbudget )
474      ENDIF
475      !
476      IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
477         zwork(:,:,:) =  trn(:,:,:,jpno3) * rno3 + trn(:,:,:,jptal) + trn(:,:,:,jpcal) * 2.             
478         !
479         alkbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )         !
480         alkbudget = alkbudget / areatot
481         CALL iom_put( "palktot", alkbudget )
482      ENDIF
483      !
484      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
485         zwork(:,:,:) =   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe) + trn(:,:,:,jpdfe)   &
486            &         +   trn(:,:,:,jpbfe) + trn(:,:,:,jpsfe)                      &
487            &         + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) )  * ferat3   
488         !
489         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
490         ferbudget = ferbudget / areatot
491         CALL iom_put( "pfertot", ferbudget )
492      ENDIF
493      !
494      ! Global budget of N SMS : denitrification in the water column and in the sediment
495      !                          nitrogen fixation by the diazotrophs
496      ! --------------------------------------------------------------------------------
497      IF( iom_use( "tnfix" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
498         znitrpottot  = glob_sum ( 'p4zsms', nitrpot(:,:,:) * nitrfix * cvol(:,:,:) )
499         CALL iom_put( "tnfix"  , znitrpottot * xfact3 )  ! Global  nitrogen fixation molC/l  to molN/m3
500      ENDIF
501      !
502      IF( iom_use( "tdenit" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
503         zrdenittot = glob_sum ( 'p4zsms', denitr(:,:,:) * rdenit * xnegtr(:,:,:) * cvol(:,:,:) )
504         zsdenittot = glob_sum ( 'p4zsms', sdenit(:,:) * e1e2t(:,:) * tmask(:,:,1) )
505         CALL iom_put( "tdenit" , ( zrdenittot + zsdenittot ) * xfact3 )  ! Total denitrification molC/l to molN/m3
506      ENDIF
507      !
508      IF( ln_check_mass .AND. kt == nitend ) THEN   ! Compute the budget of NO3, ALK, Si, Fer
509         t_atm_co2_flx  = t_atm_co2_flx / glob_sum( 'p4zsms', e1e2t(:,:) )
510         t_oce_co2_flx  = t_oce_co2_flx         * xfact1 * (-1 )
511         tpp            = tpp           * 1000. * xfact1
512         t_oce_co2_exp  = t_oce_co2_exp * 1000. * xfact1
513         IF( lwp ) WRITE(numco2,9000) ndastp, t_atm_co2_flx, t_oce_co2_flx, tpp, t_oce_co2_exp
514         IF( lwp ) WRITE(numnut,9100) ndastp, alkbudget        * 1.e+06, &
515             &                                no3budget * rno3 * 1.e+06, &
516             &                                po4budget * po4r * 1.e+06, &
517             &                                silbudget        * 1.e+06, &
518             &                                ferbudget        * 1.e+09
519         !
520         IF( lwp ) WRITE(numnit,9200) ndastp, znitrpottot * xfact2  , &
521            &                             zrdenittot  * xfact2  , &
522            &                             zsdenittot  * xfact2
523      ENDIF
524      !
525 9000  FORMAT(i8,f10.5,e18.10,f10.5,f10.5)
526 9100  FORMAT(i8,5e18.10)
527 9200  FORMAT(i8,3f10.5)
528       !
529   END SUBROUTINE p4z_chk_mass
530
531   !!======================================================================
532END MODULE p4zsms 
Note: See TracBrowser for help on using the repository browser.