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

Last change on this file since 894 was 892, checked in by slebonnois, 12 years ago

SL: Important commit ! Adaptation of Venus physics to parallel computation / template for arch on the LMD servers using ifort / documentation for 1D column physics and for parallel computations

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