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 @ 350

Last change on this file since 350 was 350, checked in by opalod, 18 years ago

nemo_v1_update_032:RB: update restart routines ; update control for cfc

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.4 KB
Line 
1MODULE trcrst
2   !!======================================================================
3   !!
4   !!                       *** MODULE trcrst ***
5   !!
6   !!   Read the restart files for passive tracers
7   !!
8   !!======================================================================
9   !!  TOP 1.0,  LOCEAN-IPSL (2005)
10   !! $Header$
11   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
12   !!----------------------------------------------------------------------
13#if defined key_passivetrc   
14   !!----------------------------------------------------------------------
15   !! * Modules used
16   !! ==============
17   USE oce_trc
18   USE trc
19   USE sms
20   USE trctrp_lec   
21   
22   IMPLICIT NONE
23   PRIVATE
24   
25   !! * Accessibility
26   PUBLIC trc_rst
27   PUBLIC trc_wri
28   
29   !! * Module variables
30   CHARACTER (len=48) ::   &
31      trestart = 'initial.trc.nc'   ! restart file name
32
33   !! * Substitutions
34#  include "passivetrc_substitute.h90"
35   
36CONTAINS
37
38#if defined key_fdir
39   !!----------------------------------------------------------------------
40   !!   'key_fdir'                                       direct access file
41   !!----------------------------------------------------------------------
42#include "trcrst_fdir.h90"
43   
44#else
45
46   SUBROUTINE trc_rst 
47      !!===========================================================================================
48      !!
49      !!                       ROUTINE trc_rst
50      !!                     *******************
51      !!
52      !!  PURPOSE :
53      !!  ---------
54      !!     READ files for restart for passive tracer
55      !!
56      !!   METHOD :
57      !!   -------
58      !!      READ the previous fields on the FILE nutrst
59      !!      the first record indicates previous characterics
60      !!      after control with the present run, we READ :
61      !!      - prognostic variables on the second and more record
62      !!
63      !!   History:
64      !!   --------
65      !!  original  : 96-11
66      !!  00-05 (A. Estublier) TVD Limiter Scheme key_trc_tvd
67      !!  00-12 (O. Aumont, E. Kestenare) read restart file for sediments
68      !!  01-05 (O. Aumont, E. Kestenare) read restart file for calcite and silicate sediments
69      !!  05-03 (O. Aumont and A. El Moussaoui) F90           
70      !!------------------------------------------------------------------------
71      !! * Modules used
72      USE ioipsl
73
74
75      !! local declarations
76      !! ==================
77      LOGICAL ::  llog       !!!
78      CHARACTER (len=32) :: clname1,clname2
79      CHARACTER (len=32) :: clname = 'restart.trc'
80      CHARACTER (len=12) :: clvnames(80) 
81
82      INTEGER :: ino1,jn,iarak0,iarak1,          &
83         ji, jj, jk,                   &
84         itime, ibvar
85      REAL(wp) :: caralk,bicarb,zdt,        &     
86         zdate0
87      REAL(wp) ::   zdept(jpk), zlamt(jpi,jpj), zphit(jpi,jpj)
88
89      REAL(wp), DIMENSION(3) :: zinfo
90
91#if defined key_trc_pisces && ( defined key_orca_r4 || defined key_orca_r2 || defined key_orca_r05 || defined key_orca_r025 )
92      REAL(wp) , DIMENSION(jpi,jpj,jpk) ::   zvolk     
93      REAL(wp) ::   zareatot, zpo4tot
94#endif
95
96      !!---------------------------------------------------------------------
97      !!  OPA.9 03-2005 
98      !!---------------------------------------------------------------------
99      !! 0. initialisations
100      !!------------------
101
102
103      IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN
104         iarak0 = 1
105      ELSE
106         iarak0=0
107      ENDIF
108
109
110      IF(lwp) WRITE(numout,*) ' '
111      IF(lwp) WRITE(numout,*) ' *** trc_rst beginning of restart for'
112      IF(lwp) WRITE(numout,*) ' passive tracer'
113      IF(lwp) WRITE(numout,*) ' the present run :'
114      IF(lwp) WRITE(numout,*) '   number job is  : ',no
115      IF(lwp) WRITE(numout,*) '   with the time nit000 : ',nit000
116      IF(lwp) THEN
117         IF(iarak0.eq.1) then
118            WRITE(numout,*) '   and before fields for Arakawa sheme '
119         ENDIF
120         WRITE(numout,*) ' '
121      ENDIF
122
123      ! Time domain : restart
124      ! -------------------------
125
126      IF(lwp) WRITE(numout,*)
127      IF(lwp) WRITE(numout,*)
128      IF(lwp) WRITE(numout,*) ' *** passive tracer restart option'
129      SELECT CASE ( nrsttr )
130      CASE ( 0 )
131         IF(lwp) WRITE(numout,*) ' nrsttr = 0 no control of nit000'
132      CASE ( 1 )
133         IF(lwp) WRITE(numout,*) ' nrsttr = 1 we control the date of nit000'
134      CASE ( 2 )
135         IF(lwp) WRITE(numout,*) ' nrsttr = 2 the date adatrj is read in restart file'
136      CASE DEFAULT
137         IF(lwp) WRITE(numout,*) '  ===>>>> nrsttr not equal 0, 1 or 2 : no control of the date'
138         IF(lwp) WRITE(numout,*) ' =======                   ========='
139      END SELECT
140
141
142      !! 1. READ nutrst
143      !! --------------
144      !! ... first information
145      !! ---------------------
146      itime=0
147      llog=.false.           !!!
148      zlamt(:,:) = 0.e0
149      zphit(:,:) = 0.e0
150      zdept(:)   = 0.e0
151      CALL restini(clname,jpi,jpj,zlamt,zphit,jpk,zdept,clname         & 
152         &           ,itime,zdate0,zdt,nutrst)
153
154      CALL ioget_vname(nutrst, ibvar, clvnames)
155      CALL restget(nutrst,'info',1,1,3,0,llog,zinfo)
156      ino1  = nint(zinfo(1))
157      iarak1 = nint(zinfo(3))
158
159      IF(lwp) WRITE(numout,*) ' '
160      IF(lwp) WRITE(numout,*) ' READ nutrst with '
161      IF(lwp) WRITE(numout,*) '   number job is  : ',ino1
162      IF(lwp) WRITE(numout,*) '   with the time it : ',nint(zinfo(2))
163      IF(lwp) THEN
164         IF(iarak1.eq.1) then
165            WRITE(numout,*) '   and before fields for Arakawa sheme '
166         ENDIF
167      ENDIF
168      IF(lwp) WRITE(numout,*) '   number of variables   : ', ibvar
169      IF(lwp) WRITE(numout,*) '   NetCDF variables      : '
170      IF(lwp) WRITE(numout,*) ' ',clvnames (:ibvar)
171      IF(lwp) WRITE(numout,*) ' '
172
173      !! 1.2 control of date
174      !! -------------------
175
176      IF( nit000- NINT( zinfo(2) ) /= 1 .AND. nrsttr /= 0 ) THEN
177         IF(lwp) THEN
178            WRITE(numout,*) ' ===>>>> : problem with nit000 for the',    & 
179               ' passive tracer restart'
180            WRITE(numout,*) ' =======                              ',    &   
181               ' ======================'
182            WRITE(numout,*) ' we stop. verify the FILE'
183            WRITE(numout,*) ' or rerun with the value  0 for the'
184            WRITE(numout,*) ' control of time PARAMETER   nrstdt'
185            WRITE(numout,*) ' '
186         ENDIF
187         STOP 'trc_rst'       !!
188      ENDIF
189
190      !! 1.3 Control of the sheme
191      !! ------------------------
192
193      IF(iarak0.ne.iarak1) THEN
194         IF(lwp) THEN
195            WRITE(numout,*) ' ===>>>> : problem with the',       &   
196               ' passive tracer restart file'
197            WRITE(numout,*) ' =======                              ',        & 
198               ' ==========================='
199            WRITE(numout,*) ' we stop. verify the FILE'
200            WRITE(numout,*) ' before field required IF 1=',iarak0
201            WRITE(numout,*) ' before field present in file IF 1=',           & 
202               iarak1
203            WRITE(numout,*) ' '
204         ENDIF
205         STOP 'trc_rst'       !!!!!    AVERIFIER AU NIV F90'
206      ENDIF
207
208
209      !! ... READ prognostic variables and computes diagnostic variable
210      !! ---------------------------------------------------------------
211
212      DO jn=1,jptra
213         clname='TRN'//ctrcnm(jn)
214         CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trn(:,:,:,jn))
215      END DO
216
217      DO jn=1,jptra
218         clname='TRB'//ctrcnm(jn)
219         CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trb(:,:,:,jn))
220      END DO
221
222
223#if defined key_trc_lobster1
224      clname='SEDB'//ctrcnm(jpdet)
225      clname1='SEDN'//ctrcnm(jpdet)
226      CALL restget(nutrst,clname,jpi,jpj,1,0,llog,sedpocb(:,:))
227      CALL restget(nutrst,clname1,jpi,jpj,1,0,llog,sedpocn(:,:))
228#elif defined key_trc_pisces
229      clname='Silicalim'
230      CALL restget(nutrst,clname,jpi,jpj,1,0,llog,xksi)
231      xksimax=xksi
232
233      clname='SED'//ctrcnm(jppoc)
234      clname1='SED'//ctrcnm(jpcal)
235      clname2='SED'//ctrcnm(jpsil)
236      CALL restget(nutrst,clname1,jpi,jpj,1,0,llog,sedcal(:,:))
237      CALL restget(nutrst,clname2,jpi,jpj,1,0,llog,sedsil(:,:))
238      CALL restget(nutrst,clname,jpi,jpj,1,0,llog,sedpoc(:,:))
239
240#elif defined key_cfc
241      clname='qint'
242      CALL restget(nutrst,clname,jpi,jpj,jptra,0,llog,qint(:,:,:))
243      clname1='qtr'
244      CALL restget(nutrst,clname1,jpi,jpj,jptra,0,llog,qtr(:,:,:))         
245#endif
246
247#if defined key_trc_pisces 
248
249#if defined key_orca_r4 || defined key_orca_r2 || defined key_orca_r05 || defined key_orca_r025
250
251      zvolk(:,:,:) = 0.
252      zareatot     = 0.
253      DO jk = 1, jpkm1
254         DO jj = 2, jpjm1
255            DO ji = 2, jpim1
256               zvolk(ji,jj,jk) = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk)
257               zareatot        = zareatot + zvolk(ji,jj,jk)
258            ENDDO
259         ENDDO
260      ENDDO
261
262
263      zpo4tot = 0.
264      DO jk = 1, jpkm1
265         DO jj = 2, jpjm1
266            DO ji = 2, jpim1
267               zpo4tot = zpo4tot + trn(ji,jj,jk,jptal) * zvolk(ji,jj,jk)
268            END DO
269         END DO
270      END DO
271
272      WRITE(0,*) 'TALK moyen ', zpo4tot/zareatot*1E6
273      zpo4tot = zpo4tot/zareatot*1E6
274      trn(:,:,:,jptal) = trn(:,:,:,jptal)*2391./zpo4tot
275
276
277      zpo4tot = 0.
278      DO jk = 1, jpkm1
279         DO jj = 2, jpjm1
280            DO ji = 2, jpim1
281               zpo4tot = zpo4tot + trn(ji,jj,jk,jppo4) * zvolk(ji,jj,jk)
282            END DO
283         END DO
284      END DO
285
286      WRITE(0,*) 'PO4 moyen ', zpo4tot/zareatot*1E6/122.
287      zpo4tot = zpo4tot/zareatot*1E6/122.
288      trn(:,:,:,jppo4) = trn(:,:,:,jppo4)*2.165/zpo4tot
289
290
291      zpo4tot = 0.
292      DO jk = 1, jpkm1
293         DO jj = 2, jpjm1
294            DO ji = 2, jpim1
295               zpo4tot = zpo4tot + trn(ji,jj,jk,jpno3) * zvolk(ji,jj,jk)
296            END DO
297         END DO
298      END DO
299
300      WRITE(0,*) 'NO3 moyen ', zpo4tot/zareatot*1E6/7.6
301      zpo4tot = zpo4tot/zareatot*1E6/7.6
302      trn(:,:,:,jpno3) = trn(:,:,:,jpno3)*30.9/zpo4tot
303
304      zpo4tot = 0.
305      DO jk = 1, jpkm1
306         DO jj = 2, jpjm1
307            DO ji = 2, jpim1
308               zpo4tot = zpo4tot + trn(ji,jj,jk,jpsil) * zvolk(ji,jj,jk)
309            END DO
310         END DO
311      END DO
312
313      WRITE(0,*) 'SiO3 moyen ', zpo4tot/zareatot*1E6
314      zpo4tot = zpo4tot/zareatot*1E6
315      trn(:,:,:,jpsil) = MIN( 400E-6,trn(:,:,:,jpsil)*91.51/zpo4tot) 
316
317#endif
318      !!  Initialization of chemical variables of the carbon cycle
319      !!  --------------------------------------------------------
320      DO jk = 1,jpk
321         DO jj = 1,jpj
322            DO ji = 1,jpi
323               caralk = trn(ji,jj,jk,jptal)-       &
324                  &        borat(ji,jj,jk)/(1.+1.E-8/(rtrn+akb3(ji,jj,jk)))
325               co3(ji,jj,jk)=(caralk-trn(ji,jj,jk,jpdic))*tmask(ji,jj,jk)   &
326                  &        +(1.-tmask(ji,jj,jk))*.5e-3
327               bicarb = (2.*trn(ji,jj,jk,jpdic)-caralk)
328               hi(ji,jj,jk) = (ak23(ji,jj,jk)*bicarb/co3(ji,jj,jk))     &
329                  &  *tmask(ji,jj,jk)+(1.-tmask(ji,jj,jk))*1.e-9
330               h2co3(ji,jj) = 1.e-5
331            ENDDO
332         ENDDO
333      ENDDO
334#endif
335
336   END SUBROUTINE trc_rst
337
338   SUBROUTINE trc_wri(kt)
339      !! ==================================================================================
340      !!
341      !!                       ROUTINE trc_wri
342      !!                     ******************
343      !!
344      !!  PURPOSE :
345      !!  ---------
346      !!     WRITE restart fields in nutwrs
347      !!   METHOD :
348      !!   -------
349      !!
350      !!   nutwrs FILE:
351      !!   each nstock time step , SAVE fields which are necessary for
352      !!   passive tracer restart
353      !!
354      !!
355      !!   INPUT :
356      !!   -----
357      !!      argument
358      !!              kt              : time step
359      !!      COMMON
360      !!            /cottrc/          : passive tracers fields (before,now
361      !!                                  ,after)
362      !!
363      !!   OUTPUT :
364      !!   ------
365      !!      FILE
366      !!           nutwrs          : standard restart fields OUTPUT
367      !!
368      !!   WORKSPACE :
369      !!   ---------
370      !!      ji,jj,jk,jl,ino0,it0,iarak0
371      !!
372      !!   History:
373      !!   --------
374      !!      original : 96-12
375      !!      addition : 99-12 (M.-A. Foujols) NetCDF FORMAT with ioipsl
376      !!      additions : 00-05 (A. Estublier)
377      !!                  TVD Limiter Scheme : key_trc_tvd
378      !!      additions : 01-01 (M.A Foujols, E. Kestenare) bug fix: restclo
379      !!      additions : 01-01 (O. Aumont, E. Kestenare)
380      !!                  write restart file for sediments
381      !!      additions : 01-05 (O. Aumont, E. Kestenare)
382      !!                  write restart file for calcite and silicate sediments
383      !!   05-03 (O. Aumont and A. El Moussaoui) F90
384      !!========================================================================================!
385      !! * Modules used
386      USE ioipsl
387
388      !! * Arguments
389      !! -----------
390      INTEGER, INTENT( in ) :: kt
391
392      !! * local declarations
393      !! ====================
394
395      LOGICAL :: clbon         !!!
396      CHARACTER (len=50) :: clname,clname1,clname2,cln
397
398      INTEGER :: jn,   &
399         ino0,it0,iarak0,     &
400         ic,jc,ji,jj,jk,      &
401         itime
402
403      REAL(wp) :: zdate0, zinfo(3),zdiag_var,    &
404         zdiag_varmin, zdiag_varmax
405
406
407      !! 1. OUTPUT of restart fields (nutwrs)
408      !! ---------------------------
409
410      IF( kt == nit000 ) THEN
411         IF(lwp) WRITE(numout,*)
412         IF(lwp) WRITE(numout,*) 'trc_wri : write passive tracers restart.output NetCDF file'
413         IF(lwp) WRITE(numout,*) '~~~~~~~'
414      ENDIF
415
416
417      IF( MOD(kt,nstock) == 0 .OR. kt == nitend ) THEN
418
419         !! 0. initialisations
420         !! ------------------
421
422         IF(lwp) WRITE(numout,*) ' '
423         IF(lwp) WRITE(numout,*) 'trc_wri : write the passive tracer restart file in NetCDF format ',   &
424            'at it= ',kt,' date= ',ndastp
425         IF(lwp) WRITE(numout,*) '~~~~~~~~~'
426
427
428         ino0 =no
429         it0  =kt
430         IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN
431            iarak0 = 1
432         ELSE
433            iarak0=0
434         ENDIF
435
436         zinfo(1)=FLOAT(ino0)
437         zinfo(2)=FLOAT(it0)
438         zinfo(3)=FLOAT(iarak0)
439
440         !! 1. WRITE in nutwrs
441         !! ------------------
442         !!... first information
443
444         INQUIRE (FILE=trestart,EXIST=clbon)
445         IF(clbon) THEN
446            OPEN(UNIT=nutwrs,FILE=trestart,STATUS='old')
447            CLOSE(nutwrs,STATUS='delete')
448         ENDIF
449
450         ic=1
451         DO jc=1,16
452            IF(cexper(jc:jc) /= ' ') ic = jc
453         END DO
454         WRITE(cln,'("_",i2.2,i2.2,i2.2,"_restart.trc")') nyear, nmonth, nday
455         clname=cexper(1:ic)//cln
456         ic=1
457         DO jc=1,48
458            IF(clname(jc:jc) /= ' ') ic=jc
459         END DO
460         trestart=clname(1:ic)//".nc"
461         itime=0
462         CALL ymds2ju(nyear,nmonth,nday,0.0,zdate0)
463         CALL restini('NONE',jpi,jpj,glamt,gphit,jpk,gdept,clname           &
464            &        ,itime,zdate0,rdt*nstock,nutwrs)
465
466         CALL restput(nutwrs,'info',1,1,3,0,zinfo)
467
468         ! prognostic variables
469         ! --------------------
470
471         DO jn=1,jptra
472            clname='TRN'//ctrcnm(jn)
473            CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trn(:,:,:,jn))
474
475            zdiag_var=0.
476            zdiag_varmin=0.
477            zdiag_varmax=0.
478            IF (lwp) WRITE(numout,*) '----TRACER STAT----'
479
480            DO ji=1,jpi
481               DO jj=1,jpj
482                  DO jk=1,jpk
483
484                     zdiag_var=zdiag_var+tmask(ji,jj,jk)*trn(ji,jj,jk,jn)
485
486                     IF (tmask(ji,jj,jk).EQ.1.) THEN
487                        IF (zdiag_varmin.GT.trn(ji,jj,jk,jn))        &
488                           zdiag_varmin =  trn(ji,jj,jk,jn)
489                        IF (zdiag_varmax.LT.trn(ji,jj,jk,jn))        &
490                           zdiag_varmax =  trn(ji,jj,jk,jn)
491
492                     ENDIF
493
494                  END DO
495               END DO
496            END DO
497
498
499            zdiag_var=zdiag_var/(jpi*jpj*jpk)
500
501            IF(lwp) WRITE(numout,*) 'MEAN NO ',jn,' =',zdiag_var,'MIN= '  &
502               ,zdiag_varmin,'MAX= ',zdiag_varmax
503
504         END DO
505
506         DO jn=1,jptra
507            clname='TRB'//ctrcnm(jn)
508            CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trb(:,:,:,jn))
509         END DO
510
511
512#if defined key_trc_lobster1
513         clname='SEDB'//ctrcnm(jpdet)
514         clname1='SEDN'//ctrcnm(jpdet)
515         CALL restput(nutwrs,clname,jpi,jpj,1,0,sedpocb(:,:))
516         CALL restput(nutwrs,clname1,jpi,jpj,1,0,sedpocn(:,:))
517#elif defined key_trc_pisces
518         clname='SED'//ctrcnm(jppoc)
519         clname1='SED'//ctrcnm(jpcal)
520         clname2='SED'//ctrcnm(jpsil)
521         CALL restput(nutwrs,clname1,jpi,jpj,1,0,sedcal(:,:))
522         CALL restput(nutwrs,clname2,jpi,jpj,1,0,sedsil(:,:))
523         CALL restput(nutwrs,clname,jpi,jpj,1,0,sedpoc(:,:))
524
525         clname='Silicalim'
526         CALL restput(nutwrs,clname,jpi,jpj,1,0,xksi(:,:))
527#elif defined key_cfc
528         clname='qint'
529         CALL restput(nutwrs,clname,jpi,jpj,jptra,0,qint(:,:,:))
530         clname1='qtr'
531         CALL restput(nutwrs,clname1,jpi,jpj,jptra,0,qtr(:,:,:))
532#endif
533
534
535         CALL restclo(nutwrs)
536
537      ENDIF
538
539   END SUBROUTINE trc_wri
540
541#endif
542
543#else
544   !!======================================================================
545   !!  Empty module : No passive tracer
546   !!======================================================================
547CONTAINS
548
549   SUBROUTINE trc_rst
550      !! no passive tracers
551   END SUBROUTINE trc_rst
552
553   SUBROUTINE trc_wri(kt)
554      !! no passive tracers
555      INTEGER, INTENT ( in ) :: kt
556      WRITE(*,*) 'trc_wri: You should not have seen this print! error?', kt
557   END SUBROUTINE trc_wri
558   
559#endif
560   
561END MODULE trcrst
Note: See TracBrowser for help on using the repository browser.