C path: /stormrc1/aer_lblrtm/src/SCCS/s.solar.f
C revision: 5.4
C created: 06/22/99 16:55:31
C presently: 06/22/99 16:57:26
C
C ----------------------------------------------------------------
C
SUBROUTINE SOLINT(IFILE,LFILE,NPTS,INFLAG,IOTFLG,JULDAT) 1,43
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C LAST MODIFICATION: 1 November 1995
C
C IMPLEMENTATION: P.D. Brown
C
C ALGORITHM REVISIONS: S.A. Clough
C P.D. Brown
C
C
C ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C 840 MEMORIAL DRIVE, CAMBRIDGE, MA 02139
C
C----------------------------------------------------------------------
C
C WORK SUPPORTED BY: THE ARM PROGRAM
C OFFICE OF ENERGY RESEARCH
C DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
PARAMETER (NSOL=2000001)
C
IMPLICIT REAL*8 (V)
C
C ------------------------------------------------------------
C SUBROUTINE SOLINT interpolates solar radiances from the binary
C file SOLAR.RAD. The following are input and output options:
C
C INFLAG = 0 => input transmittance from TAPE12 (default,
C where TAPE12 includes the monochromatic radiance
C and transmittance).
C = 1 => input optical depths from TAPE12 and
C convert to transmittance.
C = 2 => input R1, T1, T2, r1, where
C
C _
C |
C Observer |-O-|
C |
C - \|/ Sun
C /|\ --O--
C | /|\
C | S2,/ /
C | T2/ /
C R1,T1| / |/_ R3
C | / /
C | / /
C r1||/_|/_r3
C Ground ---------------------------
C ///////////////////////////
C
C = 3 => input transmittance from TAPE12 (CHARTS-type
C output)
C
C
C IOTFLG = 0 => attenuate w/transmittance & output (default).
C = 1 => attenuate and add to radiance from TAPE12
C (requires INFLAG = 1).
C = 2 => Calculate solar contribution Rs = S2*T2*r1*T1
C and add to thermal contribution R1.
C
C Output radiance goes to TAPE13.
C
C ------------------------------------------------------------
C
COMMON /MANE/ P0,TEMP0,NLAYER,DDUM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
* AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
* DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
* ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
* EXTID(10)
COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
character*8 XID, HMOLID, YID
real*8 SECANT, XALTZ
c
character*8 XIDS, HMLIDS, YIDS
real*8 SECNTS, XALTZS
c
C
COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
* WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
* EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
COMMON /SLHDR/ XIDS(10),SECNTS,PAVES,TAVES,HMLIDS(60),XALTZS(4),
* WKS(60),PZLS,PZUS,TZLS,TZUS,WBRODS,DVS,V1S,V2S,
* TBONDS,
* EMSIVS,FSCDDS(17),NMOLS,LAYERS,YI1S,YIDS(10),
* LSTWDS
COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
* NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
* NLTEFL,LNFIL4,LNGTH4
COMMON /ARMCM1/ HVRSOL
C
C ----------------------------------------------------------------
C Parameter and common blocks for direct input of emission and
C reflection function values
C
PARAMETER (NMAXCO=4040)
COMMON /EMSFIN/ V1EMIS,V2EMIS,DVEMIS,NLIMEM,ZEMIS(NMAXCO)
COMMON /RFLTIN/ V1RFLT,V2RFLT,DVRFLT,NLIMRF,ZRFLT(NMAXCO)
COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
C ----------------------------------------------------------------
C
DIMENSION XFILHD(2),XSOLHD(2),PNLHDR(2),OPNLHD(2)
DIMENSION A1(0:100),A2(0:100),A3(0:100),A4(0:100)
DIMENSION A1T2(0:100),A2T2(0:100),A3T2(0:100),A4T2(0:100)
DIMENSION A1RF(0:100),A2RF(0:100),A3RF(0:100),A4RF(0:100)
DIMENSION TRAO(2),TRAN(2410)
DIMENSION RADO(2),RADN(2410)
DIMENSION OPTO(2),OPTN(2410)
C
DIMENSION SOLAR(-1:NSOL)
DIMENSION TRAN2(-1:NSOL)
DIMENSION RAD2(-1:NSOL)
DIMENSION XRFLT(-1:NSOL)
DIMENSION SOLRAD(2410)
C
CHARACTER*40 CYID
CHARACTER*8 HVRSOL
C
EQUIVALENCE (XSOLHD(1),XIDS(1))
EQUIVALENCE (XFILHD(1),XID(1)),(PNLHDR(1),V1P),
* (OPNLHD(1),V1PO)
EQUIVALENCE (TRAN(1),TRAO(1)),(RADN(1),RADO(1)),
* (OPTN(1),OPTO(1)),
* (FSCDID(4),IAERSL),(FSCDID(5),IEMIT),
* (FSCDID(6),ISCHDR),(FSCDID(7),IPLOT),
* (FSCDID(8),IPATHL),(FSCDID(12),XSCID),
* (FSCDID(16),LAYR1)
C
C ************************************************************
C ****** THIS PROGRAM DOES MERGE FOR SOLAR RADIANCE AND ******
C ****** TRANMITTANCE USING FOUR POINT INTERPOLATION ******
C ************************************************************
C
C
C ASSIGN SCCS VERSION NUMBER TO MODULE
C
HVRSOL = '5.4'
C
C -------------------
C
C Open file SOLAR.RAD
C
ISOLFL = 19
OPEN(UNIT=ISOLFL,FILE='SOLAR.RAD',FORM='UNFORMATTED',
* STATUS='OLD')
C
CALL CPUTIM
(TIME)
WRITE (IPR,900) TIME
NPANLS = 0
TIMRD = 0.0
TIMOT = 0.0
C Calculate Earth distance to sun given Julian Day JULDAT. Used to
C scale solar source function. Formula taken from "Atmospheric Radiative
C Transfer", J. Lenoble, 1993.
c Test validity of JULDAT
if ((juldat.lt.0).or.(juldat.gt.366)) then
write(*,*) 'JULDAT = ',juldat,' is out of range 0-366.'
write(ipr,*) 'JULDAT = ',juldat,' is out of range 0-366.'
stop 'Stopped in SOLINT'
endif
c If JULDAT = 0 , then set XJUL_SCALE to 1
if (juldat.eq.0) then
XJUL_SCALE = 1.0
write(ipr,*) 'JULDAT = 0, no scaling of solar source function'
else
theta = 2*pi*(float(JULDAT)-1.)/365.
XJUL_SCALE = 1.00011 + 0.034221*cos(theta) +
* 1.28E-3*sin(theta) + 7.19E-4*cos(2.*theta) +
* 7.7E-5*sin(2.*theta)
write(ipr,*) 'JULDAT = ',JULDAT,
* ', scale factor for solar source function = ',XJUL_SCALE
endif
C
C FOR AEROSOL RUNS, MOVE YID (IFILE) INTO YID (LFILE)
C
C Read file header of solar radiance file and determine dv ratio
C
IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
CALL BUFIN
(ISOLFL,KEOF,XFILHD(1),NFHDRF)
cpdb IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
cpdb IF (JPATHL.GE.1) IPATHL = JPATHL
DVK = DV
C
C Read in file header of transmittance/optical depth file
C
CALL BUFIN
(IFILE,LEOF,XFILHD(1),NFHDRF)
DVL = DV
DVMIN = DVL
C
ATYPE = 9.999E09
IF (DVK.EQ.DVL) ATYPE = 0.
IF (DVL.GT.DVK) ATYPE = DVK/(DVL-DVK)+0.5
IF (DVL.LT.DVK) ATYPE = -DVL/(DVK-DVL)-0.5
C
C IF (ATYPE .GT. 0) STOP ' SOLINT; ATYPE GT 0 '
C
C
C Write file information out to TAPE6
C If INFLAG = 2, then also open files and read headers
C for downward transmittance from solar path and solar
C reflectance at the ground.
C
WRITE (IPR,905) ISOLFL,IFILE,LFILE,ATYPE,INFLAG,IOTFLG
IF (INFLAG.EQ.0) THEN
WRITE(IPR,920) IFILE
ELSEIF (INFLAG.EQ.1) THEN
WRITE(IPR,925) IFILE
ELSEIF (INFLAG.EQ.2) THEN
ISLTRN = 20
OPEN(UNIT=ISLTRN,FILE='SOL.PATH.T2',FORM='UNFORMATTED',
* STATUS='OLD')
CALL BUFIN
(ISLTRN,ITEOF,XSOLHD(1),NFHDRF)
DVT2 = DVS
ISLRFL = 21
OPEN(UNIT=ISLRFL,FILE='SOL.REFLECTANCE',FORM='UNFORMATTED',
* STATUS='OLD')
CALL BUFIN
(ISLRFL,IREOF,XSOLHD(1),NFHDRF)
DVRF = DVS
C
C **************************************************************
C
C Read Record 1.4 from TAPE5
C
READ (IRD,970,END=80) TMPBND,(BNDEMI(IBND),IBND=1,3),
* (BNDRFL(IBND),IBND=1,3)
C
BNDTST = ABS(BNDRFL(1))+ABS(BNDRFL(2))+ABS(BNDRFL(3))
IF (BNDTST.NE.0.) IBPROP = 1
C
C If BNDEMI(1) < 0, read in coefficients from file 'EMISSION'
C If BNDEMI(1) > 0, check to see if emissivity is reasonable
C
C UNIT ICOEF used for input files
C
ICOEF = 14
C
IF (BNDEMI(1).LT.0) THEN
OPEN (UNIT=ICOEF,FILE='EMISSION',STATUS='OLD')
CALL READEM
(ICOEF)
CLOSE (ICOEF)
ELSE
XVMID = (V1+V2)/2.
EMITST = BNDEMI(1)+BNDEMI(2)*XVMID+BNDEMI(3)*XVMID*XVMID
IF (EMITST.LT.0..OR.EMITST.GT.1.) THEN
WRITE (IPR,975) XVMID,EMITST
STOP 'BNDEMI'
ENDIF
ENDIF
C
C ------------------------------------------------------------
C *** NOTE: REFLECTION FUNCTION NOT CURRENTLY INCORPORATED ***
C *** INTO SOLAR RADIATIVE TRANSFER CALCULATION ***
C
C If BNDRFL(1) < 0, read in coefficients from file 'REFLECTION'
C If BNDRFL(1) > 0, check to see if reflectivity is reasonable
C
IF (BNDRFL(1).LT.0) THEN
OPEN (UNIT=ICOEF,FILE='REFLECTION',STATUS='OLD')
CALL READRF
(ICOEF)
CLOSE (ICOEF)
ELSE
REFTST = BNDRFL(1)+BNDRFL(2)*XVMID+BNDRFL(3)*XVMID*XVMID
IF (REFTST.LT.0..OR.REFTST.GT.1.) THEN
WRITE (IPR,980) XVMID,REFTST
STOP 'BNDRFL'
ENDIF
DVEMIS = MIN(DVL,DVK,DVT2,DVRF)
ENDIF
C ------------------------------------------------------------
C
C TBOUND is the boundary temperature. TBOUND=0. for no boundary
C EMISIV is the boundary emissivity
C Set default for EMISIV
C
EMITST = ABS(BNDEMI(1))+ABS(BNDEMI(2))+ABS(BNDEMI(3))
IF ((TMPBND.GT.0.).AND.(EMITST.EQ.0.)) BNDEMI(1) = 1.
EMISIV = BNDEMI(1)
TBOUND = TMPBND
XKTBND = TBOUND/RADCN2
WRITE (IPR,985) V1,V2,TBOUND,(BNDEMI(IBND),IBND=1,3),
* (BNDRFL(IBND),IBND=1,3)
C
C **************************************************************
C
C Determine the minimum and maximum DV of all files and reset
C ATYPE (-1. is only a flag for nonzero ATYPE)
C
DVMIN = MIN(DVL,DVK,DVT2,DVRF,DVEMIS)
DVMAX = MAX(DVL,DVK,DVT2,DVRF,DVEMIS)
c IF (DVMAX.EQ.DVMIN) THEN
c ATYPE = 0.0
c ELSE
ATYPE = -1.
c ENDIF
WRITE(IPR,927) IFILE,ISLTRN,ISLRFL
WRITE(IPR,941) DVT2,DVRF
C
ELSEIF (INFLAG.EQ.3) THEN
WRITE(IPR,926) IFILE
ENDIF
WRITE(IPR,906) DVL,DVK
C
C Test for INFLAG and IOTFLG compatibility
C
IF (IOTFLG.EQ.0) THEN
WRITE(IPR,930) LFILE
ELSEIF (IOTFLG.EQ.1) THEN
IF (INFLAG.EQ.1) STOP 'ERROR: INFLAG=1, IOTFLG=1'
WRITE(IPR,935) LFILE
ELSEIF (IOTFLG.EQ.2) THEN
IF (INFLAG.NE.2) STOP 'ERROR: INFLAG not 2, IOTFLG=2'
WRITE(IPR,940) LFILE
ENDIF
IEMIT = 1
SECANT = 0.
DV = DVL
C
C Set XSCID and ISCHDR to values which allow for potential
C interpolation of output file
C
XSCID = 100.01
ISCHDR = 10
C
C Output file header
C
CALL BUFOUT
(LFILE,XFILHD(1),NFHDRF)
C
IF (ATYPE.EQ.0.) THEN
C
C ======================================
C 1/1 ratio only
C ======================================
C
WRITE(IPR,950) DVMIN
IPANEM = 0
30 CONTINUE
IPANEM = IPANEM+1
CALL CPUTIM
(TIMSL1)
CALL SOLIN
(V1P,V2P,DVP,NLIM,ISOLFL,SOLAR(1),LSEOF)
CALL CPUTIM
(TIMSL2)
TIMRD = TIMRD+TIMSL2-TIMSL1
IF (LSEOF.LE.0) GO TO 110
C
C
C If INFLAG = 0, then read radiance and transmittance
C If INFLAG = 1, then read optical depth
C If INFLAG = 2, then read radiance and transmittance
C and call SOLIN to read in r1 and T2
C If INFLAG = 3, then read transmittance
C
IF (INFLAG.EQ.0) THEN
CALL SOLIN2
(V1PO,V2PO,DVPO,NLIMO,IFILE,RADO(1),
* TRAO(1),LEOF)
ELSEIF (INFLAG.EQ.1) THEN
CALL SOLIN
(V1PO,V2PO,DVPO,NLIMO,IFILE,OPTO(1),
* LEOF)
DO 35 I = 1,NLIMO
TRAN(I) = EXP(-OPTN(I))
35 CONTINUE
ELSEIF (INFLAG.EQ.2) THEN
CALL SOLIN2
(V1PO,V2PO,DVPO,NLIMO,IFILE,RADO(1),
* TRAO(1),LEOF)
CALL SOLIN2
(V1T2,V2T2,DVT2,NLIMT2,ISLTRN,RAD2(1),
* TRAN2(1),LSEOF)
CALL SOLIN
(V1RF,V2RF,DVRF,NLIMRF,ISLRFL,XRFLT(1),
* LSEOF)
IF (ABS(V1T2-V1RF).GT.0.001) THEN
WRITE(IPR,*) 'SOLINT: PANELS DO NOT MATCH:'
WRITE(IPR,*) ' V1T2 = ',V1T2,' V1RF = ',V1RF
STOP 'SOLINT: PANELS DO NOT MATCH: SEE TAPE6'
ENDIF
ELSEIF (INFLAG.EQ.3) THEN
CALL SOLIN
(V1PO,V2PO,DVPO,NLIMO,IFILE,TRAO(1),
* LEOF)
ENDIF
CALL CPUTIM
(TIMSL3)
TIMRD = TIMRD+TIMSL3-TIMSL2
C
C If IOTFLG = 0, then calculate attenuated solar radiance
C If IOTFLG = 1, then calculate attenuated solar radiance
C plus atmospheric radiance
C If IOTFLG = 2, then calculate attenuated solar radiance
C through the reflected atmosphere plus
C atmospheric radiance
C
C Solar irradiance is input from SOLAR.RAD (W/m2 cm-1).
C Convert to radiance units (W/cm2 sr cm-1) by multiplying
C by 1/6.8e-5.
conv_ster = 1./(1.e4*6.8e-5)
C
C Combine XJUL_SCALE and conv_ster into one scale factor SCAL_FAC
SCAL_FAC = conv_ster*XJUL_SCALE
C
IF (IOTFLG.EQ.0) THEN
DO 40 I = 1, NLIM
SOLRAD(I) = SOLAR(I)*SCAL_FAC*TRAN(I)
40 CONTINUE
ELSEIF (IOTFLG.EQ.1) THEN
DO 41 I = 1, NLIM
SOLRAD(I) = SOLAR(I)*SCAL_FAC*TRAN(I)+RADN(I)
41 CONTINUE
ELSEIF (IOTFLG.EQ.2) THEN
IF (TBOUND.EQ.0) THEN
DO 42 I = 1, NLIM
SOLRAD(I) = SOLAR(I)*SCAL_FAC*TRAN2(I)*XRFLT(I)*
* TRAN(I)+RADN(I)
42 CONTINUE
ELSE
DO 43 I = 1, NLIM
EMDUM = -1.
BBDUM = -1.
VBND = V1PO+(I-1)*DVPO
ZEMSV = EMISFN
(VBND,DVPO,VINEM,EMDEL,EMDUM)
BBND = BBFN
(VBND,DVPO,VBND,XKTBND,VINEW,BBDEL,BBDUM)
SOLRAD(I) = (SOLAR(I)*SCAL_FAC*TRAN2(I)*XRFLT(I)
* +ZEMSV*BBND)*TRAN(I)+RADN(I)
43 CONTINUE
ENDIF
ENDIF
C
CALL CPUTIM
(TIMSL2)
CALL SOLOUT
(V1PO,V2PO,DVPO,NLIMO,SOLRAD,LFILE,NPTS,NPANLS)
CALL CPUTIM
(TIMSL3)
TIMOT = TIMOT+TIMSL3-TIMSL2
GO TO 30
C
ENDIF
C
C ======================================
C All ratios except 1/1
C ======================================
C
WRITE(IPR,951) DVMIN
DO 50 JP = 0,100
APG = JP
P = 0.01*APG
C
C The following are the constants for the Lagrange
C 4 point interpolation
C
A1(JP) = -P*(P-1.0)*(P-2.0)/6.0
A2(JP) = (P**2-1.0)*(P-2.0)*0.5
A3(JP) = -P*(P+1.0)*(P-2.0)*0.5
A4(JP) = P*(P**2-1.0)/6.0
A1T2(JP) = A1(JP)
A2T2(JP) = A2(JP)
A3T2(JP) = A3(JP)
A4T2(JP) = A4(JP)
A1RF(JP) = A1(JP)
A2RF(JP) = A2(JP)
A3RF(JP) = A3(JP)
A4RF(JP) = A4(JP)
50 CONTINUE
C
C *** Beginning of loop that does merge ***
C
NPE = 0
V1P = 0.0
V2P = 0.0
DVP = 0.0
SOLAR(0) = 0.0
LSEOF = 1
NPT2 = 0
V1T2 = 0.0
V2T2 = 0.0
DVT2 = 0.0
TRAN2(0) = 0.0
LT2EOF = 1
NPRF = 0
V1RF = 0.0
V2RF = 0.0
DVRF = 0.0
XRFLT(0) = 0.0
LRFEOF = 1
V1PO = 0.0
V2PO = 0.0
DVPO = 0.0
C
C ============================================================
C
IPANEM = 0
60 CONTINUE
IPANEM = IPANEM+1
C
C If INFLAG = 0, then read radiance and transmittance
C If INFLAG = 1, then read optical depth
C If INFLAG = 2, then read radiance and transmittance
C and call SOLIN to read in r1 and T2
C If INFLAG = 3, then read transmittance
C
IF (INFLAG.EQ.0) THEN
CALL SOLIN2
(V1PO,V2PO,DVPO,NLIMO,IFILE,RADO(1),
* TRAO(1),LEOF)
IF (LEOF.LE.0) GO TO 110
ELSEIF (INFLAG.EQ.1) THEN
CALL SOLIN
(V1PO,V2PO,DVPO,NLIMO,IFILE,OPTO(1),
* LEOF)
IF (LEOF.LE.0) GO TO 110
DO 65 I = 1,NLIMO
TRAN(I) = EXP(-OPTN(I))
65 CONTINUE
ELSEIF (INFLAG.EQ.2) THEN
CALL SOLIN2
(V1PO,V2PO,DVPO,NLIMO,IFILE,RADO(1),
* TRAO(1),LEOF)
IF (LEOF.LE.0) GO TO 110
C
C -----------------------------------------------------
C TRAN2 and RAD2 read in
C
IF (V2T2.LE.V2PO+DVT2.AND.LT2EOF.GT.0) THEN
66 CALL CPUTIM
(TIMSL2)
CALL SOLIN2
(V1T2,V2T2,DVT2,NLIMT2,ISLTRN,RAD2(npt2+1),
* TRAN2(npt2+1),LT2EOF)
CALL CPUTIM
(TIMSL3)
TIMRD = TIMRD+TIMSL3-TIMSL2
IF (LT2EOF.LE.0) GO TO 67
V1T2 = V1T2-FLOAT(NPT2)*DVT2
1 NPT2 = NLIMT2+NPT2
IF (V2T2.LE.V2PO+DVT2) GO TO 66
ENDIF
C
C Zero point of first panel
C
67 IF (TRAN2(0).EQ.0.0) THEN
TRAN2(-1) = TRAN2(1)
TRAN2(0) = TRAN2(1)
ENDIF
C
C End point of last panel
C
IF (V2T2+DVT2.GE.V2) THEN
TRAN2(NPT2+1) = TRAN2(NPT2)
TRAN2(NPT2+2) = TRAN2(NPT2)
ENDIF
C
C -----------------------------------------------------
C XRFLT read in
C
IF (V2RF.LE.V2PO+DVRF.AND.LRFEOF.GT.0) THEN
68 CALL CPUTIM
(TIMSL2)
CALL SOLIN
(V1RF,V2RF,DVRF,NLIMRF,ISLRFL,XRFLT(nprf+1),
* LRFEOF)
CALL CPUTIM
(TIMSL3)
TIMRD = TIMRD+TIMSL3-TIMSL2
IF (LRFEOF.LE.0) GO TO 69
V1RF = V1RF-FLOAT(NPRF)*DVRF
NPRF = NLIMRF+NPRF
IF (V2RF.LE.V2PO+DVRF) GO TO 68
ENDIF
C
C Zero point of first panel
C
69 IF (XRFLT(0).EQ.0.0) THEN
XRFLT(-1) = XRFLT(1)
XRFLT(0) = XRFLT(1)
ENDIF
C
C End point of last panel
C
IF (V2RF+DVRF.GE.V2) THEN
XRFLT(NPRF+1) = XRFLT(NPRF)
XRFLT(NPRF+2) = XRFLT(NPRF)
ENDIF
ELSEIF (INFLAG.EQ.3) THEN
CALL SOLIN
(V1PO,V2PO,DVPO,NLIMO,IFILE,TRAO(1),
* LEOF)
IF (LEOF.LE.0) GO TO 110
ENDIF
C -----------------------------------------------------
C
CALL CPUTIM
(TIMSL3)
TIMRD = TIMRD+TIMSL3-TIMSL2
II = 1
C
C Buffer in panels from solar radiance file
C
IF (V2P.LE.V2PO+DVP .AND.LSEOF.GT.0) THEN
70 CALL CPUTIM
(TIMSL2)
CALL SOLIN
(V1P,V2P,DVP,NLIM,ISOLFL,SOLAR(NPE+1),LSEOF)
CALL CPUTIM
(TIMSL3)
TIMRD = TIMRD+TIMSL3-TIMSL2
IF (LSEOF.LE.0) GO TO 80
V1P = V1P-FLOAT(NPE)*DVP
NPE = NLIM+NPE
IF (V2P.LE.V2PO+DVP) GO TO 70
ENDIF
C
C Zero point of first panel
C
80 IF (SOLAR(0).EQ.0.0) THEN
SOLAR(-1) = SOLAR(1)
SOLAR(0) = SOLAR(1)
ENDIF
C
C End point of last panel
C
IF (V2P+DVP.GE.V2) THEN
SOLAR(NPE+1) = SOLAR(NPE)
SOLAR(NPE+2) = SOLAR(NPE)
ENDIF
C
C -----------------------------------------------------
C
C NPL is the location of first element on arrays RADO and TRAO
C
NPL = 1
NPLT2 = 1
NPLRF = 1
C
C Set spectral spacing ratios (uses DVMIN instead of DVL, for
C coding where it is not assumed that RADN & TRAN have the
C smallest spacing).
C
RATDVR = DVMIN/DVK
IF (INFLAG.EQ.2) THEN
RTDVT2 = DVMIN/DVT2
RTDVRF = DVMIN/DVRF
ENDIF
C
C Test for ratios of 1 (no need for interpolation). Reset
C interpolation coefficients if necessary.
C
IF (RATDVR.EQ.1) THEN
DO 82 JP = 0,100
A1(JP) = 0.0
A2(JP) = 1.0
A3(JP) = 0.0
A4(JP) = 0.0
82 CONTINUE
ENDIF
IF (INFLAG.EQ.2) THEN
IF (RTDVT2.EQ.1) THEN
DO 84 JP = 0,100
A1T2(JP) = 0.0
A2T2(JP) = 1.0
A3T2(JP) = 0.0
A4T2(JP) = 0.0
84 CONTINUE
ENDIF
IF (RTDVRF.EQ.1) THEN
DO 86 JP = 0,100
A1RF(JP) = 0.0
A2RF(JP) = 1.0
A3RF(JP) = 0.0
A4RF(JP) = 0.0
86 CONTINUE
ENDIF
ENDIF
C
C -----------------------------------------------------
C
C FJJ is offset by 2. (for rounding purposes)
C
FJ1DIF = (V1PO-V1P)/DVP+1.+2.
IF (INFLAG.EQ.2) THEN
FJDFT2 = (V1PO-V1T2)/DVT2+1.+2.
FJDFRF = (V1PO-V1RF)/DVRF+1.+2.
ENDIF
C
C ============================================================
C
C ***** Beginning of loop that does merge *****
C
C If IOTFLG = 0, then calculate attenuated solar radiance
C If IOTFLG = 1, then calculate attenuated solar radiance
C plus atmospheric radiance
C If IOTFLG = 2, then calculate attenuated solar radiance
C through the reflected atmosphere plus
C atmospheric radiance
C
C Solar irradiance is input from SOLAR.RAD (W/m2 cm-1).
C Convert to radiance units (W/cm2 sr cm-1) by multiplying
C by 1/6.8e-5.
conv_ster = 1./(1.e4*6.8e-5)
C
C Combine XJUL_SCALE and conv_ster into one scale factor SCAL_FAC
SCAL_FAC = conv_ster*XJUL_SCALE
C
IF (IOTFLG.EQ.0) THEN
DO 90 II = 1, NLIMO
FJJ = FJ1DIF+RATDVR*FLOAT(II-1)
JJ = IFIX(FJJ)-2
JP = (FJJ-FLOAT(JJ))*100.-199.5
SOLRAD(II) = (A1(JP)*SOLAR(JJ-1)+A2(JP)*SOLAR(JJ)+
* A3(JP)*SOLAR(JJ+1)+A4(JP)*SOLAR(JJ+2))*SCAL_FAC*
* TRAN(II)
c
90 CONTINUE
ELSEIF (IOTFLG.EQ.1) THEN
DO 91 II = 1, NLIMO
FJJ = FJ1DIF+RATDVR*FLOAT(II-1)
JJ = IFIX(FJJ)-2
JP = (FJJ-FLOAT(JJ))*100.-199.5
SOLRAD(II) = (A1(JP)*SOLAR(JJ-1)+A2(JP)*SOLAR(JJ)+
* A3(JP)*SOLAR(JJ+1)+A4(JP)*SOLAR(JJ+2))*SCAL_FAC*
* TRAN(II)+RADN(II)
91 CONTINUE
ELSEIF (IOTFLG.EQ.2) THEN
IF (TBOUND.EQ.0.) THEN
DO 92 II = 1, NLIMO
FJJ = FJ1DIF+RATDVR*FLOAT(II-1)
FJJT2 = FJDFT2+RTDVT2*FLOAT(II-1)
FJJRF = FJDFRF+RTDVRF*FLOAT(II-1)
JJ = IFIX(FJJ)-2
JJT2 = IFIX(FJJT2)-2
JJRF = IFIX(FJJRF)-2
JP = (FJJ-FLOAT(JJ))*100.-199.5
JPT2 = (FJJT2-FLOAT(JJT2))*100.-199.5
JPRF = (FJJRF-FLOAT(JJRF))*100.-199.5
ZSOL = (A1(JP)*SOLAR(JJ-1)+A2(JP)*SOLAR(JJ)+
* A3(JP)*SOLAR(JJ+1)+A4(JP)*SOLAR(JJ+2))*SCAL_FAC
ZTR2 = (A1T2(JPT2)*TRAN2(JJT2-1)+
* A2T2(JPT2)*TRAN2(JJT2)+
* A3T2(JPT2)*TRAN2(JJT2+1)+
* A4T2(JPT2)*TRAN2(JJT2+2))
ZRFL = (A1RF(JPRF)*XRFLT(JJRF-1)+
* A2RF(JPRF)*XRFLT(JJRF)+
* A3RF(JPRF)*XRFLT(JJRF+1)+
* A4RF(JPRF)*XRFLT(JJRF+2))
SOLRAD(II) = ZSOL*ZTR2*ZRFL*TRAN(II)+RADN(II)
92 CONTINUE
ELSE
DO 93 II = 1, NLIMO
FJJ = FJ1DIF+RATDVR*FLOAT(II-1)
FJJT2 = FJDFT2+RTDVT2*FLOAT(II-1)
FJJRF = FJDFRF+RTDVRF*FLOAT(II-1)
JJ = IFIX(FJJ)-2
JJT2 = IFIX(FJJT2)-2
JJRF = IFIX(FJJRF)-2
JP = (FJJ-FLOAT(JJ))*100.-199.5
JPT2 = (FJJT2-FLOAT(JJT2))*100.-199.5
JPRF = (FJJRF-FLOAT(JJRF))*100.-199.5
ZSOL = (A1(JP)*SOLAR(JJ-1)+A2(JP)*SOLAR(JJ)+
* A3(JP)*SOLAR(JJ+1)+A4(JP)*SOLAR(JJ+2))*SCAL_FAC
ZTR2 = (A1T2(JPT2)*TRAN2(JJT2-1)+
* A2T2(JPT2)*TRAN2(JJT2)+
* A3T2(JPT2)*TRAN2(JJT2+1)+
* A4T2(JPT2)*TRAN2(JJT2+2))
ZRFL = (A1RF(JPRF)*XRFLT(JJRF-1)+
* A2RF(JPRF)*XRFLT(JJRF)+
* A3RF(JPRF)*XRFLT(JJRF+1)+
* A4RF(JPRF)*XRFLT(JJRF+2))
EMDUM = -1.
BBDUM = -1.
VBND = V1PO+(II-1)*DVPO
ZEMSV = EMISFN
(VBND,DVPO,VINEM,EMDEL,EMDUM)
BBND = BBFN
(VBND,DVPO,VBND,XKTBND,VINEW,BBDEL,BBDUM)
SOLRAD(II) = (ZSOL*ZTR2*ZRFL+ZEMSV*BBND)*
* TRAN(II)+RADN(II)
93 CONTINUE
ENDIF
ENDIF
C
NPL = JJ-1
NPLT2 = JJT2-1
NPLRF = JJRF-1
C
CALL CPUTIM
(TIMSL1)
C
C ============================================================
C
C Output attenuated radiance
C
CALL SOLOUT
(V1PO,V2PO,DVPO,NLIMO,SOLRAD,LFILE,NPTS,NPANLS)
CALL CPUTIM
(TIMSL2)
TIMOT = TIMOT+TIMSL2-TIMSL1
C
C ============================================================
C
C Reset element locations for each array
C
C ============================================================
C NPL is now location of first element in the array SOLAR to
C be used for next pass.
C
IPL = -2
DO 100 NL = NPL, NPE
IPL = IPL+1
SOLAR(IPL) = SOLAR(NL)
100 CONTINUE
C
V1P = V1P+FLOAT(NPL+1)*DVP
NPE = IPL
C
IF (IOTFLG.EQ.2) THEN
C
C ------------------------------------------------------------
C NPLT2 is now location of first element in the array TRAN2 to
C be used for next pass.
C
IPL = -2
DO 102 NL = NPLT2, NPT2
IPL = IPL+1
TRAN2(IPL) = TRAN2(NL)
102 CONTINUE
C
V1T2 = V1T2+FLOAT(NPLT2+1)*DVT2
NPT2 = IPL
C
C -------------------------------------------------------------
C NPLRF is now location of first element in the array XRFLT to
C be used for next pass.
C
IPL = -2
DO 104 NL = NPLRF, NPRF
IPL = IPL+1
XRFLT(IPL) = XRFLT(NL)
104 CONTINUE
C
V1RF = V1RF+FLOAT(NPLRF+1)*DVRF
NPRF = IPL
ENDIF
C ============================================================
C
GO TO 60
110 CONTINUE
C
CALL CPUTIM
(TIME1)
TIM = TIME1-TIME
WRITE (IPR,910) TIME1,TIM,TIMRD,TIMOT
C
RETURN
C
900 FORMAT ('0 THE TIME AT THE START OF SOLINT IS ',F12.3)
905 FORMAT ('0 FILE ',I5,' MERGED WITH FILE ',I5,' ONTO FILE',
* I5,' WITH XTYPE=',G15.5,/,'0 INFLAG = ',I5,4X,
* 'IOTFLG = ',I5)
906 FORMAT ('0 Thermal spectrum spacing = ',E10.5,/,
* '0 Solar radiance spectral spacing = ',E10.5,/)
910 FORMAT ('0 THE TIME AT THE END OF SOLINT IS ',F12.3/F12.3,
* ' SECS WERE REQUIRED FOR THIS SOLAR MERGE',F12.3,
* ' - READ - ',F12.3,' - SOLOUT - ',F12.3)
920 FORMAT ('0 Radiance and Transmittance read in from unit',I5)
925 FORMAT ('0 Optical Depths read in from unit',I5)
926 FORMAT ('0 Transmittance read in from unit',I5)
927 FORMAT ('0 Thermal upwelling Radiance & Transmittance',
* ' read in from unit',I5,/,
* ' Solar reflectance function read in from unit',
* I5,/,
* ' Thermal downwelling Radiance & Transmittance',
* ' read in from unit',I5,/)
930 FORMAT ('0 Attenuated solar radiance output to unit',I5,/)
935 FORMAT ('0 Attenuated solar radiance + atmospheric radiance',
* 1x,'output to unit',I5,/)
940 FORMAT ('0 Attenuated solar radiance + atmospheric radiance',
* 1x,'(including effects of reflection) output to unit',
* I5,/)
941 FORMAT ('0 Thermal downwelling spacing = ',E10.5,/,
* '0 Reflection function spacing = ',E10.5)
950 FORMAT ('0 No interpolation needed: using DV = ',E10.5,//)
951 FORMAT ('0 Interpolating to spectral spacing = ',E10.5,//)
970 FORMAT (7E10.3)
975 FORMAT ('0 FOR VNU = ',F10.3,' THE EMISSIVITY = ',E10.3,
* ' AND IS NOT BOUNDED BY (0.,1.) ')
980 FORMAT ('0 FOR VNU = ',F10.3,' THE REFLECTIVITY = ',E10.3,
* ' AND IS NOT BOUNDED BY (0.,1.) ')
985 FORMAT ( * '0 V1(CM-1) = ',F12.4,/,'0 V2(CM-1) = ',F12.4,/,
* '0 TBOUND = ',F12.4,5X,'BOUNDARY EMISSIVITY = ',
* 3(1PE11.3),/,'0',29X,'BOUNDARY REFLECTIVITY = ',
* 3(1PE11.3))
C
END
C
C ----------------------------------------------------------------
C
SUBROUTINE SOLIN (V1P,V2P,DVP,NLIM,KFILE,XARRAY,KEOF) 8,2
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C LAST MODIFICATION: 1 November 1995
C
C IMPLEMENTATION: P.D. Brown
C
C ALGORITHM REVISIONS: S.A. Clough
C P.D. Brown
C
C
C ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C 840 MEMORIAL DRIVE, CAMBRIDGE, MA 02139
C
C----------------------------------------------------------------------
C
C WORK SUPPORTED BY: THE ARM PROGRAM
C OFFICE OF ENERGY RESEARCH
C DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
IMPLICIT REAL*8 (V)
C
C SUBROUTINE SOLIN inputs files for use with solar radiation
C calculations for interpolation in SOLINT. Reads files with
C one record per panel.
C
character*8 XID, HMOLID, YID
real*8 SECANT, XALTZ
C
COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
* WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
* EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
* NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
* NLTEFL,LNFIL4,LNGTH4
COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
C
DIMENSION PNLHDR(2),XARRAY(*)
C
EQUIVALENCE (PNLHDR(1),V1PBF)
C
CALL BUFIN
(KFILE,KEOF,PNLHDR(1),NPHDRF)
IF (KEOF.LE.0) RETURN
CALL BUFIN
(KFILE,KEOF,XARRAY(1),NLIMBF)
C
V1P = V1PBF
V2P = V2PBF
DVP = DVPBF
NLIM = NLIMBF
C
RETURN
C
END
C
C ----------------------------------------------------------------
C
SUBROUTINE SOLIN2 (V1P,V2P,DVP,NLIM,KFILE,XARAY1,XARAY2,KEOF) 6,3
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C LAST MODIFICATION: 1 November 1995
C
C IMPLEMENTATION: P.D. Brown
C
C ALGORITHM REVISIONS: S.A. Clough
C P.D. Brown
C
C
C ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C 840 MEMORIAL DRIVE, CAMBRIDGE, MA 02139
C
C----------------------------------------------------------------------
C
C WORK SUPPORTED BY: THE ARM PROGRAM
C OFFICE OF ENERGY RESEARCH
C DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
IMPLICIT REAL*8 (V)
C
C SUBROUTINE SOLIN inputs files for use with solar radiation
C calculations for interpolation in SOLINT. Reads files with
C two records per panel.
C
character*8 XID, HMOLID, YID
real*8 SECANT, XALTZ
C
COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
* WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
* EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
* NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
* NLTEFL,LNFIL4,LNGTH4
COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
C
DIMENSION PNLHDR(2),XARAY1(*),XARAY2(2)
C
EQUIVALENCE (PNLHDR(1),V1PBF)
C
CALL BUFIN
(KFILE,KEOF,PNLHDR(1),NPHDRF)
IF (KEOF.LE.0) RETURN
CALL BUFIN
(KFILE,KEOF,XARAY1(1),NLIMBF)
CALL BUFIN
(KFILE,KEOF,XARAY2(1),NLIMBF)
C
V1P = V1PBF
V2P = V2PBF
DVP = DVPBF
NLIM = NLIMBF
C
RETURN
C
END
C
C ----------------------------------------------------------------
C
SUBROUTINE SOLOUT (V1P,V2P,DVP,NLIM,SOLRAD,LFILE,NPTS,NPANLS) 2,2
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C LAST MODIFICATION: 3 April 1994
C
C IMPLEMENTATION: P.D. Brown
C
C ALGORITHM REVISIONS: S.A. Clough
C P.D. Brown
C
C
C ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C 840 MEMORIAL DRIVE, CAMBRIDGE, MA 02139
C
C----------------------------------------------------------------------
C
C WORK SUPPORTED BY: THE ARM PROGRAM
C OFFICE OF ENERGY RESEARCH
C DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
IMPLICIT REAL*8 (V)
C
C SUBROUTINE SOLOUT OUTPUTS ATTENUATED SOLAR RADIANCE (INTERPOLATED)
C TO LFILE
C
COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
* NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
* NLTEFL,LNFIL4,LNGTH4
DIMENSION PNLHDR(2)
DIMENSION SOLRAD(*)
C
EQUIVALENCE (PNLHDR(1),V1PBF)
C
REAL SOLRAD
C
NPANLS = NPANLS+1
V1PBF = V1P
V2PBF = V2P
DVPBF = DVP
NLIMBF = NLIM
C
CALL BUFOUT
(LFILE,PNLHDR(1),NPHDRF)
CALL BUFOUT
(LFILE,SOLRAD(1),NLIMBF)
C
IF (NPTS.GT.0) THEN
IF (NPANLS.EQ.1) WRITE (IPR,900)
WRITE (IPR,905)
NNPTS = NPTS
IF (NPTS.GT.(NLIMBF/2)+1) NNPTS = (NLIMBF/2)+1
JEND = NLIMBF-NNPTS+1
DO 10 J = 1, NNPTS
VJ = V1PBF+FLOAT(J-1)*DVPBF
K = J+JEND-1
VK = V1PBF+FLOAT(K-1)*DVPBF
WRITE (IPR,910) J,VJ,SOLRAD(J),K,VK,SOLRAD(K)
10 CONTINUE
ENDIF
C
RETURN
C
900 FORMAT ('0 ','LOCATION WAVENUMBER',4X,'RADIANCE',13X,
* 'LOCATION WAVENUMBER',4X,
* 'RADIANCE')
905 FORMAT (' ')
910 FORMAT (I8,2X,F12.6,1P,E15.7,0P,9X,I8,2X,F12.6,1P,E15.7,0P)
C
END