source: trunk/WRF.COMMON/WRFV2/mars_lmd/libf/phymars/meso_dustopacity.F @ 3094

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

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

File size: 9.6 KB
Line 
1      SUBROUTINE meso_dustopacity(ngrid,nlayer,nq,
2     $    zday,pplay,pplev,ls,pq,
3     $    tauref,tau,aerosol)
4                                                   
5       IMPLICIT NONE
6
7c=======================================================================
8c
9c       CAREFUL: THIS IS A VERSION TO BE USED WITH WRF !!!
10c
11c       ... CHECK THE ****WRF lines
12c
13c=======================================================================
14c   subject:
15c   --------
16c   Computing aerosol optical depth (dust opacity)
17c   In each layers
18c
19c   author: F.Forget
20c   ------
21c   update F. Montmessin (water ice scheme)
22c      and S. Lebonnois (12/06/2003) compatibility dust/ice/chemistry
23c   
24c   input:
25c   -----
26c   ngrid             Number of gridpoint of horizontal grid
27c   nlayer            Number of layer
28c   nq                Number of tracer
29c   ls                Solar longitude (Ls) , radian
30c   pplay,pplev       pressure (Pa) in the middle and boundary of each layer
31c   pq                Dust mixing ratio (used if tracer =T and active=T).
32c
33c   output:
34c   -------
35c   tauref       Prescribed mean column optical depth at 700 Pa
36c   tau          Column total visible dust optical depth at each point
37c   aerosol      aerosol(ig,l,1) is the dust optical
38c                depth in layer l, grid point ig
39c
40c=======================================================================
41#include "dimensions.h"
42#include "dimphys.h"
43#include "callkeys.h"
44#include "comcstfi.h"
45#include "comgeomfi.h"
46#include "dimradmars.h"
47#include "yomaer.h"
48#include "tracer.h"
49#include "planete.h"
50
51c-----------------------------------------------------------------------
52c
53c    Declarations :
54c    --------------
55c
56c    Input/Output
57c    ------------
58      INTEGER ngrid,nlayer,nq
59
60      REAL ls,zday,expfactor   
61      REAL pplev(ngrid,nlayer+1),pplay(ngrid,nlayer)
62      REAL pq(ngrid,nlayer,nq)
63      REAL tauref(ngrid), tau(ngrid,naerkind)
64      REAL aerosol(ngrid,nlayer,naerkind)
65
66c
67c    Local variables :
68c    -----------------
69      INTEGER l,ig,iq
70!****WRF
71      INTEGER ierr
72!****WRF
73      real topdust(ngridmx)
74      real zlsconst, zp
75      real taueq,tauS,tauN
76      real r0,reff,coefsize
77c
78c   local saved variables
79c   ---------------------
80
81      REAL topdust0(ngridmx)
82      SAVE topdust0
83
84      LOGICAL firstcall
85      DATA firstcall/.true./
86      SAVE firstcall
87
88
89c----------------------------------------------------------------------
90
91c     Initialisation
92c     --------------
93
94      IF (firstcall) THEN
95
96c        altitude of the top of the aerosol layer (km) at Ls=2.76rad:
97c        in the Viking year scenario
98         DO ig=1,ngrid
99             topdust0(ig)=60. -22.*SIN(lati(ig))**2
100         END DO
101         firstcall=.false.
102      END IF
103
104       
105
106c  -------------------------------------------------------------
107c     1) Prescribed dust  (if tracer=F or active=F)
108c  -------------------------------------------------------------
109      IF ((.not.tracer) .or. (.not.active)) THEN
110
111c       Vertical column optical depth at 700.Pa
112c       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113        IF(iaervar.eq.1) THEN
114!****WRF
115!****WRF: additional ASCII file to define dust opacity
116          OPEN(99,file='dustopacity.def',status='old',form='formatted'
117     .     ,iostat=ierr)
118          IF(ierr.NE.0) THEN
119                write(*,*) 'No file dustopacity.def'
120                stop
121          ELSE
122             READ(99,*) tauvis
123             write(*,*) 'constant tau', tauvis   
124!****WRF
125!****WRF
126             do ig=1, ngridmx
127                tauref(ig)=max(tauvis,1.e-9) ! tauvis=cste as read in file
128             end do
129             CLOSE(99)
130          ENDIF
131        ELSE IF (iaervar.eq.2) THEN   ! << "Viking" Scenario>>
132
133          tauref(1) = 0.7+.3*cos(ls+80.*pi/180.) ! like seen by VL1
134          do ig=2,ngrid
135            tauref(ig) = tauref(1)
136          end do
137
138        ELSE IF (iaervar.eq.3) THEN  ! << "MGS" scenario >>
139
140           taueq= 0.2 +(0.5-0.2) *(cos(0.5*(ls-4.363)))**14
141           tauS= 0.1 +(0.5-0.1)  *(cos(0.5*(ls-4.363)))**14
142           tauN = 0.1
143c          if (peri_day.eq.150) then
144c            tauS=0.1
145c            tauN=0.1 +(0.5-0.1)  *(cos(0.5*(ls+pi-4.363)))**14
146c            taueq= 0.2 +(0.5-0.2) *(cos(0.5*(ls+pi-4.363)))**14
147c           endif
148             
149           do ig=1,ngrid/2  ! Northern hemisphere
150             tauref(ig)= tauN +
151     &       (taueq-tauN)*0.5*(1+tanh((45-lati(ig)*180./pi)*6/60))
152           end do
153           do ig=ngrid/2+1, ngridmx  ! Southern hemisphere
154             tauref(ig)= tauS +
155     &       (taueq-tauS)*0.5*(1+tanh((45+lati(ig)*180./pi)*6/60))
156           end do
157
158        ELSE IF (iaervar.eq.4) THEN  ! << "TES" scenario >>
159c*************WRF
160c
161c 1. MY24 TES
162c
163           call readtesassim(ngrid,nlayer,zday,pplev,tauref)
164
165        ELSE IF (iaervar.gt.99) THEN  ! << input netcdf file >>
166c*************WRF
167c
168c 2. customized dust opacity field
169c   ex: from assimilation
170       call meso_readtesassim(ngrid,nlayer,zday,pplev,tauref,
171     . iaervar)
172c
173c*************WRF
174
175
176        ELSE
177          stop 'problem with iaervar in dustopacity.F'
178        ENDIF
179
180
181c       Altitude of the top of the dust layer
182c       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183        zlsconst=SIN(ls-2.76)
184        if (iddist.eq.1) then
185          do ig=1,ngrid
186             topdust(ig)=topdustref         ! constant dust layer top
187          end do
188
189        else if (iddist.eq.2) then          ! "Viking" scenario
190          do ig=1,ngrid
191            topdust(ig)=topdust0(ig)+18.*zlsconst
192          end do
193
194        else if(iddist.eq.3) then         !"MGS" scenario
195          do ig=1,ngrid
196            topdust(ig)=60.+18.*zlsconst
197     &                -(32+18*zlsconst)*sin(lati(ig))**4
198     &                 - 8*zlsconst*(sin(lati(ig)))**5
199          end do
200        endif
201
202
203c       Optical depth in each layer :
204c       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
205        if(iddist.ge.1) then
206         expfactor=0.
207          DO l=1,nlayer
208             DO ig=1,ngrid
209             if(pplay(ig,l).gt.700.
210     $                        /(988.**(topdust(ig)/70.))) then
211                zp=(700./pplay(ig,l))**(70./topdust(ig))
212                 expfactor=max(exp(0.007*(1.-max(zp,1.))),1.e-3)
213              else   
214               expfactor=1.e-3
215              endif       
216                aerosol(ig,l,1)= tauref(ig)/700. *
217     s           (pplev(ig,l)-pplev(ig,l+1))
218     &           *expfactor
219c     s           *max( exp(.007*(1.-max(zp,1.))) , 1.E-3 )
220             ENDDO
221          ENDDO
222c     changement dans le calcul de la distribution verticale         
223c     dans le cas des scenarios de poussieres assimiles
224c        if (iaervar.eq.4) THEN  ! TES
225c        call zerophys(ngrid*naerkind,tau)
226c
227c        do l=1,nlayer
228c           do ig=1,ngrid
229c                tau(ig,1)=tau(ig,1)+ aerosol(ig,l,1)
230c           end do
231c        end do
232c        do l=1,nlayer
233c           do ig=1,ngrid
234c               aerosol(ig,l,1)=aerosol(ig,l,1)*tauref(ig)/tau(ig,1)
235c     $     *(pplev(ig,1)/700)
236c           end do
237c        end do
238c        endif
239cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc       
240        else if(iddist.eq.0) then   
241c         old dust vertical distribution function (pollack90)
242          DO l=1,nlayer
243             DO ig=1,ngrid
244                zp=700./pplay(ig,l)
245                aerosol(ig,l,1)= tauref(ig)/700. *
246     s           (pplev(ig,l)-pplev(ig,l+1))
247     s           *max( exp(.03*(1.-max(zp,1.))) , 1.E-3 )
248             ENDDO
249          ENDDO
250        end if
251
252c  ---------------------------------------------------------------------
253c     2) Transported radiatively active dust  (if tracer=T and active=T)
254c ----------------------------------------------------------------------
255      ELSE  IF ((tracer) .and. (active)) THEN
256c     The dust opacity is computed from q
257
258c     a) "doubleq" technique (transport of mass and number mixing ratio)
259c        ~~~~~~~~~~~~~~~~~~~
260       if(doubleq) then
261
262         call zerophys(ngrid*nlayer*naerkind,aerosol)
263
264c        Computing effective radius :
265         do  l=1,nlayer
266           do ig=1, ngrid
267              r0=
268     &        (r3n_q*pq(ig,l,1)/max(pq(ig,l,2),0.01))**(1./3.)
269              r0=min(max(r0,1.e-10),500.e-6)
270              reff= ref_r0 * r0
271cc           If  reff is small, the transported dust mean Qext
272c            is reduced from the reference dust Qext by a factor "coefsize"
273
274             coefsize=min(max(2.52e6*reff-0.043 ,0.)   ,1.)
275
276cc              It is added 1.e-8 to pq to avoid low
277
278                aerosol(ig,l,1)=aerosol(ig,l,1)+ 1.E-8 +
279     &         ( 0.75*Qext(1)*coefsize/(rho_dust*reff))
280     &          * (pq(ig,l,1))*
281     &          (pplev(ig,l)-pplev(ig,l+1))/g
282           end do
283         end do
284         call zerophys(ngrid,tauref)
285
286c     b) Size bin technique (each aerosol can contribute to opacity))
287c        ~~~~~~~~~~~~~~~~~~
288       else
289c        The dust opacity is computed from q
290         call zerophys(ngrid*nlayer*naerkind,aerosol)
291         do iq=1,dustbin
292           do l=1,nlayer
293              do ig=1,ngrid
294cc               qextrhor(iq) is  (3/4)*Qext/(rho*reff)
295cc               It is added 1.e-8 to pq to avoid low
296                 aerosol(ig,l,1)=aerosol(ig,l,1)+
297     &           qextrhor(iq)* (pq(ig,l,iq) + 1.e-8)*
298     &           (pplev(ig,l)-pplev(ig,l+1))/g
299              end do
300           end do
301         end do
302         call zerophys(ngrid,tauref)
303       end if  ! (doubleq)
304      END IF   ! (dust scenario)
305
306c --------------------------------------------------------------------------
307c Column integrated visible optical depth in each point (used for diagnostic)
308c --------------------------------------------------------------------------
309      call zerophys(ngrid*naerkind,tau)
310      do l=1,nlayer
311         do ig=1,ngrid
312               tau(ig,1)=tau(ig,1)+ aerosol(ig,l,1)
313         end do
314      end do
315
316      return
317      end
318
Note: See TracBrowser for help on using the repository browser.