source: trunk/LMDZ.COMMON/libf/dyn3d/advect.F @ 3000

Last change on this file since 3000 was 1459, checked in by emillour, 9 years ago

Common dynamics: A couple of bug fixes

  • calfis[_p].F array boundaries must be explicitely specified when underlying arrays are of different sizes.
  • advect_new_p.F : missing initializations of intermediate variables at topmost layer.

EM

File size: 4.8 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE advect(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta)
5
6      USE comconst_mod, ONLY: daysec
7      USE logic_mod, ONLY: conser
8      USE ener_mod, ONLY: gtot
9
10      IMPLICIT NONE
11c=======================================================================
12c
13c   Auteurs:  P. Le Van , Fr. Hourdin  .
14c   -------
15c
16c   Objet:
17c   ------
18c
19c   *************************************************************
20c   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
21c   *************************************************************
22c        ces termes sont ajoutes a du,dv,dteta et dq .
23c  Modif F.Forget 03/94 : on retire q de advect
24c
25c=======================================================================
26c-----------------------------------------------------------------------
27c   Declarations:
28c   -------------
29
30      include "dimensions.h"
31      include "paramet.h"
32      include "comgeom.h"
33
34c   Arguments:
35c   ----------
36
37      REAL,INTENT(IN) :: vcov(ip1jm,llm)
38      REAL,INTENT(IN) :: ucov(ip1jmp1,llm)
39      REAL,INTENT(IN) :: teta(ip1jmp1,llm)
40      REAL,INTENT(IN) :: massebx(ip1jmp1,llm)
41      REAL,INTENT(IN) :: masseby(ip1jm,llm)
42      REAL,INTENT(IN) :: w(ip1jmp1,llm)
43      REAL,INTENT(INOUT) :: dv(ip1jm,llm)
44      REAL,INTENT(INOUT) :: du(ip1jmp1,llm)
45      REAL,INTENT(INOUT) :: dteta(ip1jmp1,llm)
46
47c   Local:
48c   ------
49
50      REAL uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1)
51      REAL unsaire2(ip1jmp1), ge(ip1jmp1)
52      REAL deuxjour, ww, gt, uu, vv
53
54      INTEGER  ij,l
55
56      REAL      SSUM
57
58c-----------------------------------------------------------------------
59c   2. Calculs preliminaires:
60c   -------------------------
61
62      IF (conser)  THEN
63         deuxjour = 2. * daysec
64
65         DO ij   = 1, ip1jmp1
66           unsaire2(ij) = unsaire(ij) * unsaire(ij)
67         ENDDO
68      END IF
69
70
71c------------------  -yy ----------------------------------------------
72c   .  Calcul de     u
73
74      DO  l=1,llm
75         DO    ij     = iip2, ip1jmp1
76            uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )
77         ENDDO
78         DO    ij     = iip2, ip1jm
79            uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)
80         ENDDO
81         DO      ij         = 1, iip1
82            uav(ij      ,l) = 0.
83            uav(ip1jm+ij,l) = 0.
84         ENDDO
85      ENDDO
86
87c------------------  -xx ----------------------------------------------
88c   .  Calcul de     v
89
90      DO  l=1,llm
91         DO    ij   = 2, ip1jm
92          vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )
93         ENDDO
94         DO    ij   = 1,ip1jm,iip1
95          vav(ij,l) = vav(ij+iim,l)
96         ENDDO
97         DO    ij   = 1, ip1jm-1
98          vav(ij,l) = vav(ij,l) + vav(ij+1,l)
99         ENDDO
100         DO    ij       = 1, ip1jm, iip1
101          vav(ij+iim,l) = vav(ij,l)
102         ENDDO
103      ENDDO
104
105c-----------------------------------------------------------------------
106
107c
108      DO l = 1, llmm1
109
110
111c       ......   calcul de  - w/2.    au niveau  l+1   .......
112
113        DO ij   = 1, ip1jmp1
114          wsur2( ij ) = - 0.5 * w( ij,l+1 )
115        ENDDO
116
117
118c     .....................     calcul pour  du     ..................
119
120        DO ij = iip2 ,ip1jm-1
121          ww        = wsur2 (  ij  )     + wsur2( ij+1 )
122          uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
123          du(ij,l)  = du(ij,l)   -ww*(uu-uav(ij,l))/massebx(ij,l)
124          du(ij,l+1)= du(ij,l+1) +ww*(uu-uav(ij,l+1))/massebx(ij,l+1)
125        ENDDO
126
127c     .....  correction pour  du(iip1,j,l)  ........
128c     .....     du(iip1,j,l)= du(1,j,l)   .....
129
130CDIR$ IVDEP
131        DO ij   = iip1 +iip1, ip1jm, iip1
132          du( ij, l  ) = du( ij -iim, l  )
133          du( ij,l+1 ) = du( ij -iim,l+1 )
134        ENDDO
135
136c     .................    calcul pour   dv      .....................
137
138        DO ij = 1, ip1jm
139          ww        = wsur2( ij+iip1 )   + wsur2( ij )
140          vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
141          dv(ij,l)  = dv(ij, l ) - ww*(vv-vav(ij,l))/masseby(ij,l)
142          dv(ij,l+1)= dv(ij,l+1) + ww*(vv-vav(ij,l+1))/masseby(ij,l+1)
143        ENDDO
144
145c
146
147c     ............................................................
148c     ...............    calcul pour   dh      ...................
149c     ............................................................
150
151c                       ---z
152c       calcul de  - d( teta  * w )      qu'on ajoute a   dh
153c                   ...............
154
155        DO ij = 1, ip1jmp1
156         ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
157         dteta(ij, l ) = dteta(ij, l )  -  ww
158         dteta(ij,l+1) = dteta(ij,l+1)  +  ww
159        ENDDO
160
161        IF( conser)  THEN
162          DO ij = 1,ip1jmp1
163            ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
164          ENDDO
165          gt       = SSUM( ip1jmp1,ge,1 )
166          gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
167        END IF
168
169      ENDDO ! of DO l = 1, llmm1
170 
171      END
Note: See TracBrowser for help on using the repository browser.