/[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 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 6518 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

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

  ViewVC Help
Powered by ViewVC 1.1.21