/[lmdze]/trunk/Sources/dyn3d/Guide/guide.f
ViewVC logotype

Contents of /trunk/Sources/dyn3d/Guide/guide.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 102 - (show annotations)
Tue Jul 15 13:43:24 2014 UTC (9 years, 10 months ago) by guez
Original Path: trunk/dyn3d/guide.f
File size: 8458 byte(s)
Removed unused file "condsurf.f" (only useful for ocean slab).

day_step must be a multiple of 4 * iperiod if ok_guide.

Changed type of variable online of module conf_guide_m from integer to
logical. Value -1 was not useful, equivalent to not ok_guide.

Removed argument masse of procedure guide. masse is kept consistent
with ps throughout the run. masse need only be computed again just
after ps has been modified. In prodecure guide, replaced use of
remanent variable first by test on itau. Replaced test on variable
"test" by test on integer values.

In leapfrog, for the call to guide, replaced test on real values by
test on integer values.

Bug fix in tau2alpha: computation of dxdyv (following LMDZ revision 1040).

In procedure wrgrads, replaced badly chosen argument name "if" by i_f.

1 MODULE guide_m
2
3 ! From dyn3d/guide.F, version 1.3 2005/05/25 13:10:09
4 ! and dyn3d/guide.h, version 1.1.1.1 2004/05/19 12:53:06
5
6 IMPLICIT NONE
7
8 REAL aire_min, aire_max
9
10 CONTAINS
11
12 SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
13
14 ! Author: F.Hourdin
15
16 USE comconst, ONLY: cpp, daysec, dtvr, kappa
17 USE comgeom, ONLY: aire, rlatu, rlonv
18 USE conf_gcm_m, ONLY: day_step, iperiod
19 use conf_guide_m, only: conf_guide, guide_u, guide_v, guide_t, guide_q, &
20 ncep, ini_anal, tau_min_u, tau_max_u, tau_min_v, tau_max_v, &
21 tau_min_t, tau_max_t, tau_min_q, tau_max_q, tau_min_p, tau_max_p, &
22 online
23 USE dimens_m, ONLY: iim, jjm, llm
24 USE disvert_m, ONLY: ap, bp, preff, presnivs
25 use dump2d_m, only: dump2d
26 USE exner_hyb_m, ONLY: exner_hyb
27 USE inigrads_m, ONLY: inigrads
28 use massdair_m, only: massdair
29 use netcdf, only: nf90_nowrite, nf90_close, nf90_inq_dimid
30 use netcdf95, only: nf95_inquire_dimension, nf95_open
31 use nr_util, only: pi
32 USE paramet_m, ONLY: iip1, ip1jm, ip1jmp1, jjp1, llmp1
33 USE q_sat_m, ONLY: q_sat
34 use read_reanalyse_m, only: read_reanalyse
35 USE serre, ONLY: clat, clon
36 use tau2alpha_m, only: tau2alpha, dxdys
37
38 INTEGER, INTENT(IN):: itau
39
40 ! variables dynamiques
41
42 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
43 REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
44
45 REAL, intent(inout):: teta(iim + 1, jjm + 1, llm) ! température potentielle
46 REAL, intent(inout):: q(iim + 1, jjm + 1, llm)
47 REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
48
49 ! Local:
50
51 ! variables dynamiques pour les reanalyses.
52
53 REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
54 ! vents covariants reanalyses
55
56 REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
57 REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
58
59 REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
60 ! vents covariants reanalyses
61
62 REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
63 REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
64 REAL, save:: masserea2(ip1jmp1, llm) ! masse
65
66 ! alpha determine la part des injections de donnees a chaque etape
67 ! alpha=1 signifie pas d'injection
68 ! alpha=0 signifie injection totale
69 REAL, save:: alpha_q(iim + 1, jjm + 1)
70 REAL, save:: alpha_t(iim + 1, jjm + 1), alpha_p(ip1jmp1)
71 REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
72
73 INTEGER, save:: step_rea, count_no_rea
74
75 INTEGER ilon, ilat
76 REAL factt ! pas de temps entre deux appels au guidage, en fraction de jour
77 real ztau(iim + 1, jjm + 1)
78
79 INTEGER ij, l
80 INTEGER ncidpl, status
81 INTEGER rcod, rid
82 REAL tau
83 INTEGER, SAVE:: nlev
84
85 ! TEST SUR QSAT
86 REAL p(iim + 1, jjm + 1, llmp1)
87 real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
88
89 REAL qsat(iim + 1, jjm + 1, llm)
90
91 INTEGER, parameter:: igrads = 2
92 REAL:: dtgrads = 100.
93
94 !-----------------------------------------------------------------------
95
96 PRINT *, 'Call sequence information: guide'
97
98 first_call: IF (itau == 0) THEN
99 CALL conf_guide
100 CALL inigrads(igrads, rlonv, 180. / pi, -180., 180., rlatu, -90., &
101 90., 180. / pi, presnivs, 1., dtgrads, 'guide', 'dyn_zon ')
102
103 IF (online) THEN
104 ! Constantes de temps de rappel en jour
105
106 ! coordonnees du centre du zoom
107 CALL coordij(clon, clat, ilon, ilat)
108 ! aire de la maille au centre du zoom
109 aire_min = aire(ilon+(ilat - 1) * iip1)
110 ! aire maximale de la maille
111 aire_max = 0.
112 DO ij = 1, ip1jmp1
113 aire_max = max(aire_max, aire(ij))
114 END DO
115
116 factt = dtvr * iperiod / daysec
117
118 CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
119 CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
120 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
121 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
122 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
123
124 CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
125 CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
126 CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
127 ELSE
128 ! Cas ou on force exactement par les variables analysees
129 alpha_t = 0.
130 alpha_u = 0.
131 alpha_v = 0.
132 alpha_p = 0.
133 END IF
134
135 step_rea = 1
136 count_no_rea = 0
137 ncidpl = -99
138
139 ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
140 if (guide_u) call nf95_open('u.nc',Nf90_NOWRITe,ncidpl)
141 if (guide_v) call nf95_open('v.nc',nf90_nowrite,ncidpl)
142 if (guide_T) call nf95_open('T.nc',nf90_nowrite,ncidpl)
143 if (guide_Q) call nf95_open('hur.nc',nf90_nowrite, ncidpl)
144
145 IF (ncep) THEN
146 status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
147 ELSE
148 status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
149 END IF
150 call nf95_inquire_dimension(ncidpl, rid, nclen=nlev)
151 PRINT *, 'nlev', nlev
152 rcod = nf90_close(ncidpl)
153 ! Lecture du premier etat des reanalyses.
154 CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
155 masserea2, nlev)
156 qrea2 = max(qrea2, 0.1)
157 END IF first_call
158
159 ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
160
161 ! Nudging fields are given 4 times per day:
162 IF (mod(itau, day_step / 4) == 0) THEN
163 vcovrea1 = vcovrea2
164 ucovrea1 = ucovrea2
165 tetarea1 = tetarea2
166 qrea1 = qrea2
167
168 PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
169 count_no_rea, ' non lectures'
170 step_rea = step_rea + 1
171 CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
172 masserea2, nlev)
173 qrea2 = max(qrea2, 0.1)
174 factt = dtvr * iperiod / daysec
175 ztau = factt / max(alpha_t, 1E-10)
176 CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
177 CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
178 CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
179 CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
180 CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
181 CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
182 CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
183 CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
184 CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
185 CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
186 CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
187 ELSE
188 count_no_rea = count_no_rea + 1
189 END IF
190
191 ! Guidage
192
193 tau = mod(real(itau) / real(day_step / 4), 1.)
194
195 ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
196
197 IF (guide_u) THEN
198 IF (itau == 0 .AND. ini_anal) then
199 ucov = ucovrea1
200 else
201 forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) * ucov(:, :, l) &
202 + alpha_u * ((1. - tau) * ucovrea1(:, :, l) &
203 + tau * ucovrea2(:, :, l))
204 end IF
205 END IF
206
207 IF (guide_t) THEN
208 IF (itau == 0 .AND. ini_anal) then
209 teta = tetarea1
210 else
211 forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) * teta(:, :, l) &
212 + alpha_t * ((1. - tau) * tetarea1(:, :, l) &
213 + tau * tetarea2(:, :, l))
214 end IF
215 END IF
216
217 IF (guide_q) THEN
218 ! Calcul de l'humidité saturante :
219 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
220 CALL exner_hyb(ps, p, pks, pk)
221 qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
222
223 ! humidité relative en % -> humidité spécifique
224 IF (itau == 0 .AND. ini_anal) then
225 q = qsat * qrea1 * 0.01
226 else
227 forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
228 + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
229 + tau * qrea2(:, :, l)) * 0.01)
230 end IF
231 END IF
232
233 IF (guide_v) THEN
234 IF (itau == 0 .AND. ini_anal) then
235 vcov = vcovrea1
236 else
237 forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) * vcov(:, :, l) &
238 + alpha_v * ((1. - tau) * vcovrea1(:, :, l) &
239 + tau * vcovrea2(:, :, l))
240 end IF
241 END IF
242
243 END SUBROUTINE guide
244
245 END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21