/[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/Sources/filtrez/filtreg.f revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC trunk/filtrez/filtreg_scal.f revision 265 by guez, Tue Mar 20 09:35:59 2018 UTC
# Line 1  Line 1 
1  module filtreg_m  module filtreg_scal_m
2    
3    IMPLICIT NONE    IMPLICIT NONE
4    
5  contains  contains
6    
7    SUBROUTINE filtreg(champ, direct, intensive)    SUBROUTINE filtreg_scal(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
11      ! Objet : filtre matriciel longitudinal, avec les matrices pr\'ecalcul\'ees      ! Objet : filtre matriciel longitudinal, avec les matrices pr\'ecalcul\'ees
12      ! pour l'op\'erateur filtre.      ! pour l'op\'erateur filtre.
13    
14      USE coefils, ONLY: sddu, sddv, unsddu, unsddv      USE dimensions, ONLY: iim, jjm
15      USE dimens_m, ONLY: iim, jjm      use filtreg_hemisph_m, only: filtreg_hemisph
16      use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, &      USE inifgn_m, ONLY: sddv, unsddv
17           matriceus, matricevn, matricevs, matrinvn, matrinvs      use inifilr_m, only: jfiltnu, jfiltsu, matriceun, matriceus, matrinvn, &
18             matrinvs
19      use nr_util, only: assert      use nr_util, only: assert
20    
21      REAL, intent(inout):: champ(:, :, :) ! (iim + 1, nlat, nbniv)      REAL, intent(inout):: champ(:, :, :) ! (iim + 1, jjm + 1, :)
22      ! en entr\'ee : champ \`a filtrer, en sortie : champ filtr\'e      ! en entr\'ee : champ \`a filtrer, en sortie : champ filtr\'e
23    
24      logical, intent(in):: direct ! filtre direct ou inverse      logical, intent(in):: direct ! filtre direct ou inverse
# Line 26  contains Line 27  contains
27      ! champ intensif ou extensif (pond\'er\'e par les aires)      ! champ intensif ou extensif (pond\'er\'e par les aires)
28    
29      ! Local:      ! Local:
30      LOGICAL griscal      REAL sdd(iim)
     INTEGER nlat ! nombre de latitudes \`a filtrer  
     integer nbniv ! nombre de niveaux verticaux \`a filtrer  
     INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil  
     INTEGER i, j, l, k  
     REAL eignq(iim), sdd1(iim), sdd2(iim)  
     INTEGER hemisph  
31    
32      !-----------------------------------------------------------      !-----------------------------------------------------------
33    
34      call assert(size(champ, 1) == iim + 1, "filtreg iim + 1")      call assert(size(champ, 1) == iim + 1, "filtreg_scal iim + 1")
35      nlat = size(champ, 2)      call assert(size(champ, 2) == jjm + 1, "filtreg_scal jjm + 1")
     nbniv = size(champ, 3)  
     call assert(nlat == jjm .or. nlat == jjm + 1, "filtreg nlat")  
     griscal = nlat == jjm + 1  
   
     IF (.not. direct .AND. nlat == jjm) THEN  
        PRINT *, 'filtreg: inverse filter on scalar grid only'  
        STOP 1  
     END IF  
   
     IF (griscal) THEN  
        IF (intensive) THEN  
           sdd1 = sddv  
           sdd2 = unsddv  
        ELSE  
           sdd1 = unsddv  
           sdd2 = sddv  
        END IF  
   
        jdfil1 = 2  
        jffil1 = jfiltnu  
        jdfil2 = jfiltsu  
        jffil2 = jjm  
     ELSE  
        IF (intensive) THEN  
           sdd1 = sddu  
           sdd2 = unsddu  
        ELSE  
           sdd1 = unsddu  
           sdd2 = sddu  
        END IF  
   
        jdfil1 = 1  
        jffil1 = jfiltnv  
        jdfil2 = jfiltsv  
        jffil2 = jjm  
     END IF  
   
     loop_hemisph: DO hemisph = 1, 2  
        IF (hemisph==1) THEN  
           jdfil = jdfil1  
           jffil = jffil1  
        ELSE  
           jdfil = jdfil2  
           jffil = jffil2  
        END IF  
   
        loop_vertical: DO l = 1, nbniv  
           loop_latitude: DO j = jdfil, jffil  
              DO i = 1, iim  
                 champ(i, j, l) = champ(i, j, l)*sdd1(i)  
              END DO  
   
              IF (hemisph==1) THEN  
                 IF (.not. direct) THEN  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO k = 1, iim  
                       DO i = 1, iim  
                          eignq(k) = eignq(k) + matrinvn(k, i, j)*champ(i, j, l)  
                       END DO  
                    END DO  
                 ELSE IF (griscal) THEN  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO i = 1, iim  
                       DO k = 1, iim  
                          eignq(k) = eignq(k) + matriceun(k, i, j) &  
                               * champ(i, j, l)  
                       END DO  
                    END DO  
                 ELSE  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO i = 1, iim  
                       DO k = 1, iim  
                          eignq(k) = eignq(k) + matricevn(k, i, j) &  
                               * champ(i, j, l)  
                       END DO  
                    END DO  
                 END IF  
              ELSE  
                 IF (.not. direct) THEN  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO i = 1, iim  
                       DO k = 1, iim  
                          eignq(k) = eignq(k) + matrinvs(k, i, j-jfiltsu+1) &  
                               *champ(i, j, l)  
                       END DO  
                    END DO  
                 ELSE IF (griscal) THEN  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO i = 1, iim  
                       DO k = 1, iim  
                          eignq(k) = eignq(k) + matriceus(k, i, j-jfiltsu+1) &  
                               *champ(i, j , l)  
                       END DO  
                    END DO  
                 ELSE  
                    DO k = 1, iim  
                       eignq(k) = 0.  
                    END DO  
                    DO i = 1, iim  
                       DO k = 1, iim  
                          eignq(k) = eignq(k) + matricevs(k, i, j-jfiltsv+1) &  
                               *champ(i, j , l)  
                       END DO  
                    END DO  
                 END IF  
              END IF  
   
              IF (direct) THEN  
                 DO i = 1, iim  
                    champ(i, j, l) = (champ(i, j, l)+eignq(i))*sdd2(i)  
                 end DO  
              ELSE  
                 DO i = 1, iim  
                    champ(i, j, l) = (champ(i, j, l)-eignq(i))*sdd2(i)  
                 end DO  
              END IF  
   
              champ(iim + 1, j, l) = champ(1, j, l)  
           END DO loop_latitude  
        END DO loop_vertical  
     end DO loop_hemisph  
36    
37    END SUBROUTINE filtreg      sdd = merge(sddv, unsddv, intensive)
38    
39  end module filtreg_m      if (direct) then
40           call filtreg_hemisph(champ(:, 2:jfiltnu, :), sdd, matriceun)
41           call filtreg_hemisph(champ(:, jfiltsu:jjm, :), sdd, matriceus)
42        else
43           call filtreg_hemisph(champ(:, 2:jfiltnu, :), sdd, - matrinvn)
44           call filtreg_hemisph(champ(:, jfiltsu:jjm, :), sdd, - matrinvs)
45        end if
46    
47      END SUBROUTINE filtreg_scal
48    
49    end module filtreg_scal_m

Legend:
Removed from v.134  
changed lines
  Added in v.265

  ViewVC Help
Powered by ViewVC 1.1.21