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

Diff of /trunk/Sources/dyn3d/divergf.f

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

trunk/libf/dyn3d/divergf.f revision 3 by guez, Wed Feb 27 13:16:39 2008 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        IMPLICIT NONE      USE comgeom, ONLY: apoln, apols, cuvsurcv_2d, cvusurcu_2d, unsaire_2d
17  c      USE dimens_m, ONLY: iim, jjm
18  c      x  et  y  sont des arguments  d'entree pour le s-prog      USE filtreg_m, ONLY: filtreg
19  c        div      est  un argument  de sortie pour le s-prog  
20  c      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    ATTENTION : pendant ce s-pg , ne pas toucher au COMMON/scratch/  .      ! Variables locales :
25  c  
26  c   ---------------------------------------------------------------------      INTEGER l, i, j
27  c  
28  c    ..........          variables en arguments    ...................      !------------------------------------------------------------
29  c  
30        INTEGER klevel      DO l = 1, klevel
31        REAL x( ip1jmp1,klevel ),y( ip1jm,klevel ),div( ip1jmp1,klevel )         forall (i = 2:iim + 1, j = 2:jjm) div(i, j, l) = cvusurcu_2d(i, j) &
32        INTEGER   l,ij              * x(i, j, l) - cvusurcu_2d(i - 1, j) * x(i - 1, j , l) &
33  c              + cuvsurcv_2d(i, j - 1) * y(i, j - 1, l) - cuvsurcv_2d(i, j) &
34  c    ...............     variables  locales   .........................              * y(i, j, l)
35    
36        REAL aiy1( iip1 ) , aiy2( iip1 )         div(1, 2:jjm, l) = div(iim + 1, 2:jjm, l)
37        REAL sumypn,sumyps  
38  c    ...................................................................         ! Calcul aux pôles
39  c         div(:, 1, l) = - SUM(cuvsurcv_2d(:iim, 1) * y(:iim, 1, l)) / apoln
40        REAL      SSUM         div(:, jjm + 1, l) = SUM(cuvsurcv_2d(:iim, jjm) * y(:iim, jjm, l)) &
41  c              / apols
42  c      end DO
43        DO 10 l = 1,klevel  
44  c      CALL filtreg(div, direct = .true., intensive = .false.)
45          DO  ij = iip2, ip1jm - 1  
46           div( ij + 1, l )     =        DO l = 1, klevel
47       *   cvusurcu( ij+1 ) * x( ij+1,l ) - cvusurcu( ij ) * x( ij , l) +         div(:, 2:jjm, l) = div(:, 2:jjm, l) * unsaire_2d(:, 2:jjm)
48       *   cuvsurcv(ij-iim) * y(ij-iim,l) - cuvsurcv(ij+1) * y(ij+1,l)      ENDDO
49          ENDDO  
50  c    END SUBROUTINE divergf
51  c     ....  correction pour  div( 1,j,l)  ......  
52  c     ....   div(1,j,l)= div(iip1,j,l) ....  end module divergf_m
 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.3  
changed lines
  Added in v.134

  ViewVC Help
Powered by ViewVC 1.1.21