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

Last change on this file since 396 was 352, checked in by opalod, 19 years ago

nemo_v1_update_033 : CT : Switch to IOIPSL-3-0 new library

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.5 KB
RevLine 
[268]1MODULE trcrst
[335]2   !!======================================================================
[268]3   !!
4   !!                       *** MODULE trcrst ***
5   !!
6   !!   Read the restart files for passive tracers
7   !!
[335]8   !!======================================================================
[340]9   !!  TOP 1.0,  LOCEAN-IPSL (2005)
10   !! $Header$
11   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
[274]12   !!----------------------------------------------------------------------
[335]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   
[268]25   !! * Accessibility
26   PUBLIC trc_rst
27   PUBLIC trc_wri
[335]28   
[268]29   !! * Module variables
30   CHARACTER (len=48) ::   &
31      trestart = 'initial.trc.nc'   ! restart file name
[350]32
33   !! * Substitutions
34#  include "passivetrc_substitute.h90"
[335]35   
[268]36CONTAINS
37
38#if defined key_fdir
39   !!----------------------------------------------------------------------
40   !!   'key_fdir'                                       direct access file
41   !!----------------------------------------------------------------------
42#include "trcrst_fdir.h90"
[335]43   
44#else
[268]45
[335]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
[268]72      USE ioipsl
73
74
[335]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) 
[268]81
[335]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)
[268]88
[335]89      REAL(wp), DIMENSION(3) :: zinfo
[268]90
[350]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
[335]96      !!---------------------------------------------------------------------
97      !!  OPA.9 03-2005 
98      !!---------------------------------------------------------------------
99      !! 0. initialisations
100      !!------------------
[268]101
102
103      IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN
[335]104         iarak0 = 1
[268]105      ELSE
[335]106         iarak0=0
[268]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
[335]117         IF(iarak0.eq.1) then
118            WRITE(numout,*) '   and before fields for Arakawa sheme '
119         ENDIF
120         WRITE(numout,*) ' '
[268]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
[335]142      !! 1. READ nutrst
143      !! --------------
144      !! ... first information
145      !! ---------------------
[268]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         & 
[352]152         &           ,itime,zdate0,zdt,nutrst,domain_id=nidom)
[268]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
[335]164         IF(iarak1.eq.1) then
165            WRITE(numout,*) '   and before fields for Arakawa sheme '
166         ENDIF
[268]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
[335]173      !! 1.2 control of date
174      !! -------------------
[268]175
176      IF( nit000- NINT( zinfo(2) ) /= 1 .AND. nrsttr /= 0 ) THEN
[335]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'       !!
[268]188      ENDIF
189
[335]190      !! 1.3 Control of the sheme
191      !! ------------------------
[268]192
193      IF(iarak0.ne.iarak1) THEN
[335]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'
[268]206      ENDIF
207
208
[335]209      !! ... READ prognostic variables and computes diagnostic variable
210      !! ---------------------------------------------------------------
[268]211
[335]212      DO jn=1,jptra
[268]213         clname='TRN'//ctrcnm(jn)
214         CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trn(:,:,:,jn))
[335]215      END DO
[268]216
[335]217      DO jn=1,jptra
[268]218         clname='TRB'//ctrcnm(jn)
219         CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trb(:,:,:,jn))
[335]220      END DO
[268]221
[335]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(:,:))
[268]228#elif defined key_trc_pisces
[335]229      clname='Silicalim'
230      CALL restget(nutrst,clname,jpi,jpj,1,0,llog,xksi)
231      xksimax=xksi
[268]232
[335]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(:,:))
[268]239
[335]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(:,:,:))         
[268]245#endif
246
[335]247#if defined key_trc_pisces 
[350]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
[335]318      !!  Initialization of chemical variables of the carbon cycle
319      !!  --------------------------------------------------------
320      DO jk = 1,jpk
321         DO jj = 1,jpj
[268]322            DO ji = 1,jpi
[335]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
[268]331            ENDDO
[335]332         ENDDO
333      ENDDO
[268]334#endif
335
[335]336   END SUBROUTINE trc_rst
[268]337
[335]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      !!========================================================================================!
[268]385      !! * Modules used
386      USE ioipsl
387
[335]388      !! * Arguments
[268]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,   &
[335]399         ino0,it0,iarak0,     &
400         ic,jc,ji,jj,jk,      &
401         itime
[268]402
403      REAL(wp) :: zdate0, zinfo(3),zdiag_var,    &
[335]404         zdiag_varmin, zdiag_varmax
[268]405
406
[335]407      !! 1. OUTPUT of restart fields (nutwrs)
408      !! ---------------------------
[268]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
[335]419         !! 0. initialisations
420         !! ------------------
[268]421
422         IF(lwp) WRITE(numout,*) ' '
423         IF(lwp) WRITE(numout,*) 'trc_wri : write the passive tracer restart file in NetCDF format ',   &
[335]424            'at it= ',kt,' date= ',ndastp
[268]425         IF(lwp) WRITE(numout,*) '~~~~~~~~~'
426
427
[335]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
[268]435
[335]436         zinfo(1)=FLOAT(ino0)
437         zinfo(2)=FLOAT(it0)
438         zinfo(3)=FLOAT(iarak0)
[268]439
[335]440         !! 1. WRITE in nutwrs
441         !! ------------------
442         !!... first information
[268]443
[335]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
[268]449
[335]450         ic=1
451         DO jc=1,16
[268]452            IF(cexper(jc:jc) /= ' ') ic = jc
[335]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
[268]458            IF(clname(jc:jc) /= ' ') ic=jc
[335]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           &
[352]464            &        ,itime,zdate0,rdt*nstock,nutwrs,domain_id=nidom)
[268]465
[335]466         CALL restput(nutwrs,'info',1,1,3,0,zinfo)
[268]467
[335]468         ! prognostic variables
469         ! --------------------
[268]470
471         DO jn=1,jptra
472            clname='TRN'//ctrcnm(jn)
473            CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trn(:,:,:,jn))
474
[335]475            zdiag_var=0.
476            zdiag_varmin=0.
477            zdiag_varmax=0.
478            IF (lwp) WRITE(numout,*) '----TRACER STAT----'
[268]479
[335]480            DO ji=1,jpi
481               DO jj=1,jpj
482                  DO jk=1,jpk
[268]483
[335]484                     zdiag_var=zdiag_var+tmask(ji,jj,jk)*trn(ji,jj,jk,jn)
[268]485
[335]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)
[268]491
[335]492                     ENDIF
[268]493
[335]494                  END DO
495               END DO
[268]496            END DO
497
498
[335]499            zdiag_var=zdiag_var/(jpi*jpj*jpk)
[268]500
[335]501            IF(lwp) WRITE(numout,*) 'MEAN NO ',jn,' =',zdiag_var,'MIN= '  &
502               ,zdiag_varmin,'MAX= ',zdiag_varmax
[268]503
504         END DO
505
[335]506         DO jn=1,jptra
[268]507            clname='TRB'//ctrcnm(jn)
508            CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trb(:,:,:,jn))
[335]509         END DO
[268]510
[335]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(:,:))
[268]517#elif defined key_trc_pisces
[335]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(:,:))
[268]524
[335]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(:,:,:))
[268]532#endif
533
534
[335]535         CALL restclo(nutwrs)
536
[268]537      ENDIF
538
[335]539   END SUBROUTINE trc_wri
[268]540
[335]541#endif
542
[268]543#else
[335]544   !!======================================================================
545   !!  Empty module : No passive tracer
546   !!======================================================================
547CONTAINS
[268]548
[335]549   SUBROUTINE trc_rst
550      !! no passive tracers
551   END SUBROUTINE trc_rst
[268]552
[335]553   SUBROUTINE trc_wri(kt)
554      !! no passive tracers
555      INTEGER, INTENT ( in ) :: kt
[268]556      WRITE(*,*) 'trc_wri: You should not have seen this print! error?', kt
[335]557   END SUBROUTINE trc_wri
558   
[268]559#endif
[335]560   
561END MODULE trcrst
Note: See TracBrowser for help on using the repository browser.