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

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

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

File size: 9.5 KB
Line 
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
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
13  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
14  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
15                        taux,tauy
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
42  REAL    :: zan0, zjulian, hours
43!===============================================================================
44  modname='dynredem0'; fil=fichnom
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
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)
130! covariant <-> contravariant <-> natural conversion coefficients
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)
135
136!--- Define fields saved later
137  WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')"),&
138               yyears0,mmois0,jjour0
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])
143  DO iq=1,nqtot
144    CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])
145  END DO
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])
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
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
171  IMPLICIT NONE
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"
179!===============================================================================
180! Arguments:
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
189!===============================================================================
190! Local variables:
191  INTEGER :: l, iq, nid, vID, ierr, nid_trac, vID_trac
192  INTEGER, SAVE :: nb=0
193  INTEGER, PARAMETER :: length=100
194  REAL               :: tab_cntrl(length) ! tableau des parametres du run
195  CHARACTER(LEN=256) :: var, dum
196  LOGICAL            :: lread_inca
197!===============================================================================
198
199  modname='dynredem1'; fil=fichnom
200  CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil)
201
202!--- Write/extend time coordinate
203  nb = nb + 1
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)
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)
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)
216
217!--- Save fields
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)
223
224!--- Tracers in file "start_trac.nc" (added by Anne)
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")
228
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)
236
237
238      IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,:,iq),llm)
239    END IF
240    fil=fichnom
241    CALL dynredem_write_u(nid,var,q(:,:,:,iq),llm)
242  END DO
243  CALL err(NF90_CLOSE(nid),"close")
244  fil="start_trac.nc"
245  IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close")
246
247END SUBROUTINE dynredem1
248
Note: See TracBrowser for help on using the repository browser.