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 NEMO/branches/2018/dev_r9838_ENHANCE04_MLF/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2018/dev_r9838_ENHANCE04_MLF/src/TOP/PISCES/P4Z/p4zsms.F90 @ 9923

Last change on this file since 9923 was 9923, checked in by gm, 6 years ago

#1911 (ENHANCE-04): step I.2: dev_r9838_ENHANCE04_MLF

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