source: trunk/LMDZ.MARS/libf/aeronomars/molvis.F @ 4035

Last change on this file since 4035 was 4035, checked in by emillour, 4 weeks ago

Mars PCM:
Cleanup and correction around thermospheric processes: ensure that the
tendencies from previous processes are included before being sent to
the next process (was not the case for conduction).
EM

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