source: LMDZ5/trunk/libf/dyn3d/dynredem.F90 @ 2598

Last change on this file since 2598 was 2598, checked in by Ehouarn Millour, 9 years ago

Cleanup in the dynamics: turn serre.h into module serre_mod.F90
EM

File size: 9.5 KB
RevLine 
[2293]1SUBROUTINE dynredem0(fichnom,iday_end,phis)
2!
3!-------------------------------------------------------------------------------
4! Write the NetCDF restart file (initialization).
5!-------------------------------------------------------------------------------
6#ifdef CPP_IOIPSL
7  USE IOIPSL
8#endif
9  USE infotrac
[2299]10  USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL,    &
11                    NF90_CLOSE,  NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER
12  USE dynredem_mod, ONLY: cre_var, put_var1, put_var2, err, modname, fil
[2597]13  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
[2598]14  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
15                        taux,tauy
[2293]16  IMPLICIT NONE
17  include "dimensions.h"
18  include "paramet.h"
19  include "comvert.h"
20  include "comgeom2.h"
21  include "temps.h"
22  include "ener.h"
23  include "logic.h"
24  include "description.h"
25  include "iniprint.h"
26!===============================================================================
27! Arguments:
28  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
29  INTEGER,          INTENT(IN) :: iday_end         !---
30  REAL,             INTENT(IN) :: phis(iip1, jjp1) !--- GROUND GEOPOTENTIAL
31!===============================================================================
32! Local variables:
33  INTEGER :: iq, l
34  INTEGER, PARAMETER :: length=100
35  REAL    :: tab_cntrl(length)                     !--- RUN PARAMETERS TABLE
36!   For NetCDF:
37  CHARACTER(LEN=30) :: unites
38  INTEGER :: indexID
39  INTEGER :: rlonuID, rlonvID, rlatuID, rlatvID
40  INTEGER :: sID, sigID, nID, vID, timID
41  INTEGER :: yyears0, jjour0, mmois0
[2299]42  REAL    :: zan0, zjulian, hours
[2293]43!===============================================================================
[2299]44  modname='dynredem0'; fil=fichnom
[2293]45#ifdef CPP_IOIPSL
46  CALL ymds2ju(annee_ref, 1, iday_end, 0.0, zjulian)
47  CALL ju2ymds(zjulian, yyears0, mmois0, jjour0, hours)
48#else
49! set yyears0, mmois0, jjour0 to 0,1,1 (hours is not used)
50  yyears0=0
51  mmois0=1
52  jjour0=1
53#endif       
54
55  tab_cntrl(:)  = 0.
56  tab_cntrl(1)  = REAL(iim)
57  tab_cntrl(2)  = REAL(jjm)
58  tab_cntrl(3)  = REAL(llm)
59  tab_cntrl(4)  = REAL(day_ref)
60  tab_cntrl(5)  = REAL(annee_ref)
61  tab_cntrl(6)  = rad
62  tab_cntrl(7)  = omeg
63  tab_cntrl(8)  = g
64  tab_cntrl(9)  = cpp
65  tab_cntrl(10) = kappa
66  tab_cntrl(11) = daysec
67  tab_cntrl(12) = dtvr
68  tab_cntrl(13) = etot0
69  tab_cntrl(14) = ptot0
70  tab_cntrl(15) = ztot0
71  tab_cntrl(16) = stot0
72  tab_cntrl(17) = ang0
73  tab_cntrl(18) = pa
74  tab_cntrl(19) = preff
75
76!    .....    parameters for zoom    ......   
77  tab_cntrl(20) = clon
78  tab_cntrl(21) = clat
79  tab_cntrl(22) = grossismx
80  tab_cntrl(23) = grossismy
81!
82  IF ( fxyhypb )   THEN
83    tab_cntrl(24) = 1.
84    tab_cntrl(25) = dzoomx
85    tab_cntrl(26) = dzoomy
86    tab_cntrl(27) = 0.
87    tab_cntrl(28) = taux
88    tab_cntrl(29) = tauy
89  ELSE
90    tab_cntrl(24) = 0.
91    tab_cntrl(25) = dzoomx
92    tab_cntrl(26) = dzoomy
93    tab_cntrl(27) = 0.
94    tab_cntrl(28) = 0.
95    tab_cntrl(29) = 0.
96    IF( ysinus )  tab_cntrl(27) = 1.
97  END IF
98  tab_cntrl(30) = REAL(iday_end)
99  tab_cntrl(31) = REAL(itau_dyn + itaufin)
100! start_time: start_time of simulation (not necessarily 0.)
101  tab_cntrl(32) = start_time
102
103!--- File creation
104  CALL err(NF90_CREATE(fichnom,NF90_CLOBBER,nid))
105
106!--- Some global attributes
107  CALL err(NF90_PUT_ATT(nid,NF90_GLOBAL,"title","Fichier demarrage dynamique"))
108
109!--- Dimensions
110  CALL err(NF90_DEF_DIM(nid,"index", length, indexID))
111  CALL err(NF90_DEF_DIM(nid,"rlonu", iip1,   rlonuID))
112  CALL err(NF90_DEF_DIM(nid,"rlatu", jjp1,   rlatuID))
113  CALL err(NF90_DEF_DIM(nid,"rlonv", iip1,   rlonvID))
114  CALL err(NF90_DEF_DIM(nid,"rlatv", jjm,    rlatvID))
115  CALL err(NF90_DEF_DIM(nid,"sigs",  llm,        sID))
116  CALL err(NF90_DEF_DIM(nid,"sig",   llmp1,    sigID))
117  CALL err(NF90_DEF_DIM(nid,"temps", NF90_UNLIMITED, timID))
118
119!--- Define and save invariant fields
[2299]120  CALL put_var1(nid,"controle","Parametres de controle" ,[indexID],tab_cntrl)
121  CALL put_var1(nid,"rlonu"   ,"Longitudes des points U",[rlonuID],rlonu)
122  CALL put_var1(nid,"rlatu"   ,"Latitudes des points U" ,[rlatuID],rlatu)
123  CALL put_var1(nid,"rlonv"   ,"Longitudes des points V",[rlonvID],rlonv)
124  CALL put_var1(nid,"rlatv"   ,"Latitudes des points V" ,[rlatvID],rlatv)
125  CALL put_var1(nid,"nivsigs" ,"Numero naturel des couches s"    ,[sID]  ,nivsigs)
126  CALL put_var1(nid,"nivsig"  ,"Numero naturel des couches sigma",[sigID],nivsig)
127  CALL put_var1(nid,"ap"      ,"Coefficient A pour hybride"      ,[sigID],ap)
128  CALL put_var1(nid,"bp"      ,"Coefficient B pour hybride"      ,[sigID],bp)
129  CALL put_var1(nid,"presnivs",""                                ,[sID]  ,presnivs)
[2293]130! covariant <-> contravariant <-> natural conversion coefficients
[2299]131  CALL put_var2(nid,"cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu)
132  CALL put_var2(nid,"cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv)
133  CALL put_var2(nid,"aire","Aires de chaque maille"     ,[rlonvID,rlatuID],aire)
134  CALL put_var2(nid,"phisinit","Geopotentiel au sol"    ,[rlonvID,rlatuID],phis)
[2293]135
136!--- Define fields saved later
137  WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')"),&
138               yyears0,mmois0,jjour0
[2299]139  CALL cre_var(nid,"temps","Temps de simulation",[timID],unites)
140  CALL cre_var(nid,"ucov" ,"Vitesse U"  ,[rlonuID,rlatuID,sID,timID])
141  CALL cre_var(nid,"vcov" ,"Vitesse V"  ,[rlonvID,rlatvID,sID,timID])
142  CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])
[2293]143  DO iq=1,nqtot
[2299]144    CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])
[2293]145  END DO
[2299]146  CALL cre_var(nid,"masse","Masse d air"    ,[rlonvID,rlatuID,sID,timID])
147  CALL cre_var(nid,"ps"   ,"Pression au sol",[rlonvID,rlatuID    ,timID])
[2293]148  CALL err(NF90_CLOSE (nid))
149
150  WRITE(lunout,*)TRIM(modname)//': iim,jjm,llm,iday_end',iim,jjm,llm,iday_end
151  WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
152
153END SUBROUTINE dynredem0
154!
155!-------------------------------------------------------------------------------
156
157
158!-------------------------------------------------------------------------------
159!
160SUBROUTINE dynredem1(fichnom,time,vcov,ucov,teta,q,masse,ps)
161!
162!-------------------------------------------------------------------------------
163! Purpose: Write the NetCDF restart file (append).
164!-------------------------------------------------------------------------------
165  USE infotrac
166  USE control_mod
[2299]167  USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
168                      NF90_CLOSE, NF90_WRITE,   NF90_PUT_VAR, NF90_NoErr
169  USE dynredem_mod, ONLY: dynredem_write_u, dynredem_write_v, dynredem_read_u, &
170                          err, modname, fil, msg
[2293]171  IMPLICIT NONE
[2299]172  include "dimensions.h"
173  include "paramet.h"
174  include "description.h"
175  include "comvert.h"
176  include "comgeom.h"
177  include "temps.h"
178  include "iniprint.h"
[2293]179!===============================================================================
180! Arguments:
[2299]181  CHARACTER(LEN=*), INTENT(IN) :: fichnom              !-- FILE NAME
182  REAL, INTENT(IN)    ::  time                         !-- TIME
183  REAL, INTENT(IN)    ::  vcov(iip1,jjm, llm)          !-- V COVARIANT WIND
184  REAL, INTENT(IN)    ::  ucov(iip1,jjp1,llm)          !-- U COVARIANT WIND
185  REAL, INTENT(IN)    ::  teta(iip1,jjp1,llm)          !-- POTENTIAL TEMPERATURE
186  REAL, INTENT(INOUT) ::     q(iip1,jjp1,llm,nqtot)    !-- TRACERS
187  REAL, INTENT(IN)    :: masse(iip1,jjp1,llm)          !-- MASS PER CELL
188  REAL, INTENT(IN)    ::    ps(iip1,jjp1)              !-- GROUND PRESSURE
[2293]189!===============================================================================
190! Local variables:
[2299]191  INTEGER :: l, iq, nid, vID, ierr, nid_trac, vID_trac
[2293]192  INTEGER, SAVE :: nb=0
193  INTEGER, PARAMETER :: length=100
194  REAL               :: tab_cntrl(length) ! tableau des parametres du run
[2299]195  CHARACTER(LEN=256) :: var, dum
196  LOGICAL            :: lread_inca
[2293]197!===============================================================================
[2299]198
199  modname='dynredem1'; fil=fichnom
[2293]200  CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil)
201
202!--- Write/extend time coordinate
203  nb = nb + 1
[2299]204  var="temps"
205  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
206  CALL err(NF90_PUT_VAR(nid,vID,[time]),"put",var)
[2293]207  WRITE(lunout,*)TRIM(modname)//": Saving for ", nb, time
208
209!--- Rewrite control table (itaufin undefined in dynredem0)
210  var="controle"
211  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
[2299]212  CALL err(NF90_GET_VAR(nid,vID,tab_cntrl),"get",var)
213  tab_cntrl(31)=DBLE(itau_dyn + itaufin)
214  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
215  CALL err(NF90_PUT_VAR(nid,vID,tab_cntrl),"put",var)
[2293]216
217!--- Save fields
[2299]218  CALL dynredem_write_u(nid,"ucov" ,ucov ,llm)
219  CALL dynredem_write_v(nid,"vcov" ,vcov ,llm)
220  CALL dynredem_write_u(nid,"teta" ,teta ,llm)
221  CALL dynredem_write_u(nid,"masse",masse,llm)
222  CALL dynredem_write_u(nid,"ps"   ,ps   ,1)
[2293]223
224!--- Tracers in file "start_trac.nc" (added by Anne)
[2299]225  lread_inca=.FALSE.; fil="start_trac.nc"
226  IF(type_trac=='inca') INQUIRE(FILE=fil,EXIST=lread_inca)
227  IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open")
[2293]228
[2299]229!--- Save tracers
230  DO iq=1,nqtot; var=tname(iq); ierr=-1
231    IF(lread_inca) THEN                  !--- Possibly read from "start_trac.nc"
232      fil="start_trac.nc"
233      ierr=NF90_INQ_VARID(nid_trac,var,vID_trac)
234      dum='inq'; IF(ierr==NF90_NoErr) dum='fnd'
235      WRITE(lunout,*)msg(dum,var)
[2293]236
[2299]237
238      IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,:,iq),llm)
[2293]239    END IF
[2299]240    fil=fichnom
241    CALL dynredem_write_u(nid,var,q(:,:,:,iq),llm)
[2293]242  END DO
[2299]243  CALL err(NF90_CLOSE(nid),"close")
244  fil="start_trac.nc"
245  IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close")
[2293]246
247END SUBROUTINE dynredem1
248
Note: See TracBrowser for help on using the repository browser.