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 NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/TOP – NEMO

source: NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/TOP/trcrst.F90 @ 10314

Last change on this file since 10314 was 10314, checked in by smasson, 5 years ago

dev_r10164_HPC09_ESIWACE_PREP_MERGE: action 2: add generic glob_min/max/sum and locmin/max, complete timing and report (including bdy and icb), see #2133

  • Property svn:keywords set to Id
File size: 15.8 KB
RevLine 
[268]1MODULE trcrst
[335]2   !!======================================================================
[1801]3   !!                         ***  MODULE trcrst  ***
4   !! TOP :   Manage the passive tracer restart
[335]5   !!======================================================================
[1801]6   !! History :    -   !  1991-03  ()  original code
7   !!             1.0  !  2005-03 (O. Aumont, A. El Moussaoui) F90
8   !!              -   !  2005-10 (C. Ethe) print control
9   !!             2.0  !  2005-10 (C. Ethe, G. Madec) revised architecture
[274]10   !!----------------------------------------------------------------------
[945]11#if defined key_top
[335]12   !!----------------------------------------------------------------------
[945]13   !!   'key_top'                                                TOP models
14   !!----------------------------------------------------------------------
[1801]15   !!----------------------------------------------------------------------
[6140]16   !!   trc_rst        : Restart for passive tracer
[945]17   !!   trc_rst_opn    : open  restart file
18   !!   trc_rst_read   : read  restart file
19   !!   trc_rst_wri    : write restart file
20   !!----------------------------------------------------------------------
[335]21   USE oce_trc
22   USE trc
[616]23   USE iom
[2528]24   USE daymod
[6140]25   
[335]26   IMPLICIT NONE
27   PRIVATE
[1801]28
[945]29   PUBLIC   trc_rst_opn       ! called by ???
30   PUBLIC   trc_rst_read      ! called by ???
31   PUBLIC   trc_rst_wri       ! called by ???
[3294]32   PUBLIC   trc_rst_cal
[1801]33
[6140]34   !!----------------------------------------------------------------------
[10067]35   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[6140]36   !! $Id$
[10068]37   !! Software governed by the CeCILL license (see ./LICENSE)
[6140]38   !!----------------------------------------------------------------------
[268]39CONTAINS
[335]40   
[616]41   SUBROUTINE trc_rst_opn( kt )
42      !!----------------------------------------------------------------------
43      !!                    ***  trc_rst_opn  ***
44      !!
45      !! ** purpose  :   output of sea-trc variable in a netcdf file
46      !!----------------------------------------------------------------------
47      INTEGER, INTENT(in) ::   kt       ! number of iteration
48      !
49      CHARACTER(LEN=20)   ::   clkt     ! ocean time-step define as a character
50      CHARACTER(LEN=50)   ::   clname   ! trc output restart file name
[5341]51      CHARACTER(LEN=256)  ::   clpath   ! full path to ocean output restart file
[616]52      !!----------------------------------------------------------------------
53      !
[7646]54      IF( l_offline ) THEN
[3294]55         IF( kt == nittrc000 ) THEN
[2528]56            lrst_trc = .FALSE.
[5341]57            IF( ln_rst_list ) THEN
58               nrst_lst = 1
59               nitrst = nstocklist( nrst_lst )
60            ELSE
61               nitrst = nitend
62            ENDIF
[2528]63         ENDIF
64
[5341]65         IF( .NOT. ln_rst_list .AND. MOD( kt - 1, nstock ) == 0 ) THEN
[3294]66            ! we use kt - 1 and not kt - nittrc000 to keep the same periodicity from the beginning of the experiment
[2528]67            nitrst = kt + nstock - 1                  ! define the next value of nitrst for restart writing
68            IF( nitrst > nitend )   nitrst = nitend   ! make sure we write a restart at the end of the run
69         ENDIF
70      ELSE
[3294]71         IF( kt == nittrc000 ) lrst_trc = .FALSE.
[1655]72      ENDIF
73
[2528]74      ! to get better performances with NetCDF format:
75      ! we open and define the tracer restart file one tracer time step before writing the data (-> at nitrst - 2*nn_dttrc + 1)
76      ! except if we write tracer restart files every tracer time step or if a tracer restart file was writen at nitend - 2*nn_dttrc + 1
[3294]77      IF( kt == nitrst - 2*nn_dttrc .OR. nstock == nn_dttrc .OR. ( kt == nitend - nn_dttrc .AND. .NOT. lrst_trc ) ) THEN
[616]78         ! beware of the format used to write kt (default is i8.8, that should be large enough)
[945]79         IF( nitrst > 1.0e9 ) THEN   ;   WRITE(clkt,*       ) nitrst
80         ELSE                        ;   WRITE(clkt,'(i8.8)') nitrst
[616]81         ENDIF
82         ! create the file
83         IF(lwp) WRITE(numout,*)
[1254]84         clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trcrst_out)
[5341]85         clpath = TRIM(cn_trcrst_outdir)
86         IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/'
87         IF(lwp) WRITE(numout,*) &
88             '             open trc restart.output NetCDF file: ',TRIM(clpath)//clname
89         CALL iom_open( TRIM(clpath)//TRIM(clname), numrtw, ldwrt = .TRUE., kiolib = jprstlib )
[616]90         lrst_trc = .TRUE.
91      ENDIF
92      !
93   END SUBROUTINE trc_rst_opn
94
[1801]95   SUBROUTINE trc_rst_read
[945]96      !!----------------------------------------------------------------------
97      !!                    ***  trc_rst_opn  ***
[335]98      !!
[945]99      !! ** purpose  :   read passive tracer fields in restart files
100      !!----------------------------------------------------------------------
[1801]101      INTEGER  ::  jn     
[1287]102
[945]103      !!----------------------------------------------------------------------
[3294]104      !
[945]105      IF(lwp) WRITE(numout,*)
[3294]106      IF(lwp) WRITE(numout,*) 'trc_rst_read : read data in the TOP restart file'
[945]107      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
[350]108
[945]109      ! READ prognostic variables and computes diagnostic variable
[494]110      DO jn = 1, jptra
[1801]111         CALL iom_get( numrtr, jpdom_autoglo, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) )
[335]112      END DO
[1077]113
[1287]114      DO jn = 1, jptra
[1801]115         CALL iom_get( numrtr, jpdom_autoglo, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) )
[1077]116      END DO
[945]117      !
118   END SUBROUTINE trc_rst_read
[494]119
[945]120   SUBROUTINE trc_rst_wri( kt )
121      !!----------------------------------------------------------------------
122      !!                    ***  trc_rst_wri  ***
[335]123      !!
[945]124      !! ** purpose  :   write passive tracer fields in restart files
125      !!----------------------------------------------------------------------
126      INTEGER, INTENT( in ) ::   kt    ! ocean time-step index
[335]127      !!
[1287]128      INTEGER  :: jn
129      REAL(wp) :: zarak0
[945]130      !!----------------------------------------------------------------------
[3294]131      !
[6140]132      CALL iom_rstput( kt, nitrst, numrtw, 'rdttrc1', rdttrc )   ! passive tracer time step
[1801]133      ! prognostic variables
134      ! --------------------
[1100]135      DO jn = 1, jptra
136         CALL iom_rstput( kt, nitrst, numrtw, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) )
137      END DO
[1077]138
[1100]139      DO jn = 1, jptra
140         CALL iom_rstput( kt, nitrst, numrtw, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) )
141      END DO
[3680]142      !
[1287]143      IF( kt == nitrst ) THEN
[1119]144          CALL trc_rst_stat            ! statistics
[1100]145          CALL iom_close( numrtw )     ! close the restart file (only at last time step)
[4990]146#if ! defined key_trdmxl_trc
[1100]147          lrst_trc = .FALSE.
[1177]148#endif
[7646]149          IF( l_offline .AND. ln_rst_list ) THEN
[5341]150             nrst_lst = nrst_lst + 1
151             nitrst = nstocklist( nrst_lst )
152          ENDIF
[1287]153      ENDIF
[945]154      !
[1801]155   END SUBROUTINE trc_rst_wri 
[268]156
[1801]157
[1287]158   SUBROUTINE trc_rst_cal( kt, cdrw )
159      !!---------------------------------------------------------------------
160      !!                   ***  ROUTINE trc_rst_cal  ***
161      !!
162      !!  ** Purpose : Read or write calendar in restart file:
163      !!
164      !!  WRITE(READ) mode:
165      !!       kt        : number of time step since the begining of the experiment at the
166      !!                   end of the current(previous) run
167      !!       adatrj(0) : number of elapsed days since the begining of the experiment at the
168      !!                   end of the current(previous) run (REAL -> keep fractions of day)
169      !!       ndastp    : date at the end of the current(previous) run (coded as yyyymmdd integer)
170      !!
171      !!   According to namelist parameter nrstdt,
[3294]172      !!       nn_rsttr = 0  no control on the date (nittrc000 is  arbitrary).
173      !!       nn_rsttr = 1  we verify that nittrc000 is equal to the last
[1287]174      !!                   time step of previous run + 1.
175      !!       In both those options, the  exact duration of the experiment
176      !!       since the beginning (cumulated duration of all previous restart runs)
[3294]177      !!       is not stored in the restart and is assumed to be (nittrc000-1)*rdt.
[1287]178      !!       This is valid is the time step has remained constant.
179      !!
[2528]180      !!       nn_rsttr = 2  the duration of the experiment in days (adatrj)
[1287]181      !!                    has been stored in the restart file.
182      !!----------------------------------------------------------------------
183      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
184      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
185      !
[3294]186      INTEGER  ::  jlibalt = jprstlib
187      LOGICAL  ::  llok
[9556]188      REAL(wp) ::  zrdttrc1, zkt, zndastp, zdayfrac, ksecs, ktime
189      INTEGER  ::   ihour, iminute
[1287]190
191      ! Time domain : restart
192      ! ---------------------
193
194      IF( TRIM(cdrw) == 'READ' ) THEN
[3294]195
196         IF(lwp) WRITE(numout,*)
197         IF(lwp) WRITE(numout,*) 'trc_rst_cal : read the TOP restart file for calendar'
198         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
199
[5513]200         IF( ln_rsttr ) THEN
201            CALL iom_open( TRIM(cn_trcrst_indir)//'/'//cn_trcrst_in, numrtr, kiolib = jlibalt )
202            CALL iom_get ( numrtr, 'kt', zkt )   ! last time-step of previous run
[3294]203
[5513]204            IF(lwp) THEN
205               WRITE(numout,*) ' *** Info read in restart : '
206               WRITE(numout,*) '   previous time-step                               : ', NINT( zkt )
207               WRITE(numout,*) ' *** restart option'
208               SELECT CASE ( nn_rsttr )
209               CASE ( 0 )   ;   WRITE(numout,*) ' nn_rsttr = 0 : no control of nittrc000'
210               CASE ( 1 )   ;   WRITE(numout,*) ' nn_rsttr = 1 : no control the date at nittrc000 (use ndate0 read in the namelist)'
211               CASE ( 2 )   ;   WRITE(numout,*) ' nn_rsttr = 2 : calendar parameters read in restart'
212               END SELECT
213               WRITE(numout,*)
214            ENDIF
215            ! Control of date
216            IF( nittrc000  - NINT( zkt ) /= nn_dttrc .AND.  nn_rsttr /= 0 )                                  &
217               &   CALL ctl_stop( ' ===>>>> : problem with nittrc000 for the restart',                 &
218               &                  ' verify the restart file or rerun with nn_rsttr = 0 (namelist)' )
[1287]219         ENDIF
[5513]220         !
[7646]221         IF( l_offline ) THEN   
[5504]222            !                                          ! set the date in offline mode
223            IF( ln_rsttr .AND. nn_rsttr == 2 ) THEN
[9556]224               CALL iom_get( numrtr, 'ndastp', zndastp )
[2528]225               ndastp = NINT( zndastp )
226               CALL iom_get( numrtr, 'adatrj', adatrj  )
[9556]227               CALL iom_get( numrtr, 'ntime' , ktime   )
228               nn_time0=INT(ktime)
229               ! calculate start time in hours and minutes
230               zdayfrac=adatrj-INT(adatrj)
231               ksecs = NINT(zdayfrac*86400)            ! Nearest second to catch rounding errors in adatrj             
232               ihour = INT(ksecs/3600)
233               iminute = ksecs/60-ihour*60
234               
235               ! Add to nn_time0
236               nhour   =   nn_time0 / 100
237               nminute = ( nn_time0 - nhour * 100 )
238               nminute=nminute+iminute
239               
240               IF( nminute >= 60 ) THEN
241                  nminute=nminute-60
242                  nhour=nhour+1
243               ENDIF
244               nhour=nhour+ihour
245               IF( nhour >= 24 ) THEN
246                  nhour=nhour-24
247                  adatrj=adatrj+1
248               ENDIF           
249               nn_time0 = nhour * 100 + nminute
250               adatrj = INT(adatrj)                    ! adatrj set to integer as nn_time0 updated           
[5504]251             ELSE
[9556]252               ! parameters corresponding to nit000 - 1 (as we start the step
253               ! loop with a call to day)
254               ndastp = ndate0        ! ndate0 read in the namelist in dom_nam
255               nhour   =   nn_time0 / 100
256               nminute = ( nn_time0 - nhour * 100 )
257               IF( nhour*3600+nminute*60-ndt05 .lt. 0 )  ndastp=ndastp-1      ! Start hour is specified in the namelist (default 0)
258               adatrj = ( REAL( nit000-1, wp ) * rdt ) / rday
[2528]259               ! note this is wrong if time step has changed during run
260            ENDIF
[9556]261            IF( ABS(adatrj  - REAL(NINT(adatrj),wp)) < 0.1 / rday )   adatrj = REAL(NINT(adatrj),wp)   ! avoid truncation error
[2528]262            !
263            IF(lwp) THEN
264              WRITE(numout,*) ' *** Info used values : '
265              WRITE(numout,*) '   date ndastp                                      : ', ndastp
266              WRITE(numout,*) '   number of elapsed days since the begining of run : ', adatrj
[9556]267              WRITE(numout,*) '   nn_time0                                         : ', nn_time0
[2528]268              WRITE(numout,*)
269            ENDIF
270            !
[5504]271            IF( ln_rsttr )  THEN   ;    neuler = 1
272            ELSE                   ;    neuler = 0
273            ENDIF
274            !
[2528]275            CALL day_init          ! compute calendar
276            !
[1287]277         ENDIF
278         !
279      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
280         !
281         IF(  kt == nitrst ) THEN
282            IF(lwp) WRITE(numout,*)
283            IF(lwp) WRITE(numout,*) 'trc_wri : write the TOP restart file (NetCDF) at it= ', kt, ' date= ', ndastp
284            IF(lwp) WRITE(numout,*) '~~~~~~~'
285         ENDIF
286         CALL iom_rstput( kt, nitrst, numrtw, 'kt'     , REAL( kt    , wp) )   ! time-step
287         CALL iom_rstput( kt, nitrst, numrtw, 'ndastp' , REAL( ndastp, wp) )   ! date
288         CALL iom_rstput( kt, nitrst, numrtw, 'adatrj' , adatrj            )   ! number of elapsed days since
289         !                                                                     ! the begining of the run [s]
[9556]290         CALL iom_rstput( kt, nitrst, numrtw, 'ntime'  , REAL( nn_time0, wp)) ! time
[1287]291      ENDIF
292
293   END SUBROUTINE trc_rst_cal
294
[1119]295
296   SUBROUTINE trc_rst_stat
297      !!----------------------------------------------------------------------
298      !!                    ***  trc_rst_stat  ***
299      !!
300      !! ** purpose  :   Compute tracers statistics
301      !!----------------------------------------------------------------------
[7753]302      INTEGER  :: jk, jn
[3294]303      REAL(wp) :: ztraf, zmin, zmax, zmean, zdrift
[5385]304      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zvol
[1119]305      !!----------------------------------------------------------------------
306
307      IF( lwp ) THEN
308         WRITE(numout,*) 
309         WRITE(numout,*) '           ----TRACER STAT----             '
310         WRITE(numout,*) 
311      ENDIF
[3294]312      !
[5385]313      DO jk = 1, jpk
[7753]314         zvol(:,:,jk) = e1e2t(:,:) * e3t_a(:,:,jk) * tmask(:,:,jk)
[5385]315      END DO
316      !
[1119]317      DO jn = 1, jptra
[10314]318         ztraf = glob_sum( 'trcrst', trn(:,:,:,jn) * zvol(:,:,:) )
[3294]319         zmin  = MINVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
320         zmax  = MAXVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
[1119]321         IF( lk_mpp ) THEN
[10297]322            CALL mpp_min( 'trcrst', zmin )      ! min over the global domain
323            CALL mpp_max( 'trcrst', zmax )      ! max over the global domain
[1119]324         END IF
[3294]325         zmean  = ztraf / areatot
326         zdrift = ( ( ztraf - trai(jn) ) / ( trai(jn) + 1.e-12 )  ) * 100._wp
327         IF(lwp) WRITE(numout,9000) jn, TRIM( ctrcnm(jn) ), zmean, zmin, zmax, zdrift
[1119]328      END DO
[7055]329      IF(lwp) WRITE(numout,*) 
[3294]3309000  FORMAT(' tracer nb :',i2,'    name :',a10,'    mean :',e18.10,'    min :',e18.10, &
331      &      '    max :',e18.10,'    drift :',e18.10, ' %')
332      !
[1119]333   END SUBROUTINE trc_rst_stat
334
[268]335#else
[945]336   !!----------------------------------------------------------------------
337   !!  Dummy module :                                     No passive tracer
338   !!----------------------------------------------------------------------
[335]339CONTAINS
[945]340   SUBROUTINE trc_rst_read                      ! Empty routines
[616]341   END SUBROUTINE trc_rst_read
[945]342   SUBROUTINE trc_rst_wri( kt )
[335]343      INTEGER, INTENT ( in ) :: kt
[616]344      WRITE(*,*) 'trc_rst_wri: You should not have seen this print! error?', kt
[945]345   END SUBROUTINE trc_rst_wri   
[268]346#endif
[945]347
[2528]348   !!----------------------------------------------------------------------
[10067]349   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[5341]350   !! $Id$
[10068]351   !! Software governed by the CeCILL license (see ./LICENSE)
[945]352   !!======================================================================
[335]353END MODULE trcrst
Note: See TracBrowser for help on using the repository browser.