source: trunk/LMDZ.COMMON/libf/dyn3dpar/top_bound_p.F @ 134

Last change on this file since 134 was 124, checked in by emillour, 14 years ago

EM: suite mise au point discretisation verticale et quelques corrections de bugs dans le version de reference parallele.

File size: 5.3 KB
Line 
1      SUBROUTINE top_bound_p( vcov,ucov,teta,phi,masse, du,dv,dh )
2      USE parallel
3      IMPLICIT NONE
4c
5#include "dimensions.h"
6#include "paramet.h"
7#include "comconst.h"
8#include "comvert.h"
9#include "comgeom2.h"
10
11
12c ..  DISSIPATION LINEAIRE A HAUT NIVEAU, RUN MESO,
13C     F. LOTT DEC. 2006
14c                                 (  10/12/06  )
15
16c=======================================================================
17c
18c   Auteur:  F. LOTT 
19c   -------
20c
21c   Objet:
22c   ------
23c
24c   Dissipation linéaire (ex top_bound de la physique)
25c
26c=======================================================================
27c-----------------------------------------------------------------------
28c   Declarations:
29c   -------------
30
31#include "comdissipn.h"
32
33c   Arguments:
34c   ----------
35
36      REAL ucov(iip1,jjp1,llm),vcov(iip1,jjm,llm),teta(iip1,jjp1,llm)
37      REAL phi(iip1,jjp1,llm)                  ! geopotentiel
38      REAL masse(iip1,jjp1,llm)
39      REAL dv(iip1,jjm,llm),du(iip1,jjp1,llm),dh(iip1,jjp1,llm)
40
41c   Local:
42c   ------
43      REAL massebx(iip1,jjp1,llm),masseby(iip1,jjm,llm),zm
44      REAL uzon(jjp1,llm),vzon(jjm,llm),tzon(jjp1,llm)
45     
46      INTEGER NDAMP
47      PARAMETER (NDAMP=4)
48      integer i
49      REAL,SAVE :: rdamp(llm)
50!     &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
51      LOGICAL,SAVE :: first=.true.
52     
53      REAL zkm
54      INTEGER j,l,jjb,jje
55
56
57      if (iflag_top_bound == 0) return
58      if (first) then
59c$OMP BARRIER
60c$OMP MASTER
61         if (iflag_top_bound == 1) then
62! couche eponge dans les 4 dernieres couches du modele
63             rdamp(:)=0.
64             rdamp(llm)=tau_top_bound
65             rdamp(llm-1)=tau_top_bound/2.
66             rdamp(llm-2)=tau_top_bound/4.
67             rdamp(llm-3)=tau_top_bound/8.
68         else if (iflag_top_bound == 2) then
69! couche eponge dans toutes les couches de pression plus faible que
70! 100 fois la pression de la derniere couche
71             rdamp(:)=tau_top_bound
72     s       *max(presnivs(llm)/presnivs(:)-0.01,0.)
73         endif
74         first=.false.
75         print*,'TOP_BOUND mode',mode_top_bound
76         print*,'Coeffs pour la couche eponge a l equateur'
77         print*,'p (Pa)  z(km)  tau (s)'
78         do l=1,llm
79           if (rdamp(l).ne.0.) then
80            zkm        = phi(iip1/2,jjp1/2,l)/(1000*g)
81          print*,presnivs(l),zkm,1./rdamp(l)
82           endif
83         enddo
84c$OMP END MASTER
85c$OMP BARRIER
86      endif
87
88
89      CALL massbar_p(masse,massebx,masseby)
90
91c   mode = 0 : pas de sponge
92c   mode = 1 : u et v -> 0
93c   mode = 2 : u et v -> moyenne zonale
94c   mode = 3 : u, v et h -> moyenne zonale
95
96C POUR V
97
98C  CALCUL DES CHAMPS EN MOYENNE ZONALE:
99
100      jjb=jj_begin
101      jje=jj_end
102      IF (pole_sud) jje=jj_end-1
103
104      if (mode_top_bound.ge.2) then
105!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
106       do l=1,llm
107        do j=jjb,jje
108          zm=0.
109          vzon(j,l)=0
110          do i=1,iim
111! Rm: on peut travailler directement avec la moyenne zonale de vcov
112! plutot qu'avec celle de v car le coefficient cv qui relie les deux
113! ne varie qu'en latitude
114            vzon(j,l)=vzon(j,l)+vcov(i,j,l)*masseby(i,j,l)
115            zm=zm+masseby(i,j,l)
116          enddo
117          vzon(j,l)=vzon(j,l)/zm
118        enddo
119       enddo
120!$OMP END DO NOWAIT   
121      else
122!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
123       do l=1,llm
124        do j=jjb,jje
125          vzon(j,l)=0.
126        enddo
127       enddo
128!$OMP END DO NOWAIT
129      endif
130
131C   AMORTISSEMENTS LINEAIRES:
132
133      if (mode_top_bound.ge.1) then
134!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
135       do l=1,llm
136        do j=jjb,jje
137          do i=1,iip1
138            dv(i,j,l)= -rdamp(l)*(vcov(i,j,l)-vzon(j,l))
139          enddo
140        enddo
141       enddo
142!$OMP END DO NOWAIT
143      endif
144
145C POUR U ET H
146
147C  CALCUL DES CHAMPS EN MOYENNE ZONALE:
148
149      jjb=jj_begin
150      jje=jj_end
151      IF (pole_nord) jjb=jj_begin+1
152      IF (pole_sud)  jje=jj_end-1
153
154      if (mode_top_bound.ge.2) then
155!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
156       do l=1,llm
157        do j=jjb,jje
158          uzon(j,l)=0.
159          zm=0.
160          do i=1,iim
161            uzon(j,l)=uzon(j,l)+massebx(i,j,l)*ucov(i,j,l)/cu(i,j)
162            zm=zm+massebx(i,j,l)
163          enddo
164          uzon(j,l)=uzon(j,l)/zm
165        enddo
166       enddo
167!$OMP END DO NOWAIT
168      else
169!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
170       do l=1,llm
171        do j=jjb,jje
172          uzon(j,l)=0.
173        enddo
174       enddo
175!$OMP END DO NOWAIT
176      endif
177
178      if (mode_top_bound.ge.3) then
179!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
180       do l=1,llm
181        do j=jjb,jje
182          zm=0.
183          tzon(j,l)=0.
184          do i=1,iim
185            tzon(j,l)=tzon(j,l)+teta(i,j,l)*masse(i,j,l)
186            zm=zm+masse(i,j,l)
187          enddo
188          tzon(j,l)=tzon(j,l)/zm
189        enddo
190       enddo
191!$OMP END DO NOWAIT
192      endif
193
194C   AMORTISSEMENTS LINEAIRES:
195
196      if (mode_top_bound.ge.1) then
197!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
198       do l=1,llm
199        do j=jjb,jje
200          do i=1,iip1
201            du(i,j,l)= -rdamp(l)*(ucov(i,j,l)-cu(i,j)*uzon(j,l))
202          enddo
203        enddo
204       enddo
205!$OMP END DO NOWAIT
206      endif
207     
208      if (mode_top_bound.ge.3) then
209!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
210       do l=1,llm
211        do j=jjb,jje
212          do i=1,iip1
213            dh(i,j,l)= -rdamp(l)*(teta(i,j,l)-tzon(j,l))
214          enddo
215        enddo
216       enddo
217!$OMP END DO NOWAIT
218      endif     
219
220!$OMP BARRIER
221      RETURN
222      END
Note: See TracBrowser for help on using the repository browser.