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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (show annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 9 months ago) by guez
File size: 6151 byte(s)
No reason to call inidissip in ce0l.

In inidissip, set random seed to 1 beacuse PGI compiler does not
accept all zeros.

dq was computed needlessly in caladvtrac. Arguments masse and dq of
calfis not used.

Replaced real*8 by double precision.

Pass arrays with inverted order of vertical levels to conflx instead
of creating local variables for this inside conflx.

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 coefils, ONLY: sddu, sddv, unsddu, unsddv
15 USE dimens_m, ONLY: iim, jjm
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