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

Annotation of /trunk/filtrez/filtreg_scal.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 57 - (hide 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 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     ! Author: P. Le Van
11     ! Objet : filtre matriciel longitudinal, avec les matrices précalculées
12     ! pour l'opérateur filtre.
13 guez 3
14 guez 27 USE dimens_m, ONLY : iim, jjm
15 guez 54 USE coefils, ONLY : sddu, sddv, unsddu, unsddv
16     use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &
17     matriceus, matricevn, matricevs, matrinvn, matrinvs
18 guez 3
19 guez 27 INTEGER, intent(in):: nlat ! nombre de latitudes a filtrer
20     integer, intent(in):: nbniv ! nombre de niveaux verticaux a filtrer
21 guez 3
22 guez 27 REAL, intent(inout):: champ(iim + 1, nlat, nbniv)
23     ! en entrée : champ à filtrer, en sortie : champ filtré
24 guez 3
25 guez 27 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 guez 3
37 guez 27 integer, intent(in):: iaire
38     ! 1 si champ intensif
39     ! 2 si champ extensif (pondere par les aires)
40 guez 3
41 guez 27 integer, intent(in):: iter
42     ! 1 filtre simple
43 guez 3
44 guez 27 LOGICAL, intent(in):: griscal
45 guez 3
46 guez 27 ! Variables local to the procedure:
47 guez 25
48 guez 27 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 guez 25
53 guez 27 !-----------------------------------------------------------
54 guez 25
55 guez 54 IF (ifiltre==1 .OR. ifiltre==-1) then
56     print *, 'Pas de transformee simple dans cette version'
57     STOP 1
58     end IF
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 guez 54 STOP 1
64 guez 27 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 guez 54 STOP 1
70 guez 27 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 guez 54 STOP 1
76 guez 27 END IF
77 guez 25
78 guez 27 IF (griscal) THEN
79     IF (nlat /= jjm + 1) THEN
80 guez 54 PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &
81     // 'filtrer, sur la grille des scalaires'
82     STOP 1
83 guez 27 ELSE
84     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 guez 54 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 guez 27 ELSE
103     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 guez 27 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 guez 25
127 guez 57 loop_vertical: DO l = 1, nbniv
128     loop_latitude: DO j = jdfil, jffil
129 guez 27 DO i = 1, iim
130     champ(i, j, l) = champ(i, j, l)*sdd1(i)
131     END DO
132 guez 25
133 guez 27 IF (hemisph==1) THEN
134     IF (ifiltre==-2) THEN
135     DO k = 1, iim
136 guez 54 eignq(k) = 0.
137 guez 27 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 guez 54 eignq(k) = 0.
146 guez 27 END DO
147     DO i = 1, iim
148     DO k = 1, iim
149 guez 32 eignq(k) = eignq(k) + matriceun(k, i, j) &
150     * champ(i, j, l)
151 guez 27 END DO
152     END DO
153     ELSE
154     DO k = 1, iim
155 guez 54 eignq(k) = 0.
156 guez 27 END DO
157     DO i = 1, iim
158     DO k = 1, iim
159 guez 32 eignq(k) = eignq(k) + matricevn(k, i, j) &
160     * champ(i, j, l)
161 guez 27 END DO
162     END DO
163     END IF
164     ELSE
165     IF (ifiltre==-2) THEN
166     DO k = 1, iim
167 guez 54 eignq(k) = 0.
168 guez 27 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 guez 54 eignq(k) = 0.
178 guez 27 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 guez 54 eignq(k) = 0.
188 guez 27 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 guez 25
198 guez 27 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 guez 25
208 guez 27 champ(iim + 1, j, l) = champ(1, j, l)
209 guez 57 END DO loop_latitude
210     END DO loop_vertical
211 guez 27 end DO
212    
213     END SUBROUTINE filtreg
214    
215     end module filtreg_m

  ViewVC Help
Powered by ViewVC 1.1.21