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

Diff of /trunk/filtrez/filtreg_scal.f

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/Sources/filtrez/filtreg.f revision 134 by guez, Wed Apr 29 15:47:56 2015 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, direct, intensive)
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      ! Author: P. Le Van
11  c=======================================================================      ! Objet : filtre matriciel longitudinal, avec les matrices pr\'ecalcul\'ees
12  c      ! pour l'op\'erateur filtre.
13  c   Auteur: P. Le Van        07/10/97  
14  c   ------      USE coefils, ONLY: sddu, sddv, unsddu, unsddv
15  c      USE dimens_m, ONLY: iim, jjm
16  c   Objet: filtre matriciel longitudinal ,avec les matrices precalculees      use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &
17  c                     pour l'operateur  Filtre    .           matriceus, matricevn, matricevs, matrinvn, matrinvs
18  c   ------      use nr_util, only: assert
19  c  
20  c   Arguments:      REAL, intent(inout):: champ(:, :, :) ! (iim + 1, nlat, nbniv)
21  c   ----------      ! en entr\'ee : champ \`a filtrer, en sortie : champ filtr\'e
22  c  
23  c      nblat                 nombre de latitudes a filtrer      logical, intent(in):: direct ! filtre direct ou inverse
24  c      nbniv                 nombre de niveaux verticaux a filtrer  
25  c      champ(iip1,nblat,nbniv)  en entree : champ a filtrer      logical, intent(in):: intensive
26  c                            en sortie : champ filtre      ! champ intensif ou extensif (pond\'er\'e par les aires)
27  c      ifiltre               +1  Transformee directe  
28  c                            -1  Transformee inverse      ! Local:
29  c                            +2  Filtre directe      LOGICAL griscal
30  c                            -2  Filtre inverse      INTEGER nlat ! nombre de latitudes \`a filtrer
31  c      integer nbniv ! nombre de niveaux verticaux \`a filtrer
32  c      iaire                 1   si champ intensif      INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil
33  c                            2   si champ extensif (pondere par les aires)      INTEGER i, j, l, k
34  c      REAL eignq(iim), sdd1(iim), sdd2(iim)
35  c      iter                  1   filtre simple      INTEGER hemisph
36  c  
37  c=======================================================================      !-----------------------------------------------------------
38  c  
39  c      call assert(size(champ, 1) == iim + 1, "filtreg iim + 1")
40  c                      Variable Intensive      nlat = size(champ, 2)
41  c                ifiltre = 1     filtre directe      nbniv = size(champ, 3)
42  c                ifiltre =-1     filtre inverse      call assert(nlat == jjm .or. nlat == jjm + 1, "filtreg nlat")
43  c      griscal = nlat == jjm + 1
44  c                      Variable Extensive  
45  c                ifiltre = 2     filtre directe      IF (.not. direct .AND. nlat == jjm) THEN
46  c                ifiltre =-2     filtre inverse         PRINT *, 'filtreg: inverse filter on scalar grid only'
47  c         STOP 1
48  c      END IF
49        include "coefils.h"  
50  c      IF (griscal) THEN
51        INTEGER nlat,nbniv,ifiltre,iter         IF (intensive) THEN
52        INTEGER i,j,l,k            sdd1 = sddv
53        INTEGER iim2,immjm            sdd2 = unsddv
54        INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil         ELSE
55              sdd1 = unsddv
56        REAL  champ( iip1,nlat,nbniv)            sdd2 = sddv
57        REAL matriceun,matriceus,matricevn,matricevs,matrinvn,matrinvs         END IF
58        COMMON/matrfil/matriceun(iim,iim,nfilun),matriceus(iim,iim,nfilus)  
59       ,             , matricevn(iim,iim,nfilvn),matricevs(iim,iim,nfilvs)         jdfil1 = 2
60       ,             ,  matrinvn(iim,iim,nfilun),matrinvs (iim,iim,nfilus)         jffil1 = jfiltnu
61        REAL  eignq(iim), sdd1(iim),sdd2(iim)         jdfil2 = jfiltsu
62        LOGICAL    griscal         jffil2 = jjm
63        INTEGER    hemisph, iaire      ELSE
64  c         IF (intensive) THEN
65              sdd1 = sddu
66        IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)            sdd2 = unsddu
67       *    STOP'Pas de transformee simple dans cette version'         ELSE
68              sdd1 = unsddu
69        IF( iter.EQ. 2 )  THEN            sdd2 = sddu
70         PRINT *,' Pas d iteration du filtre dans cette version !'         END IF
71       * , ' Utiliser old_filtreg et repasser !'  
72             STOP         jdfil1 = 1
73        ENDIF         jffil1 = jfiltnv
74           jdfil2 = jfiltsv
75        IF( ifiltre.EQ. -2 .AND..NOT.griscal )     THEN         jffil2 = jjm
76         PRINT *,' Cette routine ne calcule le filtre inverse que ',      END IF
77       * ' sur la grille des scalaires !'  
78             STOP      loop_hemisph: DO hemisph = 1, 2
79        ENDIF         IF (hemisph==1) THEN
   
       IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )  THEN  
        PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2'  
      *,' corriger et repasser !'  
            STOP  
       ENDIF  
 c  
   
       iim2   = iim * iim  
       immjm  = iim * jjm  
 c  
 c  
       IF( griscal )   THEN  
          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  
           END IF  
       ELSE  
           IF( nlat.NE.jjm )  THEN  
              PRINT  2222  
              STOP  
           ELSE  
 c  
              IF( iaire.EQ.1 )  THEN  
                 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  
           END IF  
       END IF  
 c  
 c  
       DO 100  hemisph = 1, 2  
 c  
       IF ( hemisph.EQ.1 )  THEN  
80            jdfil = jdfil1            jdfil = jdfil1
81            jffil = jffil1            jffil = jffil1
82        ELSE         ELSE
83            jdfil = jdfil2            jdfil = jdfil2
84            jffil = jffil2            jffil = jffil2
85        END IF         END IF
86    
87           loop_vertical: DO l = 1, nbniv
88              loop_latitude: DO j = jdfil, jffil
89                 DO i = 1, iim
90                    champ(i, j, l) = champ(i, j, l)*sdd1(i)
91                 END DO
92    
93                 IF (hemisph==1) THEN
94                    IF (.not. direct) THEN
95                       DO k = 1, iim
96                          eignq(k) = 0.
97                       END DO
98                       DO k = 1, iim
99                          DO i = 1, iim
100                             eignq(k) = eignq(k) + matrinvn(k, i, j)*champ(i, j, l)
101                          END DO
102                       END DO
103                    ELSE IF (griscal) THEN
104                       DO k = 1, iim
105                          eignq(k) = 0.
106                       END DO
107                       DO i = 1, iim
108                          DO k = 1, iim
109                             eignq(k) = eignq(k) + matriceun(k, i, j) &
110                                  * champ(i, j, l)
111                          END DO
112                       END DO
113                    ELSE
114                       DO k = 1, iim
115                          eignq(k) = 0.
116                       END DO
117                       DO i = 1, iim
118                          DO k = 1, iim
119                             eignq(k) = eignq(k) + matricevn(k, i, j) &
120                                  * champ(i, j, l)
121                          END DO
122                       END DO
123                    END IF
124                 ELSE
125                    IF (.not. direct) THEN
126                       DO k = 1, iim
127                          eignq(k) = 0.
128                       END DO
129                       DO i = 1, iim
130                          DO k = 1, iim
131                             eignq(k) = eignq(k) + matrinvs(k, i, j-jfiltsu+1) &
132                                  *champ(i, j, l)
133                          END DO
134                       END DO
135                    ELSE IF (griscal) THEN
136                       DO k = 1, iim
137                          eignq(k) = 0.
138                       END DO
139                       DO i = 1, iim
140                          DO k = 1, iim
141                             eignq(k) = eignq(k) + matriceus(k, i, j-jfiltsu+1) &
142                                  *champ(i, j , l)
143                          END DO
144                       END DO
145                    ELSE
146                       DO k = 1, iim
147                          eignq(k) = 0.
148                       END DO
149                       DO i = 1, iim
150                          DO k = 1, iim
151                             eignq(k) = eignq(k) + matricevs(k, i, j-jfiltsv+1) &
152                                  *champ(i, j , l)
153                          END DO
154                       END DO
155                    END IF
156                 END IF
157    
158                 IF (direct) THEN
159                    DO i = 1, iim
160                       champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)
161                    end DO
162                 ELSE
163                    DO i = 1, iim
164                       champ(i, j, l) = (champ(i, j, l)-eignq(i))*sdd2(i)
165                    end DO
166                 END IF
167    
168                 champ(iim + 1, j, l) = champ(1, j, l)
169              END DO loop_latitude
170           END DO loop_vertical
171        end DO loop_hemisph
172    
173      END SUBROUTINE filtreg
174    
175    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.134

  ViewVC Help
Powered by ViewVC 1.1.21