/[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 172 - (show annotations)
Wed Sep 30 15:59:14 2015 UTC (8 years, 7 months ago) by guez
File size: 6559 byte(s)
Just indented correctbid and nat2gcm.

The procedure read_reanalyse just reads the next time slab every time
it is called. No use keeping track of the time index in the calling
procedure, guide. It is simpler to do it in read_reanalyse. Also
simpler to read the number of vertical levels in read_reanalyse than
in guide, since we have already in read_reanalyse the input of
pressure levels. We then have to make the arrays containing reanalyses
static allocatable instead of automatic. Also only read pressure
levels at the first call of read_reanalyse instead of at every call.

masserea2 not used in guide. Remove it down the chain in
read_reanalyse and reanalyse2nat.

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, ncep, &
17 ini_anal, tau_min_u, tau_max_u, tau_min_v, tau_max_v, tau_min_t, &
18 tau_max_t, 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