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

Diff of /trunk/Sources/filtrez/filtreg_scal.f

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

revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC revision 107 by guez, Thu Sep 11 15:09:15 2014 UTC
# Line 4  module filtreg_m Line 4  module filtreg_m
4    
5  contains  contains
6    
7    SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal)    SUBROUTINE filtreg(champ, direct, intensive)
8    
9      ! From filtrez/filtreg.F, version 1.1.1.1, 2004/05/19 12:53:09      ! From filtrez/filtreg.F, version 1.1.1.1, 2004/05/19 12:53:09
10      ! Author: P. Le Van      ! Author: P. Le Van
# Line 15  contains Line 15  contains
15      USE dimens_m, ONLY: iim, jjm      USE dimens_m, ONLY: iim, jjm
16      use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &      use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &
17           matriceus, matricevn, matricevs, matrinvn, matrinvs           matriceus, matricevn, matricevs, matrinvn, matrinvs
18        use nr_util, only: assert
19    
20      INTEGER, intent(in):: nlat ! nombre de latitudes a filtrer      REAL, intent(inout):: champ(:, :, :) ! (iim + 1, nlat, nbniv)
     integer, intent(in):: nbniv ! nombre de niveaux verticaux a filtrer  
   
     REAL, intent(inout):: champ(iim + 1, nlat, nbniv)  
21      ! en entrée : champ à filtrer, en sortie : champ filtré      ! en entrée : champ à filtrer, en sortie : champ filtré
22    
23      integer, intent(in):: ifiltre      logical, intent(in):: direct ! filtre direct ou inverse
     !  +1 Transformee directe  
     ! -1 Transformee inverse  
     ! +2 Filtre directe  
     ! -2 Filtre inverse  
     ! Variable Intensive  
     ! ifiltre = 1 filtre directe  
     ! ifiltre =-1 filtre inverse  
     ! Variable Extensive  
     ! ifiltre = 2 filtre directe  
     ! ifiltre =-2 filtre inverse  
   
     integer, intent(in):: iaire  
     !  1 si champ intensif  
     ! 2 si champ extensif (pondere par les aires)  
   
     LOGICAL, intent(in):: griscal  
24    
25      ! Variables local to the procedure:      logical, intent(in):: intensive
26        ! champ intensif ou extensif (pondéré par les aires)
27    
28        ! Local:
29        LOGICAL griscal
30        INTEGER nlat ! nombre de latitudes à filtrer
31        integer nbniv ! nombre de niveaux verticaux à filtrer
32      INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil      INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil
33      INTEGER i, j, l, k      INTEGER i, j, l, k
34      REAL eignq(iim), sdd1(iim), sdd2(iim)      REAL eignq(iim), sdd1(iim), sdd2(iim)
# Line 49  contains Line 36  contains
36    
37      !-----------------------------------------------------------      !-----------------------------------------------------------
38    
39      IF (ifiltre==1 .OR. ifiltre==-1) then      call assert(size(champ, 1) == iim + 1, "filtreg iim + 1")
40         print *, 'Pas de transformee simple dans cette version'      nlat = size(champ, 2)
41         STOP 1      nbniv = size(champ, 3)
42      end IF      call assert(nlat == jjm .or. nlat == jjm + 1, "filtreg nlat")
43        griscal = nlat == jjm + 1
     IF (ifiltre==-2 .AND. .NOT. griscal) THEN  
        PRINT *, ' Cette routine ne calcule le filtre inverse que ', &  
             ' sur la grille des scalaires !'  
        STOP 1  
     END IF  
44    
45      IF (ifiltre/=2 .AND. ifiltre/=-2) THEN      IF (.not. direct .AND. nlat == jjm) THEN
46         PRINT *, ' Probleme dans filtreg car ifiltre NE 2 et NE -2', &         PRINT *, 'filtreg: inverse filter on scalar grid only'
             ' corriger et repasser !'  
47         STOP 1         STOP 1
48      END IF      END IF
49    
50      IF (griscal) THEN      IF (griscal) THEN
51         IF (nlat /= jjm + 1) THEN         IF (intensive) THEN
52            PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &            sdd1 = sddv
53                 // 'filtrer, sur la grille des scalaires'            sdd2 = unsddv
           STOP 1  
54         ELSE         ELSE
55            IF (iaire==1) THEN            sdd1 = unsddv
56               sdd1 = sddv            sdd2 = sddv
              sdd2 = unsddv  
           ELSE  
              sdd1 = unsddv  
              sdd2 = sddv  
           END IF  
   
           jdfil1 = 2  
           jffil1 = jfiltnu  
           jdfil2 = jfiltsu  
           jffil2 = jjm  
57         END IF         END IF
58    
59           jdfil1 = 2
60           jffil1 = jfiltnu
61           jdfil2 = jfiltsu
62           jffil2 = jjm
63      ELSE      ELSE
64         IF (nlat /= jjm) THEN         IF (intensive) THEN
65            PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' &            sdd1 = sddu
66                 // 'filtrer, sur la grille de V ou de Z'            sdd2 = unsddu
           STOP 1  
67         ELSE         ELSE
68            IF (iaire==1) THEN            sdd1 = unsddu
69               sdd1 = sddu            sdd2 = sddu
              sdd2 = unsddu  
           ELSE  
              sdd1 = unsddu  
              sdd2 = sddu  
           END IF  
   
           jdfil1 = 1  
           jffil1 = jfiltnv  
           jdfil2 = jfiltsv  
           jffil2 = jjm  
70         END IF         END IF
71    
72           jdfil1 = 1
73           jffil1 = jfiltnv
74           jdfil2 = jfiltsv
75           jffil2 = jjm
76      END IF      END IF
77    
78      DO hemisph = 1, 2      DO hemisph = 1, 2
# Line 122  contains Line 91  contains
91               END DO               END DO
92    
93               IF (hemisph==1) THEN               IF (hemisph==1) THEN
94                  IF (ifiltre==-2) THEN                  IF (.not. direct) THEN
95                     DO k = 1, iim                     DO k = 1, iim
96                        eignq(k) = 0.                        eignq(k) = 0.
97                     END DO                     END DO
# Line 153  contains Line 122  contains
122                     END DO                     END DO
123                  END IF                  END IF
124               ELSE               ELSE
125                  IF (ifiltre==-2) THEN                  IF (.not. direct) THEN
126                     DO k = 1, iim                     DO k = 1, iim
127                        eignq(k) = 0.                        eignq(k) = 0.
128                     END DO                     END DO
# Line 186  contains Line 155  contains
155                  END IF                  END IF
156               END IF               END IF
157    
158               IF (ifiltre==2) THEN               IF (direct) THEN
159                  DO i = 1, iim                  DO i = 1, iim
160                     champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)                     champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)
161                  end DO                  end DO

Legend:
Removed from v.82  
changed lines
  Added in v.107

  ViewVC Help
Powered by ViewVC 1.1.21