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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (show annotations)
Wed Aug 29 14:47:17 2012 UTC (11 years, 8 months ago) by guez
File size: 6151 byte(s)
Removed variable lstardis in module comdissnew and procedures gradiv
and nxgrarot. lstardir had to be true. gradiv and nxgrarot were called
if lstardis was false. Removed argument iter of procedure
filtreg. iter had to be 1. gradiv and nxgrarot called filtreg with
iter == 2.

Moved procedure flxsetup into module yoecumf. Module yoecumf is only
used in program units of directory Conflx, moved it there.

1 module filtreg_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal)
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 coefils, ONLY: sddu, sddv, unsddu, unsddv
16 use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &
17 matriceus, matricevn, matricevs, matrinvn, matrinvs
18
19 INTEGER, intent(in):: nlat ! nombre de latitudes a filtrer
20 integer, intent(in):: nbniv ! nombre de niveaux verticaux a filtrer
21
22 REAL, intent(inout):: champ(iim + 1, nlat, nbniv)
23 ! en entrée : champ à filtrer, en sortie : champ filtré
24
25 integer, intent(in):: ifiltre
26 ! +1 Transformee directe
27 ! -1 Transformee inverse
28 ! +2 Filtre directe
29 ! -2 Filtre inverse
30 ! Variable Intensive
31 ! ifiltre = 1 filtre directe
32 ! ifiltre =-1 filtre inverse
33 ! Variable Extensive
34 ! ifiltre = 2 filtre directe
35 ! ifiltre =-2 filtre inverse
36
37 integer, intent(in):: iaire
38 ! 1 si champ intensif
39 ! 2 si champ extensif (pondere par les aires)
40
41 LOGICAL, intent(in):: griscal
42
43 ! Variables local to the procedure:
44
45 INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil
46 INTEGER i, j, l, k
47 REAL eignq(iim), sdd1(iim), sdd2(iim)
48 INTEGER hemisph
49
50 !-----------------------------------------------------------
51
52 IF (ifiltre==1 .OR. ifiltre==-1) then
53 print *, 'Pas de transformee simple dans cette version'
54 STOP 1
55 end IF
56
57 IF (ifiltre==-2 .AND. .NOT. griscal) THEN
58 PRINT *, ' Cette routine ne calcule le filtre inverse que ', &
59 ' sur la grille des scalaires !'
60 STOP 1
61 END IF
62
63 IF (ifiltre/=2 .AND. ifiltre/=-2) THEN
64 PRINT *, ' Probleme dans filtreg car ifiltre NE 2 et NE -2', &
65 ' corriger et repasser !'
66 STOP 1
67 END IF
68
69 IF (griscal) THEN
70 IF (nlat /= jjm + 1) THEN
71 PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &
72 // 'filtrer, sur la grille des scalaires'
73 STOP 1
74 ELSE
75 IF (iaire==1) THEN
76 sdd1 = sddv
77 sdd2 = unsddv
78 ELSE
79 sdd1 = unsddv
80 sdd2 = sddv
81 END IF
82
83 jdfil1 = 2
84 jffil1 = jfiltnu
85 jdfil2 = jfiltsu
86 jffil2 = jjm
87 END IF
88 ELSE
89 IF (nlat /= jjm) THEN
90 PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &
91 // 'filtrer, sur la grille de V ou de Z'
92 STOP 1
93 ELSE
94 IF (iaire==1) THEN
95 sdd1 = sddu
96 sdd2 = unsddu
97 ELSE
98 sdd1 = unsddu
99 sdd2 = sddu
100 END IF
101
102 jdfil1 = 1
103 jffil1 = jfiltnv
104 jdfil2 = jfiltsv
105 jffil2 = jjm
106 END IF
107 END IF
108
109 DO hemisph = 1, 2
110 IF (hemisph==1) THEN
111 jdfil = jdfil1
112 jffil = jffil1
113 ELSE
114 jdfil = jdfil2
115 jffil = jffil2
116 END IF
117
118 loop_vertical: DO l = 1, nbniv
119 loop_latitude: DO j = jdfil, jffil
120 DO i = 1, iim
121 champ(i, j, l) = champ(i, j, l)*sdd1(i)
122 END DO
123
124 IF (hemisph==1) THEN
125 IF (ifiltre==-2) THEN
126 DO k = 1, iim
127 eignq(k) = 0.
128 END DO
129 DO k = 1, iim
130 DO i = 1, iim
131 eignq(k) = eignq(k) + matrinvn(k, i, j)*champ(i, j, l)
132 END DO
133 END DO
134 ELSE IF (griscal) THEN
135 DO k = 1, iim
136 eignq(k) = 0.
137 END DO
138 DO i = 1, iim
139 DO k = 1, iim
140 eignq(k) = eignq(k) + matriceun(k, i, j) &
141 * champ(i, j, l)
142 END DO
143 END DO
144 ELSE
145 DO k = 1, iim
146 eignq(k) = 0.
147 END DO
148 DO i = 1, iim
149 DO k = 1, iim
150 eignq(k) = eignq(k) + matricevn(k, i, j) &
151 * champ(i, j, l)
152 END DO
153 END DO
154 END IF
155 ELSE
156 IF (ifiltre==-2) THEN
157 DO k = 1, iim
158 eignq(k) = 0.
159 END DO
160 DO i = 1, iim
161 DO k = 1, iim
162 eignq(k) = eignq(k) + matrinvs(k, i, j-jfiltsu+1) &
163 *champ(i, j, l)
164 END DO
165 END DO
166 ELSE IF (griscal) THEN
167 DO k = 1, iim
168 eignq(k) = 0.
169 END DO
170 DO i = 1, iim
171 DO k = 1, iim
172 eignq(k) = eignq(k) + matriceus(k, i, j-jfiltsu+1) &
173 *champ(i, j , l)
174 END DO
175 END DO
176 ELSE
177 DO k = 1, iim
178 eignq(k) = 0.
179 END DO
180 DO i = 1, iim
181 DO k = 1, iim
182 eignq(k) = eignq(k) + matricevs(k, i, j-jfiltsv+1) &
183 *champ(i, j , l)
184 END DO
185 END DO
186 END IF
187 END IF
188
189 IF (ifiltre==2) THEN
190 DO i = 1, iim
191 champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)
192 end DO
193 ELSE
194 DO i = 1, iim
195 champ(i, j, l) = (champ(i, j, l)-eignq(i))*sdd2(i)
196 end DO
197 END IF
198
199 champ(iim + 1, j, l) = champ(1, j, l)
200 END DO loop_latitude
201 END DO loop_vertical
202 end DO
203
204 END SUBROUTINE filtreg
205
206 end module filtreg_m

  ViewVC Help
Powered by ViewVC 1.1.21