/[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 43 by guez, Fri Apr 8 12:43:31 2011 UTC
# Line 1  Line 1 
1  !  SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta, conser)
2  ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/advect.F,v 1.1.1.1 2004/05/19 12:53:06 lmdzadmin Exp $  
3  !    ! From dyn3d/advect.F, v 1.1.1.1 2004/05/19 12:53:06
4        SUBROUTINE advect(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta,    !   Auteurs:  P. Le Van , Fr. Hourdin  .                                
5       $     conser)    !   Objet:                                                              
6      !   .... calcul des termes d'advection vertic.pour u, v, teta, q ...      
7        use dimens_m    !        ces termes sont ajoutes a du, dv, dteta et dq .                  
8        use paramet_m    !  Modif F.Forget 03/94 : on retire q de advect                        
9        use comconst  
10        use comvert    USE dimens_m
11        use comgeom    USE paramet_m
12        use ener    USE comconst
13        IMPLICIT NONE    USE comvert
14  c=======================================================================    USE comgeom
15  c    USE ener
16  c   Auteurs:  P. Le Van , Fr. Hourdin  .  
17  c   -------    IMPLICIT NONE
18  c  
19  c   Objet:    !   Arguments:                                                          
20  c   ------  
21  c    REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm)
22  c   *************************************************************    real, intent(in):: teta(ip1jmp1, llm)
23  c   .... calcul des termes d'advection vertic.pour u,v,teta,q ...    REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
24  c   *************************************************************    real, INTENT (IN):: w(ip1jmp1, llm)
25  c        ces termes sont ajoutes a du,dv,dteta et dq .    REAL dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm)
26  c  Modif F.Forget 03/94 : on retire q de advect    LOGICAL, INTENT (IN):: conser
27  c  
28  c=======================================================================    !   Local:                                                              
29  c-----------------------------------------------------------------------  
30  c   Declarations:    REAL uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1)
31  c   -------------    REAL unsaire2(ip1jmp1), ge(ip1jmp1)
32      REAL deuxjour, ww, gt, uu, vv
33    
34  c   Arguments:    INTEGER ij, l
35  c   ----------  
36      REAL ssum
37        REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm)  
38        REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm)    !-----------------------------------------------------------------------
39        REAL dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm)    !   2. Calculs preliminaires:                                          
40        logical, intent(in):: conser    !   -------------------------                                          
41    
42  c   Local:    IF (conser) THEN
43  c   ------       deuxjour = 2.*daysec
44    
45        REAL uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1)       DO ij = 1, ip1jmp1
46        REAL unsaire2(ip1jmp1), ge(ip1jmp1)          unsaire2(ij) = unsaire(ij)*unsaire(ij)
47        REAL deuxjour, ww, gt, uu, vv       end DO
48      END IF
49        INTEGER  ij,l  
50    
51        REAL      SSUM    !------------------  -yy ----------------------------------------------
52      !   .  Calcul de     u                                                  
53  c-----------------------------------------------------------------------  
54  c   2. Calculs preliminaires:    DO l = 1, llm
55  c   -------------------------       DO ij = iip2, ip1jmp1
56            uav(ij, l) = 0.25*(ucov(ij, l)+ucov(ij-iip1, l))
57        IF (conser)  THEN       END DO
58           deuxjour = 2. * daysec       DO ij = iip2, ip1jm
59            uav(ij, l) = uav(ij, l) + uav(ij+iip1, l)
60           DO   1  ij   = 1, ip1jmp1       END DO
61           unsaire2(ij) = unsaire(ij) * unsaire(ij)       DO ij = 1, iip1
62     1     CONTINUE          uav(ij, l) = 0.
63        END IF          uav(ip1jm+ij, l) = 0.
64         END DO
65      END DO
66  c------------------  -yy ----------------------------------------------  
67  c   .  Calcul de     u    !------------------  -xx ----------------------------------------------
68      !   .  Calcul de     v                                                  
69        DO  l=1,llm  
70           DO    ij     = iip2, ip1jmp1    DO l = 1, llm
71              uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )       DO ij = 2, ip1jm
72           ENDDO          vav(ij, l) = 0.25*(vcov(ij, l)+vcov(ij-1, l))
73           DO    ij     = iip2, ip1jm       END DO
74              uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)       DO ij = 1, ip1jm, iip1
75           ENDDO          vav(ij, l) = vav(ij+iim, l)
76           DO      ij         = 1, iip1       END DO
77              uav(ij      ,l) = 0.       DO ij = 1, ip1jm - 1
78              uav(ip1jm+ij,l) = 0.          vav(ij, l) = vav(ij, l) + vav(ij+1, l)
79           ENDDO       END DO
80        ENDDO       DO ij = 1, ip1jm, iip1
81            vav(ij+iim, l) = vav(ij, l)
82  c------------------  -xx ----------------------------------------------       END DO
83  c   .  Calcul de     v    END DO
84    
85        DO  l=1,llm    !-----------------------------------------------------------------------
86           DO    ij   = 2, ip1jm  
87            vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )  
88           ENDDO    DO l = 1, llmm1
89           DO    ij   = 1,ip1jm,iip1  
90            vav(ij,l) = vav(ij+iim,l)  
91           ENDDO       !       ......   calcul de  - w/2.    au niveau  l+1   .......          
92           DO    ij   = 1, ip1jm-1  
93            vav(ij,l) = vav(ij,l) + vav(ij+1,l)       DO ij = 1, ip1jmp1
94           ENDDO          wsur2(ij) = -0.5*w(ij, l+1)
95           DO    ij       = 1, ip1jm, iip1       END DO
96            vav(ij+iim,l) = vav(ij,l)  
97           ENDDO  
98        ENDDO       !     .....................     calcul pour  du     ..................  
99    
100  c-----------------------------------------------------------------------       DO ij = iip2, ip1jm - 1
101            ww = wsur2(ij) + wsur2(ij+1)
102  c          uu = 0.5*(ucov(ij, l)+ucov(ij, l+1))
103        DO 20 l = 1, llmm1          du(ij, l) = du(ij, l) - ww*(uu-uav(ij, l))/massebx(ij, l)
104            du(ij, l+1) = du(ij, l+1) + ww*(uu-uav(ij, l+1))/massebx(ij, l+1)
105         END DO
106  c       ......   calcul de  - w/2.    au niveau  l+1   .......  
107         !     .....  correction pour  du(iip1, j, l)  ........                    
108        DO 5   ij   = 1, ip1jmp1       !     .....     du(iip1, j, l)= du(1, j, l)   .....                        
109        wsur2( ij ) = - 0.5 * w( ij,l+1 )  
110     5  CONTINUE       !DIR$ IVDEP                                                            
111         DO ij = iip1 + iip1, ip1jm, iip1
112            du(ij, l) = du(ij-iim, l)
113  c     .....................     calcul pour  du     ..................          du(ij, l+1) = du(ij-iim, l+1)
114         END DO
115        DO 6 ij = iip2 ,ip1jm-1  
116        ww        = wsur2 (  ij  )     + wsur2( ij+1 )       !     .................    calcul pour   dv      .....................  
117        uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )  
118        du(ij,l)  = du(ij,l)   - ww * ( uu - uav(ij, l ) )/massebx(ij, l )       DO ij = 1, ip1jm
119        du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)          ww = wsur2(ij+iip1) + wsur2(ij)
120     6  CONTINUE          vv = 0.5*(vcov(ij, l)+vcov(ij, l+1))
121            dv(ij, l) = dv(ij, l) - ww*(vv-vav(ij, l))/masseby(ij, l)
122  c     .....  correction pour  du(iip1,j,l)  ........          dv(ij, l+1) = dv(ij, l+1) + ww*(vv-vav(ij, l+1))/masseby(ij, l+1)
123  c     .....     du(iip1,j,l)= du(1,j,l)   .....       END DO
124    
125  CDIR$ IVDEP  
126        DO   7  ij   = iip1 +iip1, ip1jm, iip1  
127        du( ij, l  ) = du( ij -iim, l  )       !     ............................................................      
128        du( ij,l+1 ) = du( ij -iim,l+1 )       !     ...............    calcul pour   dh      ...................      
129     7  CONTINUE       !     ............................................................      
130    
131  c     .................    calcul pour   dv      .....................       !                       ---z                                            
132         !       calcul de  - d( teta  * w )      qu'on ajoute a   dh            
133        DO 8 ij = 1, ip1jm       !                   ...............                                    
134        ww        = wsur2( ij+iip1 )   + wsur2( ij )  
135        vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )       DO ij = 1, ip1jmp1
136        dv(ij,l)  = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l )          ww = wsur2(ij)*(teta(ij, l)+teta(ij, l+1))
137        dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)          dteta(ij, l) = dteta(ij, l) - ww
138     8  CONTINUE          dteta(ij, l+1) = dteta(ij, l+1) + ww
139         end DO
140  c  
141         IF (conser) THEN
142  c     ............................................................          DO ij = 1, ip1jmp1
143  c     ...............    calcul pour   dh      ...................             ge(ij) = wsur2(ij)*wsur2(ij)*unsaire2(ij)
144  c     ............................................................          end DO
145            gt = ssum(ip1jmp1, ge, 1)
146  c                       ---z          gtot(l) = deuxjour*sqrt(gt/ip1jmp1)
147  c       calcul de  - d( teta  * w )      qu'on ajoute a   dh       END IF
148  c                   ...............  
149      END DO
150          DO 15 ij = 1, ip1jmp1  
151           ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )  END SUBROUTINE advect
          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.43

  ViewVC Help
Powered by ViewVC 1.1.21