source: trunk/LMDZ.PLUTO.old/libf/phypluto/newsedim.F @ 3436

Last change on this file since 3436 was 3175, checked in by emillour, 11 months ago

Pluto PCM:
Add the old Pluto LMDZ for reference (required prior step to making
an LMDZ.PLUTO using the same framework as the other physics packages).
TB+EM

File size: 5.9 KB
Line 
1      SUBROUTINE newsedim(ngrid,nlay,naersize,ptimestep,
2     &  pplev,masse,epaisseur,pt,rd,rho,pqi,wq,pphi)
3      IMPLICIT NONE
4
5!==================================================================
6!     
7!     Purpose
8!     -------
9!      Calculates sedimentation of 1 tracer
10!      of radius rd (m) and density rho (kg.m-3)
11!     
12!==================================================================
13
14c-----------------------------------------------------------------------
15c   declarations:
16c   -------------
17
18#include "dimensions.h"
19#include "dimphys.h"
20#include "comcstfi.h"
21c
22c   arguments:
23c   ----------
24
25      INTEGER ngrid,nlay,naersize
26      REAL ptimestep            ! pas de temps physique (s)
27      REAL pplev(ngrid,nlay+1)   ! pression aux inter-couches (Pa)
28      REAL pt(ngrid,nlay)    ! temperature au centre des couches (K)
29      real masse (ngrid,nlay) ! masse d'une couche (kg)
30      real epaisseur (ngrid,nlay)  ! epaisseur d'une couche (m)
31      real rd(naersize)             ! particle radius (m)
32      real rho             ! particle density (kg.m-3)
33      real pphi(ngrid,nlay)  ! egeopotential
34
35
36c    Traceurs :
37      real pqi(ngrid,nlay)  ! traceur   (e.g. ?/kg)
38      real wq(ngridmx,nlay+1)  ! flux de traceur durant timestep (?/m-2)
39     
40c   local:
41c   ------
42
43      INTEGER l,ig, k, i
44      REAL rfall
45
46      LOGICAL firstcall
47      SAVE firstcall
48
49c    Traceurs :
50c    ~~~~~~~~
51      real traversee(ngridmx,nlayermx)
52      real vstokes(ngridmx,nlayermx)
53      real w(ngridmx,nlayermx)
54      real ptop, dztop, Ep, Stra
55
56      DATA firstcall/.true./
57
58c    Physical constant
59c    ~~~~~~~~~~~~~~~~~
60c     REAL visc, molrad
61c     Gas molecular viscosity (N.s.m-2)
62      data visc/6.67e-6/       ! N2 TB14
63c     Effective gas molecular radius (m)
64      data molrad/1.93e-10/   ! N2 TB14
65c     local and saved variable
66      real a,b
67      save a,b
68      real b2
69
70c    ** un petit test de coherence
71c       --------------------------
72
73      IF (firstcall) THEN
74         IF(ngrid.NE.ngridmx) THEN
75            PRINT*,'STOP dans newsedim'
76            PRINT*,'probleme de dimensions :'
77            PRINT*,'ngrid  =',ngrid
78            PRINT*,'ngridmx  =',ngridmx
79            STOP
80         ENDIF
81         firstcall=.false.
82
83
84!=======================================================================
85!     Preliminary calculations for sedimenation velocity
86
87!       - Constant to compute stokes speed simple formulae
88!        (Vstokes =  b * rho* r**2   avec   b= (2/9) * rho * g / visc
89         b = 2./9. * g / visc
90
91!       - Constant  to compute gas mean free path
92!        l= (T/P)*a, avec a = (  0.707*8.31/(4*pi*molrad**2 * avogadro))
93         a = 0.707*8.31/(4*3.1416* molrad**2  * 6.023e23)
94
95c       - Correction to account for non-spherical shape (Murphy et al.  1990)
96c   (correction = 0.85 for irregular particles, 0.5 for disk shaped particles)
97c        a = a    * 0.85
98      ENDIF
99
100c      write(*,*) 'TB16 : stokes : g,visc,b,a,molrad ',g,visc,b,a,molrad
101
102
103
104c-----------------------------------------------------------------------
105c    1. initialisation
106c    -----------------
107
108c     Sedimentation velocity (m/s)
109c     ~~~~~~~~~~~~~~~~~~~~~~
110c     (stokes law corrected for low pressure by the Cunningham
111c     slip-flow correction  according to Rossow (Icarus 36, 1-50, 1978)
112        do  l=1,nlay
113          do ig=1, ngrid
114            if (naersize.eq.1) then
115              rfall=rd(1)
116            else
117              i=ngrid*(l-1)+ig
118              rfall=rd(i)
119            endif 
120            !vstokes(ig,l) = b * rho * rfall**2 *
121            b2=((g*rad-pphi(ig,l))**2/(g*(rad**2)))*2./9./visc
122            vstokes(ig,l) = b2 * rho * rfall**2 *
123     &      (1 + 1.333* ( a*pt(ig,l)/pplev(ig,l) )/rfall)
124
125c           Layer crossing time (s) :
126            traversee(ig,l)= epaisseur(ig,l)/vstokes(ig,l)
127          end do
128        end do
129
130c     Calcul de la masse d'atmosphere correspondant a q transferee
131c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132c     (e.g. on recherche le niveau  en dessous de laquelle le traceur
133c      va traverser le niveau intercouche l : "dztop" est sa hauteur
134c      au dessus de l (m), "ptop" est sa pression (Pa))
135
136      do  l=1,nlay
137        do ig=1, ngrid
138             
139             dztop = vstokes(ig,l)*  ptimestep
140             Ep=0
141             k=0
142
143c **************************************************************
144c            Simple Method
145             w(ig,l) =
146     &       (1- exp(-dztop*g/(r*pt(ig,l))))*pplev(ig,l) / g
147cc           write(*,*) 'OK simple method l,w =', l, w(ig,l)
148cc           write(*,*) 'OK simple method dztop =', dztop
149c **************************************************************
150cccc         Complex method :
151            if (dztop.gt.epaisseur(ig,l)) then
152cccc            Cas ou on "epuise" la couche l : On calcule le flux
153cccc            Venant de dessus en tenant compte de la variation de Vstokes
154
155               Ep= epaisseur(ig,l)
156               Stra= traversee(ig,l)
157               do while(dztop.gt.Ep.and.l+k+1.le.nlay)
158                 k=k+1
159                 dztop= Ep + vstokes(ig,l+k)*(ptimestep -Stra)
160                 Ep = Ep + epaisseur(ig,l+k)
161                 Stra = Stra + traversee(ig,l+k)
162               enddo
163               Ep = Ep - epaisseur(ig,l+k)
164             end if
165             ptop=pplev(ig,l+k)*exp(-(dztop-Ep)*g/(r*pt(ig,l+k)))
166             w(ig,l) = (pplev(ig,l) -Ptop)/g
167c
168cc           write(*,*) 'OK new    method l,w =', l, w(ig,l)
169cc           write(*,*) 'OK new    method dztop =', dztop
170cc       if(l.eq.7)write(*,*)'l=7,k,pplev,Ptop',pplev(ig,l),Ptop
171cc       if(l.eq.7)write(*,*)'l=7,dztop,Ep',dztop,Ep
172cc            if(l.eq.6)write(*,*)'l=6,k, w',k, w(1,l)
173cc            if(l.eq.7)write(*,*)'l=7,k, w',k, w(1,l)
174cc            if(l.eq.8)write(*,*)'l=8,k, w',k, w(1,l)
175c **************************************************************
176        end do
177      end do
178
179      call vlz_fi(ngrid,pqi,2.,masse,w,wq)
180c         write(*,*) ' newsed: wq(6), wq(7), q(6)',
181c    &                wq(1,6),wq(1,7),pqi(1,6)
182
183
184      RETURN
185      END
186
Note: See TracBrowser for help on using the repository browser.