source: LMDZ6/branches/Amaury_dev/libf/dyn3d/dynredem.F90 @ 5182

Last change on this file since 5182 was 5182, checked in by abarral, 10 days ago

(WIP) Replace REPROBUS CPP KEY by logical
properly name modules

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