source: trunk/WRF.COMMON/WRFV2/mars_lmd/libf/aeronomars/molvis.F @ 3026

Last change on this file since 3026 was 11, checked in by aslmd, 14 years ago

spiga@svn-planeto:ajoute le modele meso-echelle martien

File size: 5.5 KB
Line 
1       SUBROUTINE molvis(ptimestep,pplay,pplev,
2     $          pt,pdteuv,pdtconduc,pvel,
3     $                   tsurf,zzlev,zzlay,zdvelmolvis)
4      IMPLICIT NONE
5
6
7c******WRF: ligne trop longue
8
9c=======================================================================
10c
11c   Molecular Viscosity Diffusion
12
13c   Based on conduction.F  by N. Descamp, F. Forget 05/1999
14c
15c   modified by M. Angelats i Coll
16c
17c=======================================================================
18
19c-----------------------------------------------------------------------
20c   declarations:
21c-----------------------------------------------------------------------
22
23#include "dimensions.h"
24#include "dimphys.h"
25#include "comcstfi.h"
26#include "surfdat.h"
27#include "chimiedata.h"
28#include "conc.h"
29
30c   arguments:
31c   ----------
32
33      REAL ptimestep
34      REAL pplay(ngridmx,nlayermx)
35      REAL pplev(ngridmx,nlayermx+1)
36      REAL zzlay(ngridmx,nlayermx)
37      REAL zzlev(ngridmx,nlayermx+1)
38      real pt(ngridmx,nlayermx)
39      real tsurf(ngridmx)
40      REAL pvel(ngridmx,nlayermx)
41      REAL pdvel(ngridmx,nlayermx)
42      real pdteuv(ngridmx,nlayermx)
43      real pdtconduc(ngridmx,nlayermx)
44
45      real zdvelmolvis(ngridmx,nlayermx)
46
47c   local:
48c   ------
49
50      INTEGER l,ig, ngrid,nz
51      real Akk,skk,phitop,velsurf,fac, m, tmean
52      REAL zvel(nlayermx)
53      real zt(nlayermx)
54      REAL alpha(nlayermx)
55      REAL lambda(nlayermx)
56      real muvol(nlayermx)
57      REAL C(nlayermx)
58      real D(nlayermx)
59      real den(nlayermx)
60      REAL pdvelm(nlayermx)
61      REAL zlay(nlayermx)
62      real zlev(nlayermx+1)
63
64c   constants used locally
65c    ---------------------
66c     The atmospheric conductivity is a function of temperature T :
67c      conductivity = Akk* T**skk
68c     Molecular viscosity is related to thermal conductivity by:
69c       conduc = 0.25*(9*gamma - 5)* Cv * molvis
70c     where gamma = Cp/Cv.  For dry air.
71
72
73      PARAMETER (skk=0.69)
74
75      PARAMETER (velsurf =0.0)
76     
77      logical firstcall
78      save firstcall
79      data firstcall /.true./
80c-----------------------------------------------------------------------
81c   calcul des coefficients alpha et lambda
82c-----------------------------------------------------------------------
83
84      IF (firstcall) THEN
85        write (*,*) 'coeff of molecular viscosity Akk,skk,factor'
86        write(*,*) Akk,skk,fac
87        firstcall = .false.
88      END IF
89
90! Initialize phitop
91      phitop=0.0
92
93      ngrid=ngridmx
94      nz=nlayermx
95
96      do ig=1,ngrid
97
98        zt(1)=pt(ig,1)+(pdteuv(ig,1)+pdtconduc(ig,1))*ptimestep
99        zvel(1)=pvel(ig,1)
100c        zlay(1)=-log(pplay(ig,1)/pplev(ig,1))*Rnew(ig,1)*zt(1)/g
101c        zlev(1)=0.0
102
103        zlay(1)=zzlay(ig,1)
104        zlev(1)=zzlev(ig,1)
105
106        do l=2,nz
107          zt(l)=pt(ig,l)+(pdteuv(ig,l)+pdtconduc(ig,l))*ptimestep
108          zvel(l)=pvel(ig,l)
109c          tmean=zt(l)
110c          if(zt(l).ne.zt(l-1)) tmean=(zt(l)-zt(l-1))/log(zt(l)/zt(l-1))
111c          zlay(l)= zlay(l-1)
112c     &          -log(pplay(ig,l)/pplay(ig,l-1))*Rnew(ig,l-1)*tmean/g
113c          zlev(l)= zlev(l-1)
114c     &         -log(pplev(ig,l)/pplev(ig,l-1))*Rnew(ig,l-1)*tmean/g
115        zlay(l)=zzlay(ig,l)
116        zlev(l)=zzlev(ig,l)
117        enddo
118
119c          zlev(nz+1)= zlev(nz)
120c     &         -log(max(pplev(ig,nz+1),1.e-30)/pplev(ig,nz))
121c     &          *Rnew(ig,nz)*tmean/g
122c          if(pplev(ig,nz+1).eq.0.)
123c     &       zlev(nz+1)=zlev(nz)+(zlay(nz)-zlay(nz-1))
124
125          zlev(nz+1)= zlev(nz)+10000.
126
127        fac=0.25*(9.*cpnew(ig,1)-5.*(cpnew(ig,1)-rnew(ig,1)))
128        Akk=Akknew(ig,1)
129        lambda(1)=Akk*tsurf(ig)**skk/zlay(1)/fac   
130c        write(*,*) 'rnew(ig,nz)  ',ig , rnew(ig,nz)
131
132        DO l=2,nz
133          fac=(9.*cpnew(ig,l)-5.*(cpnew(ig,l)-rnew(ig,l)))/4.
134          Akk=Akknew(ig,l)
135          lambda(l)=Akk/fac*zt(l)**skk/(zlay(l)-zlay(l-1))
136        ENDDO
137   
138        DO l=1,nz-1
139          muvol(l)=pplay(ig,l)/(rnew(ig,l)*zt(l))
140          alpha(l)=(muvol(l)/ptimestep)*(zlev(l+1)-zlev(l))
141        ENDDO
142        muvol(nz)=pplay(ig,nz)/(rnew(ig,nz)*zt(nz))
143        alpha(nz)=(muvol(nz)/ptimestep)*(zlev(nz+1)-zlev(nz))
144
145c--------------------------------------------------------------------
146c
147c     calcul des coefficients C et D
148c
149c-------------------------------------------------------------------
150
151      den(1)=alpha(1)+lambda(2)+lambda(1)
152      C(1)=lambda(1)*(velsurf-zvel(1))+lambda(2)*(zvel(2)-zvel(1))
153      C(1)=C(1)/den(1)       
154      D(1)=lambda(2)/den(1)           
155   
156      DO l = 2,nz-1
157         den(l)=alpha(l)+lambda(l+1)
158         den(l)=den(l)+lambda(l)*(1-D(l-1))
159         
160         C(l) =lambda(l+1)*(zvel(l+1)-zvel(l))
161     $        +lambda(l)*(zvel(l-1)-zvel(l)+C(l-1))   
162         C(l) =C(l)/den(l)           
163
164         D(l) =lambda(l+1) / den(l)
165      ENDDO
166
167      den(nz)=alpha(nz) + lambda(nz) * (1-D(nz-1))
168      C(nz)=C(nz-1)+zvel(nz-1)-zvel(nz)
169      C(nz)=(C(nz)*lambda(nz)+phitop) / den(nz)
170               
171c----------------------------------------------------------------------
172c
173c      calcul de la nouvelle pdvelm
174c
175c----------------------------------------------------------------------
176
177      DO l=1,nz
178         pdvelm(l)=0.
179      ENDDO
180         pdvelm(nz)=C(nz)
181      DO l=nz-1,1,-1
182         pdvelm(l)=C(l)+D(l)*pdvelm(l+1)
183      ENDDO
184c-----------------------------------------------------------------------
185c
186c     calcul de la tendance zdvelmolvis
187c
188c-----------------------------------------------------------------------
189   
190      DO l=1,nz
191        zdvelmolvis(ig,l)=pdvelm(l)/ptimestep
192      ENDDO
193
194      ENDDO             ! boucle sur ngrid
195
196      RETURN
197      END
Note: See TracBrowser for help on using the repository browser.