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_r11943_MERGE_2019/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11943_MERGE_2019/src/TOP/PISCES/P4Z/p4zsms.F90 @ 11960

Last change on this file since 11960 was 11960, checked in by acc, 4 years ago

Branch 2019/dev_r11943_MERGE_2019. Merge in changes from 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. (svn merge -r 11614:11954). Resolved tree conflicts and one actual conflict. Sette tested(these changes alter the ext/AGRIF reference; remember to update). See ticket #2341

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