source: trunk/libf/dyn3dpar/top_bound_p.F @ 108

Last change on this file since 108 was 108, checked in by slebonnois, 14 years ago

Sebastien Lebonnois: sponge layer et dissip horizontale.

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