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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 2 months ago) by guez
Original Path: trunk/libf/filtrez/filtreg.f
File size: 6294 byte(s)
Initial import
1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/filtreg.F,v 1.1.1.1 2004/05/19 12:53:09 lmdzadmin Exp $
3 !
4 SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire,
5 . griscal ,iter)
6
7 use dimens_m
8 use paramet_m
9 IMPLICIT NONE
10 c=======================================================================
11 c
12 c Auteur: P. Le Van 07/10/97
13 c ------
14 c
15 c Objet: filtre matriciel longitudinal ,avec les matrices precalculees
16 c pour l'operateur Filtre .
17 c ------
18 c
19 c Arguments:
20 c ----------
21 c
22 c nblat nombre de latitudes a filtrer
23 c nbniv nombre de niveaux verticaux a filtrer
24 c champ(iip1,nblat,nbniv) en entree : champ a filtrer
25 c en sortie : champ filtre
26 c ifiltre +1 Transformee directe
27 c -1 Transformee inverse
28 c +2 Filtre directe
29 c -2 Filtre inverse
30 c
31 c iaire 1 si champ intensif
32 c 2 si champ extensif (pondere par les aires)
33 c
34 c iter 1 filtre simple
35 c
36 c=======================================================================
37 c
38 c
39 c Variable Intensive
40 c ifiltre = 1 filtre directe
41 c ifiltre =-1 filtre inverse
42 c
43 c Variable Extensive
44 c ifiltre = 2 filtre directe
45 c ifiltre =-2 filtre inverse
46 c
47 c
48 include "parafilt.h"
49 include "coefils.h"
50 c
51 INTEGER nlat,nbniv,ifiltre,iter
52 INTEGER i,j,l,k
53 INTEGER iim2,immjm
54 INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
55
56 REAL champ( iip1,nlat,nbniv)
57 REAL matriceun,matriceus,matricevn,matricevs,matrinvn,matrinvs
58 COMMON/matrfil/matriceun(iim,iim,nfilun),matriceus(iim,iim,nfilus)
59 , , matricevn(iim,iim,nfilvn),matricevs(iim,iim,nfilvs)
60 , , matrinvn(iim,iim,nfilun),matrinvs (iim,iim,nfilus)
61 REAL eignq(iim), sdd1(iim),sdd2(iim)
62 LOGICAL griscal
63 INTEGER hemisph, iaire
64 c
65
66 IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)
67 * STOP'Pas de transformee simple dans cette version'
68
69 IF( iter.EQ. 2 ) THEN
70 PRINT *,' Pas d iteration du filtre dans cette version !'
71 * , ' Utiliser old_filtreg et repasser !'
72 STOP
73 ENDIF
74
75 IF( ifiltre.EQ. -2 .AND..NOT.griscal ) THEN
76 PRINT *,' Cette routine ne calcule le filtre inverse que ',
77 * ' sur la grille des scalaires !'
78 STOP
79 ENDIF
80
81 IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 ) THEN
82 PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2'
83 *,' corriger et repasser !'
84 STOP
85 ENDIF
86 c
87
88 iim2 = iim * iim
89 immjm = iim * jjm
90 c
91 c
92 IF( griscal ) THEN
93 IF( nlat. NE. jjp1 ) THEN
94 PRINT 1111
95 STOP
96 ELSE
97 c
98 IF( iaire.EQ.1 ) THEN
99 CALL SCOPY( iim, sddv, 1, sdd1, 1 )
100 CALL SCOPY( iim, unsddv, 1, sdd2, 1 )
101 ELSE
102 CALL SCOPY( iim, unsddv, 1, sdd1, 1 )
103 CALL SCOPY( iim, sddv, 1, sdd2, 1 )
104 END IF
105 c
106 jdfil1 = 2
107 jffil1 = jfiltnu
108 jdfil2 = jfiltsu
109 jffil2 = jjm
110 END IF
111 ELSE
112 IF( nlat.NE.jjm ) THEN
113 PRINT 2222
114 STOP
115 ELSE
116 c
117 IF( iaire.EQ.1 ) THEN
118 CALL SCOPY( iim, sddu, 1, sdd1, 1 )
119 CALL SCOPY( iim, unsddu, 1, sdd2, 1 )
120 ELSE
121 CALL SCOPY( iim, unsddu, 1, sdd1, 1 )
122 CALL SCOPY( iim, sddu, 1, sdd2, 1 )
123 END IF
124 c
125 jdfil1 = 1
126 jffil1 = jfiltnv
127 jdfil2 = jfiltsv
128 jffil2 = jjm
129 END IF
130 END IF
131 c
132 c
133 DO 100 hemisph = 1, 2
134 c
135 IF ( hemisph.EQ.1 ) THEN
136 jdfil = jdfil1
137 jffil = jffil1
138 ELSE
139 jdfil = jdfil2
140 jffil = jffil2
141 END IF
142
143
144 DO 50 l = 1, nbniv
145 DO 30 j = jdfil,jffil
146
147
148 DO 5 i = 1, iim
149 champ(i,j,l) = champ(i,j,l) * sdd1(i)
150 5 CONTINUE
151 c
152
153 IF( hemisph. EQ. 1 ) THEN
154
155 IF( ifiltre. EQ. -2 ) THEN
156 DO k = 1, iim
157 eignq(k) = 0.0
158 ENDDO
159 DO k = 1, iim
160 DO i = 1, iim
161 eignq(k) = eignq(k) + matrinvn(k,i,j)*champ(i,j,l)
162 ENDDO
163 ENDDO
164 ELSE IF ( griscal ) THEN
165 DO k = 1, iim
166 eignq(k) = 0.0
167 ENDDO
168 DO i = 1, iim
169 DO k = 1, iim
170 eignq(k) = eignq(k) + matriceun(k,i,j)*champ(i,j,l)
171 ENDDO
172 ENDDO
173 ELSE
174 DO k = 1, iim
175 eignq(k) = 0.0
176 ENDDO
177 DO i = 1, iim
178 DO k = 1, iim
179 eignq(k) = eignq(k) + matricevn(k,i,j)*champ(i,j,l)
180 ENDDO
181 ENDDO
182 ENDIF
183
184 ELSE
185
186 IF( ifiltre. EQ. -2 ) THEN
187 DO k = 1, iim
188 eignq(k) = 0.0
189 ENDDO
190 DO i = 1, iim
191 DO k = 1, iim
192 eignq(k) = eignq(k) + matrinvs(k,i,j-jfiltsu+1)*champ(i,j,l)
193 ENDDO
194 ENDDO
195 ELSE IF ( griscal ) THEN
196 DO k = 1, iim
197 eignq(k) = 0.0
198 ENDDO
199 DO i = 1, iim
200 DO k = 1, iim
201 eignq(k) = eignq(k) + matriceus(k,i,j-jfiltsu+1)*champ(i,j,l)
202 ENDDO
203 ENDDO
204 ELSE
205 DO k = 1, iim
206 eignq(k) = 0.0
207 ENDDO
208 DO i = 1, iim
209 DO k = 1, iim
210 eignq(k) = eignq(k) + matricevs(k,i,j-jfiltsv+1)*champ(i,j,l)
211 ENDDO
212 ENDDO
213 ENDIF
214
215 ENDIF
216 c
217 IF( ifiltre.EQ. 2 ) THEN
218 DO 15 i = 1, iim
219 champ( i,j,l ) = ( champ(i,j,l) + eignq(i) ) * sdd2(i)
220 15 CONTINUE
221 ELSE
222 DO 16 i=1,iim
223 champ( i,j,l ) = ( champ(i,j,l) - eignq(i) ) * sdd2(i)
224 16 CONTINUE
225 ENDIF
226 c
227 champ( iip1,j,l ) = champ( 1,j,l )
228 c
229 30 CONTINUE
230 c
231 50 CONTINUE
232 c
233 100 CONTINUE
234 c
235 1111 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a
236 *filtrer, sur la grille des scalaires'/)
237 2222 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi
238 *ltrer, sur la grille de V ou de Z'/)
239 RETURN
240 END

  ViewVC Help
Powered by ViewVC 1.1.21