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

Annotation of /trunk/filtrez/filtreg_scal.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (hide annotations)
Mon Mar 3 16:32:04 2008 UTC (16 years, 3 months ago) by guez
Original Path: trunk/libf/filtrez/filtreg.f
File size: 6293 byte(s)
Created module from included file parafilt.
Converted caldyn0 to free format.
Added a rule to create cross-references with NAG.
Added optional attribute in iniadvtrac.
Suppressed argument nq in dynredem0 and dynredem1, using nqmx instead.
Replaced some NetCDF calls by netcdf95 calls in dynredem0.
Added intent attribute in dynredem0 and dynredem1.
Annotated use statements with only clause, in dynredem1.
Suppressed variable nq and argument of iniadvtrac in etat0.
Added test on nqmx in etat0.
1 guez 3 !
2     ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/filtreg.F,v 1.1.1.1 2004/05/19 12:53:09 lmdzadmin Exp $
3     !
4     SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire,
5     . griscal ,iter)
6    
7     use dimens_m
8     use paramet_m
9 guez 5 use parafilt
10 guez 3 IMPLICIT NONE
11     c=======================================================================
12     c
13     c Auteur: P. Le Van 07/10/97
14     c ------
15     c
16     c Objet: filtre matriciel longitudinal ,avec les matrices precalculees
17     c pour l'operateur Filtre .
18     c ------
19     c
20     c Arguments:
21     c ----------
22     c
23     c nblat nombre de latitudes a filtrer
24     c nbniv nombre de niveaux verticaux a filtrer
25     c champ(iip1,nblat,nbniv) en entree : champ a filtrer
26     c en sortie : champ filtre
27     c ifiltre +1 Transformee directe
28     c -1 Transformee inverse
29     c +2 Filtre directe
30     c -2 Filtre inverse
31     c
32     c iaire 1 si champ intensif
33     c 2 si champ extensif (pondere par les aires)
34     c
35     c iter 1 filtre simple
36     c
37     c=======================================================================
38     c
39     c
40     c Variable Intensive
41     c ifiltre = 1 filtre directe
42     c ifiltre =-1 filtre inverse
43     c
44     c Variable Extensive
45     c ifiltre = 2 filtre directe
46     c ifiltre =-2 filtre inverse
47     c
48     c
49     include "coefils.h"
50     c
51     INTEGER nlat,nbniv,ifiltre,iter
52     INTEGER i,j,l,k
53     INTEGER iim2,immjm
54     INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
55    
56     REAL champ( iip1,nlat,nbniv)
57     REAL matriceun,matriceus,matricevn,matricevs,matrinvn,matrinvs
58     COMMON/matrfil/matriceun(iim,iim,nfilun),matriceus(iim,iim,nfilus)
59     , , matricevn(iim,iim,nfilvn),matricevs(iim,iim,nfilvs)
60     , , matrinvn(iim,iim,nfilun),matrinvs (iim,iim,nfilus)
61     REAL eignq(iim), sdd1(iim),sdd2(iim)
62     LOGICAL griscal
63     INTEGER hemisph, iaire
64     c
65    
66     IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)
67     * STOP'Pas de transformee simple dans cette version'
68    
69     IF( iter.EQ. 2 ) THEN
70     PRINT *,' Pas d iteration du filtre dans cette version !'
71     * , ' Utiliser old_filtreg et repasser !'
72     STOP
73     ENDIF
74    
75     IF( ifiltre.EQ. -2 .AND..NOT.griscal ) THEN
76     PRINT *,' Cette routine ne calcule le filtre inverse que ',
77     * ' sur la grille des scalaires !'
78     STOP
79     ENDIF
80    
81     IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 ) THEN
82     PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2'
83     *,' corriger et repasser !'
84     STOP
85     ENDIF
86     c
87    
88     iim2 = iim * iim
89     immjm = iim * jjm
90     c
91     c
92     IF( griscal ) THEN
93     IF( nlat. NE. jjp1 ) THEN
94     PRINT 1111
95     STOP
96     ELSE
97     c
98     IF( iaire.EQ.1 ) THEN
99     CALL SCOPY( iim, sddv, 1, sdd1, 1 )
100     CALL SCOPY( iim, unsddv, 1, sdd2, 1 )
101     ELSE
102     CALL SCOPY( iim, unsddv, 1, sdd1, 1 )
103     CALL SCOPY( iim, sddv, 1, sdd2, 1 )
104     END IF
105     c
106     jdfil1 = 2
107     jffil1 = jfiltnu
108     jdfil2 = jfiltsu
109     jffil2 = jjm
110     END IF
111     ELSE
112     IF( nlat.NE.jjm ) THEN
113     PRINT 2222
114     STOP
115     ELSE
116     c
117     IF( iaire.EQ.1 ) THEN
118     CALL SCOPY( iim, sddu, 1, sdd1, 1 )
119     CALL SCOPY( iim, unsddu, 1, sdd2, 1 )
120     ELSE
121     CALL SCOPY( iim, unsddu, 1, sdd1, 1 )
122     CALL SCOPY( iim, sddu, 1, sdd2, 1 )
123     END IF
124     c
125     jdfil1 = 1
126     jffil1 = jfiltnv
127     jdfil2 = jfiltsv
128     jffil2 = jjm
129     END IF
130     END IF
131     c
132     c
133     DO 100 hemisph = 1, 2
134     c
135     IF ( hemisph.EQ.1 ) THEN
136     jdfil = jdfil1
137     jffil = jffil1
138     ELSE
139     jdfil = jdfil2
140     jffil = jffil2
141     END IF
142    
143    
144     DO 50 l = 1, nbniv
145     DO 30 j = jdfil,jffil
146    
147    
148     DO 5 i = 1, iim
149     champ(i,j,l) = champ(i,j,l) * sdd1(i)
150     5 CONTINUE
151     c
152    
153     IF( hemisph. EQ. 1 ) THEN
154    
155     IF( ifiltre. EQ. -2 ) THEN
156     DO k = 1, iim
157     eignq(k) = 0.0
158     ENDDO
159     DO k = 1, iim
160     DO i = 1, iim
161     eignq(k) = eignq(k) + matrinvn(k,i,j)*champ(i,j,l)
162     ENDDO
163     ENDDO
164     ELSE IF ( griscal ) THEN
165     DO k = 1, iim
166     eignq(k) = 0.0
167     ENDDO
168     DO i = 1, iim
169     DO k = 1, iim
170     eignq(k) = eignq(k) + matriceun(k,i,j)*champ(i,j,l)
171     ENDDO
172     ENDDO
173     ELSE
174     DO k = 1, iim
175     eignq(k) = 0.0
176     ENDDO
177     DO i = 1, iim
178     DO k = 1, iim
179     eignq(k) = eignq(k) + matricevn(k,i,j)*champ(i,j,l)
180     ENDDO
181     ENDDO
182     ENDIF
183    
184     ELSE
185    
186     IF( ifiltre. EQ. -2 ) THEN
187     DO k = 1, iim
188     eignq(k) = 0.0
189     ENDDO
190     DO i = 1, iim
191     DO k = 1, iim
192     eignq(k) = eignq(k) + matrinvs(k,i,j-jfiltsu+1)*champ(i,j,l)
193     ENDDO
194     ENDDO
195     ELSE IF ( griscal ) THEN
196     DO k = 1, iim
197     eignq(k) = 0.0
198     ENDDO
199     DO i = 1, iim
200     DO k = 1, iim
201     eignq(k) = eignq(k) + matriceus(k,i,j-jfiltsu+1)*champ(i,j,l)
202     ENDDO
203     ENDDO
204     ELSE
205     DO k = 1, iim
206     eignq(k) = 0.0
207     ENDDO
208     DO i = 1, iim
209     DO k = 1, iim
210     eignq(k) = eignq(k) + matricevs(k,i,j-jfiltsv+1)*champ(i,j,l)
211     ENDDO
212     ENDDO
213     ENDIF
214    
215     ENDIF
216     c
217     IF( ifiltre.EQ. 2 ) THEN
218     DO 15 i = 1, iim
219     champ( i,j,l ) = ( champ(i,j,l) + eignq(i) ) * sdd2(i)
220     15 CONTINUE
221     ELSE
222     DO 16 i=1,iim
223     champ( i,j,l ) = ( champ(i,j,l) - eignq(i) ) * sdd2(i)
224     16 CONTINUE
225     ENDIF
226     c
227     champ( iip1,j,l ) = champ( 1,j,l )
228     c
229     30 CONTINUE
230     c
231     50 CONTINUE
232     c
233     100 CONTINUE
234     c
235     1111 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a
236     *filtrer, sur la grille des scalaires'/)
237     2222 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi
238     *ltrer, sur la grille de V ou de Z'/)
239     RETURN
240     END

  ViewVC Help
Powered by ViewVC 1.1.21