/[lmdze]/trunk/dyn3d/divergf.f
ViewVC logotype

Diff of /trunk/dyn3d/divergf.f

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

trunk/libf/dyn3d/divergf.f revision 55 by guez, Mon Dec 12 13:25:01 2011 UTC trunk/Sources/dyn3d/divergf.f revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC
# Line 1  Line 1 
1  !  module divergf_m
2  ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/divergf.F,v 1.1.1.1 2004/05/19 12:53:05 lmdzadmin Exp $  
3  !    IMPLICIT NONE
4        SUBROUTINE divergf(klevel,x,y,div)  
5  c  contains
6  c     P. Le Van  
7  c    SUBROUTINE divergf(klevel, x, y, div)
8  c  *********************************************************************  
9  c  ... calcule la divergence a tous les niveaux d'1 vecteur de compos.      ! From libf/dyn3d/divergf.F, version 1.1.1.1 2004/05/19 12:53:05
10  c     x et y...  
11  c              x et y  etant des composantes covariantes   ...      ! P. Le Van
12  c  *********************************************************************  
13        use dimens_m      ! Calcule la divergence à tous les niveaux d'un vecteur de
14        use paramet_m      ! composantes x et y. x et y sont des composantes covariantes.
15        use comgeom  
16        use filtreg_m, only: filtreg      USE comgeom, ONLY: apoln, apols, cuvsurcv_2d, cvusurcu_2d, unsaire_2d
17        IMPLICIT NONE      USE dimens_m, ONLY: iim, jjm
18  c      USE filtreg_m, ONLY: filtreg
19  c      x  et  y  sont des arguments  d'entree pour le s-prog  
20  c        div      est  un argument  de sortie pour le s-prog      INTEGER, intent(in):: klevel
21  c      REAL, intent(in):: x(iim + 1, jjm + 1, klevel), y(iim + 1, jjm, klevel)
22  c      real, intent(out):: div(iim + 1, jjm + 1, klevel) ! in (unit of x, y) m-2
23  c   ---------------------------------------------------------------------  
24  c      ! Variables locales :
25  c    ATTENTION : pendant ce s-pg , ne pas toucher au COMMON/scratch/  .  
26  c      INTEGER l, i, j
27  c   ---------------------------------------------------------------------  
28  c      !------------------------------------------------------------
29  c    ..........          variables en arguments    ...................  
30  c      DO l = 1, klevel
31        INTEGER, intent(in):: klevel         forall (i = 2:iim + 1, j = 2:jjm) div(i, j, l) = cvusurcu_2d(i, j) &
32        REAL x( ip1jmp1,klevel ),y( ip1jm,klevel ),div( ip1jmp1,klevel )              * x(i, j, l) - cvusurcu_2d(i - 1, j) * x(i - 1, j , l) &
33        INTEGER   l,ij              + cuvsurcv_2d(i, j - 1) * y(i, j - 1, l) - cuvsurcv_2d(i, j) &
34  c              * y(i, j, l)
35  c    ...............     variables  locales   .........................  
36           div(1, 2:jjm, l) = div(iim + 1, 2:jjm, l)
37        REAL aiy1( iip1 ) , aiy2( iip1 )  
38        REAL sumypn,sumyps         ! Calcul aux pôles
39  c    ...................................................................         div(:, 1, l) = - SUM(cuvsurcv_2d(:iim, 1) * y(:iim, 1, l)) / apoln
40  c         div(:, jjm + 1, l) = SUM(cuvsurcv_2d(:iim, jjm) * y(:iim, jjm, l)) &
41        REAL      SSUM              / apols
42  c      end DO
43  c  
44        DO 10 l = 1,klevel      CALL filtreg(div, direct = .true., intensive = .false.)
45  c  
46          DO  ij = iip2, ip1jm - 1      DO l = 1, klevel
47           div( ij + 1, l )     =           div(:, 2:jjm, l) = div(:, 2:jjm, l) * unsaire_2d(:, 2:jjm)
48       *   cvusurcu( ij+1 ) * x( ij+1,l ) - cvusurcu( ij ) * x( ij , l) +      ENDDO
49       *   cuvsurcv(ij-iim) * y(ij-iim,l) - cuvsurcv(ij+1) * y(ij+1,l)  
50          ENDDO    END SUBROUTINE divergf
51  c  
52  c     ....  correction pour  div( 1,j,l)  ......  end module divergf_m
 c     ....   div(1,j,l)= div(iip1,j,l) ....  
 c  
 CDIR$ IVDEP  
         DO  ij = iip2,ip1jm,iip1  
          div( ij,l ) = div( ij + iim,l )  
         ENDDO  
 c  
 c     ....  calcul  aux poles  .....  
 c  
         DO  ij  = 1,iim  
          aiy1(ij) =    cuvsurcv(    ij       ) * y(     ij     , l )  
          aiy2(ij) =    cuvsurcv( ij+ ip1jmi1 ) * y( ij+ ip1jmi1, l )  
         ENDDO  
         sumypn = SSUM ( iim,aiy1,1 ) / apoln  
         sumyps = SSUM ( iim,aiy2,1 ) / apols  
 c  
         DO  ij = 1,iip1  
          div(     ij    , l ) = - sumypn  
          div( ij + ip1jm, l ) =   sumyps  
         ENDDO  
   10  CONTINUE  
 c  
   
         CALL filtreg( div, jjp1, klevel, 2, 2, .TRUE., 1 )  
         
 c  
         DO l = 1, klevel  
            DO ij = iip2,ip1jm  
             div(ij,l) = div(ij,l) * unsaire(ij)  
           ENDDO  
         ENDDO  
 c  
        RETURN  
        END  

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

  ViewVC Help
Powered by ViewVC 1.1.21