source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/config/ppsrc/filtrez/filtreg.f @ 224

Last change on this file since 224 was 224, checked in by ymipsl, 10 years ago
File size: 10.2 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire,
5     &     griscal ,iter)
6     
7      USE filtreg_mod
8     
9      IMPLICIT NONE
10c=======================================================================
11c
12c   Auteur: P. Le Van        07/10/97
13c   ------
14c
15c   Objet: filtre matriciel longitudinal ,avec les matrices precalculees
16c                     pour l'operateur  Filtre    .
17c   ------
18c
19c   Arguments:
20c   ----------
21c
22c      nblat                 nombre de latitudes a filtrer
23c      nbniv                 nombre de niveaux verticaux a filtrer
24c      champ(iip1,nblat,nbniv)  en entree : champ a filtrer
25c                            en sortie : champ filtre
26c      ifiltre               +1  Transformee directe
27c                            -1  Transformee inverse
28c                            +2  Filtre directe
29c                            -2  Filtre inverse
30c
31c      iaire                 1   si champ intensif
32c                            2   si champ extensif (pondere par les aires)
33c
34c      iter                  1   filtre simple
35c
36c=======================================================================
37c
38c
39c                      Variable Intensive
40c                ifiltre = 1     filtre directe
41c                ifiltre =-1     filtre inverse
42c
43c                      Variable Extensive
44c                ifiltre = 2     filtre directe
45c                ifiltre =-2     filtre inverse
46c
47c
48!-----------------------------------------------------------------------
49!   INCLUDE 'dimensions.h'
50!
51!   dimensions.h contient les dimensions du modele
52!   ndm est tel que iim=2**ndm
53!-----------------------------------------------------------------------
54
55      INTEGER iim,jjm,llm,ndm
56
57      PARAMETER (iim= 128,jjm=96,llm=64,ndm=1)
58
59!-----------------------------------------------------------------------
60!
61! $Header$
62!
63!
64!  ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
65!                 veillez  n'utiliser que des ! pour les commentaires
66!                 et  bien positionner les & des lignes de continuation
67!                 (les placer en colonne 6 et en colonne 73)
68!
69!
70!-----------------------------------------------------------------------
71!   INCLUDE 'paramet.h'
72
73      INTEGER  iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
74      INTEGER  kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
75      INTEGER  ijmllm,mvar
76      INTEGER jcfil,jcfllm
77
78      PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3                       &
79     &    ,jjp1=jjm+1-1/jjm)
80      PARAMETER( llmp1 = llm+1,  llmp2 = llm+2, llmm1 = llm-1 )
81      PARAMETER( kftd  = iim/2 -ndm )
82      PARAMETER( ip1jm  = iip1*jjm,  ip1jmp1= iip1*jjp1 )
83      PARAMETER( ip1jmi1= ip1jm - iip1 )
84      PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
85      PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
86      PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
87
88!-----------------------------------------------------------------------
89!
90! $Header$
91!
92      COMMON/coefils/jfiltnu,jfiltsu,jfiltnv,jfiltsv,sddu(iim),sddv(iim)&
93     & ,unsddu(iim),unsddv(iim),coefilu(iim,jjm),coefilv(iim,jjm),      &
94     & modfrstu(jjm),modfrstv(jjm),eignfnu(iim,iim),eignfnv(iim,iim)    &
95     & ,coefilu2(iim,jjm),coefilv2(iim,jjm)
96!c
97      INTEGER jfiltnu,jfiltsu,jfiltnv,jfiltsv,modfrstu,modfrstv
98      REAL    sddu,sddv,unsddu,unsddv,coefilu,coefilv,eignfnu,eignfnv
99      REAL    coefilu2,coefilv2
100
101      INTEGER    nlat,nbniv,ifiltre,iter
102      INTEGER    i,j,l,k
103      INTEGER    iim2,immjm
104      INTEGER    jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
105
106      REAL       champ( iip1,nlat,nbniv)
107
108      REAL       eignq(iim,nlat,nbniv), sdd1(iim),sdd2(iim)
109      LOGICAL    griscal
110      INTEGER    hemisph, iaire
111
112      LOGICAL,SAVE     :: first=.TRUE.
113
114      REAL, SAVE :: sdd12(iim,4)
115
116      INTEGER, PARAMETER :: type_sddu=1
117      INTEGER, PARAMETER :: type_sddv=2
118      INTEGER, PARAMETER :: type_unsddu=3
119      INTEGER, PARAMETER :: type_unsddv=4
120
121      INTEGER :: sdd1_type, sdd2_type
122
123      IF (first) THEN
124         sdd12(1:iim,type_sddu) = sddu(1:iim)
125         sdd12(1:iim,type_sddv) = sddv(1:iim)
126         sdd12(1:iim,type_unsddu) = unsddu(1:iim)
127         sdd12(1:iim,type_unsddv) = unsddv(1:iim)
128
129         first=.FALSE.
130      ENDIF
131
132      IF(ifiltre.EQ.1.or.ifiltre.EQ.-1) 
133     &     STOP'Pas de transformee simple dans cette version'
134     
135      IF( iter.EQ. 2 )  THEN
136         PRINT *,' Pas d iteration du filtre dans cette version !'
137     &        , ' Utiliser old_filtreg et repasser !'
138         STOP
139      ENDIF
140     
141      IF( ifiltre.EQ. -2 .AND..NOT.griscal )     THEN
142         PRINT *,' Cette routine ne calcule le filtre inverse que '
143     &        , ' sur la grille des scalaires !'
144         STOP
145      ENDIF
146     
147      IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )  THEN
148         PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2'
149     &        , ' corriger et repasser !'
150         STOP
151      ENDIF
152     
153      iim2   = iim * iim
154      immjm  = iim * jjm
155
156      IF( griscal )   THEN
157         IF( nlat. NE. jjp1 )  THEN
158            PRINT  1111
159            STOP
160         ELSE
161           
162            IF( iaire.EQ.1 )  THEN
163               sdd1_type = type_sddv
164               sdd2_type = type_unsddv
165            ELSE
166               sdd1_type = type_unsddv
167               sdd2_type = type_sddv
168            ENDIF
169
170c            IF( iaire.EQ.1 )  THEN
171c               CALL SCOPY(  iim,    sddv, 1,  sdd1, 1 ) 
172c               CALL SCOPY(  iim,  unsddv, 1,  sdd2, 1 )
173c            ELSE
174c               CALL SCOPY(  iim,  unsddv, 1,  sdd1, 1 )
175c               CALL SCOPY(  iim,    sddv, 1,  sdd2, 1 )
176c            END IF
177           
178            jdfil1 = 2
179            jffil1 = jfiltnu
180            jdfil2 = jfiltsu
181            jffil2 = jjm
182         END IF
183      ELSE
184         IF( nlat.NE.jjm )  THEN
185            PRINT  2222
186            STOP
187         ELSE
188           
189            IF( iaire.EQ.1 )  THEN
190               sdd1_type = type_sddu
191               sdd2_type = type_unsddu
192            ELSE
193               sdd1_type = type_unsddu
194               sdd2_type = type_sddu
195            ENDIF
196
197c            IF( iaire.EQ.1 )  THEN
198c               CALL SCOPY(  iim,    sddu, 1,  sdd1, 1 ) 
199c               CALL SCOPY(  iim,  unsddu, 1,  sdd2, 1 )
200c            ELSE
201c               CALL SCOPY(  iim,  unsddu, 1,  sdd1, 1 )
202c               CALL SCOPY(  iim,    sddu, 1,  sdd2, 1 )
203c            END IF
204           
205            jdfil1 = 1
206            jffil1 = jfiltnv
207            jdfil2 = jfiltsv
208            jffil2 = jjm
209         END IF
210      END IF
211     
212      DO hemisph = 1, 2
213         
214         IF ( hemisph.EQ.1 )  THEN
215            jdfil = jdfil1
216            jffil = jffil1
217         ELSE
218            jdfil = jdfil2
219            jffil = jffil2
220         END IF
221         
222         DO l = 1, nbniv
223            DO j = jdfil,jffil
224               DO i = 1, iim
225                  champ(i,j,l) = champ(i,j,l) * sdd12(i,sdd1_type) ! sdd1(i)
226               END DO
227            END DO
228         END DO
229         
230         IF( hemisph. EQ. 1 )      THEN
231           
232            IF( ifiltre. EQ. -2 )   THEN
233               
234               DO j = jdfil,jffil
235                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
236     &                 matrinvn(1,1,j),
237     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
238     &                 eignq(1,j-jdfil+1,1), iim*nlat)
239               END DO
240               
241            ELSE IF ( griscal )     THEN
242               
243               DO j = jdfil,jffil
244                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
245     &                 matriceun(1,1,j),
246     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
247     &                 eignq(1,j-jdfil+1,1), iim*nlat)
248               END DO
249               
250            ELSE
251               
252               DO j = jdfil,jffil
253                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
254     &                 matricevn(1,1,j),
255     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
256     &                 eignq(1,j-jdfil+1,1), iim*nlat)
257               END DO
258               
259            ENDIF
260           
261         ELSE
262           
263            IF( ifiltre. EQ. -2 )   THEN
264               
265               DO j = jdfil,jffil
266                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
267     &                 matrinvs(1,1,j-jfiltsu+1),
268     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
269     &                 eignq(1,j-jdfil+1,1), iim*nlat)
270               END DO
271               
272               
273            ELSE IF ( griscal )     THEN
274               
275               DO j = jdfil,jffil
276                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
277     &                 matriceus(1,1,j-jfiltsu+1),
278     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
279     &                 eignq(1,j-jdfil+1,1), iim*nlat)
280               END DO
281                             
282            ELSE
283               
284               DO j = jdfil,jffil
285                  CALL DGEMM("N", "N", iim, nbniv, iim, 1.0, 
286     &                 matricevs(1,1,j-jfiltsv+1),
287     &                 iim, champ(1,j,1), iip1*nlat, 0.0,
288     &                 eignq(1,j-jdfil+1,1), iim*nlat)
289               END DO
290                             
291            ENDIF
292           
293         ENDIF
294         
295         IF( ifiltre.EQ. 2 )  THEN
296           
297            DO l = 1, nbniv
298               DO j = jdfil,jffil
299                  DO i = 1, iim
300                     champ( i,j,l ) = 
301     &                    (champ(i,j,l) + eignq(i,j-jdfil+1,l))
302     &                    * sdd12(i,sdd2_type) ! sdd2(i)
303                  END DO
304               END DO
305            END DO
306
307         ELSE
308
309            DO l = 1, nbniv
310               DO j = jdfil,jffil
311                  DO i = 1, iim
312                     champ( i,j,l ) = 
313     &                    (champ(i,j,l) - eignq(i,j-jdfil+1,l))
314     &                    * sdd12(i,sdd2_type) ! sdd2(i)
315                  END DO
316               END DO
317            END DO
318
319         ENDIF
320
321         DO l = 1, nbniv
322            DO j = jdfil,jffil
323               champ( iip1,j,l ) = champ( 1,j,l )
324            END DO
325         END DO
326
327     
328      ENDDO
329
3301111  FORMAT(//20x,'ERREUR dans le dimensionnement du tableau  CHAMP a
331     &     filtrer, sur la grille des scalaires'/)
3322222  FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi
333     &     ltrer, sur la grille de V ou de Z'/)
334      RETURN
335      END
Note: See TracBrowser for help on using the repository browser.