source: trunk/LMDZ.COMMON/libf/dyn3d/top_bound.F @ 134

Last change on this file since 134 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: 4.3 KB
Line 
1      SUBROUTINE top_bound( vcov,ucov,teta,phi,masse, du,dv,dh )
2      IMPLICIT NONE
3c
4#include "dimensions.h"
5#include "paramet.h"
6#include "comconst.h"
7#include "comvert.h"
8#include "comgeom2.h"
9
10
11c ..  DISSIPATION LINEAIRE A HAUT NIVEAU, RUN MESO,
12C     F. LOTT DEC. 2006
13c                                 (  10/12/06  )
14
15c=======================================================================
16c
17c   Auteur:  F. LOTT 
18c   -------
19c
20c   Objet:
21c   ------
22c
23c   Dissipation linéaire (ex top_bound de la physique)
24c
25c=======================================================================
26c-----------------------------------------------------------------------
27c   Declarations:
28c   -------------
29
30! #include "comgeom.h"
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
44      REAL massebx(iip1,jjp1,llm),masseby(iip1,jjm,llm),zm
45      REAL uzon(jjp1,llm),vzon(jjm,llm),tzon(jjp1,llm)
46     
47      INTEGER NDAMP
48      PARAMETER (NDAMP=4)
49      integer i
50      REAL,SAVE :: rdamp(llm)
51!     &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
52
53      LOGICAL,SAVE :: first=.true.
54
55      REAL zkm
56      INTEGER j,l
57
58
59C  CALCUL DES CHAMPS EN MOYENNE ZONALE:
60     
61      if (iflag_top_bound.eq.0) return
62
63      if (first) then
64         if (iflag_top_bound.eq.1) then
65! couche eponge dans les 4 dernieres couches du modele
66             rdamp(:)=0.
67             rdamp(llm)=tau_top_bound
68             rdamp(llm-1)=tau_top_bound/2.
69             rdamp(llm-2)=tau_top_bound/4.
70             rdamp(llm-3)=tau_top_bound/8.
71         else if (iflag_top_bound.eq.2) then
72! couche eponge dans toutes les couches de pression plus faible que
73! 100 fois la pression de la derniere couche
74             rdamp(:)=tau_top_bound
75     s       *max(presnivs(llm)/presnivs(:)-0.01,0.)
76         endif
77         first=.false.
78         print*,'TOP_BOUND mode',mode_top_bound
79         print*,'Coeffs pour la couche eponge a l equateur'
80         print*,'p (Pa)  z(km)  tau (s)'
81         do l=1,llm
82           if (rdamp(l).ne.0.) then
83            zkm        = phi(iip1/2,jjp1/2,l)/(1000*g)
84          print*,presnivs(l),zkm,1./rdamp(l)
85           endif
86         enddo
87      endif
88
89      CALL massbar(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
96      if (mode_top_bound.ge.2) then
97       do l=1,llm
98        do j=1,jjm
99          vzon(j,l)=0.
100          zm=0.
101          do i=1,iim
102! Rm: on peut travailler directement avec la moyenne zonale de vcov
103! plutot qu'avec celle de v car le coefficient cv qui relie les deux
104! ne varie qu'en latitude
105            vzon(j,l)=vzon(j,l)+vcov(i,j,l)*masseby(i,j,l)
106            zm=zm+masseby(i,j,l)
107          enddo
108          vzon(j,l)=vzon(j,l)/zm
109        enddo
110       enddo
111
112       do l=1,llm
113        do j=2,jjm
114          uzon(j,l)=0.
115          zm=0.
116          do i=1,iim
117            uzon(j,l)=uzon(j,l)+massebx(i,j,l)*ucov(i,j,l)/cu(i,j)
118            zm=zm+massebx(i,j,l)
119          enddo
120          uzon(j,l)=uzon(j,l)/zm
121        enddo
122       enddo
123      else
124          vzon(:,:)=0.
125          uzon(:,:)=0.
126      endif
127
128      if (mode_top_bound.ge.3) then
129       do l=1,llm
130        do j=2,jjm
131          zm=0.
132          tzon(j,l)=0.
133          do i=1,iim
134            tzon(j,l)=tzon(j,l)+teta(i,j,l)*masse(i,j,l)
135            zm=zm+masse(i,j,l)
136          enddo
137          tzon(j,l)=tzon(j,l)/zm
138        enddo
139       enddo
140      endif
141
142C   AMORTISSEMENTS LINEAIRES:
143
144      if (mode_top_bound.ge.1) then
145       do l=1,llm
146        do i=1,iip1
147          do j=1,jjm
148            dv(i,j,l)= -rdamp(l)*(vcov(i,j,l)-vzon(j,l))
149          enddo
150        enddo
151       enddo
152
153       do l=1,llm
154        do i=1,iip1
155          do j=2,jjm
156            du(i,j,l)= -rdamp(l)*(ucov(i,j,l)-cu(i,j)*uzon(j,l))
157          enddo
158        enddo
159       enddo
160      endif
161
162      if (mode_top_bound.ge.3) then
163       do l=1,llm
164        do i=1,iip1
165          do j=2,jjm
166            dh(i,j,l)= -rdamp(l)*(teta(i,j,l)-tzon(j,l))
167          enddo
168        enddo
169       enddo
170      endif
171     
172      RETURN
173      END
Note: See TracBrowser for help on using the repository browser.