source: trunk/LMDZ.PLUTO/libf/phypluto/optcv_pluto_mod.F90 @ 3686

Last change on this file since 3686 was 3686, checked in by debatzbr, 9 months ago

Minor corrections for the opacity calculation
BBT

File size: 9.0 KB
Line 
1MODULE optcv_pluto_mod
2
3IMPLICIT NONE
4
5CONTAINS
6
7SUBROUTINE OPTCV_pluto(DTAUV,TAUV,TAUCUMV,PLEV,  &
8      QXVAER,QSVAER,GVAER,WBARV,COSBV,      &
9      TAURAY,TAUAERO,TMID,PMID,TAUGSURF,QVAR)
10
11  use radinc_h, only: L_NLAYRAD, L_NLEVRAD, L_LEVELS, L_NSPECTV, L_NGAUSS, L_REFVAR, NAERKIND
12  use radcommon_h, only: gasv, tlimit, wrefVAR, Cmk, tgasref, pfgasref,wnov,scalep,indv,glat_ig
13  use gases_h, only: gfrac, ngasmx, igas_H2, igas_H2O, igas_He, igas_N2, &
14                     igas_CH4, igas_N2
15  use comcstfi_mod, only: g, r, mugaz
16  use callkeys_mod, only: kastprof,continuum,graybody,callgasvis
17  use recombin_corrk_mod, only: corrk_recombin, gasv_recomb
18  use tpindex_mod, only: tpindex
19
20      implicit none
21
22!==================================================================
23!
24!     Purpose
25!     -------
26!     Calculates shortwave optical constants at each level.
27!
28!     Authors
29!     -------
30!     Adapted from the NASA Ames code by R. Wordsworth (2009)
31!
32!==================================================================
33
34
35
36!     THIS SUBROUTINE SETS THE OPTICAL CONSTANTS IN THE VISUAL
37!     IT CALCUALTES FOR EACH LAYER, FOR EACH SPECRAL INTERVAL IN THE VISUAL
38!     LAYER: WBAR, DTAU, COSBAR
39!     LEVEL: TAU
40!
41!     TAUV(L,NW,NG) is the cumulative optical depth at the top of radiation code
42!     layer L. NW is spectral wavelength interval, ng the Gauss point index.
43!
44!     TLEV(L) - Temperature at the layer boundary
45!     PLEV(L) - Pressure at the layer boundary (i.e. level)
46!     GASV(NT,NPS,NW,NG) - Visual CO2 k-coefficients
47!
48!----------------------------------------------------------------------C
49
50
51      real*8 DTAUV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
52      real*8 DTAUKV(L_LEVELS,L_NSPECTV,L_NGAUSS)
53      real*8 TAUV(L_NLEVRAD,L_NSPECTV,L_NGAUSS)
54      real*8 TAUCUMV(L_LEVELS,L_NSPECTV,L_NGAUSS)
55      real*8 PLEV(L_LEVELS)
56      real*8 TMID(L_LEVELS), PMID(L_LEVELS)
57      real*8 COSBV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
58      real*8 WBARV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
59
60!     For aerosols
61      real*8 QXVAER(L_LEVELS,L_NSPECTV,NAERKIND)
62      real*8 QSVAER(L_LEVELS,L_NSPECTV,NAERKIND)
63      real*8 GVAER(L_LEVELS,L_NSPECTV,NAERKIND)
64      real*8 TAUAERO(L_LEVELS,NAERKIND)
65      real*8 TAUAEROLK(L_LEVELS,L_NSPECTV,NAERKIND)
66      real*8 TAEROS(L_LEVELS,L_NSPECTV,NAERKIND)
67
68      integer L, NW, NG, K, NG1(L_NSPECTV), LK, IAER
69      integer MT(L_LEVELS), MP(L_LEVELS), NP(L_LEVELS)
70      real*8  ANS, TAUGAS
71      real*8 TAURAY(L_NSPECTV)
72      real*8  TRAY(L_LEVELS,L_NSPECTV)
73      real*8  DPR(L_LEVELS), U(L_LEVELS)
74      real*8  LCOEF(4), LKCOEF(L_LEVELS,4)
75
76      real*8 taugsurf(L_NSPECTV,L_NGAUSS-1), TRAYAER
77
78
79
80
81
82!     mixing ratio variables
83      real*8 QVAR(L_LEVELS), WRATIO(L_LEVELS)
84      real*8 KCOEF(4)
85      integer NVAR(L_LEVELS)
86
87  ! temporary variables for multiple aerosol calculation
88  real*8 atemp(L_NLAYRAD,L_NSPECTV)
89  real*8 btemp(L_NLAYRAD,L_NSPECTV)
90  real*8 ctemp(L_NLAYRAD,L_NSPECTV)
91
92!     variables for k in units m^-1
93      real*8 rho, dz
94
95!=======================================================================
96!     Determine the total gas opacity throughout the column, for each
97!     spectral interval, NW, and each Gauss point, NG.
98!     Calculate the continuum opacities, i.e., those that do not depend on
99!     NG, the Gauss index.
100
101taugsurf(:,:) = 0.0
102
103  do K=2,L_LEVELS
104         DPR(K) = PLEV(K)-PLEV(K-1)
105
106
107!         rho  = PLEV(K)/(R*TMID(K))
108         rho  = PMID(K)/(R*TMID(K))
109         dz   = -DPR(k)/(g*rho)
110
111         U(k)   = Cmk*DPR(k)
112
113
114
115
116         call tpindex(PMID(K),TMID(K),QVAR(K),pfgasref,tgasref,WREFVAR, &
117             LCOEF,MT(K),MP(K),NVAR(K),WRATIO(K))
118
119         do LK=1,4
120            LKCOEF(K,LK) = LCOEF(LK)
121         end do
122  end do                    ! levels
123
124  ! Spectral dependance of aerosol absorption
125  do iaer=1,naerkind
126     do NW=1,L_NSPECTV
127        do K=2,L_LEVELS
128           TAEROS(K,NW,IAER) = TAUAERO(K,IAER) * QXVAER(K,NW,IAER)
129        end do
130     end do
131  end do
132
133  ! Rayleigh scattering
134  do NW=1,L_NSPECTV
135     do K=2,L_LEVELS
136        TRAY(K,NW)   = TAURAY(NW) * DPR(K)
137     end do
138  end do
139
140  ! We ignore K = 1... Hope this is ok...
141  do K=2,L_LEVELS
142
143     ! JL18: It seems to be good to have aerosols in the first "radiative layer" of the gcm in the IR
144     ! but visible does not handle very well diffusion in first layer.
145     ! This solves random variations of the sw heating at the model top.
146     if (K < 3) TAEROS(K,:,:) = 0.0
147
148     do NW=1,L_NSPECTV
149
150        TRAYAER = TRAY(K,NW)
151        !     TRAYAER is Tau RAYleigh scattering, plus AERosol opacity
152        do iaer=1,naerkind
153           TRAYAER = TRAYAER + TAEROS(K,NW,IAER)
154        end do
155
156        do NG=1,L_NGAUSS-1
157
158           ! Now compute TAUGAS
159
160           ! Interpolate between water mixing ratios
161           ! WRATIO = 0.0 if the requested water amount is equal to, or outside the
162           ! the water data range
163
164           if (L_REFVAR.eq.1)then ! added by RW for special no variable case
165
166                  KCOEF(1) = GASV(MT(K),MP(K),1,NW,NG)
167                  KCOEF(2) = GASV(MT(K),MP(K)+1,1,NW,NG)
168                  KCOEF(3) = GASV(MT(K)+1,MP(K)+1,1,NW,NG)
169                  KCOEF(4) = GASV(MT(K)+1,MP(K),1,NW,NG)
170
171           else
172
173               KCOEF(1) = GASV(MT(K),MP(K),NVAR(K),NW,NG) + WRATIO(K)*  &
174                   (GASV(MT(K),MP(K),NVAR(K)+1,NW,NG) -                 &
175                   GASV(MT(K),MP(K),NVAR(K),NW,NG))
176
177               KCOEF(2) = GASV(MT(K),MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)* &
178                   (GASV(MT(K),MP(K)+1,NVAR(K)+1,NW,NG) -                &
179                   GASV(MT(K),MP(K)+1,NVAR(K),NW,NG))
180
181             KCOEF(3) = GASV(MT(K)+1,MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)* &
182                   (GASV(MT(K)+1,MP(K)+1,NVAR(K)+1,NW,NG) -  &
183                   GASV(MT(K)+1,MP(K)+1,NVAR(K),NW,NG))
184
185               KCOEF(4) = GASV(MT(K)+1,MP(K),NVAR(K),NW,NG) + WRATIO(K)* &
186                   (GASV(MT(K)+1,MP(K),NVAR(K)+1,NW,NG) -  &
187                   GASV(MT(K)+1,MP(K),NVAR(K),NW,NG))
188           endif
189
190!     Interpolate the gaseous k-coefficients to the requested T,P values
191
192           ANS = LKCOEF(K,1)*KCOEF(1) + LKCOEF(K,2)*KCOEF(2) + &
193                   LKCOEF(K,3)*KCOEF(3) + LKCOEF(K,4)*KCOEF(4)
194
195           TAUGAS          = U(k)*ANS
196
197           TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS
198           DTAUKV(K,nw,ng) = TAUGAS + TRAYAER
199!               write(21,*) 'TB17 taugas',K,NW,ng,TAUGAS
200
201
202        end do
203
204
205!     Now fill in the "clear" part of the spectrum (NG = L_NGAUSS),
206!     which holds continuum opacity only
207
208        NG = L_NGAUSS
209        DTAUKV(K,nw,ng) = TRAYAER ! Scattering
210
211     end do
212  end do
213
214!=======================================================================
215!     Now the full treatment for the layers, where besides the opacity
216!     we need to calculate the scattering albedo and asymmetry factors
217      !TAUAEROLK(:,:,:) = 1.e-20 ! TB17
218
219  do iaer=1,naerkind
220    DO NW=1,L_NSPECTV
221      DO K=2,L_LEVELS
222           TAUAEROLK(K,NW,IAER) = TAUAERO(K,IAER) * QSVAER(K,NW,IAER) ! effect of scattering albedo
223           !TAUAEROLK(K,NW,IAER) = max(TAUAEROLK(K,NW,IAER),1.e-20) ! TB17
224      end do
225    ENDDO
226  ENDDO
227  !print*, 'TBbug  TAUAEROLK =', TAUAEROLK
228
229  DO NW=1,L_NSPECTV
230     DO L=1,L_NLAYRAD-1
231        K              = 2*L+1
232        atemp(L,NW) = SUM(GVAER(K,NW,1:naerkind) * TAUAEROLK(K,NW,1:naerkind))+SUM(GVAER(K+1,NW,1:naerkind) * TAUAEROLK(K+1,NW,1:naerkind))
233        btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind)) + SUM(TAUAEROLK(K+1,NW,1:naerkind))
234        ctemp(L,NW) = btemp(L,NW) + 0.9999*(TRAY(K,NW) + TRAY(K+1,NW))  ! JVO 2017 : does this 0.999 is really meaningful ?
235        btemp(L,NW) = btemp(L,NW) + TRAY(K,NW) + TRAY(K+1,NW)
236        COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
237     END DO ! L vertical loop
238
239     ! Last level
240     L           = L_NLAYRAD
241     K           = 2*L+1
242     atemp(L,NW) = SUM(GVAER(K,NW,1:naerkind) * TAUAEROLK(K,NW,1:naerkind))
243     btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind))
244     ctemp(L,NW) = btemp(L,NW) + 0.9999*TRAY(K,NW) ! JVO 2017 : does this 0.999 is really meaningful ?
245     btemp(L,NW) = btemp(L,NW) + TRAY(K,NW)
246     COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
247
248
249  END DO                    ! NW spectral loop
250
251  DO NG=1,L_NGAUSS
252    DO NW=1,L_NSPECTV
253     DO L=1,L_NLAYRAD-1
254
255        K              = 2*L+1
256        DTAUV(L,nw,ng) = DTAUKV(K,NW,NG) + DTAUKV(K+1,NW,NG)
257        WBARV(L,nw,ng) = ctemp(L,NW) / DTAUV(L,nw,ng)
258
259      END DO ! L vertical loop
260
261        ! Last level
262        L              = L_NLAYRAD
263        K              = 2*L+1
264             DTAUV(L,nw,ng) = DTAUKV(K,NW,NG)
265
266        WBARV(L,NW,NG) = ctemp(L,NW) / DTAUV(L,NW,NG)
267     END DO ! NW spectral loop
268  END DO ! NG Gauss loop
269
270  ! Total extinction optical depths
271  DO NG=1,L_NGAUSS ! full gauss loop
272     DO NW=1,L_NSPECTV
273        TAUV(1,NW,NG)=0.0D0
274        TAUCUMV(1,NW,NG)=0.0D0
275       
276        DO L=1,L_NLAYRAD
277           TAUV(L+1,NW,NG)=TAUV(L,NW,NG)+DTAUV(L,NW,NG)
278        END DO
279
280        DO K=2,L_LEVELS
281           TAUCUMV(K,NW,NG)=TAUCUMV(K-1,NW,NG)+DTAUKV(K,NW,NG)
282        END DO
283     END DO
284  END DO ! end full gauss loop
285
286  return
287
288end subroutine optcv_pluto
289
290END MODULE optcv_pluto_mod
Note: See TracBrowser for help on using the repository browser.