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

  ViewVC Help
Powered by ViewVC 1.1.21