source: LMDZ5/trunk/libf/dyn3dmem/dynredem_loc.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

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