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/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z – NEMO

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, 5 years 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
RevLine 
[3443]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   !!----------------------------------------------------------------------
[9169]9   !!   p4z_sms        : Time loop of passive tracers sms
[3443]10   !!----------------------------------------------------------------------
[9169]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
[3443]28
29   IMPLICIT NONE
30   PRIVATE
31
[4990]32   PUBLIC   p4z_sms_init   ! called in p4zsms.F90
33   PUBLIC   p4z_sms        ! called in p4zsms.F90
[3443]34
[9169]35   INTEGER ::    numco2, numnut, numnit      ! logical unit for co2 budget
36   REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget
37   REAL(wp) ::   xfact1, xfact2, xfact3
[3443]38
[9169]39   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xnegtr     ! Array used to indicate negative tracer values
[5385]40
[3443]41   !!----------------------------------------------------------------------
[10067]42   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[10069]43   !! $Id$
[10068]44   !! Software governed by the CeCILL license (see ./LICENSE)
[3443]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      !!
[5385]62      INTEGER ::   ji, jj, jk, jnt, jn, jl
63      REAL(wp) ::  ztra
[3443]64      CHARACTER (len=25) :: charout
65      !!---------------------------------------------------------------------
66      !
[9124]67      IF( ln_timing )   CALL timing_start('p4z_sms')
[3443]68      !
[4152]69      IF( kt == nittrc000 ) THEN
70        !
[5385]71        ALLOCATE( xnegtr(jpi,jpj,jpk) )
72        !
[9559]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
[10382]76            t_oce_co2_flx_cum = 0._wp
[9559]77        ELSE
78            CALL p4z_rst( nittrc000, 'READ' )  !* read or initialize all required fields
[4152]79        ENDIF
80        !
81      ENDIF
82      !
[3443]83      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt )      ! Relaxation of some tracers
[3496]84      !
[7646]85      rfact = r2dttrc
[5385]86      !
87      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + nn_dttrc ) ) THEN
88         rfactr  = 1. / rfact
[7646]89         rfact2  = rfact / REAL( nrdttrc, wp )
[5385]90         rfact2r = 1. / rfact2
91         xstep = rfact2 / rday         ! Time step duration for biology
92         IF(lwp) WRITE(numout,*) 
[6140]93         IF(lwp) WRITE(numout,*) '    Passive Tracer  time step    rfact  = ', rfact, ' rdt = ', rdt
[5385]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
[7753]100            trb(:,:,:,jn) = trn(:,:,:,jn)
[5385]101         END DO
102      ENDIF
103      !
[10222]104      IF( ll_sbc ) CALL p4z_sbc( kt )   ! external sources of nutrients
105      !
106#if ! defined key_sed_off
[9559]107      CALL p4z_che              ! computation of chemical constants
108      CALL p4z_int( kt )        ! computation of various rates for biogeochemistry
109      !
[3443]110      DO jnt = 1, nrdttrc          ! Potential time splitting if requested
111         !
[5385]112         CALL p4z_bio( kt, jnt )   ! Biology
113         CALL p4z_lys( kt, jnt )   ! Compute CaCO3 saturation
[6421]114         CALL p4z_sed( kt, jnt )   ! Surface and Bottom boundary conditions
[5385]115         CALL p4z_flx( kt, jnt )   ! Compute surface fluxes
[3443]116         !
[7753]117         xnegtr(:,:,:) = 1.e0
[3443]118         DO jn = jp_pcs0, jp_pcs1
[5385]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
[7753]133           trb(:,:,:,jn) = trb(:,:,:,jn) + xnegtr(:,:,:) * tra(:,:,:,jn)
[5385]134         END DO
135        !
136         DO jn = jp_pcs0, jp_pcs1
[7753]137            tra(:,:,:,jn) = 0._wp
[5385]138         END DO
[3443]139         !
[5385]140         IF( ln_top_euler ) THEN
141            DO jn = jp_pcs0, jp_pcs1
[7753]142               trn(:,:,:,jn) = trb(:,:,:,jn)
[5385]143            END DO
144         ENDIF
[3443]145      END DO
146
147      !
[5385]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
[10222]153#endif
[5385]154      !
[10222]155      IF( ln_sediment ) THEN 
[3443]156         !
157         CALL sed_model( kt )     !  Main program of Sediment model
158         !
[10222]159         IF( ln_top_euler ) THEN
160            DO jn = jp_pcs0, jp_pcs1
161               trn(:,:,:,jn) = trb(:,:,:,jn)
162            END DO
163         ENDIF
164         !
[3443]165      ENDIF
166      !
167      IF( lrst_trc )  CALL p4z_rst( kt, 'WRITE' )  !* Write PISCES informations in restart file
168      !
[5385]169
[9124]170      IF( lk_iomput .OR. ln_check_mass )  CALL p4z_chk_mass( kt )    ! Mass conservation checking
[3481]171
[9124]172      IF( lwm .AND. kt == nittrc000    )  CALL FLUSH( numonp )       ! flush output namelist PISCES
[3443]173      !
[9124]174      IF( ln_timing )  CALL timing_stop('p4z_sms')
[3481]175      !
[3443]176   END SUBROUTINE p4z_sms
177
[9124]178
[3443]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      !!----------------------------------------------------------------------
[9124]188      INTEGER :: ios                 ! Local integer output status for namelist read
189      !!
[7646]190      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, wsbio2max, wsbio2scale,    &
[10416]191         &                   ldocp, ldocz, lthet, no3rat3, po4rat3
[9124]192         !
[4148]193      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp
[3531]194      NAMELIST/nampismass/ ln_check_mass
195      !!----------------------------------------------------------------------
[9169]196      !
197      IF(lwp) THEN
198         WRITE(numout,*)
199         WRITE(numout,*) 'p4z_sms_init : PISCES initialization'
200         WRITE(numout,*) '~~~~~~~~~~~~'
201      ENDIF
[3443]202
[4147]203      READ  ( numnatp_ref, nampisbio, IOSTAT = ios, ERR = 901)
[11536]204901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisbio in reference namelist' )
[4147]205      READ  ( numnatp_cfg, nampisbio, IOSTAT = ios, ERR = 902 )
[11536]206902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisbio in configuration namelist' )
[9169]207      IF(lwm) WRITE( numonp, nampisbio )
208      !
[3443]209      IF(lwp) THEN                         ! control print
[9169]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 
[7646]214         IF( ln_p5z ) THEN
[9169]215            WRITE(numout,*) '      N/C in zooplankton                        no3rat3     =', no3rat3
216            WRITE(numout,*) '      P/C in zooplankton                        po4rat3     =', po4rat3
[7646]217         ENDIF
[9169]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
[7646]222         IF( ln_ligand ) THEN
223            IF( ln_p4z ) THEN
[9169]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
[7646]227            ENDIF
228         ENDIF
[3443]229      ENDIF
230
231
[4147]232      READ  ( numnatp_ref, nampisdmp, IOSTAT = ios, ERR = 905)
[11536]233905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisdmp in reference namelist' )
[4147]234      READ  ( numnatp_cfg, nampisdmp, IOSTAT = ios, ERR = 906 )
[11536]235906   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisdmp in configuration namelist' )
[9169]236      IF(lwm) WRITE( numonp, nampisdmp )
237      !
[3443]238      IF(lwp) THEN                         ! control print
239         WRITE(numout,*)
[9169]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
[3443]243      ENDIF
244
[4147]245      READ  ( numnatp_ref, nampismass, IOSTAT = ios, ERR = 907)
[11536]246907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampismass in reference namelist' )
[4147]247      READ  ( numnatp_cfg, nampismass, IOSTAT = ios, ERR = 908 )
[11536]248908   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampismass in configuration namelist' )
[9169]249      IF(lwm) WRITE( numonp, nampismass )
[4147]250
[3531]251      IF(lwp) THEN                         ! control print
[9169]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
[3531]255      ENDIF
[9124]256      !
[3443]257   END SUBROUTINE p4z_sms_init
258
[9124]259
[3443]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
[9124]272      !!---------------------------------------------------------------------
[3443]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
[9751]283            CALL p4z_che                              ! initialize the chemical constants
[7646]284            CALL ahini_for_at(hi)
[3443]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         !
[4996]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         !
[7646]299         IF( ln_p5z ) THEN
300            IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN
[9909]301               CALL iom_get( numrtr, jpdom_autoglo, 'sizep' , sizep(:,:,:)  )
302               CALL iom_get( numrtr, jpdom_autoglo, 'sizen' , sizen(:,:,:)  )
[7646]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        !
[3443]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(:,:) )
[4996]320         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum )
[7646]321         IF( ln_p5z ) THEN
[9909]322            CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) )
323            CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) )
[7646]324            CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) )
325         ENDIF
[3443]326      ENDIF
327      !
328   END SUBROUTINE p4z_rst
329
[9124]330
[3443]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      !
[5385]345      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn
346      REAL(wp) :: zalksumb, zpo4sumb, zno3sumb, zsilsumb
[3443]347      !!---------------------------------------------------------------------
348
349      IF(lwp)  WRITE(numout,*)
[3557]350      IF(lwp)  WRITE(numout,*) ' p4z_dmp : Restoring of nutrients at time-step kt = ', kt
[3443]351      IF(lwp)  WRITE(numout,*)
352
[10222]353      IF( cn_cfg == "ORCA" .OR. cn_cfg == "orca") THEN
[10213]354         IF( .NOT. lk_c1d ) THEN      ! ORCA configuration (not 1D) !
355            !                                                ! --------------------------- !
356            ! set total alkalinity, phosphate, nitrate & silicate
[10425]357            zarea          = 1._wp / glob_sum( 'p4zsms', cvol(:,:,:) ) * 1e6             
[3443]358
[10425]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
[7753]363 
[10213]364            IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn
365            trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksumn
[3443]366
[10213]367            IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn
368            trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sumn
[3443]369
[10213]370            IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn
371            trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sumn
[3443]372
[10213]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
[10425]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
[7753]382 
[10213]383               IF(lwp) WRITE(numout,*) ' '
384               IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb
385               trb(:,:,:,jptal) = trb(:,:,:,jptal) * alkmean / zalksumb
[5385]386
[10213]387               IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb
388               trb(:,:,:,jppo4) = trb(:,:,:,jppo4) * po4mean / zpo4sumb
[5385]389
[10213]390               IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb
391               trb(:,:,:,jpno3) = trb(:,:,:,jpno3) * no3mean / zno3sumb
[5385]392
[10213]393               IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb
394               trb(:,:,:,jpsil) = MIN( 400.e-6,trb(:,:,:,jpsil) * silmean / zsilsumb )
395           ENDIF
[5385]396        ENDIF
397        !
[3443]398      ENDIF
[5385]399        !
[3443]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      !!---------------------------------------------------------------------
[5547]410      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
411      REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot
[5385]412      CHARACTER(LEN=100)   ::   cltxt
413      INTEGER :: jk
[9125]414      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwork
[5385]415      !!----------------------------------------------------------------------
416      !
[3443]417      IF( kt == nittrc000 ) THEN
[8533]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
[3451]421         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si, Fer
[3496]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 )
[5385]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,*) 
[3443]428         ENDIF
429      ENDIF
430
[4996]431      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
432         !   Compute the budget of NO3, ALK, Si, Fer
[7646]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        !
[10425]445        no3budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
[7646]446        no3budget = no3budget / areatot
447        CALL iom_put( "pno3tot", no3budget )
[4996]448      ENDIF
449      !
[5385]450      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
[7646]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        !
[10425]463        po4budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
[7646]464        po4budget = po4budget / areatot
465        CALL iom_put( "ppo4tot", po4budget )
[5385]466      ENDIF
467      !
468      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
[7646]469         zwork(:,:,:) =  trn(:,:,:,jpsil) + trn(:,:,:,jpgsi) + trn(:,:,:,jpdsi) 
[4996]470         !
[10425]471         silbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
[4996]472         silbudget = silbudget / areatot
473         CALL iom_put( "psiltot", silbudget )
474      ENDIF
475      !
[5385]476      IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
[7646]477         zwork(:,:,:) =  trn(:,:,:,jpno3) * rno3 + trn(:,:,:,jptal) + trn(:,:,:,jpcal) * 2.             
[4996]478         !
[10425]479         alkbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )         !
[4996]480         alkbudget = alkbudget / areatot
481         CALL iom_put( "palktot", alkbudget )
482      ENDIF
483      !
[5385]484      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
[7646]485         zwork(:,:,:) =   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe) + trn(:,:,:,jpdfe)   &
486            &         +   trn(:,:,:,jpbfe) + trn(:,:,:,jpsfe)                      &
487            &         + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) )  * ferat3   
[3496]488         !
[10425]489         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  ) 
[3496]490         ferbudget = ferbudget / areatot
[4996]491         CALL iom_put( "pfertot", ferbudget )
[3496]492      ENDIF
[4996]493      !
[5385]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
[10425]498         znitrpottot  = glob_sum ( 'p4zsms', nitrpot(:,:,:) * nitrfix * cvol(:,:,:) )
[8533]499         CALL iom_put( "tnfix"  , znitrpottot * xfact3 )  ! Global  nitrogen fixation molC/l  to molN/m3
[5385]500      ENDIF
501      !
502      IF( iom_use( "tdenit" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
[10425]503         zrdenittot = glob_sum ( 'p4zsms', denitr(:,:,:) * rdenit * xnegtr(:,:,:) * cvol(:,:,:) )
504         zsdenittot = glob_sum ( 'p4zsms', sdenit(:,:) * e1e2t(:,:) * tmask(:,:,1) )
[8533]505         CALL iom_put( "tdenit" , ( zrdenittot + zsdenittot ) * xfact3 )  ! Total denitrification molC/l to molN/m3
[5385]506      ENDIF
507      !
[4996]508      IF( ln_check_mass .AND. kt == nitend ) THEN   ! Compute the budget of NO3, ALK, Si, Fer
[10425]509         t_atm_co2_flx  = t_atm_co2_flx / glob_sum( 'p4zsms', e1e2t(:,:) )
[5385]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
[4996]513         IF( lwp ) WRITE(numco2,9000) ndastp, t_atm_co2_flx, t_oce_co2_flx, tpp, t_oce_co2_exp
[5385]514         IF( lwp ) WRITE(numnut,9100) ndastp, alkbudget        * 1.e+06, &
[4996]515             &                                no3budget * rno3 * 1.e+06, &
[5385]516             &                                po4budget * po4r * 1.e+06, &
[4996]517             &                                silbudget        * 1.e+06, &
518             &                                ferbudget        * 1.e+09
[5385]519         !
520         IF( lwp ) WRITE(numnit,9200) ndastp, znitrpottot * xfact2  , &
[9124]521            &                             zrdenittot  * xfact2  , &
522            &                             zsdenittot  * xfact2
[4996]523      ENDIF
524      !
[3496]525 9000  FORMAT(i8,f10.5,e18.10,f10.5,f10.5)
[5385]526 9100  FORMAT(i8,5e18.10)
527 9200  FORMAT(i8,3f10.5)
[3443]528       !
529   END SUBROUTINE p4z_chk_mass
530
531   !!======================================================================
532END MODULE p4zsms 
Note: See TracBrowser for help on using the repository browser.