source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynredem_loc.F90 @ 5172

Last change on this file since 5172 was 5159, checked in by abarral, 5 months ago

Put dimensions.h and paramet.h into modules

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