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

  ViewVC Help
Powered by ViewVC 1.1.21