/[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 135 - (show annotations)
Thu Apr 30 14:22:32 2015 UTC (9 years ago) by guez
File size: 7937 byte(s)
Use matmul in filtreg.
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 CONTAINS
9
10 SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
11
12 ! Author: F.Hourdin
13
14 USE comconst, ONLY: cpp, kappa
15 USE comgeom, ONLY: rlatu, rlatv
16 USE conf_gcm_m, ONLY: day_step
17 use conf_guide_m, only: guide_u, guide_v, guide_t, guide_q, ncep, &
18 ini_anal, tau_min_u, tau_max_u, tau_min_v, tau_max_v, tau_min_t, &
19 tau_max_t, tau_min_q, tau_max_q, online, factt
20 USE dimens_m, ONLY: iim, jjm, llm
21 USE disvert_m, ONLY: ap, bp, preff
22 USE exner_hyb_m, ONLY: exner_hyb
23 use init_tau2alpha_m, only: init_tau2alpha
24 use netcdf, only: nf90_nowrite
25 use netcdf95, only: nf95_close, nf95_inq_dimid, nf95_inquire_dimension, &
26 nf95_open
27 use nr_util, only: pi
28 USE paramet_m, ONLY: iip1, ip1jmp1, jjp1, llmp1
29 USE q_sat_m, ONLY: q_sat
30 use read_reanalyse_m, only: read_reanalyse
31 use serre, only: grossismx, grossismy
32 use tau2alpha_m, only: tau2alpha
33 use writefield_m, only: writefield
34
35 INTEGER, INTENT(IN):: itau
36 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
37 REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
38
39 REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
40 ! température potentielle
41
42 REAL, intent(inout):: q(:, :, :) ! (iim + 1, jjm + 1, llm)
43 REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
44
45 ! Local:
46
47 ! variables dynamiques pour les réanalyses
48
49 REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
50 ! vents covariants reanalyses
51
52 REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
53 REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
54
55 REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
56 ! vents covariants reanalyses
57
58 REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
59 REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
60 REAL, save:: masserea2(ip1jmp1, llm) ! masse
61
62 ! alpha détermine la part des injections de données à chaque étape
63 ! alpha=0 signifie pas d'injection
64 ! alpha=1 signifie injection totale
65 REAL, save:: alpha_q(iim + 1, jjm + 1)
66 REAL, save:: alpha_t(iim + 1, jjm + 1)
67 REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
68
69 INTEGER, save:: step_rea, count_no_rea
70
71 INTEGER l
72 INTEGER ncid, dimid
73 REAL tau
74 INTEGER, SAVE:: nlev
75
76 ! TEST SUR QSAT
77 REAL p(iim + 1, jjm + 1, llmp1)
78 real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
79 REAL qsat(iim + 1, jjm + 1, llm)
80
81 REAL dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)
82
83 !-----------------------------------------------------------------------
84
85 !!PRINT *, 'Call sequence information: guide'
86
87 first_call: IF (itau == 0) THEN
88 IF (online) THEN
89 IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN
90 ! grille regulière
91 if (guide_u) alpha_u = factt / tau_max_u
92 if (guide_v) alpha_v = factt / tau_max_v
93 if (guide_t) alpha_t = factt / tau_max_t
94 if (guide_q) alpha_q = factt / tau_max_q
95 else
96 call init_tau2alpha(dxdys, dxdyu, dxdyv)
97
98 if (guide_u) then
99 CALL tau2alpha(dxdyu, rlatu, tau_min_u, tau_max_u, alpha_u)
100 CALL writefield("alpha_u", alpha_u)
101 end if
102
103 if (guide_v) then
104 CALL tau2alpha(dxdyv, rlatv, tau_min_v, tau_max_v, alpha_v)
105 CALL writefield("alpha_v", alpha_v)
106 end if
107
108 if (guide_t) then
109 CALL tau2alpha(dxdys, rlatu, tau_min_t, tau_max_t, alpha_t)
110 CALL writefield("alpha_t", alpha_t)
111 end if
112
113 if (guide_q) then
114 CALL tau2alpha(dxdys, rlatu, tau_min_q, tau_max_q, alpha_q)
115 CALL writefield("alpha_q", alpha_q)
116 end if
117 end IF
118 ELSE
119 ! Cas où on force exactement par les variables analysées
120 if (guide_u) alpha_u = 1.
121 if (guide_v) alpha_v = 1.
122 if (guide_t) alpha_t = 1.
123 if (guide_q) alpha_q = 1.
124 END IF
125
126 step_rea = 1
127 count_no_rea = 0
128
129 ! lecture d'un fichier netcdf pour determiner le nombre de niveaux :
130
131 if (guide_u) then
132 call nf95_open('u.nc',Nf90_NOWRITe,ncid)
133 else if (guide_v) then
134 call nf95_open('v.nc',nf90_nowrite,ncid)
135 else if (guide_T) then
136 call nf95_open('T.nc',nf90_nowrite,ncid)
137 else
138 call nf95_open('hur.nc',nf90_nowrite, ncid)
139 end if
140
141 IF (ncep) THEN
142 call nf95_inq_dimid(ncid, 'LEVEL', dimid)
143 ELSE
144 call nf95_inq_dimid(ncid, 'PRESSURE', dimid)
145 END IF
146 call nf95_inquire_dimension(ncid, dimid, nclen=nlev)
147 PRINT *, 'nlev = ', nlev
148 call nf95_close(ncid)
149
150 ! Lecture du premier état des réanalyses :
151 CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
152 masserea2, nlev)
153 qrea2 = max(qrea2, 0.1)
154 END IF first_call
155
156 ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
157
158 ! Nudging fields are given 4 times per day:
159 IF (mod(itau, day_step / 4) == 0) THEN
160 vcovrea1 = vcovrea2
161 ucovrea1 = ucovrea2
162 tetarea1 = tetarea2
163 qrea1 = qrea2
164
165 PRINT *, 'Lecture fichiers guidage, pas ', step_rea, 'apres ', &
166 count_no_rea, ' non lectures'
167 step_rea = step_rea + 1
168 CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
169 masserea2, nlev)
170 qrea2 = max(qrea2, 0.1)
171
172 if (guide_u) then
173 CALL writefield("ucov", ucov)
174 CALL writefield("ucovrea2", ucovrea2)
175 end if
176
177 if (guide_t) then
178 CALL writefield("teta", teta)
179 CALL writefield("tetarea2", tetarea2)
180 end if
181
182 if (guide_q) then
183 CALL writefield("qrea2", qrea2)
184 CALL writefield("q", q)
185 end if
186 ELSE
187 count_no_rea = count_no_rea + 1
188 END IF
189
190 ! Guidage
191
192 tau = mod(real(itau) / real(day_step / 4), 1.)
193
194 ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
195
196 IF (guide_u) THEN
197 IF (itau == 0 .AND. ini_anal) then
198 ucov = ucovrea1
199 else
200 forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) * ucov(:, :, l) &
201 + alpha_u * ((1. - tau) * ucovrea1(:, :, l) &
202 + tau * ucovrea2(:, :, l))
203 end IF
204 END IF
205
206 IF (guide_t) THEN
207 IF (itau == 0 .AND. ini_anal) then
208 teta = tetarea1
209 else
210 forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) * teta(:, :, l) &
211 + alpha_t * ((1. - tau) * tetarea1(:, :, l) &
212 + tau * tetarea2(:, :, l))
213 end IF
214 END IF
215
216 IF (guide_q) THEN
217 ! Calcul de l'humidité saturante :
218 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
219 CALL exner_hyb(ps, p, pks, pk)
220 qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
221
222 ! humidité relative en % -> humidité spécifique
223 IF (itau == 0 .AND. ini_anal) then
224 q = qsat * qrea1 * 0.01
225 else
226 forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
227 + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
228 + tau * qrea2(:, :, l)) * 0.01)
229 end IF
230 END IF
231
232 IF (guide_v) THEN
233 IF (itau == 0 .AND. ini_anal) then
234 vcov = vcovrea1
235 else
236 forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) * vcov(:, :, l) &
237 + alpha_v * ((1. - tau) * vcovrea1(:, :, l) &
238 + tau * vcovrea2(:, :, l))
239 end IF
240 END IF
241
242 END SUBROUTINE guide
243
244 END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21