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

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

SL: corrections de bugs suite a compilations venus et titan de la version 109.

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