source: branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zsms.F90 @ 5034

Last change on this file since 5034 was 5034, checked in by andrewryan, 6 years ago

merge with trunk

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