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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 173 - (hide 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 guez 20 MODULE guide_m
2 guez 3
3 guez 29 ! 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 guez 3
6 guez 37 IMPLICIT NONE
7    
8 guez 20 CONTAINS
9 guez 3
10 guez 102 SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
11 guez 3
12 guez 29 ! Author: F.Hourdin
13 guez 3
14 guez 115 USE comconst, ONLY: cpp, kappa
15     USE conf_gcm_m, ONLY: day_step
16 guez 173 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 guez 88 USE dimens_m, ONLY: iim, jjm, llm
20 guez 135 USE disvert_m, ONLY: ap, bp, preff
21 guez 139 use dynetat0_m, only: grossismx, grossismy, rlatu, rlatv
22 guez 83 USE exner_hyb_m, ONLY: exner_hyb
23 guez 115 use init_tau2alpha_m, only: init_tau2alpha
24 guez 39 use nr_util, only: pi
25 guez 103 USE paramet_m, ONLY: iip1, ip1jmp1, jjp1, llmp1
26 guez 83 USE q_sat_m, ONLY: q_sat
27 guez 88 use read_reanalyse_m, only: read_reanalyse
28 guez 109 use tau2alpha_m, only: tau2alpha
29 guez 108 use writefield_m, only: writefield
30 guez 3
31 guez 83 INTEGER, INTENT(IN):: itau
32 guez 102 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
33     REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
34    
35 guez 108 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 guez 88 REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
40 guez 3
41 guez 83 ! Local:
42    
43 guez 108 ! variables dynamiques pour les réanalyses
44 guez 102
45     REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
46     ! vents covariants reanalyses
47    
48 guez 90 REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
49     REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
50 guez 102
51     REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
52     ! vents covariants reanalyses
53    
54 guez 90 REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
55     REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
56 guez 3
57 guez 116 ! alpha détermine la part des injections de données à chaque étape
58 guez 112 ! alpha=0 signifie pas d'injection
59     ! alpha=1 signifie injection totale
60 guez 90 REAL, save:: alpha_q(iim + 1, jjm + 1)
61 guez 103 REAL, save:: alpha_t(iim + 1, jjm + 1)
62 guez 102 REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
63    
64 guez 115 INTEGER l
65 guez 102 REAL tau
66 guez 3
67 guez 44 ! TEST SUR QSAT
68 guez 90 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 guez 3
72 guez 115 REAL dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)
73    
74 guez 29 !-----------------------------------------------------------------------
75 guez 3
76 guez 172 IF (itau == 0) THEN
77 guez 102 IF (online) THEN
78 guez 115 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 guez 3
87 guez 115 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 guez 3
92 guez 115 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 guez 3
97 guez 115 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 guez 102 ELSE
108 guez 107 ! Cas où on force exactement par les variables analysées
109 guez 115 if (guide_u) alpha_u = 1.
110     if (guide_v) alpha_v = 1.
111     if (guide_t) alpha_t = 1.
112 guez 112 if (guide_q) alpha_q = 1.
113 guez 102 END IF
114 guez 3
115 guez 172 ! Lecture du premier état des réanalyses :
116     CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
117     qrea2 = max(qrea2, 0.1)
118 guez 3
119 guez 172 if (ini_anal) then
120     IF (guide_u) ucov = ucovrea2
121     IF (guide_v) vcov = vcovrea2
122     IF (guide_t) teta = tetarea2
123 guez 115
124 guez 172 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 guez 112 end if
132 guez 172 END IF
133 guez 3
134 guez 172 ! Importation des vents, pression et temp\'erature r\'eels :
135 guez 115
136 guez 102 ! 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 guez 3
143 guez 172 CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
144 guez 102 qrea2 = max(qrea2, 0.1)
145 guez 112
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 guez 102 END IF
161 guez 3
162 guez 102 ! Guidage
163 guez 3
164 guez 102 tau = mod(real(itau) / real(day_step / 4), 1.)
165 guez 3
166 guez 102 ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
167 guez 3
168 guez 172 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 guez 3
172 guez 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 guez 3
176 guez 172 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 guez 102 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 guez 3
186 guez 102 ! humidité relative en % -> humidité spécifique
187 guez 172 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 guez 102 END IF
191 guez 3
192 guez 29 END SUBROUTINE guide
193 guez 20
194     END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21