source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/calc_rayleigh.F90 @ 298

Last change on this file since 298 was 298, checked in by milmd, 10 years ago

Less output messages are written. On 20000 cores it is better. In LMDZ, only master of MPI and OpenMP can write.

File size: 5.8 KB
Line 
1      subroutine calc_rayleigh
2
3!==================================================================
4!     
5!     Purpose
6!     -------
7!     Average the Rayleigh scattering in each band, weighting the
8!     average by the blackbody function at temperature tstellar.
9!     Works for an arbitrary mix of gases (currently CO2, N2 and
10!     H2 are possible).
11!     
12!     Authors
13!     -------
14!     Robin Wordsworth (2010)
15!     Jeremy Leconte (2012): Added option for variable gas. Improved water rayleigh (Bucholtz 1995).
16!
17!     Called by
18!     ---------
19!     setspv.F
20!     
21!     Calls
22!     -----
23!     none
24!     
25!==================================================================
26
27      use radinc_h, only: L_NSPECTV
28      use radcommon_h, only: WAVEV, BWNV, DWNV, tstellar, tauray, taurayvar, scalep
29      use gases_h
30      use mod_phys_lmdz_para, only : is_master
31
32      implicit none
33
34#include "comcstfi.h"
35#include "callkeys.h"
36
37      real*8 wl
38      integer N,Nfine,ifine,igas
39      parameter(Nfine=500.0)
40      real*8 :: P0 = 9.423D+6   ! Rayleigh scattering reference pressure in pascals.   
41
42      logical typeknown
43      real*8 tauvar,tauvarvar,tausum,tausumvar,tauwei,tauweivar,bwidth,bstart
44      double precision df
45
46      real*8 tauconsti(ngasmx)
47      real*8 tauvari(ngasmx)
48
49      integer icantbewrong
50
51      ! tau0/p0=tau/p (Hansen 1974)
52      ! Then calculate tau0 = (8*pi^3*p_1atm)/(3*N0^2) * 4*delta^2/(g*mugaz*lambda^4)
53      ! where delta=n-1 and N0 is an amagat
54
55      typeknown=.false.
56      do igas=1,ngasmx
57         if(igas.eq.vgas)then
58            if (is_master) print*,'variable gas is ',trim(gnom(igas)),' in Rayleigh scattering '
59         endif
60         if((igas/=vgas).and.(gfrac(igas).lt.5.e-2))then
61            if (is_master) print*,'Ignoring ',trim(gnom(igas)),' in Rayleigh scattering '// &
62            'as its mixing ratio is less than 0.05.' 
63            ! ignore variable gas in Rayleigh calculation
64            ! ignore gases of mixing ratio < 0.05 in Rayleigh calculation
65            tauconsti(igas) = 0.0
66         else
67            if(igas.eq.igas_CO2) then
68               tauconsti(igas) = (8.7/g)*1.527*scalep/P0
69            elseif(igas.eq.igas_N2)then
70               tauconsti(igas) = (9.81/g)*8.569E-3*scalep/(P0/93.0)
71            elseif(igas.eq.igas_H2O)then
72!               tauconsti(igas) = (10.0/g)*9.22E-3*scalep/101325.0
73               tauconsti(igas) = 1.98017E-10/(g*mugaz*100.) 
74            elseif(igas.eq.igas_H2)then
75               tauconsti(igas) = (10.0/g)*0.0241*scalep/101325.0
76               !tauconsti(igas) = (10.0/g)*0.0487*scalep/(101325.0)
77               ! uses n=1.000132 from Optics, Fourth Edition.
78               ! was out by a factor 2!
79            elseif(igas.eq.igas_He)then
80               tauconsti(igas) = (10.0/g)*0.00086*scalep/101325.0
81            else
82               print*,'Error in calc_rayleigh: Gas species not recognised!'
83               call abort
84            endif
85
86            if((gfrac(igas).eq.1.0).and.(vgas.eq.0))then
87               if (is_master) print*,'Rayleigh scattering is for a pure ',trim(gnom(igas)),' atmosphere.'
88               typeknown=.true.
89            endif
90
91         endif
92      enddo
93
94      if(.not.typeknown)then
95         if (is_master) print*,'Rayleigh scattering is for a mixed gas atmosphere.'
96         typeknown=.true.
97      endif
98
99 
100      do N=1,L_NSPECTV
101         
102         tausum = 0.0
103         tauwei = 0.0
104         tausumvar = 0.0
105         tauweivar = 0.0
106         bstart = 10000.0/BWNV(N+1)
107         bwidth = (10000.0/BWNV(N)) - (10000.0/BWNV(N+1))
108         do ifine=1,Nfine
109            wl=bstart+dble(ifine)*bwidth/Nfine
110
111            tauvar=0.0
112            tauvarvar=0.0
113            do igas=1,ngasmx
114               if((igas/=vgas).and.(gfrac(igas).lt.5.e-2))then
115                  ! ignore variable gas in Rayleigh calculation
116                  ! ignore gases of mixing ratio < 0.05 in Rayleigh calculation
117                  tauvari(igas)   = 0.0
118               else
119                  if(igas.eq.igas_CO2)then
120                     tauvari(igas) = (1.0+0.013/wl**2)/wl**4
121                  elseif(igas.eq.igas_N2)then
122                     tauvari(igas) = (1.0+0.0113/wl**2+0.00013/wl**4)/wl**4
123                  elseif(igas.eq.igas_H2O)then
124!                     tauvari(igas) = 1.0/wl**4 ! to be improved...
125                     tauvari(igas) = (5.7918E6/(2.38E2-1/wl**2)+1.679E5/(57.36E0-1/wl**2))**2/wl**4 
126                  elseif(igas.eq.igas_H2)then
127                     tauvari(igas) = 1.0/wl**4 
128                  elseif(igas.eq.igas_He)then
129                     tauvari(igas) = 1.0/wl**4 
130                  else
131                     print*,'Error in calc_rayleigh: Gas species not recognised!'
132                     call abort
133                  endif
134               endif
135
136               if(igas.eq.vgas) then
137                  tauvarvar=tauvarvar+tauconsti(igas)*tauvari(igas)
138                  tauvar=tauvar+0.0*0.0*gfrac(igas)
139               else
140                  tauvar=tauvar+tauconsti(igas)*tauvari(igas)*gfrac(igas)
141               endif
142
143            enddo
144
145            call blackl(dble(wl*1e-6),dble(tstellar),df)
146            df=df*bwidth/Nfine
147            tauwei=tauwei+df
148            tausum=tausum+tauvar*df
149            tauweivar=tauweivar+df
150            tausumvar=tausumvar+tauvarvar*df
151         
152         enddo
153         TAURAY(N)=tausum/tauwei
154         TAURAYVAR(N)=tausumvar/tauweivar
155         ! we multiply by scalep here (100) because plev, which is used in optcv,
156         ! is in units of mBar, so we need to convert.
157
158      end do
159
160      IF (L_NSPECTV > 6) THEN
161        icantbewrong = L_NSPECTV-6
162        if (is_master) print*,'At 1 atm and lambda = ',WAVEV(icantbewrong),' um'
163        if (is_master) print*,'tau_R = ',TAURAY(icantbewrong)*1013.25
164        if (is_master) print*,'sig_R = ',TAURAY(icantbewrong)*g*mugaz*1.67e-27*100, &
165               'cm^2 molecule^-1'
166      ENDIF
167
168    end subroutine calc_rayleigh
Note: See TracBrowser for help on using the repository browser.