source: trunk/LMDZ.VENUS/libf/phyvenus/sw_venus_dc.F @ 1396

Last change on this file since 1396 was 1310, checked in by slebonnois, 11 years ago

SL: VENUS VERTICAL EXTENSION. NLTE and thermospheric processes, to be run with 78 levels and specific inputs.

File size: 7.2 KB
Line 
1      SUBROUTINE SW_venus_dc(PRMU0, PFRAC,
2     S              PPB, pt,
3     S              PHEAT,
4     S              PTOPSW,PSOLSW,ZFSNET)
5     
6      use dimphy
7      use cpdet_mod, only: cpdet
8      IMPLICIT none
9
10#include "dimensions.h"
11#include "YOMCST.h"
12C
13C     ------------------------------------------------------------------
14C
15C     PURPOSE.
16C     --------
17C
18c      this routine loads and interpolates the shortwave radiation
19c     fluxes taken from Dave Crisp calculations for Venus.
20c     Ref: Crisp 1986.
21C
22C     AUTHOR.
23C     -------
24C        Sebastien Lebonnois
25C
26C     MODIFICATIONS.
27C     --------------
28C        ORIGINAL : 27/07/2005
29c        L.Salmi  : june 2013 astuce to reduce the excess of  NIR
30c                   in the transition region LTE/LTE
31c
32c        G.Gilli  : feb  2014         
33C     ------------------------------------------------------------------
34C
35C* ARGUMENTS:
36C
37c inputs
38
39      REAL   PRMU0  ! COSINE OF ZENITHAL ANGLE
40      REAL   PFRAC  ! fraction de la journee
41      REAL   PPB(klev+1)  ! inter-couches PRESSURE (bar)
42      REAL   pt(klev)     ! mid-layer temperature
43C
44c output
45
46      REAL   PHEAT(klev)  ! SHORTWAVE HEATING (K/s) within each layer
47      REAL   PTOPSW       ! SHORTWAVE FLUX AT T.O.A. (net)
48      REAL   PSOLSW       ! SHORTWAVE FLUX AT SURFACE (net)
49      REAL   ZFSNET(klev+1) ! net solar flux at ppb levels
50
51C
52C* LOCAL VARIABLES:
53C
54      integer nldc,nszadc
55      parameter (nldc=49)  ! fichiers Crisp
56      parameter (nszadc=8) ! fichiers Crisp
57     
58      integer i,j,nsza,nsza0,nl0
59      real   solarrate               ! solar heating rate (K/earthday)
60      real   zsnet(nldc+1,nszadc)    ! net solar flux (W/m**2) (+ vers bas)
61      real   zsdn,zsup               ! downward/upward solar flux (W/m**2)
62      real   solza(nszadc)           ! solar zenith angles in table
63      real   presdc(nldc+1)          ! pressure levels in table (bar)
64      real   tempdc(nldc+1)          ! temperature in table (K)
65      real   altdc(nldc+1)           ! altitude in table (km)
66      real   coolrate                ! IR heating rate (K/earthday) ?
67      real   totalrate               ! total rate (K/earthday)
68      real   zldn                    ! downward IR flux (W/m**2) ?
69      real   zlup                    !   upward IR flux (W/m**2) ?
70      real   zsolnet(nldc+1)         ! for testing mean net solar flux in DC
71      character*22 nullchar
72      real   sza0,factsza,factflux
73      logical firstcall
74      data    firstcall/.true./
75      REAL,save,allocatable :: zsolVE(:) ! net solar flux at ppb levels, fichiers VE
76      save   solza,zsnet,presdc,tempdc,altdc
77      save   firstcall
78     
79c ------------------------
80c Loading the file
81c ------------------------
82
83      if (firstcall) then
84       allocate(zsolVE(klevp1))
85
86       open(11,file='dataDCrisp.dat')
87       read(11,*) nullchar
88     
89       do nsza=1,nszadc
90        read(11,*) nullchar
91        read(11,*) nullchar
92        read(11,*) nullchar
93        read(11,'(22x,F11.5)') solza(nsza)
94        read(11,*) nullchar
95        read(11,*) nullchar
96        read(11,*) nullchar
97        read(11,'(3(2x,F10.4),36x,4(2x,F11.5))')
98     .          presdc(nldc+1),tempdc(nldc+1), altdc(nldc+1),
99     .          zsdn,zsup,zldn,zlup
100        zsnet(nldc+1,nsza)=zsdn-zsup
101        do i=1,nldc
102           j = nldc+1-i        ! changing: vectors from surface to top
103           read(11,'(6(2x,F10.4),4(2x,F11.5))')
104     .          presdc(j),tempdc(j),altdc(j),
105     .          solarrate,coolrate,totalrate,
106     .          zsdn,zsup,zldn,zlup
107           zsnet(j,nsza)=zsdn-zsup
108        enddo
109       enddo
110
111       close(11)
112
113c ----------- TEST ------------
114c      Fichiers de Vincent
115c -----------------------------
116c      open(12,file='flux_vis_dcGCM.txt')
117c      read(12,*) nullchar
118c
119c       do j=1,klev+1
120c          read(12,*) zlup,zldn,zsolVE(j)
121c       enddo
122c       
123c      close(12)
124c -----------------------------
125c --------  FIN TEST ----------
126     
127       firstcall=.false.
128      endif
129
130c ----------- TEST ------------
131c      Moyenne planetaire
132c -----------------------------
133c     do j=1,nldc
134c  ---
135c       zsolnet(j) = zsnet(j,1)*0.5*
136c    .             sin(solza(1)*RPI/180.)*solza(2)*RPI/180./2.
137c       do nsza=2,nszadc-1
138c       zsolnet(j) = zsolnet(j)+zsnet(j,nsza)*0.5*
139c    .             sin(solza(nsza)*RPI/180.)*
140c    .             (solza(nsza+1)-solza(nsza-1))*RPI/180./2.
141c       enddo
142c       zsolnet(j) = zsolnet(j)+zsdn(j,nszadc)*0.5*
143c    .             sin(solza(nszadc)*RPI/180.)*
144c    .             (90.-solza(nszadc-1))*RPI/180./2.
145c  ---
146c       zsolnet(j) = 0.0
147c       do nsza=1,nszadc-1
148c       zsolnet(j) = zsolnet(j)+(zsnet(j,nsza  )
149c    .                          +zsnet(j,nsza+1))*0.5*
150c    .             (cos(solza(nsza  )*RPI/180.)-
151c    .              cos(solza(nsza+1)*RPI/180.) )
152c       enddo
153c       zsolnet(j) = zsolnet(j)+zsnet(j,nszadc)*0.25*
154c      .             cos(solza(nszadc)*RPI/180.)
155c  ---
156c       print*,j,altdc(j),zsolnet(j)
157c     enddo
158c     stop
159c -----------------------------
160c --------  FIN TEST ----------
161
162c --------------------------------------
163c Interpolation in the GCM vertical grid
164c --------------------------------------
165
166c Zenith angle
167c ------------
168     
169      sza0 = acos(PRMU0)/3.1416*180.
170c        print*,'Angle Zenithal =',sza0,' PFRAC=',PFRAC
171
172      do nsza=1,nszadc
173         if (solza(nsza).le.sza0) then
174              nsza0 = nsza+1
175         endif
176      enddo
177     
178      if (nsza0.ne.nszadc+1) then
179          factsza = (sza0-solza(nsza0-1))/(solza(nsza0)-solza(nsza0-1))
180      else
181          factsza = min((sza0-solza(nszadc))/(90.-solza(nszadc)), 1.)
182      endif
183
184c Pressure levels
185c ---------------
186
187      do j=1,klev+1
188        nl0 = 2
189        do i=1,nldc
190           if (presdc(i).ge.PPB(j)) then
191                nl0 = i+1
192           endif
193        enddo
194       
195        factflux = (log10(max(PPB(j),presdc(nldc+1)))
196     .                          -log10(presdc(nl0-1)))
197     .            /(log10(presdc(nl0))-log10(presdc(nl0-1)))
198c       factflux = (max(PPB(j),presdc(nldc+1))-presdc(nl0-1))
199c    .            /(presdc(nl0)-presdc(nl0-1))
200        if (nsza0.ne.nszadc+1) then
201          ZFSNET(j) =  factflux   *  factsza   *zsnet(nl0,nsza0)
202     .             +   factflux   *(1.-factsza)*zsnet(nl0,nsza0-1)
203     .             + (1.-factflux)*  factsza   *zsnet(nl0-1,nsza0)
204     .             + (1.-factflux)*(1.-factsza)*zsnet(nl0-1,nsza0-1)
205        else
206          ZFSNET(j) =  factflux   *(1.-factsza)*zsnet(nl0,nsza0-1)
207     .             + (1.-factflux)*(1.-factsza)*zsnet(nl0-1,nsza0-1)
208        endif
209       
210        ZFSNET(j) = ZFSNET(j)*PFRAC
211
212      enddo
213
214c ----------- TEST ------------
215c      Fichiers de Vincent
216c -----------------------------
217c     do j=1,klev+1
218c       ZFSNET(j)=zsolVE(j)
219c     enddo
220c -----------------------------
221c --------  FIN TEST ----------
222
223      PTOPSW = ZFSNET(klev+1)
224      PSOLSW = ZFSNET(1)
225     
226c Heating rates
227c -------------
228c On utilise le gradient du flux pour calculer le taux de chauffage:
229c   heat(K/s) = d(fluxnet)  (W/m2)
230c              *g           (m/s2)
231c              /(-dp)  (epaisseur couche, en Pa=kg/m/s2)
232c              /cp  (J/kg/K)
233
234      do j=1,klev
235! ADAPTATION GCM POUR CP(T)
236        PHEAT(j) = (ZFSNET(j+1)-ZFSNET(j))
237     .            *RG/cpdet(pt(j)) / ((PPB(j)-PPB(j+1))*1.e5)
238      enddo
239
240      return
241      end
242
Note: See TracBrowser for help on using the repository browser.