MODULE trcrst !!=========================================================================================== !! !! *** MODULE trcrst *** !! !! Read the restart files for passive tracers !! !!=========================================================================================== !! TOP 1.0, LOCEAN-IPSL (2005) !! $Header$ !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! * Modules used !! ============== USE oce_trc USE trc USE sms USE trctrp_lec IMPLICIT NONE PRIVATE !! * Accessibility PUBLIC trc_rst PUBLIC trc_wri !! * Module variables CHARACTER (len=48) :: & trestart = 'initial.trc.nc' ! restart file name CONTAINS #if defined key_fdir !!---------------------------------------------------------------------- !! 'key_fdir' direct access file !!---------------------------------------------------------------------- #include "trcrst_fdir.h90" #else !! USE ioipsl #if defined key_passivetrc SUBROUTINE trc_rst !!=========================================================================================== !! !! ROUTINE trc_rst !! ******************* !! !! PURPOSE : !! --------- !! READ files for restart for passive tracer !! !! METHOD : !! ------- !! READ the previous fields on the FILE nutrst !! the first record indicates previous characterics !! after control with the present run, we READ : !! - prognostic variables on the second and more record !! !! History: !! -------- !! original : 96-11 !! 00-05 (A. Estublier) TVD Limiter Scheme key_trc_tvd !! 00-12 (O. Aumont, E. Kestenare) read restart file for sediments !! 01-05 (O. Aumont, E. Kestenare) read restart file for calcite and silicate sediments !! 05-03 (O. Aumont and A. El Moussaoui) F90 !!------------------------------------------------------------------------ !! * Modules used USE ioipsl !! local declarations !! ================== LOGICAL :: llog !!! CHARACTER (len=32) :: clname1,clname2 CHARACTER (len=32) :: clname = 'restart.trc' CHARACTER (len=12) :: clvnames(80) INTEGER :: ino1,jn,iarak0,iarak1, & ji, jj, jk, & itime, ibvar REAL(wp) :: caralk,bicarb,zdt, & zdate0 REAL(wp) :: zdept(jpk), zlamt(jpi,jpj), zphit(jpi,jpj) REAL(wp), DIMENSION(3) :: zinfo !!--------------------------------------------------------------------- !! OPA.9 03-2005 !!--------------------------------------------------------------------- !! 0. initialisations !!------------------ IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN iarak0 = 1 ELSE iarak0=0 ENDIF IF(lwp) WRITE(numout,*) ' ' IF(lwp) WRITE(numout,*) ' *** trc_rst beginning of restart for' IF(lwp) WRITE(numout,*) ' passive tracer' IF(lwp) WRITE(numout,*) ' the present run :' IF(lwp) WRITE(numout,*) ' number job is : ',no IF(lwp) WRITE(numout,*) ' with the time nit000 : ',nit000 IF(lwp) THEN IF(iarak0.eq.1) then WRITE(numout,*) ' and before fields for Arakawa sheme ' ENDIF WRITE(numout,*) ' ' ENDIF ! Time domain : restart ! ------------------------- IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' *** passive tracer restart option' SELECT CASE ( nrsttr ) CASE ( 0 ) IF(lwp) WRITE(numout,*) ' nrsttr = 0 no control of nit000' CASE ( 1 ) IF(lwp) WRITE(numout,*) ' nrsttr = 1 we control the date of nit000' CASE ( 2 ) IF(lwp) WRITE(numout,*) ' nrsttr = 2 the date adatrj is read in restart file' CASE DEFAULT IF(lwp) WRITE(numout,*) ' ===>>>> nrsttr not equal 0, 1 or 2 : no control of the date' IF(lwp) WRITE(numout,*) ' ======= =========' END SELECT !! 1. READ nutrst !! -------------- !! ... first information !! --------------------- itime=0 llog=.false. !!! zlamt(:,:) = 0.e0 zphit(:,:) = 0.e0 zdept(:) = 0.e0 CALL restini(clname,jpi,jpj,zlamt,zphit,jpk,zdept,clname & & ,itime,zdate0,zdt,nutrst) CALL ioget_vname(nutrst, ibvar, clvnames) CALL restget(nutrst,'info',1,1,3,0,llog,zinfo) ino1 = nint(zinfo(1)) iarak1 = nint(zinfo(3)) IF(lwp) WRITE(numout,*) ' ' IF(lwp) WRITE(numout,*) ' READ nutrst with ' IF(lwp) WRITE(numout,*) ' number job is : ',ino1 IF(lwp) WRITE(numout,*) ' with the time it : ',nint(zinfo(2)) IF(lwp) THEN IF(iarak1.eq.1) then WRITE(numout,*) ' and before fields for Arakawa sheme ' ENDIF ENDIF IF(lwp) WRITE(numout,*) ' number of variables : ', ibvar IF(lwp) WRITE(numout,*) ' NetCDF variables : ' IF(lwp) WRITE(numout,*) ' ',clvnames (:ibvar) IF(lwp) WRITE(numout,*) ' ' !! 1.2 control of date !! ------------------- IF( nit000- NINT( zinfo(2) ) /= 1 .AND. nrsttr /= 0 ) THEN IF(lwp) THEN WRITE(numout,*) ' ===>>>> : problem with nit000 for the', & ' passive tracer restart' WRITE(numout,*) ' ======= ', & ' ======================' WRITE(numout,*) ' we stop. verify the FILE' WRITE(numout,*) ' or rerun with the value 0 for the' WRITE(numout,*) ' control of time PARAMETER nrstdt' WRITE(numout,*) ' ' ENDIF STOP 'trc_rst' !! ENDIF !! 1.3 Control of the sheme !! ------------------------ IF(iarak0.ne.iarak1) THEN IF(lwp) THEN WRITE(numout,*) ' ===>>>> : problem with the', & ' passive tracer restart file' WRITE(numout,*) ' ======= ', & ' ===========================' WRITE(numout,*) ' we stop. verify the FILE' WRITE(numout,*) ' before field required IF 1=',iarak0 WRITE(numout,*) ' before field present in file IF 1=', & iarak1 WRITE(numout,*) ' ' ENDIF STOP 'trc_rst' !!!!! AVERIFIER AU NIV F90' ENDIF !! ... READ prognostic variables and computes diagnostic variable !! --------------------------------------------------------------- DO jn=1,jptra clname='TRN'//ctrcnm(jn) CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trn(:,:,:,jn)) END DO DO jn=1,jptra clname='TRB'//ctrcnm(jn) CALL restget(nutrst,clname,jpi,jpj,jpk,0,llog,trb(:,:,:,jn)) END DO #if defined key_trc_hamocc3 clname='SED'//ctrcnm(jppoc) clname1='SED'//ctrcnm(jpcal) clname2='SED'//ctrcnm(jpsil) CALL restget(nutrst,clname1,jpi,jpj,1,0,llog,sedcal(:,:)) CALL restget(nutrst,clname2,jpi,jpj,1,0,llog,sedsil(:,:)) CALL restget(nutrst,clname,jpi,jpj,1,0,llog,sedpoc(:,:)) #elif defined key_trc_npzd || defined key_trc_lobster1 clname='SED'//ctrcnm(jpdet) CALL restget(nutrst,clname,jpi,jpj,1,0,llog,sedpoc(:,:)) #elif defined key_trc_pisces clname='Silicalim' CALL restget(nutrst,clname,jpi,jpj,1,0,llog,xksi) xksimax=xksi clname='SED'//ctrcnm(jppoc) clname1='SED'//ctrcnm(jpcal) clname2='SED'//ctrcnm(jpsil) CALL restget(nutrst,clname1,jpi,jpj,1,0,llog,sedcal(:,:)) CALL restget(nutrst,clname2,jpi,jpj,1,0,llog,sedsil(:,:)) CALL restget(nutrst,clname,jpi,jpj,1,0,llog,sedpoc(:,:)) #endif #if defined key_trc_hamocc3 || defined key_trc_pisces !! Initialization of chemical variables of the carbon cycle !! -------------------------------------------------------- DO jk = 1,jpk DO jj = 1,jpj DO ji = 1,jpi caralk = trn(ji,jj,jk,jptal)- & & borat(ji,jj,jk)/(1.+1.E-8/(rtrn+akb3(ji,jj,jk))) co3(ji,jj,jk)=(caralk-trn(ji,jj,jk,jpdic))*tmask(ji,jj,jk) & & +(1.-tmask(ji,jj,jk))*.5e-3 bicarb = (2.*trn(ji,jj,jk,jpdic)-caralk) hi(ji,jj,jk) = (ak23(ji,jj,jk)*bicarb/co3(ji,jj,jk)) & & *tmask(ji,jj,jk)+(1.-tmask(ji,jj,jk))*1.e-9 h2co3(ji,jj) = 1.e-5 ENDDO ENDDO ENDDO #endif END SUBROUTINE trc_rst SUBROUTINE trc_wri(kt) !! ================================================================================== !! !! ROUTINE trc_wri !! ****************** !! !! PURPOSE : !! --------- !! WRITE restart fields in nutwrs !! METHOD : !! ------- !! !! nutwrs FILE: !! each nstock time step , SAVE fields which are necessary for !! passive tracer restart !! !! !! INPUT : !! ----- !! argument !! kt : time step !! COMMON !! /cottrc/ : passive tracers fields (before,now !! ,after) !! !! OUTPUT : !! ------ !! FILE !! nutwrs : standard restart fields OUTPUT !! !! WORKSPACE : !! --------- !! ji,jj,jk,jl,ino0,it0,iarak0 !! !! History: !! -------- !! original : 96-12 !! addition : 99-12 (M.-A. Foujols) NetCDF FORMAT with ioipsl !! additions : 00-05 (A. Estublier) !! TVD Limiter Scheme : key_trc_tvd !! additions : 01-01 (M.A Foujols, E. Kestenare) bug fix: restclo !! additions : 01-01 (O. Aumont, E. Kestenare) !! write restart file for sediments !! additions : 01-05 (O. Aumont, E. Kestenare) !! write restart file for calcite and silicate sediments !! 05-03 (O. Aumont and A. El Moussaoui) F90 !!========================================================================================! !! * Modules used USE ioipsl !! * Arguments !! ----------- INTEGER, INTENT( in ) :: kt !! * local declarations !! ==================== LOGICAL :: clbon !!! CHARACTER (len=50) :: clname,clname1,clname2,cln INTEGER :: jn, & ino0,it0,iarak0, & ic,jc,ji,jj,jk, & itime REAL(wp) :: zdate0, zinfo(3),zdiag_var, & zdiag_varmin, zdiag_varmax !! 1. OUTPUT of restart fields (nutwrs) !! --------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'trc_wri : write passive tracers restart.output NetCDF file' IF(lwp) WRITE(numout,*) '~~~~~~~' ENDIF IF( MOD(kt,nstock) == 0 .OR. kt == nitend ) THEN !! 0. initialisations !! ------------------ IF(lwp) WRITE(numout,*) ' ' IF(lwp) WRITE(numout,*) 'trc_wri : write the passive tracer restart file in NetCDF format ', & 'at it= ',kt,' date= ',ndastp IF(lwp) WRITE(numout,*) '~~~~~~~~~' ino0 =no it0 =kt #if defined key_trc_cen2 || defined key_trc_tvd iarak0=1 #else iarak0=0 #endif zinfo(1)=FLOAT(ino0) zinfo(2)=FLOAT(it0) zinfo(3)=FLOAT(iarak0) !! 1. WRITE in nutwrs !! ------------------ !!... first information INQUIRE (FILE=trestart,EXIST=clbon) IF(clbon) THEN OPEN(UNIT=nutwrs,FILE=trestart,STATUS='old') CLOSE(nutwrs,STATUS='delete') ENDIF ic=1 DO jc=1,16 IF(cexper(jc:jc) /= ' ') ic = jc END DO WRITE(cln,'("_",i2.2,i2.2,i2.2,"_restart.trc")') nyear, nmonth, nday clname=cexper(1:ic)//cln ic=1 DO jc=1,48 IF(clname(jc:jc) /= ' ') ic=jc END DO trestart=clname(1:ic)//".nc" itime=0 CALL ymds2ju(nyear,nmonth,nday,0.0,zdate0) CALL restini('NONE',jpi,jpj,glamt,gphit,jpk,gdept,clname & & ,itime,zdate0,rdt*nstock,nutwrs) CALL restput(nutwrs,'info',1,1,3,0,zinfo) ! prognostic variables ! -------------------- DO jn=1,jptra clname='TRN'//ctrcnm(jn) CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trn(:,:,:,jn)) zdiag_var=0. zdiag_varmin=0. zdiag_varmax=0. IF (lwp) WRITE(numout,*) '----TRACER STAT----' DO ji=1,jpi DO jj=1,jpj DO jk=1,jpk zdiag_var=zdiag_var+tmask(ji,jj,jk)*trn(ji,jj,jk,jn) IF (tmask(ji,jj,jk).EQ.1.) THEN IF (zdiag_varmin.GT.trn(ji,jj,jk,jn)) & zdiag_varmin = trn(ji,jj,jk,jn) IF (zdiag_varmax.LT.trn(ji,jj,jk,jn)) & zdiag_varmax = trn(ji,jj,jk,jn) ENDIF END DO END DO END DO zdiag_var=zdiag_var/(jpi*jpj*jpk) IF(lwp) WRITE(numout,*) 'MEAN NO ',jn,' =',zdiag_var,'MIN= ' & ,zdiag_varmin,'MAX= ',zdiag_varmax END DO DO jn=1,jptra clname='TRB'//ctrcnm(jn) CALL restput(nutwrs,clname,jpi,jpj,jpk,0,trb(:,:,:,jn)) END DO #if defined key_trc_hamocc3 clname='SED'//ctrcnm(jppoc) clname1='SED'//ctrcnm(jpcal) clname2='SED'//ctrcnm(jpsil) CALL restput(nutwrs,clname1,jpi,jpj,1,0,sedcal(:,:)) CALL restput(nutwrs,clname2,jpi,jpj,1,0,sedsil(:,:)) CALL restput(nutwrs,clname,jpi,jpj,1,0,sedpoc(:,:)) #elif defined key_trc_npzd || defined key_trc_lobster1 clname='SED'//ctrcnm(jpdet) CALL restput(nutwrs,clname,jpi,jpj,1,0,sedpoc(:,:)) #elif defined key_trc_pisces clname='SED'//ctrcnm(jppoc) clname1='SED'//ctrcnm(jpcal) clname2='SED'//ctrcnm(jpsil) CALL restput(nutwrs,clname1,jpi,jpj,1,0,sedcal(:,:)) CALL restput(nutwrs,clname2,jpi,jpj,1,0,sedsil(:,:)) CALL restput(nutwrs,clname,jpi,jpj,1,0,sedpoc(:,:)) clname='Silicalim' CALL restput(nutwrs,clname,jpi,jpj,1,0,xksi(:,:)) #endif CALL restclo(nutwrs) ENDIF END SUBROUTINE trc_wri #else SUBROUTINE trc_rst !! no passive tracers END SUBROUTINE trc_rst SUBROUTINE trc_wri(kt) !!! no passive tracers INTEGER, INTENT ( in ) :: kt WRITE(*,*) 'trc_wri: You should not have seen this print! error?', kt END SUBROUTINE trc_wri #endif #endif END MODULE trcrst