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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 54 - (hide annotations)
Tue Dec 6 15:07:04 2011 UTC (12 years, 5 months ago) by guez
File size: 6324 byte(s)
Removed Numerical Recipes procedure "ran1". Replaced calls to "ran1"
in "inidissip" by calls to intrinsic procedures.

Split file "interface_surf.f90" into a file with a module containing
only variables, "interface_surf", and single-procedure files. Gathered
files into directory "Interface_surf".

Added argument "cdivu" to "gradiv" and "gradiv2", "cdivh" to
"divgrad2" and "divgrad", and "crot" to "nxgraro2" and
"nxgrarot". "dissip" now uses variables "cdivu", "cdivh" and "crot"
from module "inidissip_m", so it can pass them to "gradiv2",
etc. Thanks to this modification, we avoid a circular dependency
betwwen "inidissip.f90" and "gradiv2.f90", etc. The value -1. used by
"gradiv2", for instance, during computation of eigenvalues is not the
value "cdivu" computed by "inidissip".

Extracted procedure "start_inter_3d" from module "startdyn", to its
own module.

In "inidissip", unrolled loop on "ii". I find it clearer now.

Moved variables "matriceun", "matriceus", "matricevn", "matricevs",
"matrinvn" and "matrinvs" from module "parafilt" to module
"inifilr_m". Moved variables "jfiltnu", "jfiltnv", "jfiltsu",
"jfiltsv" from module "coefils" to module "inifilr_m".

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 27 DO l = 1, nbniv
128     DO j = jdfil, jffil
129     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     END DO
210     END DO
211     end DO
212    
213     END SUBROUTINE filtreg
214    
215     end module filtreg_m

  ViewVC Help
Powered by ViewVC 1.1.21