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

Contents of /trunk/filtrez/filtreg_scal.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 57 - (show annotations)
Mon Jan 30 12:54:02 2012 UTC (12 years, 4 months ago) by guez
Original Path: trunk/libf/filtrez/filtreg.f90
File size: 6382 byte(s)
Write used namelists to file "" instead of standard output.

Avoid aliasing in "inidissip" in calls to "divgrad2", "divgrad",
"gradiv2", "gradiv", "nxgraro2" and "nxgrarot". Add a degenerate
dimension to arrays so they have rank 3, like the dummy arguments in
"divgrad2", "divgrad", "gradiv2", "gradiv", "nxgraro2" and "nxgrarot".

Extract the initialization part from "bilan_dyn" and make a separate
procedure, "init_dynzon", from it.

Move variables from modules "iniprint" and "logic" to module
"conf_gcm_m".

Promote internal procedures of "fxy" to private procedures of module
"fxy_m".

Extracted documentation from "inigeom". Removed useless "save"
attributes. Removed useless intermediate variables. Extracted
processing of poles from loop on latitudes. Write coordinates to file
"longitude_latitude.txt" instead of standard output.

Do not use ozone tracer for radiative transfer.

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 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 integer, intent(in):: iter
42 ! 1 filtre simple
43
44 LOGICAL, intent(in):: griscal
45
46 ! Variables local to the procedure:
47
48 INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil
49 INTEGER i, j, l, k
50 REAL eignq(iim), sdd1(iim), sdd2(iim)
51 INTEGER hemisph
52
53 !-----------------------------------------------------------
54
55 IF (ifiltre==1 .OR. ifiltre==-1) then
56 print *, 'Pas de transformee simple dans cette version'
57 STOP 1
58 end IF
59
60 IF (iter==2) THEN
61 PRINT *, ' Pas d iteration du filtre dans cette version !', &
62 ' Utiliser old_filtreg et repasser !'
63 STOP 1
64 END IF
65
66 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 1
70 END IF
71
72 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 1
76 END IF
77
78 IF (griscal) THEN
79 IF (nlat /= jjm + 1) THEN
80 PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &
81 // 'filtrer, sur la grille des scalaires'
82 STOP 1
83 ELSE
84 IF (iaire==1) THEN
85 sdd1 = sddv
86 sdd2 = unsddv
87 ELSE
88 sdd1 = unsddv
89 sdd2 = sddv
90 END IF
91
92 jdfil1 = 2
93 jffil1 = jfiltnu
94 jdfil2 = jfiltsu
95 jffil2 = jjm
96 END IF
97 ELSE
98 IF (nlat /= jjm) THEN
99 PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &
100 // 'filtrer, sur la grille de V ou de Z'
101 STOP 1
102 ELSE
103 IF (iaire==1) THEN
104 sdd1 = sddu
105 sdd2 = unsddu
106 ELSE
107 sdd1 = unsddu
108 sdd2 = sddu
109 END IF
110
111 jdfil1 = 1
112 jffil1 = jfiltnv
113 jdfil2 = jfiltsv
114 jffil2 = jjm
115 END IF
116 END IF
117
118 DO hemisph = 1, 2
119 IF (hemisph==1) THEN
120 jdfil = jdfil1
121 jffil = jffil1
122 ELSE
123 jdfil = jdfil2
124 jffil = jffil2
125 END IF
126
127 loop_vertical: DO l = 1, nbniv
128 loop_latitude: DO j = jdfil, jffil
129 DO i = 1, iim
130 champ(i, j, l) = champ(i, j, l)*sdd1(i)
131 END DO
132
133 IF (hemisph==1) THEN
134 IF (ifiltre==-2) THEN
135 DO k = 1, iim
136 eignq(k) = 0.
137 END DO
138 DO k = 1, iim
139 DO i = 1, iim
140 eignq(k) = eignq(k) + matrinvn(k, i, j)*champ(i, j, l)
141 END DO
142 END DO
143 ELSE IF (griscal) THEN
144 DO k = 1, iim
145 eignq(k) = 0.
146 END DO
147 DO i = 1, iim
148 DO k = 1, iim
149 eignq(k) = eignq(k) + matriceun(k, i, j) &
150 * champ(i, j, l)
151 END DO
152 END DO
153 ELSE
154 DO k = 1, iim
155 eignq(k) = 0.
156 END DO
157 DO i = 1, iim
158 DO k = 1, iim
159 eignq(k) = eignq(k) + matricevn(k, i, j) &
160 * champ(i, j, l)
161 END DO
162 END DO
163 END IF
164 ELSE
165 IF (ifiltre==-2) THEN
166 DO k = 1, iim
167 eignq(k) = 0.
168 END DO
169 DO i = 1, iim
170 DO k = 1, iim
171 eignq(k) = eignq(k) + matrinvs(k, i, j-jfiltsu+1) &
172 *champ(i, j, l)
173 END DO
174 END DO
175 ELSE IF (griscal) THEN
176 DO k = 1, iim
177 eignq(k) = 0.
178 END DO
179 DO i = 1, iim
180 DO k = 1, iim
181 eignq(k) = eignq(k) + matriceus(k, i, j-jfiltsu+1) &
182 *champ(i, j , l)
183 END DO
184 END DO
185 ELSE
186 DO k = 1, iim
187 eignq(k) = 0.
188 END DO
189 DO i = 1, iim
190 DO k = 1, iim
191 eignq(k) = eignq(k) + matricevs(k, i, j-jfiltsv+1) &
192 *champ(i, j , l)
193 END DO
194 END DO
195 END IF
196 END IF
197
198 IF (ifiltre==2) THEN
199 DO i = 1, iim
200 champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)
201 end DO
202 ELSE
203 DO i = 1, iim
204 champ(i, j, l) = (champ(i, j, l)-eignq(i))*sdd2(i)
205 end DO
206 END IF
207
208 champ(iim + 1, j, l) = champ(1, j, l)
209 END DO loop_latitude
210 END DO loop_vertical
211 end DO
212
213 END SUBROUTINE filtreg
214
215 end module filtreg_m

  ViewVC Help
Powered by ViewVC 1.1.21