/[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 109 - (show annotations)
Wed Sep 17 10:08:00 2014 UTC (9 years, 8 months ago) by guez
Original Path: trunk/dyn3d/guide.f
File size: 7451 byte(s)
Moved a call to writefield from guide to tau2alpha. (dxdys does not
change with itau.) So dxdys does not need to be a module variable any
longer. Other variables of modules tau2alpha_m downgraded to local
variables of tau2alpha, since they were not used elsewhere.

Procedures write_field[13]d and formcoord were never called. Could
then remove int2str.

Inline writefield_gen into writefield.

CreateNewField takes an integer array argument instead of 3 scalar
integers. CreateNewField now creates a number of dimensions adapted to
the rank of the output field, instead of always 4 dimensions.

Changed names of variables of module write_field: fieldid to
ncid, fieldindex to record, fieldvarid to varid.

In writefield_gen, if index == -1, no need to call GetFieldIndex
again, we know that the result is nbfield.

In guide, moved calls to writefield for some variables inside if
first_call: those variables do not change with time. Removed ztau:
computed only to be output, does not seem meaningful. Removed
writefield for aire: does not change with time and is already in
"grilles_gcm.nc".

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

  ViewVC Help
Powered by ViewVC 1.1.21