/[lmdze]/trunk/filtrez/filtreg_scal.f
ViewVC logotype

Annotation of /trunk/filtrez/filtreg_scal.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations)
Tue Apr 6 17:52:58 2010 UTC (14 years, 1 month ago) by guez
Original Path: trunk/libf/filtrez/filtreg.f90
File size: 6342 byte(s)
Split "stringop.f90" into single-procedure files. Gathered files in directory
"IOIPSL/Stringop".

Split "flincom.f90" into "flincom.f90" and "flinget.f90". Removed
unused procedures from module "flincom". Removed unused argument
"filename" of procedure "flinopen_nozoom".

Removed unused files.

Split "grid_change.f90" into "grid_change.f90" and
"gr_phy_write_3d.f90".

Removed unused procedures from modules "calendar", "ioipslmpp",
"grid_atob", "gath_cpl" and "getincom". Removed unused procedures in
files "ppm3d.f" and "thermcell.f".

Split "mathelp.f90" into "mathelp.f90" and "mathop.f90".

Removed unused variable "dpres" of module "comvert".

Use argument "itau" instead of local variables "iadvtr" and "first" to
control algorithm in procedure "fluxstokenc".

Removed unused arguments of procedure "integrd".

Removed useless computations at the end of procedure "leapfrog".

Merged common block "matrfil" into module "parafilt".

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

  ViewVC Help
Powered by ViewVC 1.1.21