source: trunk/LMDZ.VENUS/libf/phyvenus/nirco2abs.F @ 2198

Last change on this file since 2198 was 2198, checked in by flefevre, 5 years ago

reglages Diogo Quirino & Gabriella Gilli pour la haute atmosphere

File size: 9.5 KB
Line 
1      SUBROUTINE nirco2abs(nlon,nlev,nplay,dist_sol,nq,pq,
2     $     mu0,fract,pdtnirco2)
3
4       use dimphy
5       use geometry_mod, only: longitude_deg, latitude_deg
6       use chemparam_mod, only: i_co2, i_o
7c       use compo_hedin83_mod2
8
9
10       IMPLICIT NONE
11c=======================================================================
12c   subject:
13c   --------
14c   Computing heating rate due to
15c   absorption by CO2 in the near-infrared
16c   This version includes NLTE effects
17c
18c   (Scheme to be described in Forget et al., JGR, 2003)
19c   (old Scheme described in Forget et al., JGR, 1999)
20c
21c   This version updated with a new functional fit,
22c   see NLTE correction-factor of Lopez-Valverde et al (1998)
23c   Stephen Lewis 2000
24c
25c   apr 2019 d.quirino   Improving NLTE params, SOIR/SPICAV Temp comparison
26c   oct 2014 g.gilli     Coupling with photochemical model
27C   jan 2014 g.gilli     Revision (following martian non-lte param)   
28C   jun 2013 l.salmi     First adaptation to Venus and NIR NLTE param
29c   jul 2011 malv+fgg    New corrections for NLTE implemented
30c   08/2002 : correction for bug when running with diurnal=F
31c
32c   author:  Frederic Hourdin 1996
33c   ------
34c            Francois Forget 1999
35c
36c   input:
37c   -----
38c   nlon                 number of gridpoint of horizontal grid
39c   nlev                Number of layer
40c   dist_sol              sun-Venus distance (AU)
41c   mu0(nlon)         
42c   fract(nlon)        day fraction of the time interval
43c   declin                latitude of subslar point
44c
45c   output:
46c   -------
47c
48c   pdtnirco2(nlon,nlev)      Heating rate (K/sec)
49c
50c
51c=======================================================================
52c
53c    0.  Declarations :
54c    ------------------
55c
56
57#include "YOMCST.h"
58#include "clesphys.h"
59c#include "comdiurn.h"
60#include "nirdata.h"
61c#include "tracer.h"
62#include "mmol.h"
63c-----------------------------------------------------------------------
64c    Input/Output
65c    ------------
66      integer,intent(in) :: nlon ! number of (horizontal) grid points
67      integer,intent(in) :: nlev ! number of atmospheric layers
68
69      real,intent(in) :: nplay(nlon,nlev) ! Pressure
70      real,intent(in) :: dist_sol ! Sun-Venus distance (in AU)
71      integer,intent(in) :: nq ! number of tracers
72      real,intent(in) :: pq(nlon,nlev,nq) ! mass mixing ratio tracers
73      real,intent(in) :: mu0(nlon) ! solar angle
74      real,intent(in) :: fract(nlon) ! day fraction of the time interval
75c      real,intent(in) :: declin ! latitude of sub-solar point
76      real :: co2vmr_gcm(nlon,nlev), o3pvmr_gcm(nlon,nlev)
77 
78      real,intent(out) :: pdtnirco2(nlon,nlev) ! heating rate (K/sec)
79
80c
81c    Local variables :
82c    -----------------
83      INTEGER l,ig, n, nstep,i
84      REAL co2heat0, zmu(nlon)
85
86c     special diurnal=F
87      real mu0_int(nlon),fract_int(nlon),zday_int
88      real ztim1,ztim2,ztim3,step
89
90c
91c   local saved variables
92c   ---------------------
93      logical,save :: firstcall=.true.
94      integer,save :: ico2=0 ! index of "co2" tracer
95      integer,save :: io=0 ! index of "o" tracer
96
97cccc     parameters for CO2 heating fit
98c
99c     n_a  =  heating rate for Venusian day at p0, r0, mu =0 [K day-1]
100c     Here p0 = p_cloud top [Pa]
101c     n_p0 = is a pressure below which non LTE effects are significant [Pa]
102c     n_a Solar heating [K/Eday] at the cloud top, taken from Crisps table     
103 
104      real n_a, n_p0, n_b, p_ctop
105
106   
107cc "Nominal" values used in Gilli+2'17
108c       parameter (n_a = 18.13/86400.0)     !c     K/Eday  ---> K/sec   
109c       parameter (p_ctop=13.2e2)
110c       parameter (n_p0=0.008)
111
112cc "New" values used to improve SPICAV/SOIR Temperature comparision (D.Quirino)
113       parameter (n_a = 15.92/86400.0)     !c     K/Eday  ---> K/sec   
114       parameter (p_ctop=19.85e2)
115       parameter (n_p0=0.1) 
116       parameter (n_b=1.362)
117
118c    -- NLTE Param v2  --
119C       parameter (n_p0=0.01) 
120c       parameter (n_b = 1.3)
121   
122
123c     Variables added to implement NLTE correction factor (feb 2011)
124      real    pyy(nlev)
125      real    cor1(nlev),oldoco2(nlev),alfa2(nlev)
126      real    p2011,cociente1,merge
127      real    cor0,oco2gcm
128!!!!
129c      real :: pic27(nlon,nlev), pic27b(nlon,nlev)
130c      real :: pic43(nlon,nlev), picnir(nlon,nlev)
131
132c     co2heat is the heating by CO2 at p_ctop=13.2e2 for a zero zenithal angle.
133
134      co2heat0=n_a*(0.72/dist_sol)**2     
135
136CCCCCC   TEST: reduce by X% nir Heating
137c      co2heat0  = co2heat0 * 0.8
138
139c----------------------------------------------------------------------
140     
141c     Initialisation
142c     --------------
143      if (firstcall) then
144        if (nircorr.eq.1) then
145c          ! we will need co2 and o tracers
146          ico2= i_co2
147          if (ico2==0) then
148            write(*,*) "nirco2abs error: I need a CO2 tracer"
149            write(*,*) "     when running with nircorr==1"
150           stop
151          endif
152          io=i_o
153          if (io==0) then
154            write(*,*) "nirco2abs error: I need an O tracer"
155            write(*,*) "     when running with nircorr==1"
156            stop
157          endif
158        endif
159        firstcall=.false.
160      endif
161
162     
163c     
164c     Simple calcul for a given sun incident angle (if cycle_diurne=T)
165c     --------------------------------------------
166
167      IF (cycle_diurne) THEN 
168
169         do ig=1,nlon   
170            zmu(ig)=sqrt(1224.*mu0(ig)*mu0(ig)+1.)/35.
171
172           
173            if(nircorr.eq.1) then
174               do l=1,nlev
175                  pyy(l)=nplay(ig,l)
176               enddo
177
178               call interpnir(cor1,pyy,nlev,corgcm,pres1d,npres)
179               call interpnir(oldoco2,pyy,nlev,oco21d,pres1d,npres)
180               call interpnir(alfa2,pyy,nlev,alfa,pres1d,npres)
181               
182            endif
183
184            do l=1,nlev
185     
186c           Calculations for the O/CO2 correction
187               if(nircorr.eq.1) then
188                  cor0=1./(1.+n_p0/nplay(ig,l))**n_b
189                  if(pq(ig,l,ico2) .gt. 1.e-6) then
190                     oco2gcm=pq(ig,l,io)/pq(ig,l,ico2)
191
192                  else
193                     oco2gcm=1.e6
194                  endif
195                  cociente1=oco2gcm/oldoco2(l)
196                 
197c                  WRITE(*,*) "nirco2abs line 211", l, cociente1
198
199                  merge=alog10(cociente1)*alfa2(l)+alog10(cor0)*
200     $                 (1.-alfa2(l))
201                  merge=10**merge
202                  p2011=sqrt(merge)*cor0
203
204               else if (nircorr.eq.0) then
205                  p2011=1.
206                  cor1(l)=1.
207               endif
208
209              if(fract(ig).gt.0.) pdtnirco2(ig,l)=
210     &             co2heat0*sqrt((p_ctop*zmu(ig))/nplay(ig,l))
211     &             /(1.+n_p0/nplay(ig,l))**n_b
212c           Corrections from tabulation
213     $              * cor1(l) * p2011
214             
215          enddo
216         enddo
217         
218c     Averaging over diurnal cycle (if diurnal=F)
219c     -------------------------------------------
220c     NIR CO2 abs is slightly non linear. To remove the diurnal
221c     cycle, it is better to average the heating rate over 1 day rather
222c     than using the mean mu0 computed by mucorr in physiq.F (FF, 1998)
223
224      ELSE      ! if (.not.diurnal) then
225         nstep = 20    ! number of integration step /sol
226         do n=1,nstep
227
228            zday_int = (n-1)/float(nstep)
229
230            CALL zenang(0.,zday_int,RDAY/nstep,
231     &                  latitude_deg,longitude_deg,
232     &                  mu0_int,fract_int)
233
234            do ig=1,nlon
235               zmu(ig)=sqrt(1224.*mu0_int(ig)*mu0_int(ig)+1.)/35.
236
237               if(nircorr.eq.1) then
238                  do l=1,nlev
239                     pyy(l)=nplay(ig,l)
240                  enddo
241                 call interpnir(cor1,pyy,nlev,corgcm,pres1d,npres)
242                 call interpnir(oldoco2,pyy,nlev,oco21d,pres1d,npres)
243                 call interpnir(alfa2,pyy,nlev,alfa,pres1d,npres)
244               endif
245c
246
247               do l=1,nlev
248c           Calculations for the O/CO2 correction
249               if(nircorr.eq.1) then
250                  cor0=1./(1.+n_p0/nplay(ig,l))**n_b
251                  oco2gcm=pq(ig,l,io)/pq(ig,l,ico2)
252                  cociente1=oco2gcm/oldoco2(l)
253                  merge=alog10(cociente1)*alfa2(l)+alog10(cor0)*
254     $                 (1.-alfa2(l))
255                  merge=10**merge
256                  p2011=sqrt(merge)*cor0
257
258               else if (nircorr.eq.0) then
259                  p2011=1.
260                  cor1(l)=1.
261               endif
262
263               if(fract_int(ig).gt.0.) pdtnirco2(ig,l)=
264     &              pdtnirco2(ig,l) + (1/float(nstep))*
265     &              co2heat0*sqrt((p_ctop*zmu(ig))/nplay(ig,l))
266     &              /(1.+n_p0/nplay(ig,l))**n_b
267!     Corrections from tabulation
268     $              * cor1(l) * p2011
269
270               enddo
271            enddo
272         end do
273     
274
275      END IF 
276
277      return
278      end
279
280     
281      subroutine interpnir(escout,p,nlev,escin,pin,nl)
282C
283C subroutine to perform linear interpolation in pressure from 1D profile
284C escin(nl) sampled on pressure grid pin(nl) to profile
285C escout(nlev) on pressure grid p(nlev).
286C
287      real escout(nlev),p(nlev)
288      real escin(nl),pin(nl),wm,wp
289      integer nl,nlev,n1,n,nm,np
290      do n1=1,nlev
291         if(p(n1) .gt. 1500. .or. p(n1) .lt. 1.0e-13) then
292c            escout(n1) = 0.0
293            escout(n1) = 1.e-15
294         else
295            do n = 1,nl-1
296               if (p(n1).le.pin(n).and.p(n1).ge.pin(n+1)) then
297                  nm=n
298                  np=n+1
299                  wm=abs(pin(np)-p(n1))/(pin(nm)-pin(np))
300                  wp=1.0 - wm
301               endif
302            enddo
303            escout(n1) = escin(nm)*wm + escin(np)*wp
304         endif
305      enddo
306      return
307      end
Note: See TracBrowser for help on using the repository browser.