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

Diff of /trunk/dyn3d/advect.f

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

trunk/libf/dyn3d/advect.f revision 12 by guez, Mon Jul 21 16:05:07 2008 UTC trunk/libf/dyn3d/advect.f90 revision 46 by guez, Mon May 16 14:52:30 2011 UTC
# Line 1  Line 1 
1  !  module advect_m
2  ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/advect.F,v 1.1.1.1 2004/05/19 12:53:06 lmdzadmin Exp $  
3  !    IMPLICIT NONE
4        SUBROUTINE advect(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta,  
5       $     conser)  contains
6    
7        use dimens_m    SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta, &
8        use paramet_m         conser)
9        use comconst  
10        use comvert      ! From dyn3d/advect.F, version 1.1.1.1 2004/05/19 12:53:06
11        use comgeom      ! Authors: P. Le Van , F. Hourdin
12        use ener      ! Objet : calcul des termes d'advection verticale pour u, v, teta.
13        IMPLICIT NONE      ! Ces termes sont ajoutés à du, dv, dteta.
14  c=======================================================================  
15  c      USE dimens_m, ONLY : iim, llm
16  c   Auteurs:  P. Le Van , Fr. Hourdin  .      USE paramet_m, ONLY : iip1, iip2, ip1jm, ip1jmp1
17  c   -------      USE comconst, ONLY : daysec
18  c      USE comgeom, ONLY : unsaire
19  c   Objet:      USE ener, ONLY : gtot
20  c   ------  
21  c      ! Arguments:
22  c   *************************************************************      REAL, intent(in):: vcov(ip1jm, llm), ucov(ip1jmp1, llm)
23  c   .... calcul des termes d'advection vertic.pour u,v,teta,q ...      real, intent(in):: teta(ip1jmp1, llm)
24  c   *************************************************************      REAL, intent(in):: massebx(ip1jmp1, llm), masseby(ip1jm, llm)
25  c        ces termes sont ajoutes a du,dv,dteta et dq .      real, INTENT (IN):: w(ip1jmp1, llm)
26  c  Modif F.Forget 03/94 : on retire q de advect      REAL, intent(inout):: dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm)
27  c      LOGICAL, INTENT (IN):: conser
28  c=======================================================================  
29  c-----------------------------------------------------------------------      ! Local:
30  c   Declarations:      REAL uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1)
31  c   -------------      REAL unsaire2(ip1jmp1)
32        REAL deuxjour, ww, uu, vv
33        INTEGER ij, l
34  c   Arguments:  
35  c   ----------      !-----------------------------------------------------------------------
36    
37        REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm)      ! 2. Calculs preliminaires :
38        REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm)  
39        REAL dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm)      IF (conser) THEN
40        logical, intent(in):: conser         deuxjour = 2. * daysec
41           unsaire2 = unsaire**2
42  c   Local:      END IF
43  c   ------  
44        ! Calcul de \bar{u}^{yy}
45        REAL uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1)      DO l = 1, llm
46        REAL unsaire2(ip1jmp1), ge(ip1jmp1)         DO ij = iip2, ip1jmp1
47        REAL deuxjour, ww, gt, uu, vv            uav(ij, l) = 0.25*(ucov(ij, l)+ucov(ij-iip1, l))
48           END DO
49        INTEGER  ij,l         DO ij = iip2, ip1jm
50              uav(ij, l) = uav(ij, l) + uav(ij+iip1, l)
51        REAL      SSUM         END DO
52           DO ij = 1, iip1
53  c-----------------------------------------------------------------------            uav(ij, l) = 0.
54  c   2. Calculs preliminaires:            uav(ip1jm+ij, l) = 0.
55  c   -------------------------         END DO
56        END DO
57        IF (conser)  THEN  
58           deuxjour = 2. * daysec      ! Calcul de \bar{v}^{xx}
59        DO l = 1, llm
60           DO   1  ij   = 1, ip1jmp1         DO ij = 2, ip1jm
61           unsaire2(ij) = unsaire(ij) * unsaire(ij)            vav(ij, l) = 0.25*(vcov(ij, l)+vcov(ij-1, l))
62     1     CONTINUE         END DO
63        END IF         DO ij = 1, ip1jm, iip1
64              vav(ij, l) = vav(ij+iim, l)
65           END DO
66  c------------------  -yy ----------------------------------------------         DO ij = 1, ip1jm - 1
67  c   .  Calcul de     u            vav(ij, l) = vav(ij, l) + vav(ij+1, l)
68           END DO
69        DO  l=1,llm         DO ij = 1, ip1jm, iip1
70           DO    ij     = iip2, ip1jmp1            vav(ij+iim, l) = vav(ij, l)
71              uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )         END DO
72           ENDDO      END DO
73           DO    ij     = iip2, ip1jm  
74              uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)      DO l = 1, llm - 1
75           ENDDO         ! calcul de - w/2 au niveau l+1
76           DO      ij         = 1, iip1         DO ij = 1, ip1jmp1
77              uav(ij      ,l) = 0.            wsur2(ij) = -0.5 * w(ij, l+1)
78              uav(ip1jm+ij,l) = 0.         END DO
79           ENDDO  
80        ENDDO         ! calcul pour "du"
81           DO ij = iip2, ip1jm - 1
82  c------------------  -xx ----------------------------------------------            ww = wsur2(ij) + wsur2(ij+1)
83  c   .  Calcul de     v            uu = 0.5*(ucov(ij, l)+ucov(ij, l+1))
84              du(ij, l) = du(ij, l) - ww*(uu-uav(ij, l))/massebx(ij, l)
85        DO  l=1,llm            du(ij, l+1) = du(ij, l+1) + ww*(uu-uav(ij, l+1))/massebx(ij, l+1)
86           DO    ij   = 2, ip1jm         END DO
87            vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )  
88           ENDDO         ! correction pour du(iip1, j, l)
89           DO    ij   = 1,ip1jm,iip1         ! du(iip1, j, l)= du(1, j, l)
90            vav(ij,l) = vav(ij+iim,l)  
91           ENDDO         DO ij = iip1 + iip1, ip1jm, iip1
92           DO    ij   = 1, ip1jm-1            du(ij, l) = du(ij-iim, l)
93            vav(ij,l) = vav(ij,l) + vav(ij+1,l)            du(ij, l+1) = du(ij-iim, l+1)
94           ENDDO         END DO
95           DO    ij       = 1, ip1jm, iip1  
96            vav(ij+iim,l) = vav(ij,l)         ! calcul pour dv
97           ENDDO         DO ij = 1, ip1jm
98        ENDDO            ww = wsur2(ij+iip1) + wsur2(ij)
99              vv = 0.5*(vcov(ij, l)+vcov(ij, l+1))
100  c-----------------------------------------------------------------------            dv(ij, l) = dv(ij, l) - ww*(vv-vav(ij, l))/masseby(ij, l)
101              dv(ij, l+1) = dv(ij, l+1) + ww*(vv-vav(ij, l+1))/masseby(ij, l+1)
102  c         END DO
103        DO 20 l = 1, llmm1  
104           ! calcul pour dh
105           ! calcul de - d(\bar{teta}^z * w) qu'on ajoute à dh
106  c       ......   calcul de  - w/2.    au niveau  l+1   .......         DO ij = 1, ip1jmp1
107              ww = wsur2(ij) * (teta(ij, l) + teta(ij, l + 1))
108        DO 5   ij   = 1, ip1jmp1            dteta(ij, l) = dteta(ij, l) - ww
109        wsur2( ij ) = - 0.5 * w( ij,l+1 )            dteta(ij, l + 1) = dteta(ij, l + 1) + ww
110     5  CONTINUE         end DO
111    
112           IF (conser) THEN
113  c     .....................     calcul pour  du     ..................            gtot(l) = deuxjour * sqrt(sum(wsur2**2 * unsaire2) / ip1jmp1)
114           END IF
115        DO 6 ij = iip2 ,ip1jm-1      END DO
116        ww        = wsur2 (  ij  )     + wsur2( ij+1 )  
117        uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )    END SUBROUTINE advect
118        du(ij,l)  = du(ij,l)   - ww * ( uu - uav(ij, l ) )/massebx(ij, l )  
119        du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)  end module advect_m
    6  CONTINUE  
   
 c     .....  correction pour  du(iip1,j,l)  ........  
 c     .....     du(iip1,j,l)= du(1,j,l)   .....  
   
 CDIR$ IVDEP  
       DO   7  ij   = iip1 +iip1, ip1jm, iip1  
       du( ij, l  ) = du( ij -iim, l  )  
       du( ij,l+1 ) = du( ij -iim,l+1 )  
    7  CONTINUE  
   
 c     .................    calcul pour   dv      .....................  
   
       DO 8 ij = 1, ip1jm  
       ww        = wsur2( ij+iip1 )   + wsur2( ij )  
       vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )  
       dv(ij,l)  = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l )  
       dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)  
    8  CONTINUE  
   
 c  
   
 c     ............................................................  
 c     ...............    calcul pour   dh      ...................  
 c     ............................................................  
   
 c                       ---z  
 c       calcul de  - d( teta  * w )      qu'on ajoute a   dh  
 c                   ...............  
   
         DO 15 ij = 1, ip1jmp1  
          ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )  
          dteta(ij, l ) = dteta(ij, l )  -  ww  
          dteta(ij,l+1) = dteta(ij,l+1)  +  ww  
   15    CONTINUE  
   
       IF( conser)  THEN  
         DO 17 ij = 1,ip1jmp1  
         ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)  
   17    CONTINUE  
         gt       = SSUM( ip1jmp1,ge,1 )  
         gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )  
       END IF  
   
   20  CONTINUE  
   
       RETURN  
       END  

Legend:
Removed from v.12  
changed lines
  Added in v.46

  ViewVC Help
Powered by ViewVC 1.1.21