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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.5  
changed lines
  Added in v.25

  ViewVC Help
Powered by ViewVC 1.1.21