source: trunk/mesoscale/LMDZ.MARS/libf_gcm/aeronomars/molvis.F @ 57

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

mineur LMD_MM_MARS: ajout du GCM ancienne physique, systeme maintenant complet sur SVN (ne manque que la base de donnees d'etats initiaux)

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