source: trunk/LMDZ.COMMON/libf/dyn3dpar/advect_p.F

Last change on this file was 1422, checked in by milmd, 10 years ago

In GENERIC, MARS and COMMON models replace some include files by modules (usefull for decoupling physics with dynamics).

File size: 5.8 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE advect_p(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta)
5      USE parallel_lmdz
6      USE write_field_p
7      USE comconst_mod, ONLY: daysec
8      USE logic_mod, ONLY: conser
9      IMPLICIT NONE
10c=======================================================================
11c
12c   Auteurs:  P. Le Van , Fr. Hourdin  .
13c   -------
14c
15c   Objet:
16c   ------
17c
18c   *************************************************************
19c   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
20c   *************************************************************
21c        ces termes sont ajoutes a du,dv,dteta et dq .
22c  Modif F.Forget 03/94 : on retire q de advect
23c
24c=======================================================================
25c-----------------------------------------------------------------------
26c   Declarations:
27c   -------------
28
29#include "dimensions.h"
30#include "paramet.h"
31#include "comgeom.h"
32
33c   Arguments:
34c   ----------
35
36      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm)
37      REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm)
38      REAL dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm)
39
40c   Local:
41c   ------
42
43      REAL uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1)
44      REAL unsaire2(ip1jmp1), ge(ip1jmp1)
45      REAL deuxjour, ww, gt, uu, vv
46
47      INTEGER  ij,l,ijb,ije
48
49      EXTERNAL  SSUM
50      REAL      SSUM
51
52c-----------------------------------------------------------------------
53c   2. Calculs preliminaires:
54c   -------------------------
55
56      IF (conser)  THEN
57         deuxjour = 2. * daysec
58
59         DO   1  ij   = 1, ip1jmp1
60         unsaire2(ij) = unsaire(ij) * unsaire(ij)
61   1     CONTINUE
62      END IF
63
64
65c------------------  -yy ----------------------------------------------
66c   .  Calcul de     u
67
68      DO  l=1,llm
69         
70         ijb=ij_begin
71         ije=ij_end
72         if (pole_nord) ijb=ijb+iip1
73         if (pole_sud)  ije=ije-iip1
74         
75c         DO    ij     = iip2, ip1jmp1
76c            uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )
77c         ENDDO
78
79c         DO    ij     = iip2, ip1jm
80c            uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)
81c         ENDDO
82         
83         DO    ij     = ijb, ije
84                 
85           uav(ij,l)=0.25*(ucov(ij,l)+ucov(ij-iip1,l))
86     .               +0.25*(ucov(ij+iip1,l)+ucov(ij,l))
87         ENDDO
88         
89         if (pole_nord) then
90           DO      ij         = 1, iip1
91              uav(ij      ,l) = 0.
92           ENDDO
93         endif
94         
95         if (pole_sud) then
96           DO      ij         = 1, iip1
97              uav(ip1jm+ij,l) = 0.
98           ENDDO
99         endif
100         
101      ENDDO
102     
103c      call write_field3d_p('uav',reshape(uav,(/iip1,jjp1,llm/)))
104     
105c------------------  -xx ----------------------------------------------
106c   .  Calcul de     v
107     
108      ijb=ij_begin
109      ije=ij_end
110      if (pole_sud)  ije=ij_end-iip1
111     
112      DO  l=1,llm
113         
114         DO    ij   = ijb+1, ije
115           vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )
116         ENDDO
117         
118         DO    ij   = ijb,ije,iip1
119          vav(ij,l) = vav(ij+iim,l)
120         ENDDO
121         
122         
123         DO    ij   = ijb, ije-1
124          vav(ij,l) = vav(ij,l) + vav(ij+1,l)
125         ENDDO
126         
127         DO    ij       = ijb, ije, iip1
128          vav(ij+iim,l) = vav(ij,l)
129         ENDDO
130         
131      ENDDO
132c       call write_field3d_p('vav',reshape(vav,(/iip1,jjm,llm/)))
133c-----------------------------------------------------------------------
134
135
136     
137      DO 20 l = 1, llmm1
138
139
140c       ......   calcul de  - w/2.    au niveau  l+1   .......
141      ijb=ij_begin
142      ije=ij_end+iip1
143      if (pole_sud)  ije=ij_end
144     
145      DO 5   ij   = ijb, ije
146      wsur2( ij ) = - 0.5 * w( ij,l+1 )
147   5  CONTINUE
148
149
150c     .....................     calcul pour  du     ..................
151     
152      ijb=ij_begin
153      ije=ij_end
154      if (pole_nord) ijb=ijb+iip1
155      if (pole_sud)  ije=ije-iip1
156         
157      DO 6 ij = ijb ,ije-1
158      ww        = wsur2 (  ij  )     + wsur2( ij+1 )
159      uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
160      du(ij,l)  = du(ij,l)   - ww * ( uu - uav(ij, l ) )/massebx(ij, l )
161      du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)
162   6  CONTINUE
163
164c     .....  correction pour  du(iip1,j,l)  ........
165c     .....     du(iip1,j,l)= du(1,j,l)   .....
166
167CDIR$ IVDEP
168      DO   7  ij   = ijb+iip1-1, ije, iip1
169      du( ij, l  ) = du( ij -iim, l  )
170      du( ij,l+1 ) = du( ij -iim,l+1 )
171   7  CONTINUE
172
173c     .................    calcul pour   dv      .....................
174      ijb=ij_begin
175      ije=ij_end
176      if (pole_sud)  ije=ij_end-iip1
177     
178      DO 8 ij = ijb, ije
179      ww        = wsur2( ij+iip1 )   + wsur2( ij )
180      vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
181      dv(ij,l)  = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l )
182      dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)
183   8  CONTINUE
184
185c
186
187c     ............................................................
188c     ...............    calcul pour   dh      ...................
189c     ............................................................
190
191c                       ---z
192c       calcul de  - d( teta  * w )      qu'on ajoute a   dh
193c                   ...............
194        ijb=ij_begin
195        ije=ij_end
196       
197        DO 15 ij = ijb, ije
198         ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
199         dteta(ij, l ) = dteta(ij, l )  -  ww
200         dteta(ij,l+1) = dteta(ij,l+1)  +  ww
201  15    CONTINUE
202
203c ym ---> conser a voir plus tard
204
205c      IF( conser)  THEN
206c       
207c        DO 17 ij = 1,ip1jmp1
208c        ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
209c  17    CONTINUE
210c        gt       = SSUM( ip1jmp1,ge,1 )
211c        gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
212c      END IF
213
214  20  CONTINUE
215 
216      RETURN
217      END
Note: See TracBrowser for help on using the repository browser.