/[lmdze]/trunk/libf/filtrez/filtreg.f90
ViewVC logotype

Contents of /trunk/libf/filtrez/filtreg.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (show annotations)
Tue Dec 21 15:45:48 2010 UTC (13 years, 4 months ago) by guez
File size: 6341 byte(s)
Inlined procedure "pression".

Split "guide.f90" into "guide.f90" and "tau2alpha.f90". Split
"read_reanalyse.f" into single-procedure files in directory
"Read_reanalyse".

Useless copy of variables in "iniphysiq". Directly define module
variables in "gcm" and remove procedure "iniphysiq".

Added "pressure-altitude" in "test_disvert".

1 module filtreg_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal, iter)
8
9 ! From filtrez/filtreg.F, version 1.1.1.1, 2004/05/19 12:53:09
10 ! Author: P. Le Van
11 ! Objet : filtre matriciel longitudinal, avec les matrices précalculées
12 ! pour l'opérateur filtre.
13
14 USE dimens_m, ONLY : iim, jjm
15 USE parafilt, ONLY: matriceun, matriceus, matricevn, matricevs, matrinvn, &
16 matrinvs
17 USE coefils, ONLY : jfiltnu, jfiltnv, jfiltsu, jfiltsv, sddu, sddv, &
18 unsddu, unsddv
19
20 INTEGER, intent(in):: nlat ! nombre de latitudes a filtrer
21 integer, intent(in):: nbniv ! nombre de niveaux verticaux a filtrer
22
23 REAL, intent(inout):: champ(iim + 1, nlat, nbniv)
24 ! en entrée : champ à filtrer, en sortie : champ filtré
25
26 integer, intent(in):: ifiltre
27 ! +1 Transformee directe
28 ! -1 Transformee inverse
29 ! +2 Filtre directe
30 ! -2 Filtre inverse
31 ! Variable Intensive
32 ! ifiltre = 1 filtre directe
33 ! ifiltre =-1 filtre inverse
34 ! Variable Extensive
35 ! ifiltre = 2 filtre directe
36 ! ifiltre =-2 filtre inverse
37
38 integer, intent(in):: iaire
39 ! 1 si champ intensif
40 ! 2 si champ extensif (pondere par les aires)
41
42 integer, intent(in):: iter
43 ! 1 filtre simple
44
45 LOGICAL, intent(in):: griscal
46
47 ! Variables local to the procedure:
48
49 INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil
50 INTEGER i, j, l, k
51 REAL eignq(iim), sdd1(iim), sdd2(iim)
52 INTEGER hemisph
53
54 !-----------------------------------------------------------
55
56 IF (ifiltre==1 .OR. ifiltre==-1) STOP &
57 'Pas de transformee simple dans cette version'
58
59 IF (iter==2) THEN
60 PRINT *, ' Pas d iteration du filtre dans cette version !', &
61 ' Utiliser old_filtreg et repasser !'
62 STOP
63 END IF
64
65 IF (ifiltre==-2 .AND. .NOT. griscal) THEN
66 PRINT *, ' Cette routine ne calcule le filtre inverse que ', &
67 ' sur la grille des scalaires !'
68 STOP
69 END IF
70
71 IF (ifiltre/=2 .AND. ifiltre/=-2) THEN
72 PRINT *, ' Probleme dans filtreg car ifiltre NE 2 et NE -2', &
73 ' corriger et repasser !'
74 STOP
75 END IF
76
77 IF (griscal) THEN
78 IF (nlat /= jjm + 1) THEN
79 PRINT 1111
80 STOP
81 ELSE
82
83 IF (iaire==1) THEN
84 sdd1 = sddv
85 sdd2 = unsddv
86 ELSE
87 sdd1 = unsddv
88 sdd2 = sddv
89 END IF
90
91 jdfil1 = 2
92 jffil1 = jfiltnu
93 jdfil2 = jfiltsu
94 jffil2 = jjm
95 END IF
96 ELSE
97 IF (nlat/=jjm) THEN
98 PRINT 2222
99 STOP
100 ELSE
101
102 IF (iaire==1) THEN
103 sdd1 = sddu
104 sdd2 = unsddu
105 ELSE
106 sdd1 = unsddu
107 sdd2 = sddu
108 END IF
109
110 jdfil1 = 1
111 jffil1 = jfiltnv
112 jdfil2 = jfiltsv
113 jffil2 = jjm
114 END IF
115 END IF
116
117
118 DO hemisph = 1, 2
119
120 IF (hemisph==1) THEN
121 jdfil = jdfil1
122 jffil = jffil1
123 ELSE
124 jdfil = jdfil2
125 jffil = jffil2
126 END IF
127
128
129 DO l = 1, nbniv
130 DO j = jdfil, jffil
131
132
133 DO i = 1, iim
134 champ(i, j, l) = champ(i, j, l)*sdd1(i)
135 END DO
136
137
138 IF (hemisph==1) THEN
139
140 IF (ifiltre==-2) THEN
141 DO k = 1, iim
142 eignq(k) = 0.0
143 END DO
144 DO k = 1, iim
145 DO i = 1, iim
146 eignq(k) = eignq(k) + matrinvn(k, i, j)*champ(i, j, l)
147 END DO
148 END DO
149 ELSE IF (griscal) THEN
150 DO k = 1, iim
151 eignq(k) = 0.0
152 END DO
153 DO i = 1, iim
154 DO k = 1, iim
155 eignq(k) = eignq(k) + matriceun(k, i, j) &
156 * champ(i, j, l)
157 END DO
158 END DO
159 ELSE
160 DO k = 1, iim
161 eignq(k) = 0.0
162 END DO
163 DO i = 1, iim
164 DO k = 1, iim
165 eignq(k) = eignq(k) + matricevn(k, i, j) &
166 * champ(i, j, l)
167 END DO
168 END DO
169 END IF
170
171 ELSE
172
173 IF (ifiltre==-2) THEN
174 DO k = 1, iim
175 eignq(k) = 0.0
176 END DO
177 DO i = 1, iim
178 DO k = 1, iim
179 eignq(k) = eignq(k) + matrinvs(k, i, j-jfiltsu+1) &
180 *champ(i, j, l)
181 END DO
182 END DO
183 ELSE IF (griscal) THEN
184 DO k = 1, iim
185 eignq(k) = 0.0
186 END DO
187 DO i = 1, iim
188 DO k = 1, iim
189 eignq(k) = eignq(k) + matriceus(k, i, j-jfiltsu+1) &
190 *champ(i, j , l)
191 END DO
192 END DO
193 ELSE
194 DO k = 1, iim
195 eignq(k) = 0.0
196 END DO
197 DO i = 1, iim
198 DO k = 1, iim
199 eignq(k) = eignq(k) + matricevs(k, i, j-jfiltsv+1) &
200 *champ(i, j , l)
201 END DO
202 END DO
203 END IF
204
205 END IF
206
207 IF (ifiltre==2) THEN
208 DO i = 1, iim
209 champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)
210 end DO
211 ELSE
212 DO i = 1, iim
213 champ(i, j, l) = (champ(i, j, l)-eignq(i))*sdd2(i)
214 end DO
215 END IF
216
217 champ(iim + 1, j, l) = champ(1, j, l)
218
219 END DO
220
221 END DO
222
223 end DO
224
225 1111 FORMAT (//20X, 'ERREUR dans le dimensionnement du tableau &
226 & CHAMP a filtrer, sur la grille des scalaires'/)
227 2222 FORMAT (//20X, 'ERREUR dans le dimensionnement du tableau &
228 &CHAMP a filtrer, sur la grille de V ou de Z'/)
229
230 END SUBROUTINE filtreg
231
232 end module filtreg_m

  ViewVC Help
Powered by ViewVC 1.1.21