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.
trcrst.F90 in trunk/NEMO/TOP_SRC – NEMO

source: trunk/NEMO/TOP_SRC/trcrst.F90 @ 1573

Last change on this file since 1573 was 1473, checked in by smasson, 15 years ago

for dimgout: allow changing the number of proc for restart, see ticket:442

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 20.8 KB
RevLine 
[268]1MODULE trcrst
[335]2   !!======================================================================
[945]3   !!                       ***  MODULE trcrst  ***
4   !! TOP :   create, write, read the restart files for passive tracers
[335]5   !!======================================================================
[945]6   !! History :   1.0  !  2007-02 (C. Ethe) adaptation from the ocean
[274]7   !!----------------------------------------------------------------------
[945]8#if defined key_top
[335]9   !!----------------------------------------------------------------------
[945]10   !!   'key_top'                                                TOP models
11   !!----------------------------------------------------------------------
12   !!   trc_rst_opn    : open  restart file
13   !!   trc_rst_read   : read  restart file
14   !!   trc_rst_wri    : write restart file
15   !!----------------------------------------------------------------------
[335]16   USE oce_trc
17   USE trc
[1077]18   USE sms_lobster         ! LOBSTER variables
19   USE sms_pisces          ! PISCES variables
[945]20   USE trcsms_cfc          ! CFC variables
[1254]21   USE trcsms_c14b         ! C14 variables
22   USE trcsms_my_trc       ! MY_TRC variables
[335]23   USE trctrp_lec   
[433]24   USE lib_mpp
[616]25   USE iom
[335]26   
27   IMPLICIT NONE
28   PRIVATE
29   
[945]30   PUBLIC   trc_rst_opn       ! called by ???
31   PUBLIC   trc_rst_read      ! called by ???
32   PUBLIC   trc_rst_wri       ! called by ???
[335]33   
[616]34   INTEGER, PUBLIC ::   numrtr, numrtw   !: logical unit for trc restart (read and write)
[350]35
[616]36
[350]37   !! * Substitutions
[945]38#  include "top_substitute.h90"
39   !!----------------------------------------------------------------------
40   !! NEMO/TOP 1.0 , LOCEAN-IPSL (2005)
41   !! $Id$
42   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
43   !!----------------------------------------------------------------------
[335]44   
[268]45CONTAINS
[335]46   
[616]47   SUBROUTINE trc_rst_opn( kt )
48      !!----------------------------------------------------------------------
49      !!                    ***  trc_rst_opn  ***
50      !!
51      !! ** purpose  :   output of sea-trc variable in a netcdf file
52      !!----------------------------------------------------------------------
53      INTEGER, INTENT(in) ::   kt       ! number of iteration
54      !
55      CHARACTER(LEN=20)   ::   clkt     ! ocean time-step define as a character
56      CHARACTER(LEN=50)   ::   clname   ! trc output restart file name
57      !!----------------------------------------------------------------------
58      !
[1100]59      IF( kt == nit000 ) lrst_trc = .FALSE. 
[945]60# if defined key_off_tra
[1100]61      IF( MOD( kt - 1, nstock ) == 0 ) THEN
62         ! we use kt - 1 and not kt - nit000 to keep the same periodicity from the beginning of the experiment
63         nitrst = kt + nstock - 1                  ! define the next value of nitrst for restart writing
64         IF( nitrst > nitend )   nitrst = nitend   ! make sure we write a restart at the end of the run
[616]65      ENDIF
[1100]66#endif
[616]67     
68      IF( kt == nitrst - ndttrc .OR. nitend - nit000 + 1 < 2 * ndttrc ) THEN
69         ! beware if model runs less than 2*ndttrc time step
70         ! beware of the format used to write kt (default is i8.8, that should be large enough)
[945]71         IF( nitrst > 1.0e9 ) THEN   ;   WRITE(clkt,*       ) nitrst
72         ELSE                        ;   WRITE(clkt,'(i8.8)') nitrst
[616]73         ENDIF
74         ! create the file
75         IF(lwp) WRITE(numout,*)
[1254]76         clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trcrst_out)
[616]77         IF(lwp) WRITE(numout,*) '             open trc restart.output NetCDF file: '//clname
78         CALL iom_open( clname, numrtw, ldwrt = .TRUE., kiolib = jprstlib )
79         lrst_trc = .TRUE.
80      ENDIF
81      !
82   END SUBROUTINE trc_rst_opn
83
84
85   SUBROUTINE trc_rst_read 
[945]86      !!----------------------------------------------------------------------
87      !!                    ***  trc_rst_opn  ***
[335]88      !!
[945]89      !! ** purpose  :   read passive tracer fields in restart files
90      !!----------------------------------------------------------------------
[1287]91      INTEGER  ::  jn 
92      INTEGER  ::  iarak0
93      REAL(wp) ::  zarak0
[1473]94      INTEGER  ::  jlibalt = jprstlib
95      LOGICAL  ::  llok
[1287]96#if defined key_pisces 
97      INTEGER  ::  ji, jj, jk
98      REAL(wp) ::  zcaralk, zbicarb, zco3
99      REAL(wp) ::  ztmas, ztmas1
100#endif
101
[945]102      !!----------------------------------------------------------------------
[268]103
[945]104      IF(lwp) WRITE(numout,*)
105      IF(lwp) WRITE(numout,*) 'trc_rst_read : read the TOP restart file'
106      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
[350]107
[1473]108      IF ( jprstlib == jprstdimg ) THEN
109        ! eventually read netcdf file (monobloc)  for restarting on different number of processors
110        ! if {cn_trcrst_in}.nc exists, then set jlibalt to jpnf90
111        INQUIRE( FILE = TRIM(cn_trcrst_in)//'.nc', EXIST = llok )
112        IF ( llok ) THEN ; jlibalt = jpnf90  ; ELSE ; jlibalt = jprstlib ; ENDIF
113      ENDIF
114     
115      CALL iom_open( cn_trcrst_in, numrtr, kiolib = jlibalt )
[1287]116
117      ! Time domain : restart
118      ! ---------------------
119      CALL trc_rst_cal( nittrc000, 'READ' )   ! calendar
120
[945]121      IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN   ;   iarak0 = 1
122      ELSE                                           ;   iarak0 = 0
[268]123      ENDIF
[616]124      CALL iom_get( numrtr, 'arak0', zarak0 )
[268]125
[945]126      IF( iarak0 /= NINT( zarak0 ) )   &                           ! Control of the scheme
127         & CALL ctl_stop( ' ===>>>> : problem with advection scheme', &
128         & ' it must be the same type for both restart and previous run', &
129         & ' centered or euler '  )
[1287]130      IF(lwp) WRITE(numout,*)
[268]131
[1287]132      IF(lwp) WRITE(numout,*) '    arakawa option      : ', NINT( zarak0 )
[268]133
[1287]134
[945]135      ! READ prognostic variables and computes diagnostic variable
[494]136      DO jn = 1, jptra
[1077]137         CALL iom_get( numrtr, jpdom_autoglo, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) ) 
[335]138      END DO
[1077]139
[1287]140      DO jn = 1, jptra
[1077]141         CALL iom_get( numrtr, jpdom_autoglo, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) ) 
142      END DO
143
144#if defined key_lobster
145      CALL iom_get( numrtr, jpdom_autoglo, 'SEDB'//ctrcnm(jpdet), sedpocb(:,:) ) 
146      CALL iom_get( numrtr, jpdom_autoglo, 'SEDN'//ctrcnm(jpdet), sedpocn(:,:) ) 
[1011]147#endif
148#if defined key_pisces
[1287]149      !
150      IF( ln_pisdmp ) CALL pis_dmp_ini  ! relaxation of some tracers
151      !
152      IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN
153         CALL iom_get( numrtr, jpdom_autoglo, 'PH' , hi(:,:,:)  )
154      ELSE
155         ! Set PH from  total alkalinity, borat (???), akb3 (???) and ak23 (???)
156         ! --------------------------------------------------------
157         DO jk = 1, jpk
158            DO jj = 1, jpj
159               DO ji = 1, jpi
160                  ztmas   = tmask(ji,jj,jk)
161                  ztmas1  = 1. - tmask(ji,jj,jk)
162                  zcaralk = trn(ji,jj,jk,jptal) - borat(ji,jj,jk) / (  1. + 1.E-8 / ( rtrn + akb3(ji,jj,jk) )  )
163                  zco3    = ( zcaralk - trn(ji,jj,jk,jpdic) ) * ztmas + 0.5e-3 * ztmas1
164                  zbicarb = ( 2. * trn(ji,jj,jk,jpdic) - zcaralk )
165                  hi(ji,jj,jk) = ( ak23(ji,jj,jk) * zbicarb / zco3 ) * ztmas + 1.e-9 * ztmas1
166               END DO
167            END DO
168         END DO
169      ENDIF
[1077]170      CALL iom_get( numrtr, jpdom_autoglo, 'Silicalim', xksi(:,:) ) 
[1287]171      IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN
172         CALL iom_get( numrtr, jpdom_autoglo, 'Silicamax' , xksimax(:,:)  )
173      ELSE
174         xksimax(:,:) = xksi(:,:)
175      ENDIF
[1011]176#endif
177#if defined key_cfc
178      DO jn = jp_cfc0, jp_cfc1
[1254]179         CALL iom_get( numrtr, jpdom_autoglo, 'qint_'//ctrcnm(jn), qint_cfc(:,:,jn) ) 
[616]180      END DO
[1077]181#endif
[1254]182#if defined key_c14b
183      CALL iom_get( numrtr, jpdom_autoglo, 'qint_'//ctrcnm(jn) , qint_c14(:,:) ) 
184#endif
185#if defined key_my_trc
186#endif
[1287]187     
[616]188      CALL iom_close( numrtr )
[945]189      !
190   END SUBROUTINE trc_rst_read
[494]191
192
[945]193   SUBROUTINE trc_rst_wri( kt )
194      !!----------------------------------------------------------------------
195      !!                    ***  trc_rst_wri  ***
[335]196      !!
[945]197      !! ** purpose  :   write passive tracer fields in restart files
198      !!----------------------------------------------------------------------
199      INTEGER, INTENT( in ) ::   kt    ! ocean time-step index
[335]200      !!
[1287]201      INTEGER  :: jn
202      REAL(wp) :: zarak0
[945]203      !!----------------------------------------------------------------------
[268]204
205
[1287]206      CALL trc_rst_cal( kt, 'WRITE' )   ! calendar
207
208      IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN   ;   zarak0 = 1.
209      ELSE                                           ;   zarak0 = 0.
[1100]210      ENDIF
[1287]211      CALL iom_rstput( kt, nitrst, numrtw, 'arak0', zarak0 )
[268]212
[1287]213      ! prognostic variables
214      ! --------------------
[1100]215      DO jn = 1, jptra
216         CALL iom_rstput( kt, nitrst, numrtw, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) )
217      END DO
[1077]218
[1100]219      DO jn = 1, jptra
220         CALL iom_rstput( kt, nitrst, numrtw, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) )
221      END DO
[268]222
[945]223#if defined key_lobster
[1287]224         CALL iom_rstput( kt, nitrst, numrtw, 'SEDB'//ctrcnm(jpdet), sedpocb(:,:) )
225         CALL iom_rstput( kt, nitrst, numrtw, 'SEDN'//ctrcnm(jpdet), sedpocn(:,:) )
[1011]226#endif
[1287]227#if defined key_pisces 
228         CALL iom_rstput( kt, nitrst, numrtw, 'PH', hi(:,:,:) )
229         CALL iom_rstput( kt, nitrst, numrtw, 'Silicalim', xksi(:,:) )
230         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) )
[1011]231#endif
232#if defined key_cfc
[1287]233         DO jn = jp_cfc0, jp_cfc1
234            CALL iom_rstput( kt, nitrst, numrtw, 'qint_'//ctrcnm(jn), qint_cfc(:,:,jn) )
235         END DO
[616]236#endif
[1254]237#if defined key_c14b
[1287]238         CALL iom_rstput( kt, nitrst, numrtw, 'qint_'//ctrcnm(jn), qint_c14(:,:) )
[1254]239#endif
240#if defined key_my_trc
241#endif
[1287]242     
243      IF( kt == nitrst ) THEN
[1119]244          CALL trc_rst_stat            ! statistics
[1100]245          CALL iom_close( numrtw )     ! close the restart file (only at last time step)
[1177]246#if ! defined key_trdmld_trc
[1100]247          lrst_trc = .FALSE.
[1177]248#endif
[1287]249      ENDIF
[945]250      !
[616]251   END SUBROUTINE trc_rst_wri
[268]252
[1287]253   SUBROUTINE trc_rst_cal( kt, cdrw )
254      !!---------------------------------------------------------------------
255      !!                   ***  ROUTINE trc_rst_cal  ***
256      !!
257      !!  ** Purpose : Read or write calendar in restart file:
258      !!
259      !!  WRITE(READ) mode:
260      !!       kt        : number of time step since the begining of the experiment at the
261      !!                   end of the current(previous) run
262      !!       adatrj(0) : number of elapsed days since the begining of the experiment at the
263      !!                   end of the current(previous) run (REAL -> keep fractions of day)
264      !!       ndastp    : date at the end of the current(previous) run (coded as yyyymmdd integer)
265      !!
266      !!   According to namelist parameter nrstdt,
267      !!       nrsttr = 0  no control on the date (nittrc000 is  arbitrary).
268      !!       nrsttr = 1  we verify that nit000 is equal to the last
269      !!                   time step of previous run + 1.
270      !!       In both those options, the  exact duration of the experiment
271      !!       since the beginning (cumulated duration of all previous restart runs)
272      !!       is not stored in the restart and is assumed to be (nit000-1)*rdt.
273      !!       This is valid is the time step has remained constant.
274      !!
275      !!       nrsttr = 2  the duration of the experiment in days (adatrj)
276      !!                    has been stored in the restart file.
277      !!----------------------------------------------------------------------
278      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
279      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
280      !
281      REAL(wp) ::  zkt
282#if defined key_off_tra
283      REAL(wp) ::  zndastp
284#endif
285
286      ! Time domain : restart
287      ! ---------------------
288
289      IF( TRIM(cdrw) == 'READ' ) THEN
290         CALL iom_get ( numrtr, 'kt', zkt )   ! last time-step of previous run
291         IF(lwp) THEN
292            WRITE(numout,*) ' *** Info read in restart : '
293            WRITE(numout,*) '   previous time-step                               : ', NINT( zkt )
294            WRITE(numout,*) ' *** restart option'
295            SELECT CASE ( nrsttr )
296            CASE ( 0 )   ;   WRITE(numout,*) ' nrsttr = 0 : no control of nittrc000'
297            CASE ( 1 )   ;   WRITE(numout,*) ' nrsttr = 1 : no control the date at nit000 (use ndate0 read in the namelist)'
298            CASE ( 2 )   ;   WRITE(numout,*) ' nrsttr = 2 : calendar parameters read in restart'
299            END SELECT
300            WRITE(numout,*)
301         ENDIF
302         ! Control of date
303         IF( nittrc000  - NINT( zkt ) /= 1 .AND.  nrsttr /= 0 )                                  &
304            &   CALL ctl_stop( ' ===>>>> : problem with nit000 for the restart',                 &
305            &                  ' verify the restart file or rerun with nrsttr = 0 (namelist)' )
306#if defined key_off_tra
307         ! define ndastp and adatrj
308         IF ( nrsttr == 2 ) THEN
309            CALL iom_get( numrtr, 'ndastp', zndastp ) 
310            ndastp = NINT( zndastp )
311            CALL iom_get( numrtr, 'adatrj', adatrj  )
312         ELSE
313            ndastp = ndate0 - 1     ! ndate0 read in the namelist in dom_nam
314            adatrj = ( REAL( nittrc000-1, wp ) * rdttra(1) ) / rday
315            ! note this is wrong if time step has changed during run
316         ENDIF
317         !
318         IF(lwp) THEN
319           WRITE(numout,*) ' *** Info used values : '
320           WRITE(numout,*) '   date ndastp                                      : ', ndastp
321           WRITE(numout,*) '   number of elapsed days since the begining of run : ', adatrj
322           WRITE(numout,*)
323         ENDIF
324#endif
325
326      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
327         !
328         IF(  kt == nitrst ) THEN
329            IF(lwp) WRITE(numout,*)
330            IF(lwp) WRITE(numout,*) 'trc_wri : write the TOP restart file (NetCDF) at it= ', kt, ' date= ', ndastp
331            IF(lwp) WRITE(numout,*) '~~~~~~~'
332         ENDIF
333         ! calendar control
334         CALL iom_rstput( kt, nitrst, numrtw, 'kt'     , REAL( kt    , wp) )   ! time-step
335         CALL iom_rstput( kt, nitrst, numrtw, 'ndastp' , REAL( ndastp, wp) )   ! date
336         CALL iom_rstput( kt, nitrst, numrtw, 'adatrj' , adatrj            )   ! number of elapsed days since
337         !                                                                     ! the begining of the run [s]
338      ENDIF
339
340   END SUBROUTINE trc_rst_cal
341
[1119]342# if defined key_pisces 
343
[1287]344   SUBROUTINE pis_dmp_ini 
[1119]345      !!----------------------------------------------------------------------
[1287]346      !!                    ***  pis_dmp_ini  ***
[1119]347      !!
[1287]348      !! ** purpose  : Relaxation of some tracers
[1119]349      !!----------------------------------------------------------------------
[1287]350      INTEGER  :: ji, jj, jk 
[1119]351      REAL(wp) ::  &
352         alkmean = 2426. ,  & ! mean value of alkalinity ( Glodap ; for Goyet 2391. )
353         po4mean = 2.165 ,  & ! mean value of phosphates
354         no3mean = 30.90 ,  & ! mean value of nitrate
355         siomean = 91.51      ! mean value of silicate
356     
[1254]357      REAL(wp) ::   zvol, ztrasum
[1119]358
[1287]359
[1119]360      IF(lwp)  WRITE(numout,*)
361
362      IF( cp_cfg == "orca" .AND. .NOT. lk_trc_c1d ) THEN      ! ORCA condiguration (not 1D) !
363         !                                                    ! --------------------------- !
364         ! set total alkalinity, phosphate, NO3 & silicate
365
366         ! total alkalinity
367         ztrasum = 0.e0             
368         DO jk = 1, jpk
369            DO jj = 1, jpj
370               DO ji = 1, jpi
[1254]371                  zvol = cvol(ji,jj,jk)
[1119]372#  if defined key_off_degrad
[1254]373                  zvol = zvol * facvol(ji,jj,jk)
[1119]374#  endif
[1254]375                  ztrasum = ztrasum + trn(ji,jj,jk,jptal) * zvol
[1119]376               END DO
377            END DO
378         END DO
379         IF( lk_mpp )   CALL mpp_sum( ztrasum )     ! sum over the global domain 
380         
381         ztrasum = ztrasum / areatot * 1.e6
382         IF(lwp) WRITE(numout,*) '       TALK mean : ', ztrasum
383         trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / ztrasum
384           
385         ! phosphate
386         ztrasum = 0.e0
387         DO jk = 1, jpk
388            DO jj = 1, jpj
389               DO ji = 1, jpi
[1254]390                  zvol = cvol(ji,jj,jk)
[1119]391#  if defined key_off_degrad
[1254]392                  zvol = zvol * facvol(ji,jj,jk)
[1119]393#  endif
[1254]394                  ztrasum = ztrasum + trn(ji,jj,jk,jppo4) * zvol
[1119]395               END DO
396            END DO
397         END DO
398         IF( lk_mpp )   CALL mpp_sum( ztrasum )     ! sum over the global domain 
399         
400         ztrasum = ztrasum / areatot * 1.e6 / 122.
401         IF(lwp) WRITE(numout,*) '       PO4  mean : ', ztrasum
402         trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / ztrasum
403       
404         ! Nitrates         
405         ztrasum = 0.e0
406         DO jk = 1, jpk
407            DO jj = 1, jpj
408               DO ji = 1, jpi
[1254]409                  zvol = cvol(ji,jj,jk)
[1119]410#  if defined key_off_degrad
[1254]411                  zvol = zvol * facvol(ji,jj,jk)
[1119]412#  endif
[1254]413                  ztrasum = ztrasum + trn(ji,jj,jk,jpno3) * zvol
[1119]414               END DO
415            END DO
416         END DO
417         IF( lk_mpp )   CALL mpp_sum( ztrasum )     ! sum over the global domain 
418         
419         ztrasum = ztrasum / areatot * 1.e6 / 7.6
420         IF(lwp) WRITE(numout,*) '       NO3  mean : ', ztrasum
421         trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / ztrasum
422         
423         ! Silicate
424         ztrasum = 0.e0
425         DO jk = 1, jpk
426            DO jj = 1, jpj
427               DO ji = 1, jpi
[1254]428                  zvol = cvol(ji,jj,jk)
[1119]429#  if defined key_off_degrad
[1254]430                  zvol = zvol * facvol(ji,jj,jk)
[1119]431#  endif
[1254]432                  ztrasum = ztrasum + trn(ji,jj,jk,jpsil) * zvol
[1119]433               END DO
434            END DO
435         END DO
436         IF( lk_mpp )   CALL mpp_sum( ztrasum )     ! sum over the global domain 
437         ztrasum = ztrasum / areatot * 1.e6
438         IF(lwp) WRITE(numout,*) '       SiO3 mean : ', ztrasum
439         trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * siomean / ztrasum ) 
440         !
441      ENDIF
442
443!#if defined key_kriest
444!     !! Initialize number of particles from a standart restart file
445!     !! The name of big organic particles jpgoc has been only change
446!     !! and replace by jpnum but the values here are concentration
447!     trn(:,:,:,jppoc) = trn(:,:,:,jppoc) + trn(:,:,:,jpnum)
448!     trn(:,:,:,jpnum) = trn(:,:,:,jppoc) / ( 6. * xkr_massp )
449!#endif
450
[1287]451   END SUBROUTINE pis_dmp_ini
[1119]452
453#endif
454      !!----------------------------------------------------------------------
455
456   SUBROUTINE trc_rst_stat
457      !!----------------------------------------------------------------------
458      !!                    ***  trc_rst_stat  ***
459      !!
460      !! ** purpose  :   Compute tracers statistics
461      !!----------------------------------------------------------------------
462
463      INTEGER  :: ji, jj, jk, jn
464      REAL(wp) :: zdiag_var, zdiag_varmin, zdiag_varmax, zdiag_tot
[1254]465      REAL(wp) :: zder, zvol
[1119]466      !!----------------------------------------------------------------------
467
468
469      IF( lwp ) THEN
470         WRITE(numout,*) 
471         WRITE(numout,*) '           ----TRACER STAT----             '
472         WRITE(numout,*) 
473      ENDIF
474     
475      zdiag_tot = 0.e0
476      DO jn = 1, jptra
477         zdiag_var    = 0.e0
478         zdiag_varmin = 0.e0
479         zdiag_varmax = 0.e0
[1287]480         DO jk = 1, jpk
[1119]481            DO jj = 1, jpj
[1287]482               DO ji = 1, jpi
[1254]483                  zvol = cvol(ji,jj,jk)
484#  if defined key_off_degrad
485                  zvol = zvol * facvol(ji,jj,jk)
486#  endif
487                  zdiag_var = zdiag_var + trn(ji,jj,jk,jn) * zvol
[1119]488               END DO
489            END DO
490         END DO
491         
492         zdiag_varmin = MINVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
493         zdiag_varmax = MAXVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
494         IF( lk_mpp ) THEN
495            CALL mpp_min( zdiag_varmin )      ! min over the global domain
496            CALL mpp_max( zdiag_varmax )      ! max over the global domain
497            CALL mpp_sum( zdiag_var    )      ! sum over the global domain
498         END IF
499         zdiag_tot = zdiag_tot + zdiag_var
500         zdiag_var = zdiag_var / areatot
501         IF(lwp) WRITE(numout,*) '   MEAN NO ', jn, ctrcnm(jn), ' = ', zdiag_var,   &
502            &                    ' MIN = ', zdiag_varmin, ' MAX = ', zdiag_varmax
503      END DO
504     
505      zder = ( ( zdiag_tot - trai ) / ( trai + 1.e-12 )  ) * 100._wp
506      IF(lwp) WRITE(numout,*) '   Integral of all tracers over the full domain  = ', zdiag_tot
507      IF(lwp) WRITE(numout,*) '   Drift of the sum of all tracers =', zder, ' %'
508     
509   END SUBROUTINE trc_rst_stat
510
[268]511#else
[945]512   !!----------------------------------------------------------------------
513   !!  Dummy module :                                     No passive tracer
514   !!----------------------------------------------------------------------
[335]515CONTAINS
[945]516   SUBROUTINE trc_rst_read                      ! Empty routines
[616]517   END SUBROUTINE trc_rst_read
[945]518   SUBROUTINE trc_rst_wri( kt )
[335]519      INTEGER, INTENT ( in ) :: kt
[616]520      WRITE(*,*) 'trc_rst_wri: You should not have seen this print! error?', kt
[945]521   END SUBROUTINE trc_rst_wri   
[268]522#endif
[945]523
524   !!======================================================================
[335]525END MODULE trcrst
Note: See TracBrowser for help on using the repository browser.