/[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 173 - (show annotations)
Tue Oct 6 15:57:02 2015 UTC (8 years, 7 months ago) by guez
File size: 6553 byte(s)
correctbid did nothing. (Not used either in LMDZ since revision 1170.)

Avoid aliasing in arguments of nat2gcm: use a single set of arguments
with intent inout. Argument q of nat2gcm was not used.

pres2lev now accepts po in any monotonic order. So the input files for
nudging can now have the pressure coordinate in any order. Also, we
read the latitude coordinate from the input files for nudging and we
invert order if necessary so the input files for nudging can now have
the latitude coordinate in any order.

In pre2lev, no need for lmomx: use automatic arrays.

Removed variable ncep of module conf_guide_m. Instead, we find out
what the pressure coordinate is with find_coord.


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 conf_gcm_m, ONLY: day_step
16 use conf_guide_m, only: guide_u, guide_v, guide_t, guide_q, ini_anal, &
17 tau_min_u, tau_max_u, tau_min_v, tau_max_v, tau_min_t, tau_max_t, &
18 tau_min_q, tau_max_q, online, factt
19 USE dimens_m, ONLY: iim, jjm, llm
20 USE disvert_m, ONLY: ap, bp, preff
21 use dynetat0_m, only: grossismx, grossismy, rlatu, rlatv
22 USE exner_hyb_m, ONLY: exner_hyb
23 use init_tau2alpha_m, only: init_tau2alpha
24 use nr_util, only: pi
25 USE paramet_m, ONLY: iip1, ip1jmp1, jjp1, llmp1
26 USE q_sat_m, ONLY: q_sat
27 use read_reanalyse_m, only: read_reanalyse
28 use tau2alpha_m, only: tau2alpha
29 use writefield_m, only: writefield
30
31 INTEGER, INTENT(IN):: itau
32 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
33 REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
34
35 REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
36 ! température potentielle
37
38 REAL, intent(inout):: q(:, :, :) ! (iim + 1, jjm + 1, llm)
39 REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
40
41 ! Local:
42
43 ! variables dynamiques pour les réanalyses
44
45 REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
46 ! vents covariants reanalyses
47
48 REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
49 REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
50
51 REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
52 ! vents covariants reanalyses
53
54 REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
55 REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
56
57 ! alpha détermine la part des injections de données à chaque étape
58 ! alpha=0 signifie pas d'injection
59 ! alpha=1 signifie injection totale
60 REAL, save:: alpha_q(iim + 1, jjm + 1)
61 REAL, save:: alpha_t(iim + 1, jjm + 1)
62 REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
63
64 INTEGER l
65 REAL tau
66
67 ! TEST SUR QSAT
68 REAL p(iim + 1, jjm + 1, llmp1)
69 real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
70 REAL qsat(iim + 1, jjm + 1, llm)
71
72 REAL dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)
73
74 !-----------------------------------------------------------------------
75
76 IF (itau == 0) THEN
77 IF (online) THEN
78 IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN
79 ! grille regulière
80 if (guide_u) alpha_u = factt / tau_max_u
81 if (guide_v) alpha_v = factt / tau_max_v
82 if (guide_t) alpha_t = factt / tau_max_t
83 if (guide_q) alpha_q = factt / tau_max_q
84 else
85 call init_tau2alpha(dxdys, dxdyu, dxdyv)
86
87 if (guide_u) then
88 CALL tau2alpha(dxdyu, rlatu, tau_min_u, tau_max_u, alpha_u)
89 CALL writefield("alpha_u", alpha_u)
90 end if
91
92 if (guide_v) then
93 CALL tau2alpha(dxdyv, rlatv, tau_min_v, tau_max_v, alpha_v)
94 CALL writefield("alpha_v", alpha_v)
95 end if
96
97 if (guide_t) then
98 CALL tau2alpha(dxdys, rlatu, tau_min_t, tau_max_t, alpha_t)
99 CALL writefield("alpha_t", alpha_t)
100 end if
101
102 if (guide_q) then
103 CALL tau2alpha(dxdys, rlatu, tau_min_q, tau_max_q, alpha_q)
104 CALL writefield("alpha_q", alpha_q)
105 end if
106 end IF
107 ELSE
108 ! Cas où on force exactement par les variables analysées
109 if (guide_u) alpha_u = 1.
110 if (guide_v) alpha_v = 1.
111 if (guide_t) alpha_t = 1.
112 if (guide_q) alpha_q = 1.
113 END IF
114
115 ! Lecture du premier état des réanalyses :
116 CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
117 qrea2 = max(qrea2, 0.1)
118
119 if (ini_anal) then
120 IF (guide_u) ucov = ucovrea2
121 IF (guide_v) vcov = vcovrea2
122 IF (guide_t) teta = tetarea2
123
124 IF (guide_q) then
125 ! Calcul de l'humidité saturante :
126 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
127 CALL exner_hyb(ps, p, pks, pk)
128 q = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa)) &
129 * qrea2 * 0.01
130 end IF
131 end if
132 END IF
133
134 ! Importation des vents, pression et temp\'erature r\'eels :
135
136 ! Nudging fields are given 4 times per day:
137 IF (mod(itau, day_step / 4) == 0) THEN
138 vcovrea1 = vcovrea2
139 ucovrea1 = ucovrea2
140 tetarea1 = tetarea2
141 qrea1 = qrea2
142
143 CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
144 qrea2 = max(qrea2, 0.1)
145
146 if (guide_u) then
147 CALL writefield("ucov", ucov)
148 CALL writefield("ucovrea2", ucovrea2)
149 end if
150
151 if (guide_t) then
152 CALL writefield("teta", teta)
153 CALL writefield("tetarea2", tetarea2)
154 end if
155
156 if (guide_q) then
157 CALL writefield("qrea2", qrea2)
158 CALL writefield("q", q)
159 end if
160 END IF
161
162 ! Guidage
163
164 tau = mod(real(itau) / real(day_step / 4), 1.)
165
166 ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
167
168 IF (guide_u) forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) &
169 * ucov(:, :, l) + alpha_u * ((1. - tau) * ucovrea1(:, :, l) + tau &
170 * ucovrea2(:, :, l))
171
172 IF (guide_v) forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) &
173 * vcov(:, :, l) + alpha_v * ((1. - tau) * vcovrea1(:, :, l) + tau &
174 * vcovrea2(:, :, l))
175
176 IF (guide_t) forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) &
177 * teta(:, :, l) + alpha_t * ((1. - tau) * tetarea1(:, :, l) + tau &
178 * tetarea2(:, :, l))
179
180 IF (guide_q) THEN
181 ! Calcul de l'humidité saturante :
182 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
183 CALL exner_hyb(ps, p, pks, pk)
184 qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
185
186 ! humidité relative en % -> humidité spécifique
187 forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
188 + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
189 + tau * qrea2(:, :, l)) * 0.01)
190 END IF
191
192 END SUBROUTINE guide
193
194 END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21