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/NEMOGCM/NEMO/TOP_SRC – NEMO

source: trunk/NEMOGCM/NEMO/TOP_SRC/trcrst.F90 @ 2528

Last change on this file since 2528 was 2528, checked in by rblod, 13 years ago

Update NEMOGCM from branch nemo_v3_3_beta

  • Property svn:keywords set to Id
File size: 15.4 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   !!----------------------------------------------------------------------
16   !!   trc_rst :   Restart for passive tracer
17   !!----------------------------------------------------------------------
18   !!----------------------------------------------------------------------
19   !!   'key_top'                                                TOP models
20   !!----------------------------------------------------------------------
[945]21   !!   trc_rst_opn    : open  restart file
22   !!   trc_rst_read   : read  restart file
23   !!   trc_rst_wri    : write restart file
24   !!----------------------------------------------------------------------
[335]25   USE oce_trc
26   USE trc
[2528]27   USE trcnam_trp
[433]28   USE lib_mpp
[2528]29   USE lib_fortran
[616]30   USE iom
[1801]31   USE trcrst_cfc      ! CFC     
32   USE trcrst_lobster  ! LOBSTER  restart
33   USE trcrst_pisces   ! PISCES   restart
34   USE trcrst_c14b     ! C14 bomb restart
35   USE trcrst_my_trc   ! MY_TRC   restart
[2528]36   USE daymod
[335]37   IMPLICIT NONE
38   PRIVATE
[1801]39
[945]40   PUBLIC   trc_rst_opn       ! called by ???
41   PUBLIC   trc_rst_read      ! called by ???
42   PUBLIC   trc_rst_wri       ! called by ???
[1801]43
[616]44   INTEGER, PUBLIC ::   numrtr, numrtw   !: logical unit for trc restart (read and write)
[350]45
46   !! * Substitutions
[945]47#  include "top_substitute.h90"
[335]48   
[268]49CONTAINS
[335]50   
[616]51   SUBROUTINE trc_rst_opn( kt )
52      !!----------------------------------------------------------------------
53      !!                    ***  trc_rst_opn  ***
54      !!
55      !! ** purpose  :   output of sea-trc variable in a netcdf file
56      !!----------------------------------------------------------------------
57      INTEGER, INTENT(in) ::   kt       ! number of iteration
58      !
59      CHARACTER(LEN=20)   ::   clkt     ! ocean time-step define as a character
60      CHARACTER(LEN=50)   ::   clname   ! trc output restart file name
61      !!----------------------------------------------------------------------
62      !
[2528]63      IF( lk_offline ) THEN
64         IF( kt == nit000 ) THEN
65            lrst_trc = .FALSE.
66            nitrst = nitend
67         ENDIF
68
69         IF( MOD( kt - 1, nstock ) == 0 ) THEN
70            ! we use kt - 1 and not kt - nit000 to keep the same periodicity from the beginning of the experiment
71            nitrst = kt + nstock - 1                  ! define the next value of nitrst for restart writing
72            IF( nitrst > nitend )   nitrst = nitend   ! make sure we write a restart at the end of the run
73         ENDIF
74      ELSE
75         IF( kt == nit000 ) lrst_trc = .FALSE.
[1655]76      ENDIF
77
[2528]78      ! to get better performances with NetCDF format:
79      ! we open and define the tracer restart file one tracer time step before writing the data (-> at nitrst - 2*nn_dttrc + 1)
80      ! 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
81      IF( kt == nitrst - 2*nn_dttrc + 1 .OR. nstock == nn_dttrc .OR. ( kt == nitend - nn_dttrc + 1 .AND. .NOT. lrst_trc ) ) THEN
[616]82         ! beware of the format used to write kt (default is i8.8, that should be large enough)
[945]83         IF( nitrst > 1.0e9 ) THEN   ;   WRITE(clkt,*       ) nitrst
84         ELSE                        ;   WRITE(clkt,'(i8.8)') nitrst
[616]85         ENDIF
86         ! create the file
87         IF(lwp) WRITE(numout,*)
[1254]88         clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trcrst_out)
[616]89         IF(lwp) WRITE(numout,*) '             open trc restart.output NetCDF file: '//clname
90         CALL iom_open( clname, numrtw, ldwrt = .TRUE., kiolib = jprstlib )
91         lrst_trc = .TRUE.
92      ENDIF
93      !
94   END SUBROUTINE trc_rst_opn
95
[1801]96   SUBROUTINE trc_rst_read
[945]97      !!----------------------------------------------------------------------
98      !!                    ***  trc_rst_opn  ***
[335]99      !!
[945]100      !! ** purpose  :   read passive tracer fields in restart files
101      !!----------------------------------------------------------------------
[1801]102      INTEGER  ::  jn     
[1473]103      INTEGER  ::  jlibalt = jprstlib
104      LOGICAL  ::  llok
[1287]105
[945]106      !!----------------------------------------------------------------------
[268]107
[945]108      IF(lwp) WRITE(numout,*)
109      IF(lwp) WRITE(numout,*) 'trc_rst_read : read the TOP restart file'
110      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
[350]111
[1473]112      IF ( jprstlib == jprstdimg ) THEN
113        ! eventually read netcdf file (monobloc)  for restarting on different number of processors
[1801]114        ! if {cn_trcrst_in}.nc exists, then set jlibalt to jpnf90
[1473]115        INQUIRE( FILE = TRIM(cn_trcrst_in)//'.nc', EXIST = llok )
[1801]116        IF ( llok ) THEN ; jlibalt = jpnf90  ; ELSE ; jlibalt = jprstlib ; ENDIF
[1473]117      ENDIF
[1287]118
[1801]119      CALL iom_open( cn_trcrst_in, numrtr, kiolib = jlibalt ) 
120
[1287]121      ! Time domain : restart
122      ! ---------------------
[2528]123      CALL trc_rst_cal( nit000, 'READ' )   ! calendar
[1287]124
[945]125      ! READ prognostic variables and computes diagnostic variable
[494]126      DO jn = 1, jptra
[1801]127         CALL iom_get( numrtr, jpdom_autoglo, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) )
[335]128      END DO
[1077]129
[1287]130      DO jn = 1, jptra
[1801]131         CALL iom_get( numrtr, jpdom_autoglo, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) )
[1077]132      END DO
133
[1801]134      IF( lk_lobster )   CALL trc_rst_read_lobster( numrtr )      ! LOBSTER bio-model
135      IF( lk_pisces  )   CALL trc_rst_read_pisces ( numrtr )      ! PISCES  bio-model
136      IF( lk_cfc     )   CALL trc_rst_read_cfc    ( numrtr )      ! CFC     tracers
137      IF( lk_c14b    )   CALL trc_rst_read_c14b   ( numrtr )      ! C14 bomb  tracer
138      IF( lk_my_trc  )   CALL trc_rst_read_my_trc ( numrtr )      ! MY_TRC  tracers
139
[616]140      CALL iom_close( numrtr )
[945]141      !
142   END SUBROUTINE trc_rst_read
[494]143
[945]144   SUBROUTINE trc_rst_wri( kt )
145      !!----------------------------------------------------------------------
146      !!                    ***  trc_rst_wri  ***
[335]147      !!
[945]148      !! ** purpose  :   write passive tracer fields in restart files
149      !!----------------------------------------------------------------------
150      INTEGER, INTENT( in ) ::   kt    ! ocean time-step index
[335]151      !!
[1287]152      INTEGER  :: jn
153      REAL(wp) :: zarak0
[945]154      !!----------------------------------------------------------------------
[268]155
156
[1287]157      CALL trc_rst_cal( kt, 'WRITE' )   ! calendar
[2528]158      CALL iom_rstput( kt, nitrst, numrtw, 'rdttrc1', rdttrc(1) )   ! surface passive tracer time step
[1801]159      ! prognostic variables
160      ! --------------------
[1100]161      DO jn = 1, jptra
162         CALL iom_rstput( kt, nitrst, numrtw, 'TRN'//ctrcnm(jn), trn(:,:,:,jn) )
163      END DO
[1077]164
[1100]165      DO jn = 1, jptra
166         CALL iom_rstput( kt, nitrst, numrtw, 'TRB'//ctrcnm(jn), trb(:,:,:,jn) )
167      END DO
[268]168
[1801]169      IF( lk_lobster )   CALL trc_rst_wri_lobster( kt, nitrst, numrtw )      ! LOBSTER bio-model
170      IF( lk_pisces  )   CALL trc_rst_wri_pisces ( kt, nitrst, numrtw )      ! PISCES  bio-model
171      IF( lk_cfc     )   CALL trc_rst_wri_cfc    ( kt, nitrst, numrtw )      ! CFC     tracers
172      IF( lk_c14b    )   CALL trc_rst_wri_c14b   ( kt, nitrst, numrtw )      ! C14 bomb  tracer
173      IF( lk_my_trc  )   CALL trc_rst_wri_my_trc ( kt, nitrst, numrtw )      ! MY_TRC  tracers
174
[1287]175      IF( kt == nitrst ) THEN
[1119]176          CALL trc_rst_stat            ! statistics
[1100]177          CALL iom_close( numrtw )     ! close the restart file (only at last time step)
[1177]178#if ! defined key_trdmld_trc
[1100]179          lrst_trc = .FALSE.
[1177]180#endif
[1287]181      ENDIF
[945]182      !
[1801]183   END SUBROUTINE trc_rst_wri 
[268]184
[1801]185
[1287]186   SUBROUTINE trc_rst_cal( kt, cdrw )
187      !!---------------------------------------------------------------------
188      !!                   ***  ROUTINE trc_rst_cal  ***
189      !!
190      !!  ** Purpose : Read or write calendar in restart file:
191      !!
192      !!  WRITE(READ) mode:
193      !!       kt        : number of time step since the begining of the experiment at the
194      !!                   end of the current(previous) run
195      !!       adatrj(0) : number of elapsed days since the begining of the experiment at the
196      !!                   end of the current(previous) run (REAL -> keep fractions of day)
197      !!       ndastp    : date at the end of the current(previous) run (coded as yyyymmdd integer)
198      !!
199      !!   According to namelist parameter nrstdt,
[2528]200      !!       nn_rsttr = 0  no control on the date (nit000 is  arbitrary).
201      !!       nn_rsttr = 1  we verify that nit000 is equal to the last
[1287]202      !!                   time step of previous run + 1.
203      !!       In both those options, the  exact duration of the experiment
204      !!       since the beginning (cumulated duration of all previous restart runs)
205      !!       is not stored in the restart and is assumed to be (nit000-1)*rdt.
206      !!       This is valid is the time step has remained constant.
207      !!
[2528]208      !!       nn_rsttr = 2  the duration of the experiment in days (adatrj)
[1287]209      !!                    has been stored in the restart file.
210      !!----------------------------------------------------------------------
211      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
212      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
213      !
[2528]214      REAL(wp) ::  zkt, zrdttrc1
[1287]215      REAL(wp) ::  zndastp
216
217      ! Time domain : restart
218      ! ---------------------
219
220      IF( TRIM(cdrw) == 'READ' ) THEN
221         CALL iom_get ( numrtr, 'kt', zkt )   ! last time-step of previous run
222         IF(lwp) THEN
223            WRITE(numout,*) ' *** Info read in restart : '
224            WRITE(numout,*) '   previous time-step                               : ', NINT( zkt )
225            WRITE(numout,*) ' *** restart option'
[2528]226            SELECT CASE ( nn_rsttr )
227            CASE ( 0 )   ;   WRITE(numout,*) ' nn_rsttr = 0 : no control of nit000'
228            CASE ( 1 )   ;   WRITE(numout,*) ' nn_rsttr = 1 : no control the date at nit000 (use ndate0 read in the namelist)'
229            CASE ( 2 )   ;   WRITE(numout,*) ' nn_rsttr = 2 : calendar parameters read in restart'
[1287]230            END SELECT
231            WRITE(numout,*)
232         ENDIF
233         ! Control of date
[2528]234         IF( nit000  - NINT( zkt ) /= 1 .AND.  nn_rsttr /= 0 )                                  &
[1287]235            &   CALL ctl_stop( ' ===>>>> : problem with nit000 for the restart',                 &
[2528]236            &                  ' verify the restart file or rerun with nn_rsttr = 0 (namelist)' )
237         IF( lk_offline ) THEN      ! set the date in offline mode
238            ! Check dynamics and tracer time-step consistency and force Euler restart if changed
239            IF( iom_varid( numrtr, 'rdttrc1', ldstop = .FALSE. ) > 0 )   THEN
240               CALL iom_get( numrtr, 'rdttrc1', zrdttrc1 )
241               IF( zrdttrc1 /= rdttrc(1) )   neuler = 0
242            ENDIF
243            !                          ! define ndastp and adatrj
244            IF ( nn_rsttr == 2 ) THEN
245               CALL iom_get( numrtr, 'ndastp', zndastp ) 
246               ndastp = NINT( zndastp )
247               CALL iom_get( numrtr, 'adatrj', adatrj  )
248            ELSE
249               ndastp = ndate0 - 1     ! ndate0 read in the namelist in dom_nam
250               adatrj = ( REAL( nit000-1, wp ) * rdttra(1) ) / rday
251               ! note this is wrong if time step has changed during run
252            ENDIF
253            !
254            IF(lwp) THEN
255              WRITE(numout,*) ' *** Info used values : '
256              WRITE(numout,*) '   date ndastp                                      : ', ndastp
257              WRITE(numout,*) '   number of elapsed days since the begining of run : ', adatrj
258              WRITE(numout,*)
259            ENDIF
260            !
261            CALL day_init          ! compute calendar
262            !
[1287]263         ENDIF
264         !
265      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
266         !
267         IF(  kt == nitrst ) THEN
268            IF(lwp) WRITE(numout,*)
269            IF(lwp) WRITE(numout,*) 'trc_wri : write the TOP restart file (NetCDF) at it= ', kt, ' date= ', ndastp
270            IF(lwp) WRITE(numout,*) '~~~~~~~'
271         ENDIF
272         CALL iom_rstput( kt, nitrst, numrtw, 'kt'     , REAL( kt    , wp) )   ! time-step
273         CALL iom_rstput( kt, nitrst, numrtw, 'ndastp' , REAL( ndastp, wp) )   ! date
274         CALL iom_rstput( kt, nitrst, numrtw, 'adatrj' , adatrj            )   ! number of elapsed days since
275         !                                                                     ! the begining of the run [s]
276      ENDIF
277
278   END SUBROUTINE trc_rst_cal
279
[1119]280
281   SUBROUTINE trc_rst_stat
282      !!----------------------------------------------------------------------
283      !!                    ***  trc_rst_stat  ***
284      !!
285      !! ** purpose  :   Compute tracers statistics
286      !!----------------------------------------------------------------------
287
[2528]288      INTEGER  :: jn
[1119]289      REAL(wp) :: zdiag_var, zdiag_varmin, zdiag_varmax, zdiag_tot
[2528]290      REAL(wp) :: zder
[1119]291      !!----------------------------------------------------------------------
292
293
294      IF( lwp ) THEN
295         WRITE(numout,*) 
296         WRITE(numout,*) '           ----TRACER STAT----             '
297         WRITE(numout,*) 
298      ENDIF
299     
300      zdiag_tot = 0.e0
301      DO jn = 1, jptra
[2528]302#  if defined key_degrad
303         zdiag_var = glob_sum( trn(:,:,:,jn) * cvol(:,:,:) * facvol(:,:,:) )
304#  else
305         zdiag_var = glob_sum( trn(:,:,:,jn) * cvol(:,:,:)  )
[1254]306#  endif
[1119]307         zdiag_varmin = MINVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
308         zdiag_varmax = MAXVAL( trn(:,:,:,jn), mask= ((tmask*SPREAD(tmask_i,DIM=3,NCOPIES=jpk).NE.0.)) )
309         IF( lk_mpp ) THEN
310            CALL mpp_min( zdiag_varmin )      ! min over the global domain
311            CALL mpp_max( zdiag_varmax )      ! max over the global domain
312         END IF
313         zdiag_tot = zdiag_tot + zdiag_var
314         zdiag_var = zdiag_var / areatot
315         IF(lwp) WRITE(numout,*) '   MEAN NO ', jn, ctrcnm(jn), ' = ', zdiag_var,   &
316            &                    ' MIN = ', zdiag_varmin, ' MAX = ', zdiag_varmax
317      END DO
318     
319      zder = ( ( zdiag_tot - trai ) / ( trai + 1.e-12 )  ) * 100._wp
320      IF(lwp) WRITE(numout,*) '   Integral of all tracers over the full domain  = ', zdiag_tot
321      IF(lwp) WRITE(numout,*) '   Drift of the sum of all tracers =', zder, ' %'
322     
323   END SUBROUTINE trc_rst_stat
324
[268]325#else
[945]326   !!----------------------------------------------------------------------
327   !!  Dummy module :                                     No passive tracer
328   !!----------------------------------------------------------------------
[335]329CONTAINS
[945]330   SUBROUTINE trc_rst_read                      ! Empty routines
[616]331   END SUBROUTINE trc_rst_read
[945]332   SUBROUTINE trc_rst_wri( kt )
[335]333      INTEGER, INTENT ( in ) :: kt
[616]334      WRITE(*,*) 'trc_rst_wri: You should not have seen this print! error?', kt
[945]335   END SUBROUTINE trc_rst_wri   
[268]336#endif
[945]337
[2528]338   !!----------------------------------------------------------------------
339   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
340   !! $Id$
341   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
[945]342   !!======================================================================
[335]343END MODULE trcrst
Note: See TracBrowser for help on using the repository browser.