C path: /stormrc1/aer_lblrtm/src/SCCS/s.postsub.f C revision: 5.11 C created: 12/13/99 10:59:48 C presently: 12/13/99 11:00:22 C C --------------------------------------------------------------SUBROUTINE SCANFN (IFILE,JFILE) 1,22 C IMPLICIT REAL*8 (V) C C DRIVER FOR CONVOLVING INSTRUMENTAL SCANNING FUNCTION C WITH SPECTRUM C COMMON S(3850),R1(5000),N1(5000) C character*8 XID, HMOLID, YID,SCANID real*8 SECANT, XALTZ C COMMON /HVERSN/ HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG, * HVROPR,HVRPST,HVRPLT,HVRTST,HVRUTL,HVRXMR COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SCINF/ HWHM,JEMIT,JFN,SAMPLE,SCANID,NPTS,XF(6018) COMMON /FLFORM/ CFORM COMMON /RCTSV/ JDUM,SDUM,JFLG,RNJDM,NB,IPC,VLFT,VCNT,VRGT, * WGTL,WGTR C CHARACTER*12 BCD,HTRANS,HABSRB,HRADIA CHARACTER*11 CFORM CHARACTER*8 HSCNID(0:6) CHARACTER*8 HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG,HVROPR, * HVRPLT,HVRPST,HVRTST,HVRUTL,HVRXMR CHARACTER SCNOUT*7,SCNINF*7,CTAPE*4 LOGICAL OP C DIMENSION FILHDR(2),SUMR(4) DIMENSION HWJ(0:6),DXJ(0:6),NJ(0:6),NJMX(0:6),SMPLJ(0:6), * XSCAL(0:6) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCHDR) , (FSCDID(12),XSCID), * (FSCDID(13),XHWHM) , (FSCDID(14),IDABS), * (FSCDID(16),LAYR1) C DATA HTRANS / 'TRANSMISSION'/,HABSRB / ' ABSORPTION '/, * HRADIA / ' RADIANCE '/ DATA SCNOUT / ' '/,SCNINF / 'SCNINTF'/,CTAPE / 'TAPE'/ C DATA HSCNID(0) / 'RECTANGL'/,HWJ(0) / 1. /, * DXJ(0) / 0.0 /,NJ(0) / 0 /,NJMX(0) / 0 /, * SMPLJ(0) / .5 /,XSCAL(0) / 0. / DATA HSCNID(1) / 'TRIANGLE'/,HWJ(1) / 2. /, * DXJ(1) / 0.02 /,NJ(1) / 101 /,NJMX(1) / 251 /, * SMPLJ(1) / 2. /,XSCAL(1) / 0. / DATA HSCNID(2) / 'GAUSS '/,HWJ(2) / 4. /, * DXJ(2) / 0.02 /,NJ(2) / 201 /,NJMX(2) / 251 /, * SMPLJ(2) / 4. /,XSCAL(2) / 0. / C C SINCSQ: 54.18 HALFWIDTHS CORRESPONDS TO 24 ZERO CROSSINGS C PI CORRESPONDS TO X=2.257609141 C DATA HSCNID(3) / 'SINCSQ '/,HWJ(3) / 54.1826 /, * DXJ(3) / 0.02 /,NJ(3) / 2710 /,NJMX(3) / 2760 /, * SMPLJ(3) / 4. /,XSCAL(3) / 1.391557377 / C C SINC: 119.33 HALFWIDTHS CORRESPONDS TO 72 ZERO CROSSINGS C PI CORRESPONDS TO X=1.657400255 C DATA HSCNID(4) / 'SINC '/,HWJ(4) / 119.332818 /, * DXJ(4) / 0.02 /,NJ(4) / 5968 /,NJMX(4) / 6018 /, * SMPLJ(4) / 4. /,XSCAL(4) / 1.89549425 / DATA HSCNID(5) / 'VRCTCENT'/,HWJ(5) / 1. /, * DXJ(5) / 0.0 /,NJ(5) / 0 /,NJMX(5) / 0 /, * SMPLJ(5) / .5 /,XSCAL(5) / 0. / DATA HSCNID(6) / 'VRCTLEFT'/,HWJ(6) / 1. /, * DXJ(6) / 0.0 /,NJ(6) / 0 /,NJMX(6) / 0 /, * SMPLJ(6) / .5 /,XSCAL(6) / 0. / C C---------------------------------------------------------------------- C C ADDITIONAL SCANNING FUNCTIONS MAY READILY BE ADDED TO THOSE C CURRENTLY IMPLEMENTED IN THIS VERSION OF LBLRTM: C C A SHAPE SUBROUTINE FOR THE DESIRED FUNCTION MUST BE CREATED- C THIS SUBROUTINE PRECALCULATES THE FUNCTION FOR SUBSEQUENT C LOOKUP. SEE FOR EXAMPLE SUBROUTINE SHAPEG FOR THE GAUSSIAN C C THE SHAPE SUBROUTINE SETS UP THE SYMMETRIC FUNCTION IN ARRAY FG C AT EQUAL INCREMENTS OF THE HALFWIDTH, 'DXF'. THE VALUE OF 'DXF' C IS SET IN THIS SUBROUTINE BY THE VALUE OF 'DXJ(?)' C C A DATA CARD MUST BE CREATED FOR EACH SCANNING FUNCTION DEFINING C THE FOLLOWING QUANTITIES: C C HWJ(?) EXTENT OF THE FUNCTION (BOUND) FROM THE CENTER IN UNITS C OF HALFWIDTH C C DXJ(?) INCREMENT AT WHICH THE FUNCTION IS STORED IN UNITS C OF HALFWIDTH C C NJ(?) THE NUMBER OF POINTS FROM THE CENTER TO THE FUNCTION C BOUND C C NJMAX(?) SIZE OF THE ARRAY IN WHICH THE FUNCTION IS STORED C FUNCTION VALUES BETWEEN NJ AND NJMAX ARE ZERO C C SMPL(?) DEFAULT VALUE OF THE SAMPLING INCREMENT IN RECIPRICAL C HALFWIDTH UNITS: E.G. A VALUE OF FOUR MEANS THAT THE C OUTPUT SPACING, 'DV', IN WAVENUMBERS WILL BE 1/4 THE C HALFWIDTH VALUE IN WAVENUMBERS, 'HWHM'. C C XSCAL(?) REQUIRED FOR PERIODIC FUNTIONS. THE VALUE OF THE C FUNCTION ARGUMENT IN RADIANS FOR WHICH THE C FUNCTION VALUE IS 0.5, E.G. C SINX/X = 0.5 FOR X = 1.89549425, XSCAL(4) C C CONSIDERATION MUST BE GIVEN TO THE ISSUE OF FUNCTION C NORMALIZATION FOR FUNCTIONS THAT DO NOT HAVE RAPID C CONVERGENCE TO ZERO (SINX/X) C C SAC C C---------------------------------------------------------------------- C C C ASSIGN SCCS VERSION NUMBER TO MODULE C HVRPST = '5.11' C PI = 2.*ASIN(1.) C C SET THE MAXIMIM NUMBER OF AVAILABLE FUNCTIONS: C NFNMAX = 6 C C NLIMF IS ONE MORE THAN THE SIZE OF OUTPUT (CONVOLVED) ARRAY C NLIMF = 2401 NREN = 0 NSHIFT = 32 IFLSAV = 0 IPRT = 1 C 10 CONTINUE SUMOUT = 0. SMIN = 999999. SMAX = -99999. DVOSAV = 0. SUMR(1) = SUMOUT SUMR(2) = SMIN SUMR(3) = SMAX SUMR(4) = DVOSAV C IEOFT = 1 C C READ IN CONTROL PARAMETERS: SEE INSTRUCTIONS FO DEFINITIONS C READ (IRD,900,END=80) HWHM,V1,V2,JEMIT,JFN,JVAR,SAMPL,IUNIT, * IFILST,NIFILS,JUNIT,NPTS C IF (HWHM.LE.0.) GO TO 70 C C JEMIT=-1 SCANFN CONVOLVED WITH ABSORPTION C JEMIT=0 SCANFN CONVOLVED WITH TRANSMISSION C JEMIT=1 SCANFN CONVOLVED WITH EMISSION C JABS = 0 IDABS = 0 IF (JEMIT.LT.0) THEN JABS = 1 JEMIT = 0 IDABS = -1 ENDIF IDABST = IDABS C C JVAR=1 FOR A VARIABLE SLIT FUNCTION (NOT FOR JFN=0) C THE CODING IN CNVSCN RESULTS IN HWHM=1./ (VI-V1)**2 C HWHM IS CONSTANT FOR EACH PANEL AS PROGRAMMED C IFN = ABS(JFN) IF (IFN.GT.NFNMAX) THEN WRITE (IPR,*) 'SCANF; JFN GT LIMIT' STOP 'SCANF; JFN GT LIMIT' ENDIF C READ (HSCNID(IFN),905) SCANID C HWF = HWJ(IFN) DXF = DXJ(IFN) NF = NJ(IFN) NFMAX = NJMX(IFN) SAMPLE = SMPLJ(IFN) XSCALE = XSCAL(IFN) C C CHECK FOR NEGATIVE JFN OR NEGATIVE SAMPL C C FOR NEGATIVE JFN, USER IS SUPPLYING FIRST ZERO CROSSING FOR THE C PERIODIC FUNCTION IN HWHM. SET HWHM=(FIRST ZERO)/(PI/XSCALE) C C For JFN=5,6 user is supplying instrument field of view half angle C in degrees in HWHM. Trap if JFN=-5,-6. C IF (JFN.LT.0) THEN JFN = ABS(JFN) IF ((JFN.EQ.3).OR.(JFN.EQ.4)) THEN HWHM = HWHM/(PI/XSCALE) ELSE WRITE (IPR,910) JFN STOP 'SCANFN; INVALID JFN' ENDIF ENDIF C C SET DVINT TO DETERMINE IF INTERPOLATION IS NECESSARY C - For JFN = 5,6, set DVINT to 1/12 the width of the first box. C HWHM should carry the value of the field of view half angle C (in degrees). This is converted to radians. The box width C formula is C C width = V1*(1/2 angle FOV)**2/2 C C and the degrees-to-radians formula is C C rad = deg*3.141592654/180. C C - For JFN not equal to 5 or 6, set DVINT to 1/12 the value of C HWHM. HWHM should carry the true value of the Half Width C at Half Maximum of the scanning function at this point. C IF ((JFN.EQ.5).OR.(JFN.EQ.6)) THEN DVINT = V1*(HWHM*3.141592654/180.)**2/24 ELSE DVINT = HWHM/12. ENDIF C C - For positive SAMPL, set SAMPLE equal to SAMPL (the number C of points per half width). C - For negative SAMPL, user is supplying desired DELVO C (outgoing spectral spacing). SAMPLE (the number of sample C points per half width) is set such that SAMPLE=HWHM/DELVO C (Half Width at Half Max over user input outgoing spectral C spacing), and the outgoing spectral spacing DVO will be C recalculated using HWHM and SAMPLE below. C IF (SAMPL.LT.0.) THEN SAMPLE = HWHM/(-SAMPL) ELSEIF (SAMPL.GT.0.) THEN SAMPLE = SAMPL ENDIF C C SET UP SELECTED SCANNING FUNCTION: C IF (JFN.EQ.1) CALL SHAPET
(XF) IF (JFN.EQ.2) CALL SHAPEG
(XF) IF (JFN.EQ.3) CALL SINCSQ
(XF,XSCALE) IF (JFN.EQ.4) CALL SINC
(XF,XSCALE) C IF (IUNIT.LE.0) IUNIT = IFILE IFILE = IUNIT IFILST = MAX(IFILST,1) IF (NIFILS.LE.0) NIFILS = 99 C C SKIP TO SELECTED 'FILE' C REWIND IFILE IF (IFILST.GT.1) CALL SKIPFL
(IFILST-1,IFILE,IEOF) C C READ FILE HEADER FOR SELECTED 'FILE' C 20 CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) IF (IEOF.EQ.0) GO TO 10 IDABS = IDABST C WRITE (IPR,915) XID,(YID(M),M=1,2) WRITE (IPR,920) LAYR1,LAYER WRITE (IPR,925) SECANT,PAVE,TAVE,DV,V1C,V2C WRITE (IPR,930) WBROAD,(HMOLID(M),WK(M),M=1,NMOL) C C CHECK FOR INTERPOLATION AND OPEN OUTPUT FILE IF NECESSARY C C IFILE INTERPOLATED ONTO JFILE C IF (JUNIT.LE.0) JUNIT = JFILE JFILE = JUNIT C C IF DV NOT FINE ENOUGH, FIRST INTERPOLATE C IF (DV.GT.DVINT) THEN IFLSAV = IFILE JFLSAV = JFILE IEOFSC = 1 JFILE = 77 INQUIRE (UNIT=JFILE,OPENED=OP) IF (OP) CLOSE (JFILE) SCNOUT = SCNINF OPEN (JFILE,FILE=SCNOUT,STATUS='UNKNOWN',FORM=CFORM) REWIND JFILE IBUF = 0 C C INTERPOLATE: C CALL SCNINT
(IFILE,JFILE,DVINT,JEMIT,NPTS,IBUF) C IEOFSV = IEOFSC WRITE (IPR,935) IFILE = JFILE REWIND IFILE CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) JFILE = JFLSAV ELSE IFLSAV = 0 ENDIF INQUIRE (UNIT=JFILE,OPENED=OP) IF (.NOT.OP) THEN WRITE (SCNOUT,940) CTAPE,JFILE OPEN (JFILE,FILE=SCNOUT,STATUS='UNKNOWN',FORM=CFORM) REWIND JFILE ENDIF C ISCAN = ISCHDR IF (ISCAN.LE.0.OR.XSCID.EQ.-99.) ISCAN = 0 IF (ISCHDR.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCHDR ISCHDR = ISCAN+1 JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF (JTREM.LT.0) THEN WRITE(IPR,*) ' SCANF; JTREM LT 0' STOP ' SCANF; JTREM LT 0' ENDIF WRITE (IPR,945) SCANID,IFILE,IFILST,NIFILS,JEMIT,JFN,JVAR,JABS C C JTREM=0 SCANFN CONVOLVED WITH EXPONENTIATED C ABSORPTION COEFFICIENT C JTREM=1 SCANFN CONVOLVED WITH EMISSION C JTREM=2 SCANFN CONVOLVED WITH TRANSMISSION C DVI = DV DVSAV = DVI C C Compute output spectral spacing. For JFN not 5 or 6, at this C point HWHM always contains the value of the Half Width at Half C Maximum of the scanning function, and SAMPLE always contains C the number of points per half width of the scanning function. C C For JFN = 5,6 at this point, HWHM contains the value of the C field of view half angle (in degrees), and SAMPLE contains C the ratio of the field of view half angle to the specified C output spectral spacing (the quotient of HWHM and SAMPLE C results in the circuitous calculation of the previously input C DVO). C DVO = HWHM/SAMPLE IF (JFN.EQ.0) THEN IRATIO = DVO/DVI+0.5 DVO = FLOAT(IRATIO)*DVI IF (IRATIO.LT.2) THEN WRITE (IPR,950) GO TO 10 ENDIF ENDIF C C BOUND AT THIS POINT IS THE WAVENUMBER VALUE C OF HALF THE SCANNING FUNCTION C BOUND = HWF*HWHM DV = DVO V1C = V1 V2C = V2 SCIND = JVAR+10*(JFN+10*(JEMIT)) XSCID = SCIND+0.01 XHWHM = HWHM CALL BUFOUT
(JFILE,FILHDR(1),NFHDRF) WRITE (IPR,955) HWHM,BOUND,JFILE,V1,V2,DVO NBOUND = (2.*HWF)*SAMPLE+0.01 C C NBOUND IS THE NUMBER OF SPECTRAL VALUES SPANNED C BY THE FULL SCANNING FUNCTION C C RESET BOUND BASED ON NBOUND C BOUND = FLOAT(NBOUND)*DVO/2. MAXF = NLIMF+2*NBOUND+NSHIFT C TIMRDF = 0. TIMCNV = 0. TIMPNL = 0. IEOFSC = 1 NLO = NSHIFT+1 SUMIN = 0. NHI = NLIMF+NSHIFT-1 DO 30 I = 1, MAXF N1(I) = 0. R1(I) = 0. 30 CONTINUE INIT = 0 IDATA = -1 IPANEL = -1 JFLG = -1 VFT = V1-FLOAT(NSHIFT)*DV VBOT = V1-BOUND VTOP = V2+BOUND C IF (JEMIT.EQ.0.AND.IDABS.EQ.0) BCD = HTRANS IF (JEMIT.EQ.0.AND.IDABS.EQ.-1) BCD = HABSRB IF (JEMIT.EQ.1) BCD = HRADIA IF (NPTS.GT.0) WRITE (IPR,960) BCD C 40 CALL CPUTIM
(TIME0) C IF (IEOFSC.LE.0) GO TO 60 C C READ DATA TO BE CONVOLVE FROM IFILE AND PUT INTO ARRAY S C CALL RDSCAN
(S,JTREM,IFILE,ISCAN,IPRT) C CPRT WRITE(IPR,965) IEOFSC,IDATA C CALL CPUTIM
(TIME) TIMRDF = TIMRDF+TIME-TIME0 C IF (IEOFSC.LE.0) GO TO 60 C C SHRKSC MAY SHRINK (COMPRESS) THE DATA; DVI IS MODIFIED ACCORDINGL C IF ((JFN.NE.0).AND.(JFN.NE.5).AND.(JFN.NE.6)) THEN CALL SHRKSC
(INIT,HWHM) ENDIF C 50 CONTINUE C C PERFORM THE CONVOLUTION OF XF ON S TO GIVE R1 C IF (JFN.EQ.0) THEN CALL CNVRCT
(S,HWHM,R1,XF) ELSEIF (JFN.EQ.5) THEN CALL CNVVRC
(S,HWHM,R1,XF) ELSEIF (JFN.EQ.6) THEN CALL CNVVRL
(S,HWHM,R1,XF) ELSE CALL CONVSC
(S,HWHM,R1,XF) ENDIF C CPRT WRITE(IPR,965) IEOFSC,IDATA,IPANEL C IF (IPANEL.EQ.0) GO TO 40 C 60 CONTINUE C C OUTPUT PANEL TO JFILE, NPTS VALUES OF R1 C IF (JFN.EQ.0.OR.JFN.EQ.5.OR.JFN.EQ.6) THEN CALL PNLRCT
(R1,JFILE,SUMR,NPTS) ELSE CALL PANLSC
(R1,JFILE,SUMR,NPTS) ENDIF C IF ((ISTOP.NE.1).AND.(IEOFSC.LT.0)) GO TO 60 IF ((ISTOP.NE.1).AND.(IEOFSC.GT.0)) GO TO 50 CALL CPUTIM
(TIME) WRITE (IPR,970) TIME,TIMRDF,TIMCNV,TIMPNL CALL ENDFIL
(JFILE) C SUMIN = SUMIN*DVSAV C WRITE (IPR,975) SUMIN C IF (IFLSAV.NE.0) THEN IFILE = IFLSAV IEOFSC = IEOFSV ENDIF IF (IEOFSC.EQ.1) CALL SKIPFL
(1,IFILE,IEOFSC) C IEOFT = IEOFT+1 C SUMOUT = SUMR(1) SMIN = SUMR(2) SMAX = SUMR(3) DVOSAV = SUMR(4) C SUMOUT = SUMOUT*DVOSAV WRITE (IPR,980) SUMOUT,SMIN,SMAX C IF (IEOFT.LE.NIFILS.AND.IEOFSC.LT.0) GO TO 20 C GO TO 10 C 70 CONTINUE C 80 RETURN C 900 FORMAT (3F10.3,3(3X,I2),F10.4,4(3X,I2),I5) 905 FORMAT (A8) 910 FORMAT (//,' ***** INVALID VALUE FOR JFN = ',I2,' *****',/) 915 FORMAT ('1',' **SCANFN** ',/,'0',10A8,2X,2(1X,A8,1X)) 920 FORMAT (//,' INITIAL LAYER = ',I5,' FINAL LAYER =',I5) 925 FORMAT ('0 SECANT =',F15.5,/'0 PRESS(MB) =',F12.5/'0 TEMP(K) =', * F11.2,/'0 DV(CM-1) = ',F12.8,/'0 V1(CM-1) = ',F12.6,/ * '0 V2(CM-1) = ',F12.6) 930 FORMAT ('0 COLUMN DENSITY (MOLECULES/CM**2)'//5X,'WBROAD = ', * 1PE10.3,/(5X,A6,' = ',1PE10.3)) 935 FORMAT ('0',' **SCANFN** ',/) 940 FORMAT (A4,I2.2) 945 FORMAT ('0','***',A8,'***',//6X,'INPUT FILE NUMBER =',I3, * ' ,IFILST = ',I5,' ,NIFILS = ',I5,',JEMIT =',I2, * ' ,JFN =',I2,' ,JVAR =',I2,' ,JABS =',I2) 950 FORMAT ('0',60X,'****** IRATIO LESS THAN 2, NO SCANFN ******') 955 FORMAT (1X,' HWHM OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/, * 5X,'BOUND OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/,6X, * 'OUTPUT FILE NUMBER =',I3,', V1 =',F12.5,', V2 =', * F12.5,5X,' DV OUT',F12.8) 960 FORMAT (///,'0',5X,A12,/) 965 FORMAT ('0',5X,'IEOFSC =',I3,' IDATA =',I3,' IPANEL =',I3,/) 970 FORMAT ('0',5X,'TIME =',F7.3,', READ =',F6.3,', CONV. =',F7.3, * ', PANEL =',F6.3) 975 FORMAT ('0 SUMIN =',1P,E16.9) 980 FORMAT ('0 SUMOUT =',1P,E16.9,' MIN =',E16.9,' MAX =',E16.9) C END C C -------------------------------------------------------------- C
SUBROUTINE SCANRD (DVINT,IEMIT) 4,4 C IMPLICIT REAL*8 (V) C C READ CONTROL CARD FOR SCANNING WITH WEIGHTING FUNCTIONS C COMMON S(3850),R1(5000) C character*8 XID, HMOLID, YID,SCANID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /SCSHAP/ HWFS,DXFS,NFS,NFMAXS COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SCINF/ HWHM,JEMIT,JFN,SAMPLE,SCANID,NPTS,XF(6018) COMMON /FLFORM/ CFORM C CHARACTER*8 HSCNID(0:6) CHARACTER CFORM*11,TAPE13*6,CTAPE*4 LOGICAL OP C DIMENSION FILHDR(2) DIMENSION HWJ(0:6),DXJ(0:6),NJ(0:6),NJMX(0:6),SMPLJ(0:6), * XSCAL(0:6) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(6),ISCHDR), * (FSCDID(12),XSCID) , (FSCDID(13),XHWHM), * (FSCDID(14),IDABS) , (FSCDID(16),LAYR1) C DATA HSCNID(0) / 'RECTANGL'/,HWJ(0) / 1. /, * DXJ(0) / 0.0 /,NJ(0) / 0 /,NJMX(0) / 0 /, * SMPLJ(0) / .5 /,XSCAL(0) / 0. / DATA HSCNID(1) / 'TRIANGLE'/,HWJ(1) / 2. /, * DXJ(1) / 0.02 /,NJ(1) / 101 /,NJMX(1) / 251 /, * SMPLJ(1) / 2. /,XSCAL(1) / 0. / DATA HSCNID(2) / 'GAUSS '/,HWJ(2) / 4. /, * DXJ(2) / 0.02 /,NJ(2) / 201 /,NJMX(2) / 251 /, * SMPLJ(2) / 4. /,XSCAL(2) / 0. / C C SINCSQ: 54.18 HALFWIDTHS CORRESPONDS TO 24 ZERO CROSSINGS C PI CORRESPONDS TO X=2.257609141 C DATA HSCNID(3) / 'SINCSQ '/,HWJ(3) / 54.1826 /, * DXJ(3) / 0.02 /,NJ(3) / 2710 /,NJMX(3) / 2760 /, * SMPLJ(3) / 4. /,XSCAL(3) / 1.391557377 / C C SINC: 119.33 HALFWIDTHS CORRESPONDS TO 72 ZERO CROSSINGS C PI CORRESPONDS TO X=1.657400255 C DATA HSCNID(4) / 'SINC '/,HWJ(4) / 119.332818 /, * DXJ(4) / 0.02 /,NJ(4) / 5968 /,NJMX(4) / 6018 /, * SMPLJ(4) / 4. /,XSCAL(4) / 1.89549425 / DATA HSCNID(5) / 'VRCTCENT'/,HWJ(5) / 1. /, * DXJ(5) / 0.0 /,NJ(5) / 0 /,NJMX(5) / 0 /, * SMPLJ(5) / .5 /,XSCAL(5) / 0. / DATA HSCNID(6) / 'VRCTLEFT'/,HWJ(6) / 1. /, * DXJ(6) / 0.0 /,NJ(6) / 0 /,NJMX(6) / 0 /, * SMPLJ(6) / .5 /,XSCAL(6) / 0. / C DATA TAPE13 / ' '/,CTAPE / 'TAPE'/ C PI = 2.*ASIN(1.) C C SET THE MAXIMIM NUMBER OF AVAILABLE FUNCTIONS: C NFNMAX = 6 C NLIMF = 2401 NSHIFT = 32 READ (IRD,900,END=10) HWHM,V1,V2,JEMIT,JFN,JVAR,SAMPL,NNFILE,NPTS C IF (HWHM.LE.0.) THEN WRITE(IPR,*) ' SCANRD * HWHM NEGATIVE ' STOP ' SCANRD * HWHM NEGATIVE ' ENDIF C C JEMIT=-1 SCANFN CONVOLVED WITH ABSORPTION C JEMIT=0 SCANFN CONVOLVED WITH TRANSMISSION C JEMIT=1 SCANFN CONVOLVED WITH EMISSION C JABS = 0 C C THE FOLLOWING CARDS HAVE BEEN RETRAINED C FOR POSSIBLE FUTURE CODE ENHANCEMENTS C CC IF (JEMIT.LT.0) THEN CC JABS=1 CC JEMIT=0 CC ENDIF C C JVAR=1 FOR A VARIABLE SLIT FUNCTION (NOT FOR JFN=0) C THE CODING IN CNVSCN RESULTS IN HWHM=1./ (VI-V1)**2 C HWHM IS CONSTANT FOR EACH PANEL AS PROGRAMMED C FOLLOWING VALUES INITIALIZE FOR RECTANGLE C IFN = ABS(JFN) IF (IFN.GT.NFNMAX) THEN WRITE(IPR,*)' SCANF; JFN GT LIMIT' STOP ' SCANF; JFN GT LIMIT' ENDIF C READ (HSCNID(IFN),905) SCANID C C JVAR=1 FOR A VARIABLE SLIT FUNCTION (NOT FOR JFN=0) C THE CODING IN CNVSCN RESULTS IN HWHM=1./ (VI-V1)**2 C HWHM IS CONSTANT FOR EACH PANEL AS PROGRAMMED C FOLLOWING VALUES INITIALIZE FOR RECTANGLE C HWF = HWJ(IFN) DXF = DXJ(IFN) NF = NJ(IFN) NFMAX = NJMX(IFN) SAMPLE = SMPLJ(IFN) XSCALE = XSCAL(IFN) C C Set values of HWFS, DXFS, NFS, & NFMAXS to HWF, DXF, NF, C & NFMAX for use when entering HIRAC1 between SCANRD and C SCNMRG. C HWFS = HWF DXFS = DXF NFS = NFS NFMAXS = NFMAX C C CHECK FOR NEGATIVE JFN OR NEGATIVE SAMPL C C FOR NEGATIVE JFN, USER IS SUPPLYING FIRST ZERO CROSSING FOR THE C PERIODIC FUNCTION IN HWHM. SET HWHM=(FIRST ZERO)/(PI/XSCALE) C C For JFN=5,6 user is supplying instrument field of view half angle C in degrees in HWHM. C C FOR NEGATIVE SAMPL, USER IS SUPPLYING DESIRED DELVO. C SET SAMPLE=HWHM/DELVO. C IF (JFN.LT.0) THEN JFN = ABS(JFN) IF ((JFN.EQ.3).OR.(JFN.EQ.4)) THEN HWHM = HWHM/(PI/XSCALE) ELSE WRITE (IPR,910) JFN STOP 'SCANRD; INVALID JFN' ENDIF ENDIF C IF (SAMPL.LT.0.) SAMPLE = HWHM/(-SAMPL) IF (SAMPL.GT.0.) SAMPLE = SAMPL C IF (JFN.EQ.1) CALL SHAPET
(XF) IF (JFN.EQ.2) CALL SHAPEG
(XF) IF (JFN.EQ.3) CALL SINCSQ
(XF,XSCALE) IF (JFN.EQ.4) CALL SINC
(XF,XSCALE) C IF (NNFILE.NE.NFILE.AND.NNFILE.GT.0) THEN INQUIRE (UNIT=NFILE,OPENED=OP) IF (OP) CLOSE (NFILE) NFILE = NNFILE INQUIRE (UNIT=NFILE,OPENED=OP) IF (.NOT.OP) THEN WRITE (TAPE13,915) CTAPE,NFILE OPEN (NFILE,FILE=TAPE13,STATUS='UNKNOWN',FORM=CFORM) REWIND NFILE ENDIF ENDIF C WRITE (IPR,920) SCANID,JEMIT,JFN,JVAR,SAMPL,NPTS IEMIT = JEMIT C C BOUND AT THIS POINT IS THE WAVENUMBER VALUE C OF HALF THE SCANNING FUNCTION C DVO = HWHM/SAMPLE DVINT = HWHM/12. BOUND = HWF*HWHM V1C = V1 V2C = V2 XHWHM = HWHM WRITE (IPR,925) HWHM,BOUND,NFILE,V1,V2 RETURN 10 PRINT 930 STOP C 900 FORMAT (3F10.3,3(3X,I2),F10.4,15X,2I5) 905 FORMAT (A8) 910 FORMAT (//,' ***** INVALID VALUE FOR JFN = ',I2,' *****',/) 915 FORMAT (A4,I2.2) 920 FORMAT ('1',5X,'SCANRD',5X,'***',A8,'***',/,/,' JEMIT =',I2, * ' JFN =',I2,' ,JVAR =',I2,' ,SAMPL =',F10.4,' ,NPTS =', * I5) 925 FORMAT (1X,' HWHM OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/, * 5X,'BOUND OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/,6X, * 'OUTPUT FILE NUMBER =',I3,', V1 =',F12.5,', V2 =', * F12.5) 930 FORMAT (' END OF FILE TAPE5',/,' (NOTE TAPE10 ALREADY CREATED )') C END C C -------------------------------------------------------------- C
SUBROUTINE SCNINT (IFILE,JFILE,DVINT,JEMIT,NPTS,IBUF) 5,7 C IMPLICIT REAL*8 (V) C C********************************************************************** C C INTERPOLATION FUNCTION DRIVER FOR WEIGHTING FUNCTIONS C C FOUR-POINT VERSION (MARCH 1990) C C********************************************************************** C C THE INPUT DATA WILL BE PUT INTO T(5) = S(1) WITH THE LAST C 4 POINTS OF THE PREVIOUS PANEL PUT INTO T(1 TO 4). C THIS SCHEME PERMITS 6 POINT INTERPOLATION. C C S IS NOMINALLY 2401 POINTS BUT MAY NEED TO BE EXTENDED BY C 2 POINTS TO PERMIT 4 POINT INTERPOLATION UP TO THE LAST C DATA POINT. C COMMON T(2410),R(2401) DIMENSION S(2406) EQUIVALENCE (C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WN2 ,DV ,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /INPNL/ V1I,V2I,DVI,NNI COMMON /OUTPNL/ V1J,V2J,DVJ,NNJ COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 C DIMENSION FILHDR(2),RSTAT(3) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCHDR) , (FSCDID(12),XSCID), * (FSCDID(13),XHWHM) , (FSCDID(14),IDABS), * (FSCDID(16),LAYR1) C CHARACTER*12 BCD,HTRANS,HABSRB,HRADIA C DATA HTRANS / 'TRANSMISSION'/,HABSRB / ' ABSORPTION '/, * HRADIA / ' RADIANCE '/ C C---------------------------------------------------------------------- C JEMIT=-1 INTERPOLATE ABSORPTION C JEMIT=0 INTERPOLATE TRANSMISSION C JEMIT=1 INTERPOLATE EMISSION C JEMIT=2 INTERPOLATE OPTICAL DEPTH C---------------------------------------------------------------------- C WRITE (IPR,900) CALL CPUTIM
(TIME1) TIMRDF = 0.0 TIMCNV = 0.0 TIMPNL = 0.0 C V1SAV = V1 V2SAV = V2 DVSAV = DV DVOSAV = 0. C DVO = DVINT C C I4PT = 1 FOR FOUR POINT INTERPOLATION C I4PT = 1 ICNVRT = 1 IF (DVO.LE.0.) GO TO 40 C IF (IBUF.EQ.1) REWIND IFILE REWIND JFILE C C BUFFER IN THE FILE HEADER ON UNIT (IFILE) C BUFFER OUT ON UNIT (JFILE) C IF (IBUF.EQ.1) THEN CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) IF (IEOF.EQ.0) GO TO 30 JABS = 0 IDABS = 0 IF (JEMIT.LT.0) THEN JABS = 1 JEMIT = 0 IDABS = -1 ENDIF ENDIF V1 = V1C V2 = V2C DVI = DV C C V2 IS ONLY APPROXIMATE C NUM = (((V2-V1)/DVO)+0.5) V2 = V1+FLOAT(NUM)*DVO NUM = NUM+1 WRITE (IPR,905) V1,V2,DVO,NUM,JEMIT,I4PT,IFILE,JFILE,NPTS C ISCAN = ISCHDR IF (ISCAN.LE.0.OR.XSCID.EQ.-99.) ISCAN = 0 IF (ISCHDR.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCHDR ISCHDR = ISCAN+10 V1C = V1 V2C = V2 DV = DVO C SCNID = 100*JEMIT XSCID = SCNID+0.01 C CALL BUFOUT
(JFILE,FILHDR(1),NFHDRF) C JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.2)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF (JTREM.LT.0) THEN WRITE(IPR,*) ' JTREM.LT.0 AT I07570' STOP ' JTREM.LT.0 AT I07570' ENDIF WRITE (IPR,910) IFILE,IEMIT,JEMIT,JTREM,JABS C IDATA = -1 C C NEED TO SAVE LAST IBOUND POINTS OF EACH PANEL TO ATTACH TO NEXT C IBOUND = 4 C C VBOT IS LOWEST NEEDED WAVENUMBER, VTOP IS HIGHEST C BOUND = FLOAT(IBOUND)*DV VBOT = V1-BOUND VTOP = V2+BOUND C IF (JEMIT.EQ.0.AND.IDABS.EQ.0) BCD = HTRANS IF (JEMIT.EQ.0.AND.IDABS.EQ.-1) BCD = HABSRB IF (JEMIT.EQ.1) BCD = HRADIA IF (NPTS.GT.0) WRITE (IPR,915) BCD C C ZERO OUT T(1 TO IBOUND) C DO 10 II = 1, IBOUND T(II) = 0.0 10 CONTINUE C C READ FROM IFILE UNTIL THE FIRST REQUIRED POINT IS REACHED C AND LOAD DATA INTO S C CALL RDPANL
(S,JTREM,IFILE,ISCAN,JEMIT,ICNVRT) IF (IEOFSC.LE.0) GO TO 20 C C DO INTERPOLATION C CALL INTERP
(IFILE,JFILE,I4PT,IBOUND,NPTS,JTREM,ISCAN,JEMIT, * RSTAT,ICNVRT) C CALL CPUTIM
(TIME2) CALL ENDFIL
(JFILE) C C WRITE STATISTICS C WRITE (IPR,920) RSTAT(1),RSTAT(2),RSTAT(3) TIMTOT = TIME2-TIME1 TIMCNV = TIMTOT-TIMRDF-TIMPNL WRITE (IPR,925) TIMTOT,TIMRDF,TIMCNV,TIMPNL C GO TO 30 C 20 CONTINUE WRITE (IPR,930) IFILE C 30 CONTINUE V1 = V1SAV V2 = V2SAV DV = DVSAV RETURN C 40 CONTINUE WRITE (IPR,935) DVINT C RETURN C 900 FORMAT (/,'0***SCNINT***',/) 905 FORMAT (5X,'V1=',F14.8,' V2=',F14.8,' DVO=',E14.6,' NUM=',I8,/, * 5X,'JEMIT=',I3,' I4PT=',I3,' IUNIT=',I3,' JUNIT=',I3, * ' NPTS=',I5) 910 FORMAT (5X,'INPUT FILE NUMBER =',I3,' IEMIT=',I3,' JEMIT=',I3, * ' JTREM=',I3,' JABS=',I3) 915 FORMAT (///,'0',5X,A12,/) 920 FORMAT ('0 SUMOUT =',1P,E16.9,' MIN =',E16.9,' MAX =',E16.9) 925 FORMAT (/,5X,'SCNINT TIME: TOTAL = ',F8.3,' READ = ',F8.3, * ' INTERP = ',F8.3,' WRITE = ',F8.3,/) 930 FORMAT (/,5X,'SCNINT- ERROR: EOF ON INPUT UNIT ',I4, * ' BEFORE V1 WAS REACHED',/) 935 FORMAT (/,5X,'SCNINT- ERROR: DVINT .LT. ZERO ; DVINT =',F12.4,/) C END C C -------------------------------------------------------------- C
SUBROUTINE SCNMRG (IFILE,JFILE) 5,14 C IMPLICIT REAL*8 (V) C C DRIVER FOR CONVOLVING INSTRUMENTAL SCANNING FUNCTION C WITH SPECTRUM C COMMON S(3850),R1(5000) C character*8 XID, HMOLID, YID,SCANID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SCINF/ HWHM,JEMIT,JFN,SAMPLE,SCANID,NPTS,XF(6018) COMMON /RCTSV/ JJ,SUMJ,JFLG,RNJ,NB,IPC,VLFT,VCNT,VRGT,WGTL,WGTR C DIMENSION FILHDR(2) DIMENSION SUMR(4) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCHDR) , (FSCDID(12),XSCID), * (FSCDID(13),XHWHM) , (FSCDID(14),IDABS), * (FSCDID(16),LAYR1) C CHARACTER*12 BCD,HTRANS,HABSRB,HRADIA C DATA HTRANS / 'TRANSMISSION'/,HABSRB / ' ABSORPTION '/, * HRADIA / ' RADIANCE '/ C C IUNIT INPUT FILE C JUNIT OUTPUT FILE C IUNIT = IFILE JUNIT = JFILE NREN = 0 IPRT = 1 IDABS = 0 IF (JEMIT.LT.0) THEN JABS = 1 JEMIT = 0 IDABS = -1 ENDIF IDABST = IDABS IFILST = 1 NIFILS = 9999 C SUMOUT = 0. SMIN = 999999. SMAX = -99999. DVOSAV = 0. SUMR(1) = SUMOUT SUMR(2) = SMIN SUMR(3) = SMAX SUMR(4) = DVOSAV NSHIFT = 32 C REWIND IUNIT CALL BUFIN
(IUNIT,IEOF,FILHDR(1),NFHDRF) IF (IEOF.EQ.0) GO TO 50 C DVSAV = DV IDABS = IDABST C WRITE (IPR,900) XID,(YID(M),M=1,2) WRITE (IPR,905) LAYR1,LAYER WRITE (IPR,910) SECANT,PAVE,TAVE,DV,V1C,V2C WRITE (IPR,915) WBROAD,(HMOLID(M),WK(M),M=1,NMOL) C ISCAN = ISCHDR IF (ISCAN.LE.0.OR.XSCID.EQ.-99.) ISCAN = 0 IF (ISCHDR.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCHDR ISCHDR = ISCAN+1 JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 C IF (JTREM.LT.0) THEN WRITE(IPR,*) ' SCANF; JTREM LT 0' STOP ' SCANF; JTREM LT 0' ENDIF C WRITE (IPR,920) SCANID,IUNIT,IFILST,NIFILS,JEMIT,JFN,JVAR,JABS C C JTREM=0 SCANFN CONVOLVED WITH EXPONENTIATED C ABSORPTION COEFFICIENT C JTREM=1 SCANFN CONVOLVED WITH EMISSION C JTREM=2 SCANFN CONVOLVED WITH TRANSMISSION C DVI = DV DVO = HWHM/SAMPLE C C BOUND AT THIS POINT IS THE WAVENUMBER VALUE C OF HALF THE SCANNING FUNCTION C BOUND = HWF*HWHM DV = DVO V1C = V1 V2C = V2 SCIND = JVAR+10*(JFN+10*(JEMIT)) XSCID = SCIND+0.01 XHWHM = HWHM CALL BUFOUT
(JUNIT,FILHDR(1),NFHDRF) WRITE (IPR,925) HWHM,BOUND,JUNIT,V1,V2,DVO NBOUND = (2.*HWF)*SAMPLE+0.01 C C BOUND AT THIS POINT IS THE WAVENUMBER VALUE OF THE C FULL SCANNING FUNCTION C BOUND = FLOAT(NBOUND)*DVO/2. MAXF = NLIMF+2*NBOUND+NSHIFT C TIMRDF = 0. TIMCNV = 0. TIMPNL = 0. IEOFSC = 1 NLO = NSHIFT+1 SUMIN = 0. NHI = NLIMF+NSHIFT-1 DO 10 I = 1, MAXF R1(I) = 0. 10 CONTINUE INIT = 0 IDATA = -1 IPANEL = -1 JFLG = -1 VFT = V1-FLOAT(NSHIFT)*DV VBOT = V1-BOUND VTOP = V2+BOUND C IF (JEMIT.EQ.0.AND.IDABS.EQ.0) BCD = HTRANS IF (JEMIT.EQ.0.AND.IDABS.EQ.-1) BCD = HABSRB IF (JEMIT.EQ.1) BCD = HRADIA IF (NPTS.GT.0) WRITE (IPR,930) BCD 20 CALL CPUTIM
(TIME0) IF (IEOFSC.LE.0) GO TO 40 CALL RDSCAN
(S,JTREM,IUNIT,ISCAN,IPRT) C CPRT WRITE(IPR,935) IEOFSC,IDATA C CALL CPUTIM
(TIME) TIMRDF = TIMRDF+TIME-TIME0 C IF (IEOFSC.LE.0) GO TO 40 IF (JFN.NE.0) CALL SHRKSC
(INIT,HWHM) C C SHRKSC MAY SHRINK (COMPRESS) THE DATA; C DVI IS MODIFIED ACCORDINGLY C 30 CONTINUE IF (JFN.EQ.0) THEN CALL CNVRCT
(S,HWHM,R1,XF) ELSEIF (JFN.EQ.5) THEN CALL CNVVRC
(S,HWHM,R1,XF) ELSEIF (JFN.EQ.6) THEN CALL CNVVRL
(S,HWHM,R1,XF) ELSE CALL CONVSC
(S,HWHM,R1,XF) ENDIF C CPRT WRITE(IPR,935) IEOFSC,IDATA,IPANEL C IF (IPANEL.EQ.0) GO TO 20 C 40 CONTINUE IF (JFN.EQ.0.OR.JFN.EQ.5.OR.JFN.EQ.6) THEN CALL PNLRCT
(R1,JUNIT,SUMR,NPTS) ELSE CALL PANLSC
(R1,JUNIT,SUMR,NPTS) ENDIF IF ((ISTOP.NE.1).AND.(IEOFSC.GT.0)) GO TO 30 CALL CPUTIM
(TIME) WRITE (IPR,940) TIME,TIMRDF,TIMCNV,TIMPNL C SUMIN = SUMIN*DVSAV C WRITE (IPR,945) SUMIN C IF (IEOFSC.EQ.1) CALL SKIPFL
(1,IUNIT,IEOFSC) C IEOFT = IEOFT+1 C C SUMOUT = SUMR(1) SMIN = SUMR(2) SMAX = SUMR(3) DVOSAV = SUMR(4) C SUMOUT = SUMOUT*DVOSAV WRITE (IPR,950) SUMOUT,SMIN,SMAX C 50 RETURN C 900 FORMAT ('0',' **SCNMRG** ',/,'0',10A8,2X,2(1X,A8,1X)) 905 FORMAT (//,' INITIAL LAYER = ',I5,' FINAL LAYER =',I5) 910 FORMAT ('0 SECANT =',F15.5,/'0 PRESS(MB) =',F12.5/'0 TEMP(K) =', * F11.2,/'0 DV(CM-1) = ',F12.8,/'0 V1(CM-1) = ',F12.6,/, * '0 V2(CM-1) = ',F12.6) 915 FORMAT ('0 COLUMN DENSITY (MOLECULES/CM**2)'//5X,'WBROAD = ', * 1PE10.3,/(5X,A6,' = ',1PE10.3)) 920 FORMAT ('0','***',A8,'***',//6X,'INPUT FILE NUMBER =',I3, * ' ,IFILST = ',I5,' ,NIFILS = ',I5,',JEMIT =',I2, * ' ,JFN =',I2,' ,JVAR =',I2,' ,JABS =',I2) 925 FORMAT (1X,' HWHM OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/, * 5X,'BOUND OF INSTRUMENT FUNCTION =',F12.8,' CM-1'/,6X, * 'OUTPUT FILE NUMBER =',I3,', V1 =',F12.5,', V2 =', * F12.5,5X,' DV OUT',F12.8) 930 FORMAT (///,'0',5X,A12,/) 935 FORMAT ('0',5X,'IEOFSC =',I3,' IDATA =',I3,' IPANEL =',I3,/) 940 FORMAT ('0',5X,'TIME =',F7.3,', READ =',F6.3,', CONV. =',F7.3, * ', PANEL =',F6.3) 945 FORMAT ('0 SUMIN =',1P,E16.9) 950 FORMAT ('0 SUMOUT =',1P,E16.9,' MIN =',E16.9,' MAX =',E16.9) C END C C -------------------------------------------------------------- C
SUBROUTINE SHRKSC (INIT,HWHM) 3,2 C IMPLICIT REAL*8 (V) C C THIS SUBROUTINE COMPRESSES (SHRINKS) THE INPUT TO THE CONVOLUTION C ROUTINE FOR THE SCANNING FUNCTION TO ACCELERATE THE CALCULATION C COMMON S(3850),R1(5000),SS(200) COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NLIM COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION JRATIO(24) C DATA JRATIO / 1,2,3,4,5,6,8,10,12,15,16,20,24,25,30,32,40,48,50, * 60,75,80,100,120 / C CALL CPUTIM
(TIME0) NLIMS = NLIM IF (NREN.GT.0) THEN DO 10 I = 1, NREN S(I) = SS(I) 10 CONTINUE ENDIF NREN = 0 IF (INIT.EQ.0) THEN DVSC = HWHM/12. IRATSH = DVSC/DVI+0.5 DO 20 I = 2, 24 IF (JRATIO(I).GT.IRATSH) THEN IRATSH = JRATIO(I-1) GO TO 30 ENDIF 20 CONTINUE 30 IF (IRATSH.GT.JRATIO(24)) IRATSH = JRATIO(24) IF (IRATSH.LE.1) RETURN DVSC = FLOAT(IRATSH)*DVI V1SHFT = FLOAT(IRATSH-1)*DVI/2. WRITE (IPR,900) IRATSH SRATIO = IRATSH IRATM1 = IRATSH-1 INIT = 1 ENDIF IF (IRATSH.LE.1) RETURN NREN = NLIM-(NLIM/IRATSH)*IRATSH C CPRT WRITE(IPR,905) V1I,V1SHFT,DVSC,NREN C V1I = V1I+V1SHFT IMIN = 1 IMAX = NLIM-IRATM1-NREN C K = 0 DO 50 I = IMIN, IMAX, IRATSH SUMK = 0. JHI = I+IRATM1 K = K+1 DO 40 J = I, JHI SUMK = SUMK+S(J) 40 CONTINUE S(K) = SUMK/SRATIO 50 CONTINUE C V2I = V1I+DVSC*FLOAT(K-1) NLIM = K DVI = DVSC ILO = ((VBOT-V1I)/DVI)+1.5 ILO = MAX(ILO,1) IHI = ((VTOP-V1I)/DVI)+1.5 IHI = MIN(IHI,NLIM) C CPRT WRITE(IPR,910) ILO,IHI C IF (NREN.GT.0) THEN DO 60 I = 1, NREN II = NLIMS-NREN+I SS(I) = S(II) 60 CONTINUE ENDIF CALL CPUTIM
(TIME) TIMCNV = TIMCNV+TIME-TIME0 C RETURN C 900 FORMAT (' SHRINK RATIO = ',I5) 905 FORMAT (' V1I =',F10.3,' V1SHFT =',F10.3,' DVSC =',F12.5, C ' NREN =',I4) 910 FORMAT (' ILO =',I4,' IHI =',I4) C END C C -------------------------------------------------------------- C
SUBROUTINE SHAPET (XF) 2 C C SUBROUTINE SHAPET SETS UP THE TRIANGULAR SCANNING FUNCTION C COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION XF(*) C XTRIAN(X) = 1.-0.5*X DO 10 I = 1, NFMAX XF(I) = 0. 10 CONTINUE XF(1) = 0.5 SUM = XF(1) DO 20 I = 2, NF X = FLOAT(I-1)*DXF XF(I) = 0.5*XTRIAN(X) SUM = SUM+2.*XF(I) 20 CONTINUE SUM = SUM*DXF C CPRT WRITE(IPR,900) NF,DXF,SUM C RETURN C 900 FORMAT ('0',5X,'NF =',I5,', DXF =',F7.5,', SUM =',F18.15) C END C C -------------------------------------------------------------- C
SUBROUTINE RDSCAN (S,JTREM,IFILE,ISCAN,IPRT) 5,8 C IMPLICIT REAL*8 (V) C C SUBROUTINE RDSCAN INPUTS PANELS FROM IFILE RESULTING C FROM THE LBLRTM CALCULATION FOR CONVOLUTION C WITH THE SELECTED SCANNING FUNCTION C COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /RSCAN/ VMIN,VMAX,DVI,NNI COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION DUMMY(2),PNLHDR(2) DIMENSION S(*) C EQUIVALENCE (PNLHDR(1),VMIN) C CPRT WRITE(IPR,900) VBOT,VTOP C IDUM1 = 0 IDUM2 = 0 ISCANT = MOD(ISCAN,1000) IF(JTREM.EQ.0.AND.ISCANT.GE.1) GO TO 60 IF (ISCAN.LT.1) THEN IF (JTREM.EQ.1) IDUM1 = 1 IF (JTREM.EQ.2) IDUM2 = 1 ENDIF 10 CALL BUFIN
(IFILE,IEOFSC,PNLHDR(1),NPHDRF) IF (IEOFSC.LE.0) GO TO 50 NLOW = NREN+1 IF (NREN.LE.0) NLOW = 1 VMIN = VMIN-(NLOW-1)*DVI NNB = NNI NNI = NNI+NLOW-1 IF ((IDATA.EQ.-1).AND.(VMIN.GT.VBOT).AND.(IPRT.EQ.1)) * WRITE (IPR,905) IDATA = 0 IF (VMAX.GE.VBOT) GO TO 20 IF (IDUM2.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) IF (IDUM1.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),1) GO TO 10 20 IF (JTREM.EQ.0) THEN CALL BUFIN
(IFILE,IEOFSC,S(NLOW),NNB) DO 30 I = NLOW, NNI SI = S(I) S(I) = 1. IF (SI.GT.1.0E-04) THEN IF (SI.LT.ARGMIN) THEN S(I) = EXP(-SI) ELSE S(I) = EXPMIN ENDIF ELSE S(I) = 1.-SI ENDIF 30 CONTINUE ELSE C IF (IDUM2.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),1) CALL BUFIN
(IFILE,IEOFSC,S(NLOW),NNB) IF (IDUM1.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),1) ENDIF C CPRT WRITE(IPR,910) VMIN,VMAX,DVI,NLOW,NNI C IF (JABS.NE.0) THEN DO 40 I = NLOW, NNI S(I) = 1.-S(I) 40 CONTINUE ENDIF ILO = 1 IHI = NNI DIF = (VMIN-VBOT)/DVI IF (DIF.LT.0.) ILO = -DIF+1.5 IF (VMAX.LE.VTOP) RETURN IHI = (VTOP-VMIN)/DVI+1.5 IDATA = 1 RETURN 50 IF (IPRT.EQ.1) WRITE (IPR,915) RETURN C 60 WRITE(IPR,920) JTREM,ISCAN RETURN C 900 FORMAT ('0',/,'0 READING SPECTRUM, VBOT =',F10.3,', VTOP =', * F10.3) 905 FORMAT ('0 ********** FIRST VALUE USED ON IFILE; CHECK IFILE ') 910 FORMAT (10X,'VMIN =',F10.3,', VMAX =',F10.3,', DVI=',F7.5,', * NLOW=',I4,', NNI=',I4) 915 FORMAT ('0 ********** END OF FILE ENCOUNTERED; CHECK IFILE ') 920 FORMAT(' ERROR IN INPUT',/,' JTREM =',I2,' ISCAN=',I5) C END C C -------------------------------------------------------------- C
SUBROUTINE CONVSC (S,HWHMV1,R1,XF) 3,2 C IMPLICIT REAL*8 (V) C C SUBROUTINE CONVSC PERFORMS THE CONVOLUTION WITH THE SELECTED C SCANNING FUNCTION C COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION S(*),R1(*),XF(*) C CALL CPUTIM
(TIME0) IF (ILO.GT.IHI) GO TO 60 RATIO = DVI/DVO DVODX = DVO/DXF HWBND = HWF/DVO ZINT = ((V1I-VFT)/DVO) HWHM = HWHMV1 ITST = -1 C DO 50 I = ILO, IHI IF ( IF (I.LT.ITST) GO TO 20 ITST = 9999 IF (JVAR.EQ.0) GO TO 10 VI = FLOAT(I-1)*DVI+V1I HWHM = HWHMV1*(VI/V1)**2 ITST = I+IFIX(1./DVI) 10 CONTINUE ZSLOPE = DVODX/HWHM ZBOUND = HWBND*HWHM XNORM = DVI/HWHM C CPRT WRITE(IPR,900) VI,HWHM C 20 CONTINUE ZPEAK = FLOAT(I-1)*RATIO+ZINT JMAX = ZPEAK+ZBOUND+1.5 IF (JMAX.LE.MAXF) GO TO 30 ILAST = I-1 GO TO 60 C 30 JMIN = ZPEAK-ZBOUND+1.5 JMIN = MAX(JMIN,1) SUMIN = SUMIN+S(I) SI = XNORM*S(I) ZF = (FLOAT(JMIN-1)-ZPEAK)*ZSLOPE DO 40 JF = JMIN, JMAX IT = ABS(ZF)+1.5 R1(JF) = R1(JF)+SI*XF(IT) ZF = ZF+ZSLOPE 40 CONTINUE C 50 CONTINUE ILAST = IHI IPANEL = IDATA GO TO 70 C 60 IPANEL = 1 70 CALL CPUTIM
(TIME) TIMCNV = TIMCNV+TIME-TIME0 ILO = ILAST+1 C RETURN C 900 FORMAT ('0 AVE PANEL WAVENUMBER = ',F12.4,5X,'HWHM = ',F10.5) C END C C -------------------------------------------------------------- C
SUBROUTINE PANLSC (R1,JFILE,SUMR,NPTS) 2,4 C IMPLICIT REAL*8 (V) C C SUBROUTINE PANLSC OUTPUTS THE RESULTS OF THE SCANNING FUNCTION C TO FILE JFILE C COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /SPANEL/ V1P,V2P,DV,NLIM DIMENSION PNLHDR(2) DIMENSION R1(*),SUMR(*) C EQUIVALENCE (PNLHDR(1),V1P) C CALL CPUTIM
(TIME0) C SUMOUT = SUMR(1) SMIN = SUMR(2) SMAX = SUMR(3) DV = DVO ISTOP = 0 NNHI = (V2-VFT)/DV+1.5 IF (NHI.GE.NNHI) ISTOP = 1 IF (ISTOP.EQ.1) NHI = NNHI NLIM = NHI-NLO+1 V1P = VFT+FLOAT(NLO-1)*DV V2P = VFT+FLOAT(NHI-1)*DV C C V1P IS FIRST FREQ OF PANEL C V2P IS LAST FREQ OF PANEL C CALL BUFOUT
(JFILE,PNLHDR(1),NPHDRF) CALL BUFOUT
(JFILE,R1(NLO),NLIM) VFT = VFT+FLOAT(NLIMF-1)*DV IF (NPTS.GT.0) THEN WRITE (IPR,900) V1P,V2P,DVO,NLIM WRITE (IPR,905) NNPTS = NPTS IF (NPTS.GT.(NLIM/2)+1) NNPTS = NLIM/2+1 IJLIM = NLIM-NNPTS+1 DO 10 IJ = 1, NNPTS IK = IJ+IJLIM-1 VI = V1P+FLOAT(IJ-1)*DVO VK = V1P+FLOAT(IK-1)*DVO JJ = NLO+IJ-1 KK = NLO+IK-1 WRITE (IPR,910) IJ,VI,R1(JJ),IK,VK,R1(KK) 10 CONTINUE ENDIF NLIMHI = NLIM+NLO-1 DO 20 I = NLO, NLIMHI SMIN = MIN(SMIN,R1(I)) SMAX = MAX(SMAX,R1(I)) SUMOUT = SUMOUT+R1(I) 20 CONTINUE IF (ISTOP.EQ.1) GO TO 50 DO 30 J = NLIMF, MAXF R1(J-NLIMF+1) = R1(J) 30 CONTINUE DO 40 J = MAXF-NLIMF+2, MAXF R1(J) = 0. 40 CONTINUE NLO = NSHIFT+1 50 SUMR(1) = SUMOUT SUMR(2) = SMIN SUMR(3) = SMAX SUMR(4) = DVO CALL CPUTIM
(TIME) TIMPNL = TIMPNL+TIME-TIME0 C RETURN C 900 FORMAT ('0 V1P =',F12.5,' V2P =',F12.5,' DVOUT =',F12.8,' NLIM =' * ,I10) 905 FORMAT ('0') 910 FORMAT (I5,0PF12.5,1PE12.5,I15,0PF12.5,1PE12.5) C END C C -------------------------------------------------------------- C
SUBROUTINE PNLRCT (R1,JFILE,SUMR,NPTS) 2,4 IMPLICIT REAL*8 (V) C C SUBROUTINE PNLRCT OUTPUTS THE RESULTS OF THE SCANNING FUNCTION C TO FILE JFILE C COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LBL4FL,LNGTH4 COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /SPANEL/ V1P,V2P,DV,NLIM DIMENSION PNLHDR(2) DIMENSION R1(*),SUMR(*) EQUIVALENCE (PNLHDR(1),V1P) C CALL CPUTIM
(TIME0) C SUMOUT = SUMR(1) SMIN = SUMR(2) SMAX = SUMR(3) DV = DVO ISTOP = 0 NNHI = (V2-VFT)/DV+1.5 IF (NHI.GE.NNHI) ISTOP = 1 IF (ISTOP.EQ.1) NHI = NNHI NLIM = NHI-NLO+1 C V1P = VFT+FLOAT(NLO-1)*DV V2P = VFT+FLOAT(NHI-1)*DV C C V1P IS FIRST FREQ OF PANEL C V2P IS LAST FREQ OF PANEL C CALL BUFOUT
(JFILE,PNLHDR(1),NPHDRF) CALL BUFOUT
(JFILE,R1(NLO),NLIM) VFT = VFT+FLOAT(NLIMF-1)*DV IF (NPTS.GT.0) THEN WRITE (IPR,900) V1P,V2P,DVO,NLIM WRITE (IPR,905) NNPTS = NPTS IF (NPTS.GT.(NLIM/2)+1) NNPTS = NLIM/2+1 IJLIM = NLIM-NNPTS+1 DO 10 IJ = 1, NNPTS IK = IJ+IJLIM-1 VI = V1P+FLOAT(IJ-1)*DVO VK = V1P+FLOAT(IK-1)*DVO JJ = NLO+IJ-1 KK = NLO+IK-1 WRITE (IPR,910) IJ,VI,R1(JJ),IK,VK,R1(KK) 10 CONTINUE ENDIF NLIMHI = NLIM+NLO-1 DO 20 I = NLO, NLIMHI SMIN = MIN(SMIN,R1(I)) SMAX = MAX(SMAX,R1(I)) SUMOUT = SUMOUT+R1(I) 20 CONTINUE C IF (ISTOP.EQ.1) GO TO 50 DO 30 J = NLIMF, MAXF R1(J-NLIMF+1) = R1(J) 30 CONTINUE DO 40 J = MAXF-NLIMF+2, MAXF R1(J) = 0. 40 CONTINUE NLO = NSHIFT+1 50 SUMR(1) = SUMOUT IPANEL = -1 SUMR(2) = SMIN SUMR(3) = SMAX SUMR(4) = DVO CALL CPUTIM
(TIME) TIMPNL = TIMPNL+TIME-TIME0 RETURN C 900 FORMAT('0 V1P =',F12.5,' V2P =',F12.5,' DVOUT =',F12.8, * ' NLIM =',I10) 905 FORMAT('0') 910 FORMAT(I5,0PF12.5,1PE12.5,I15,0PF12.5,1PE12.5) C END C C -------------------------------------------------------------- C
SUBROUTINE CNVRCT (S,HWHM,R1,XF) 2,1 IMPLICIT REAL*8 (V) I C C SUBROUTINE CNVRCT PERFORMS THE CONVOLUTION WITH AN ALTERNATE C RECTANGULAR SCANNING FUNCTION (ADJACENT BOXES OF ONE SIZE, C EQUAL TO 2*HWHM) C C THE CONVOLUTION IS A WEIGHTED SUM THAT PROPERLY WEIGHS THE INPUT C POINTS WITH THE FRACTION OF THAT POINT THAT COMPLETELY FALLS WITHIN C THE OUTPUT BOX. OUTPUT RADIANCE IS THE SUMMED RADIANCE DIVIDED C BY THE SUM OF THE WEIGHTS. C COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LBL4FL,LNGTH4 COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /RCTSV/ JN,SUMJ,JFLG,RNJ,NB,IPC,VLFT,VCNT,VRGT,WGTL,WGTR DIMENSION S(*),R1(*),XF(*) C C LBLRTM flags C JFLG = -1: first time through; increment NB when box is full C JFLG = 0: subsequent calls:increment NB when box full C JFLG = 1: out of data, return for more; do not increment NB C IDATA =-1: first time through; or, need more data C IDATA = 0: data present C IDATA = 1: no data present C IPANEL=-1: first time through; or, after panel written C IPANEL= 0: panel not full C IPANEL= 1: panel is full C CALL CPUTIM
(TIME0) RATIO = DVO/DVI C C During first call or if entering after writing a panel, C initialize: SUMJ (radiance sum), and C RNJ (accumulator for number of input points in C current box, i.e. the sum of the weights) C JN (box counter from 1 at VFT) C During first call only, C initialize: NB (box counter from 1 at V1), C IPC (output panel counter). C IF (IPANEL.EQ.-1) THEN SUMJ = 0. RNJ = 0. JN = NLO IF (JFLG.EQ.-1) THEN NB = 1 IPC = 1 ENDIF ENDIF C C Check that number of points in current panel, NNI, is correct. C NNIV2 = (V2I-V1I)/DVI+1.0001 IF (NNI.GT.NNIV2) NNI = NNIV2 C C Top of loop over NB boxes C 10 IF (NLO.LE.NHI) THEN VCNT = V1+(NB-1)*DVO IF (VCNT.GT.V2) THEN IPANEL = 1 RETURN ENDIF C VLFT = VCNT-HWHM VRGT = VCNT+HWHM C C Find lbl panel indices for points which fall within current C box. C RL = (VLFT-V1I)/DVI+1 RR = (VRGT-V1I)/DVI+1 C IL = INT(RL+0.5) IH = INT(RR+0.5) C C Calculate weight for each end point, inner points weighted C as 1. NEP is the number of endpoints in use. C VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = (VLBLR-VLFT)/DVI VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = (VRGT-VLBLL)/DVI NEP = 2 C C Set flag if last data point on current input panel reached C IF (IH.GT.NNI) THEN IH = NNI JFLG = 1 C C If retrieving next panel while box sum is in progress, then C use weight of 1. for temp. right endpoint at IH = NNI = 2400 C calculate partial sum below, then return. If only one point C is included in this sum (IL = IH = NNI), use weight of 0 C for right point, and add only left endpoint to sum. VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = 1. IF (IL.EQ.IH) THEN WGTR = 0. NEP = 1 ENDIF ENDIF C C If returning with new panel to partially summed box, then set C weight for temporary left endpoint to 1. If it's the last C point going into the box, then count it as final right endpoint, C and use weight of 0 for left point (since IL = IH = 1). C IF (IL.LE.1) THEN IL = 1 VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = 1. IF (IL.GE.IH) THEN WGTL = 0. NEP = 1 ENDIF ENDIF C C If retrieving next panel while box sum is not progress, then C check that left edge of current output box is beyond last data on C panel (IL.GT.NNI), if so, go back for new panel without summing C IF (JFLG.EQ.1.AND.IDATA.EQ.0.AND.IL.GT.NNI) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C If last point on current input panel is reached, and there is C no more data to retrieve, then return C IF (JFLG.EQ.1.AND.IDATA.EQ.1) RETURN C C Compute sum for current box number NB, for all points but C the end points C DO 20 I = IL+1, IH-1 SUMJ = SUMJ+S(I) 20 CONTINUE C C Add weighted end points to sum SUMJ = SUMJ+S(IL)*WGTL SUMJ = SUMJ+S(IH)*WGTR C C Define sum of the weights, where all inner points are weighted C as 1, and the end points are weighted with the fraction that C occurs within the box. C RNJ = RNJ+(IH-IL+1-NEP)+WGTL+WGTR C C If out of data on current input panel, go back for more; C partial SUMJ, current NB, and JFLG are saved in COMMON RCTSV C IF (JFLG.EQ.1.AND.IDATA.EQ.0) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C IPANEL=IDATA C SUMIN = SUMIN+SUMJ C C Compute average radiance for completed box C R1(JN) = SUMJ/RNJ C ILPR = IH+1 C C Increment current box counters, initialize SUMJ and RNJ JN = JN+1 SUMJ = 0. RNJ = 0. C C Output panel when number of boxes, NB, reaches a multiple of C 2400, using then incrementing current output panel number, IPC. C IF (NB.EQ.IPC*(NHI-NLO+1)) THEN IPANEL = 1 IPC = IPC+1 NB = NB+1 RETURN ENDIF C C Increment NB NB = NB+1 C Go back to top of loop over NB boxes C GO TO 10 ENDIF C RETURN END C C -------------------------------------------------------------- C
SUBROUTINE CNVVRC (S,AFOV,R1,XF) 2,1 IMPLICIT REAL*8 (V) C C SUBROUTINE CNVVRC PERFORMS THE CONVOLUTION WITH A RECTANGULAR C SCANNING FUNCTION OF VARIABLE SIZE, WHERE THE BOX SIZE IS C WAVENUMBER DEPENDENT. V1, V2, AND DVO ARE USED TO DEFINE THE C CENTER OF THE OUTPUT BOXES. BOXES OVERLAP WHERE NECESSARY TO C INSURE A CONSTANT DVO. C C BFOV is used to determine the resolution (box size), which is C spectrally variable. C C AFOV is passed in from calls to CNVVRC from SCANFN and SCNMRG C as HWHM, since the value of HWHM on Record 8.1 on TAPE5 holds C the place of the half angle of the instrument field of view in C degrees. C C BOX WIDTH EQUALS V*B**2/2, AND THE SHIFT EQUALS HALF THE BOX WIDTH C V*(1-B**2/4), WHERE B IS THE HALF ANGLE OF THE INSTRUMENT FIELD C OF VIEW IN RADIANS. C C THE CONVOLUTION IS A WEIGHTED SUM THAT PROPERLY WEIGHS THE INPUT C POINTS WITH THE FRACTION OF THAT POINT THAT COMPLETELY FALLS WITHIN C THE OUTPUT BOX. OUTPUT RADIANCE IS THE SUMMED RADIANCE DIVIDED C BY THE SUM OF THE WEIGHTS. C COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LBL4FL,LNGTH4 COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /RCTSV/ JN,SUMJ,JFLG,RNJ,NB,IPC,VLFT,VCNT,VRGT,WGTL,WGTR DIMENSION S(*),R1(*),XF(*) C C LBLRTM flags C JFLG = -1: first time through; increment NB when box is full C JFLG = 0: subsequent calls:increment NB when box full C JFLG = 1: out of data, return for more; do not increment NB C IDATA =-1: first time through; or, need more data C IDATA = 0: data present C IDATA = 1: no data present C IPANEL=-1: first time through; or, after panel written C IPANEL= 0: panel not full C IPANEL= 1: panel is full C CALL CPUTIM
(TIME0) C C Convert AFOV to BFOV, the half angle of the instrument field of C view in radians. (For IRIS-D, AFOV equals 2.5 degrees) BFOV = AFOV*3.141592654/180. C RATIO = DVO/DVI C C During first call or if entering after writing a panel, C initialize: SUMJ (radiance sum), and C RNJ (accumulator for number of input points in C current box, i.e. the sum of the weights) C JN (box counter from 1 at VFT) C During first call only, C initialize: NB (box counter from 1 at V1), C IPC (output panel counter). C IF (IPANEL.EQ.-1) THEN SUMJ = 0. RNJ = 0. JN = NLO IF (JFLG.EQ.-1) THEN NB = 1 IPC = 1 ENDIF ENDIF C C Check that number of points in current panel, NNI, is correct. C NNIV2 = (V2I-V1I)/DVI+1.0001 IF (NNI.GT.NNIV2) NNI = NNIV2 C C Top of loop over NB boxes C 10 IF (NLO.LE.NHI) THEN C For current box find wavenumber at center and left/right edges. C For first box, VCNT equals V1. When current box exceeds V2, C then exit. VCNT = V1+(NB-1)*DVO IF (VCNT.GT.V2) THEN IPANEL = 1 RETURN ENDIF VLFT = VCNT*(1-BFOV**2/4) VRGT = VCNT*(1+BFOV**2/4) C Find lbl panel indices for points which fall within current box. RL = (VLFT-V1I)/DVI+1 RR = (VRGT-V1I)/DVI+1 C IL = INT(RL+0.5) IH = INT(RR+0.5) C C Calculate weight for each end point, inner points weighted as 1. C NEP is the number of endpoints in use. C VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = (VLBLR-VLFT)/DVI VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = (VRGT-VLBLL)/DVI NEP = 2 C C Set flag if last data point on current input panel reached C IF (IH.GT.NNI) THEN IH = NNI JFLG = 1 C C If retrieving next panel while box sum is in progress, then C use weight of 1. for temp. right endpoint at IH = NNI = 2400 C calculate partial sum below, then return. If only one point C is included in this sum (IL = IH = NNI), use weight of 0 C for right point, and add only left endpoint to sum. VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = 1. IF (IL.EQ.IH) THEN WGTR = 0. NEP = 1 ENDIF ENDIF C C If returning with new panel to partially summed box, then set C weight for temporary left endpoint to 1. If it's the last C point going into the box, then count it as final right endpoint, C and use weight of 0 for left point (since IL = IH = 1). C IF (IL.LE.1) THEN IL = 1 VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = 1. IF (IL.GE.IH) THEN WGTL = 0. NEP = 1 ENDIF ENDIF C C If retrieving next panel while box sum is not progress, then C check that left edge of current output box is beyond last data on C panel (IL.GT.NNI), if so, go back for new panel without summing C IF (JFLG.EQ.1.AND.IDATA.EQ.0.AND.IL.GT.NNI) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C If last point on current input panel is reached, and there is C no more data to retrieve, then return C IF (JFLG.EQ.1.AND.IDATA.EQ.1) RETURN C C Compute sum for current box number NB, for all points but C the end points C DO 20 I = IL+1, IH-1 SUMJ = SUMJ+S(I) 20 CONTINUE C C Add weighted end points to sum SUMJ = SUMJ+S(IL)*WGTL SUMJ = SUMJ+S(IH)*WGTR C C Define sum of the weights, where all inner points are weighted C as 1, and the end points are weighted with the fraction that C occurs within the box. C RNJ = RNJ+(IH-IL+1-NEP)+WGTL+WGTR C C If out of data on current input panel, go back for more; C partial SUMJ, current NB, and JFLG are saved in COMMON RCTSV C IF (JFLG.EQ.1.AND.IDATA.EQ.0) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C IPANEL=IDATA C SUMIN = SUMIN+SUMJ C C C Compute average radiance for completed box C R1(JN) = SUMJ/RNJ C C Increment current box counters, initialize SUMJ and RNJ JN = JN+1 SUMJ = 0. RNJ = 0. C C Output panel when number of boxes, NB, reaches a multiple of C 2400, using then incrementing current output panel number, IPC. C IF (NB.EQ.IPC*(NHI-NLO+1)) THEN IPANEL = 1 IPC = IPC+1 NB = NB+1 RETURN ENDIF C Increment NB NB = NB+1 C C Go back to top of loop over NB boxes C GO TO 10 ENDIF C RETURN END C C -------------------------------------------------------------- C
SUBROUTINE CNVVRL (S,AFOV,R1,XF) 2,1 IMPLICIT REAL*8 (V) C C SUBROUTINE CNVVRL PERFORMS THE CONVOLUTION WITH A RECTANGULAR C SCANNING FUNCTION OF VARIABLE SIZE, WHERE THE BOX SIZE IS C WAVENUMBER DEPENDANT. V1, V2, AND DVO ARE USED TO DEFINE THE C LEFT EDGE OF THE OUTPUT BOXES. BOXES OVERLAP WHERE NECESSARY C TO INSURE A CONSTANT DVO. C C BFOV is used to determine the resolution (box size), which is C spectrally variable. C C AFOV is passed in from calls to CNVVRL from SCANFN and SCNMRG C as HWHM, since the value of HWHM on Record 8.1 on TAPE5 holds C the place of the half angle of the instrument field of view in C degrees. C C BOX WIDTH EQUALS V*B**2/2, AND THE SHIFT EQUALS HALF THE BOX WIDTH C V*(1-B**2/4), WHERE B IS THE HALF ANGLE OF THE INSTRUMENT FIELD C OF VIEW IN RADIANS. C C THE CONVOLUTION IS A WEIGHTED SUM THAT PROPERLY WEIGHS THE INPUT C POINTS WITH THE FRACTION OF THAT POINT THAT COMPLETELY FALLS WITHIN C THE OUTPUT BOX. OUTPUT RADIANCE IS THE SUMMED RADIANCE DIVIDED C BY THE SUM OF THE WEIGHTS. C COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LBL4FL,LNGTH4 COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /RCTSV/ JN,SUMJ,JFLG,RNJ,NB,IPC,VLFT,VCNT,VRGT,WGTL,WGTR DIMENSION S(*),R1(*),XF(*) C C LBLRTM flags C JFLG = -1: first time through; increment NB when box is full C JFLG = 0: subsequent calls:increment NB when box full C JFLG = 1: out of data, return for more; do not increment NB C IDATA =-1: first time through; or, need more data C IDATA = 0: data present C IDATA = 1: no data present C IPANEL=-1: first time through; or, after panel written C IPANEL= 0: panel not full C IPANEL= 1: panel is full C CALL CPUTIM
(TIME0) C C Convert AFOV to BFOV, the half angle of the instrument field of C view in radians. (For IRIS-D, AFOV equals 2.5 degrees) BFOV = AFOV*3.141592654/180. RATIO = DVO/DVI C C During first call or if entering after writing a panel, C initialize: SUMJ (radiance sum), and C RNJ (accumulator for number of input points in C current box, i.e. the sum of the weights) C JN (box counter from 1 at VFT) C During first call only, C initialize: NB (box counter from 1 at V1), C IPC (output panel counter). C IF (IPANEL.EQ.-1) THEN SUMJ = 0. RNJ = 0. JN = NLO IF (JFLG.EQ.-1) THEN NB = 1 IPC = 1 ENDIF ENDIF C C Check that number of points in current panel, NNI, is correct. C NNIV2 = (V2I-V1I)/DVI+1.0001 IF (NNI.GT.NNIV2) NNI = NNIV2 C C Top of loop over NB boxes C 10 IF (NLO.LE.NHI) THEN C C For current box find wavenumber at the left and right edges. C For first box, VLFT equals V1. When current box exceeds V2, C then exit. C VLFT = V1+(NB-1)*DVO IF (VLFT.GT.V2) THEN IPANEL = 1 RETURN ENDIF C VCNT = VLFT*(1+BFOV**2/4) VRGT = VLFT*(1+BFOV**2/2) C C Find lbl panel indices for points which fall within current box. C RL = (VLFT-V1I)/DVI+1 RR = (VRGT-V1I)/DVI+1 C IL = INT(RL+0.5) IH = INT(RR+0.5) C C Calculate weight for each end point, inner points weighted as 1, C NEP is the number of endpoints in use. C VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = (VLBLR-VLFT)/DVI VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = (VRGT-VLBLL)/DVI NEP = 2 C C Set flag if last data point on current input panel reached C IF (IH.GT.NNI) THEN IH = NNI JFLG = 1 C C If retrieving next panel while box sum is in progress, then C use weight of 1. for temp. right endpoint at IH = NNI, C calculate partial sum below, then return. If only one point C is included in this sum (IL = IH = NNI), use weight of 0 C for right point, and add only left endpoint to sum. VLBLL = (V1I+(IH-1)*DVI)-DVI/2. WGTR = 1. IF (IL.EQ.IH) THEN WGTR = 0. NEP = 1 ENDIF ENDIF C C If returning with new panel to partially summed box, then set C weight for temporary left endpoint to 1. If it's the last C point going into the box, then count it as final right endpoint, C and use weight of 0 for left point (since IL = IH = 1). C IF (IL.LE.1) THEN IL = 1 VLBLR = (V1I+(IL-1)*DVI)+DVI/2. WGTL = 1. IF (IL.GE.IH) THEN WGTL = 0. NEP = 1 ENDIF ENDIF C C If retrieving next panel while box sum is not in progress, then C check that left edge of current output box is beyond last data on C panel (IL.GT.NNI), if so, go back for new panel without summing C IF (JFLG.EQ.1.AND.IDATA.EQ.0.AND.IL.GT.NNI) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C If last point on current input panel is reached, and there is C no more data to retrieve, then return C IF (JFLG.EQ.1.AND.IDATA.EQ.1) RETURN C C Compute sum for current box number NB, using a weight of 1.0 C for all points but the end points, which use WGTL and WGTR C DO 20 I = IL+1, IH-1 SUMJ = SUMJ+S(I) 20 CONTINUE C C Add weighted end points to sum SUMJ = SUMJ+S(IL)*WGTL SUMJ = SUMJ+S(IH)*WGTR C C Define sum of the weights, where all inner points are weighted C as 1, and the end points are weighted with the fraction that C occurs within the box. C RNJ = RNJ+(IH-IL+1-NEP)+WGTL+WGTR C C If out of data on current input panel, go back for more; C partial SUMJ, current NB, and JFLG are saved in COMMON RCTSV C IF (JFLG.EQ.1.AND.IDATA.EQ.0) THEN IPANEL = 0 JFLG = 0 RETURN ENDIF C C IPANEL=IDATA C SUMIN = SUMIN+SUMJ C C Compute average radiance for completed box C R1(JN) = SUMJ/RNJ C C Increment current box counters, initialize SUMJ and RNJ JN = JN+1 SUMJ = 0. RNJ = 0. C C Output panel when number of boxes, NB, reaches a multiple of C 2400, using then incrementing current output panel number, IPC. C IF (NB.EQ.IPC*(NHI-NLO+1)) THEN IPANEL = 1 IPC = IPC+1 NB = NB+1 RETURN ENDIF C C Increment NB NB = NB+1 C C Go back to top of loop over NB boxes C GO TO 10 C ENDIF C RETURN END C C -------------------------------------------------------------- C
SUBROUTINE SINCSQ (XF,XSCALE) 2 C C SUBROUTINE SINCSQ SETS UP THE SINCSQ SCANNING FUNCTION C COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION XF(*) C C DATA XSCALE / 1.391557377 / C XSINC2(X) = (SIN(X)/X)**2 PI = 2.*ASIN(1.) C C PI CORRESPONDS TO X=2.257609141 C XNORM = XSCALE/PI DO 10 I = 1, NFMAX XF(I) = 0. 10 CONTINUE XF(1) = XNORM SUM = XF(1) DO 20 I = 2, NF X = FLOAT(I-1)*DXF XF(I) = XNORM*XSINC2(X*XSCALE) SUM = SUM+2.*XF(I) 20 CONTINUE SUM = SUM*DXF C CPRT WRITE(IPR,900) NF,DXF,SUM C RETURN C 900 FORMAT ('0',5X,'NF =',I5,', DXF =',F7.5,', SUM =',F18.15) C END C C -------------------------------------------------------------- C
SUBROUTINE SINC (XF,XSCALE) 2 C C SUBROUTINE SINC SETS UP THE SINC SCANNING FUNCTION C COMMON /CMSHAP/ HWF,DXF,NF,NFMAX,HWF2,DXF2,NX2,N2MAX, * HWF3,DXF3,NX3,N3MAX COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION XF(*) C C DATA XSCALE / 1.89549425 / C XSINC(X) = (SIN(X)/X) PI = 2.*ASIN(1.) C C PI CORRESPONDS TO X=1.657400255 C XNORM = XSCALE/PI DO 10 I = 1, NFMAX XF(I) = 0. 10 CONTINUE XF(1) = XNORM SUM = XF(1) DO 20 I = 2, NF X = FLOAT(I-1)*DXF XF(I) = XNORM*XSINC(X*XSCALE) SUM = SUM+2.*XF(I) 20 CONTINUE SUM = SUM*DXF C CPRT WRITE(IPR,900) NF,DXF,SUM C RETURN C 900 FORMAT ('0',5X,'NF =',I5,', DXF =',F7.5,', SUM =',F18.15) C END C C -------------------------------------------------------------- C
SUBROUTINE INTRPL (IFILE,JFILE) 1,8 C IMPLICIT REAL*8 (V) C C********************************************************************** C C INTERPOLATION FUNCTION DRIVER: FOUR POINT VERSION C C A.E.R. INC. (MARCH 1990) C C********************************************************************** C C THE INPUT DATA WILL BE PUT INTO T(5) WITH THE LAST C 4 POINTS OF THE PREVIOUS PANEL PUT INTO T(1 TO 4). C THIS SCHEME PERMITS 6 POINT INTERPOLATION. C C S IS NOMINALLY 2401 POINTS BUT MAY NEED TO BE EXTENDED BY TWO (2) C POINTS TO PERMIT 4 POINT INTERPOLATION UP TO THE LAST DATA POINT. C COMMON T(2410),R(2401) DIMENSION S(2406) EQUIVALENCE (C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ C COMMON /HVERSN/ HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG, * HVROPR,HVRPST,HVRPLT,HVRTST,HVRUTL,HVRXMR COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WN2 ,DV ,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /INPNL/ V1I,V2I,DVI,NNI COMMON /OUTPNL/ V1J,V2J,DVJ,NNJ COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /FLFORM/ CFORM C DIMENSION FILHDR(2),RSTAT(3) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCHDR) , (FSCDID(12),XSCID), * (FSCDID(13),XHWHM) , (FSCDID(14),IDABS), * (FSCDID(16),LAYR1) C CHARACTER*12 BCD,HTRANS,HABSRB,HRADIA CHARACTER CFORM*11,SCNOUT*6,CTAPE*4 CHARACTER*8 HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG,HVROPR, * HVRPLT,HVRPST,HVRTST,HVRUTL,HVRXMR LOGICAL OP C DATA HTRANS / 'TRANSMISSION'/,HABSRB / ' ABSORPTION '/, * HRADIA / ' RADIANCE '/ DATA SCNOUT / ' '/,CTAPE / 'TAPE'/ C C---------------------------------------------------------------------- C JEMIT=-1 INTERPOLATE ABSORPTION C JEMIT=0 INTERPOLATE TRANSMISSION C JEMIT=1 INTERPOLATE EMISSION C JEMIT=2 INTERPOLATE OPTICAL DEPTH C---------------------------------------------------------------------- C C C ASSIGN SCCS VERSION NUMBER TO MODULE C HVRPST = '5.11' C 10 CONTINUE CALL CPUTIM
(TIME1) TIMRDF = 0.0 TIMCNV = 0.0 TIMPNL = 0.0 C READ (IRD,900,END=50) DVO,V1,V2,JEMIT,I4PT,IUNIT,IFILST,NIFILS, * JUNIT,NPTS IF (DVO.LE.0.) GO TO 40 C C V2 IS ONLY APPROXIMATE C NUM = (((V2-V1)/DVO)+0.5) V2 = V1+FLOAT(NUM)*DVO NUM = NUM+1 WRITE (IPR,905) V1,V2,DVO,NUM,JEMIT,I4PT,IUNIT,IFILST,JUNIT,NPTS C C SET INPUT(IFILE), OUTPUT(JFILE) UNITS. C IF (IUNIT.LE.0) IUNIT = IFILE IFILE = IUNIT INQUIRE (UNIT=IFILE,OPENED=OP) IF (.NOT.OP) THEN WRITE (SCNOUT,910) CTAPE,IFILE OPEN (IFILE,FILE=SCNOUT,STATUS='UNKNOWN',FORM=CFORM) ENDIF IFILST = MAX(IFILST,1) IF (NIFILS.LE.0) NIFILS = 99 IF (JUNIT.LE.0) JUNIT = JFILE JFILE = JUNIT INQUIRE (UNIT=JFILE,OPENED=OP) IF (.NOT.OP) THEN WRITE (SCNOUT,910) CTAPE,JFILE OPEN (JFILE,FILE=SCNOUT,STATUS='UNKNOWN',FORM=CFORM) REWIND JFILE ENDIF C REWIND IFILE IF (IFILST.GT.1) CALL SKIPFL
(IFILST-1,IFILE,IEOF) C C BUFFER IN THE FILE HEADER ON UNIT (IFILE) C BUFFER OUT ON UNIT (JFILE) C CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) IF (IEOF.EQ.0) GO TO 10 C WRITE (IPR,915) XID,(YID(M),M=1,2) WRITE (IPR,920) LAYR1,LAYER WRITE (IPR,925) SECANT,PAVE,TAVE,DV,V1C,V2C WRITE (IPR,930) WN2,(HMOLID(M),WK(M),M=1,NMOL) C JABS = 0 IDABS = 0 IF (JEMIT.LT.0) THEN JABS = 1 JEMIT = 0 IDABS = -1 ENDIF C ISCAN = ISCHDR IF (ISCAN.LE.0.OR.XSCID.EQ.-99.) ISCAN = 0 IF (ISCHDR.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCHDR ISCHDR = ISCAN+10 V1C = V1 V2C = V2 DV = DVO C SCNID = 100*JEMIT XSCID = SCNID+0.01 C CALL BUFOUT
(JFILE,FILHDR(1),NFHDRF) C ICNVRT = 0 JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.2)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF (JTREM.LT.0) STOP 71048 WRITE (IPR,935) IEMIT,JEMIT,JTREM WRITE (IPR,940) IFILE,IFILST,NIFILS,JEMIT,JABS C IDATA = -1 C C NEED TO SAVE LAST IBOUND POINTS OF EACH PANEL TO ATTACH TO NEXT C IBOUND = 4 C C VBOT IS LOWEST NEEDED WAVENUMBER, VTOP IS HIGHEST C BOUND = FLOAT(IBOUND)*DV VBOT = V1-BOUND VTOP = V2+BOUND C IF (JEMIT.EQ.0.AND.IDABS.EQ.0) BCD = HTRANS IF (JEMIT.EQ.0.AND.IDABS.EQ.-1) BCD = HABSRB IF (JEMIT.EQ.1) BCD = HRADIA IF (NPTS.GT.0) WRITE (IPR,945) BCD C C ZERO OUT T(1 TO IBOUND) C DO 20 II = 1, IBOUND T(II) = 0.0 20 CONTINUE C C READ FROM IFILE UNTIL THE FIRST REQUIRED POINT IS REACHED C AND LOAD DATA INTO S C CALL RDPANL
(S,JTREM,IFILE,ISCAN,JEMIT,ICNRT) IF (IEOFSC.LE.0) GO TO 30 C C DO INTERPOLATION C CALL INTERP
(IFILE,JFILE,I4PT,IBOUND,NPTS,JTREM,ISCAN,JEMIT, * RSTAT,ICNVRT) C CALL CPUTIM
(TIME2) CALL ENDFIL
(JFILE) C C WRITE STATISTICS C WRITE (IPR,950) RSTAT(1),RSTAT(2),RSTAT(3) TIMTOT = TIME2-TIME1 TIMCNV = TIMTOT-TIMRDF-TIMPNL WRITE (IPR,955) TIMTOT,TIMRDF,TIMCNV,TIMPNL GO TO 10 C 30 CONTINUE WRITE (IPR,960) IFILE C GO TO 10 C 40 CONTINUE WRITE (IPR,965) C RETURN C 50 CONTINUE WRITE (IPR,970) IRD STOP ' INTRPL' C 900 FORMAT (3F10.3,2I5,15X,5I5) 905 FORMAT (5X,'V1=',F14.8,' V2=',F14.8,' DVO=',E14.6,' NUM=',I8,/5X, * 'JEMIT=',I3,' I4PT=',I3,' IUNIT=',I3,' IFILST=',I3,/5X, * 'JUNIT=',I3,' NPTS=',I5) 910 FORMAT (A4,I2.2) 915 FORMAT (//,' ***INTRPL***',/,'0',10A8,2X,2(1X,A8,1X)) 920 FORMAT (//,' INITIAL LAYER = ',I5,' FINAL LAYER =',I5) 925 FORMAT (' SECANT =',F15.5,/' PRESS(MB) =',F12.5/' TEMP(K) =', * F11.2,/' DV(CM-1) = ',F12.8,/,' V1(CM-1) = ',F12.6,/, * ' V2(CM-1) = ',F12.6) 930 FORMAT (/,' COLUMN DENSITY (MOLECULES/CM**2)',/,5X,'WBROAD = ', * 1PE10.3,/(5X,A6,' = ',1PE10.3)) 935 FORMAT (5X,'IEMIT=',I5,' JEMIT=',I5,' JTREM=',I5) 940 FORMAT (5X,'INPUT FILE NUMBER =',I3,' ,IFILST = ',I3, * ' ,NIFILS = ',I3,',JEMIT =',I2,' ,JABS =',I2) 945 FORMAT (///,'0',5X,A12,/) 950 FORMAT (/,5X,'SUMOUT =',1P,E16.9,' MIN =',E16.9,' MAX =',E16.9) 955 FORMAT (/,5X,'TIME: TOTAL = ',F8.3,' READ = ',F8.3,' INTERP = ', * F8.3,' WRITE = ',F8.3) 960 FORMAT (/,5X,'INTRPL- ERROR: EOF ON INPUT UNIT ',I4, * ' BEFORE V1 WAS REACHED') 965 FORMAT (/,5X,'END OF INTERPOLATION REQUESTS') 970 FORMAT (/,5X,' INTRP - ERROR: EOF ON STANDARD INPUT, UNIT = ',I4) C END C C -------------------------------------------------------------- C
SUBROUTINE RDPANL (S,JTREM,IFILE,ISCAN,JEMIT,ICNVRT) 4,10 C IMPLICIT REAL*8 (V) C C SUBROUTINE RDPANL INPUTS PANELS FROM IFILE RESULTING FROM THE C LBLRTM CALCULATION C COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /INPNL/ VMIN,VMAX,DVI,NNI COMMON /RPANL/ V1P,V2P,DVP,NLIMP COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 DIMENSION DUMMY(2),PNLHDR(2) DIMENSION S(*) C EQUIVALENCE (PNLHDR(1),V1P) C C---------------------------------------------------------------------- C CALL CPUTIM
(TIME1) IDUM1 = 0 IDUM2 = 0 ISCANT = MOD(ISCAN,1000) IF (JTREM.EQ.0.AND.ISCANT.GE.1) GO TO 70 IF (ISCAN.LT.1) THEN IF (JTREM.EQ.1) IDUM1 = 1 IF (JTREM.EQ.2) IDUM2 = 1 ENDIF 10 CALL BUFIN
(IFILE,IEOFSC,PNLHDR(1),NPHDRF) IF (IEOFSC.LE.0) THEN WRITE (IPR,900) GO TO 60 ELSE VMIN = V1P VMAX = V2P DVI = DVP NNI = NLIMP ENDIF C IF ((IDATA.EQ.-1).AND.(VMIN.GT.VBOT)) WRITE (IPR,905) IDATA = 0 IF (VMAX.GE.VBOT) GO TO 20 IF (IDUM2.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) IF (IDUM1.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) GO TO 10 C 20 IF (JTREM.EQ.0) THEN CALL BUFIN
(IFILE,IEOFSC,S(1),NNI) IF (JEMIT.NE.2.AND.ICNVRT.EQ.0) THEN DO 30 I = 1, NNI SI = S(I) S(I) = 1. IF (SI.GT.0.) THEN IF (SI.GE.ARGMIN) THEN S(I) = EXPMIN ELSE S(I) = EXP(-SI) ENDIF ENDIF 30 CONTINUE ENDIF ELSE C IF (IDUM2.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) CALL BUFIN
(IFILE,IEOFSC,S(1),NNI) IF (IDUM1.EQ.1) CALL BUFIN
(IFILE,IEOFSC,DUMMY(1),2) ENDIF C IF (JABS.EQ.1.AND.ICNVRT.EQ.0) THEN DO 40 I = 1, NNI S(I) = 1.-S(I) 40 CONTINUE ENDIF IF (JEMIT.EQ.2.AND.ICNVRT.EQ.0) THEN DO 50 I = 1, NNI S(I) = -ALOG( 50 CONTINUE ENDIF C VMIN = VMIN-4.0*DVI NNI = NNI+4 ILO = 1 IHI = NNI DIF = (VMIN-VBOT)/DVI IF (DIF.LT.0.) ILO = -DIF+1.5 IF (VMAX.GT.VTOP) THEN IHI = (VTOP-VMIN)/DVI+1.5 IDATA = 1 ENDIF C 60 CALL CPUTIM
(TIME2) TIMRDF = TIMRDF+TIME2-TIME1 C RETURN C 70 WRITE (IPR,910) JTREM,ISCAN C RETURN C 900 FORMAT ('0 ********** END OF FILE ENCOUNTERED; CHECK IFILE ') 905 FORMAT ('0 ********** FIRST VALUE USED ON IFILE; CHECK IFILE ') 910 FORMAT (' ERROR IN INPUT',/,' JTREM =',I2,' ISCAN=',I5) C END C C -------------------------------------------------------------- C
SUBROUTINE OTPANL (R1,JFILE,NPTS) 3,4 C IMPLICIT REAL*8 (V) C C SUBROUTINE OTPANL OUTPUTS THE RESULTS OF THE INTERPOLATION ON C TO FILE JFILE C COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /OUTPNL/ V1P,V2P,DVP,NLIM DIMENSION PNLHDR(2),R1(*) C EQUIVALENCE (PNLHDR(1),V1P) C C---------------------------------------------------------------------- C CALL CPUTIM
(TIME1) IF (NLIM.LE.0) GO TO 20 C CALL BUFOUT
(JFILE,PNLHDR(1),NPHDRF) CALL BUFOUT
(JFILE,R1(1),NLIM) C IF (NPTS.GT.0) THEN WRITE (IPR,900) V1P,V2P,DVP,NLIM WRITE (IPR,905) NNPTS = NPTS IF (NPTS.GT.(NLIM/2)+1) NNPTS = NLIM/2+1 IJLIM = NLIM-NNPTS+1 DO 10 IJ = 1, NNPTS IK = IJ+IJLIM-1 VIJ = V1P+FLOAT(IJ-1)*DVP VIK = V1P+FLOAT(IK-1)*DVP WRITE (IPR,910) IJ,VIJ,R1(IJ),IK,VIK,R1(IK) 10 CONTINUE ENDIF C 20 CALL CPUTIM
(TIME2) TIMPNL = TIMPNL+TIME2-TIME1 C RETURN C 900 FORMAT ('0 V1P =',F12.5,' V2P =',F12.5,' DVP =',F12.8,' NLIM =', * I8) 905 FORMAT ('0') 910 FORMAT (I5,0PF12.5,1PE12.5,I15,0PF12.5,1PE12.5) C END C C -------------------------------------------------------------- C
SUBROUTINE INTERP (IFILE,JFILE,I4PT,IBOUND,NPTS,JTREM,ISCAN, 3,6 * JEMIT,RSTAT,ICNVRT) C IMPLICIT REAL*8 (V) C C********************************************************************** C THIS SUBROUTINE INTERPOLATES THE SPECTRAL DATA FROM IFILE, ON C A GRID DEFINED BY V1I,V2I,DVI, AND NNI, ONTO THE GRID FROM C V1 TO V2 WITH A DV OF DVO AND WRITES THE RESULT TO JFILE. C THE INTERPOLATION IS EITHER LINEAR (I4PT = 0) OR 4 POINT (I4PT C = 1). IBOUND IS THE NUMBER OF POINTS NEEDED FROM THE PREVIOUS C INPUT PANEL, WHILE NPTS IS THE NUMBER OF POINTS TO BE PRINTED C AT THE BEGINNING AND END OF EACH OUTPUT PANEL. JTREM,ISCAN, AND C JEMIT RELATE TO THE INPUT DATA AND ARE NEEDED BY RDPANL. C RSTAT(3) RETURNS THE SUM, MIN, AND MAX OF THE INTERPOLATED C SPECTRUM. C********************************************************************** C C THE INPUT DATA WILL BE PUT INTO T(5) WITH THE LAST C IBOUND POINTS OF THE PREVIOUS PANEL PUT INTO T(1-4) C COMMON T(2410),R(2401) DIMENSION S(2406) EQUIVALENCE (C COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /INPNL/ V1I,V2I,DVI,NNI COMMON /OUTPNL/ V1J,V2J,DVJ,NNJ DIMENSION C1(0:202),C2(0:202),C3(0:202),C4(0:202),RSTAT(3) C DATA NUMCOF / 201 / C CALL CPUTIM
(TIME1) C C SET UP FOUR POINT INTERPOLATION COEFICIENTS FOR P FOR 201 C POINTS BETWEEN 0 AND 1.0, with an extra point at each end C IF (I4PT.NE.0) THEN XNUMCF = FLOAT(NUMCOF) DO 10 IP = 0, NUMCOF+1 P = (FLOAT(IP)-1.0)/(XNUMCF-1.0) PP = P**2 C1(IP) = -P/2.0*(1-P)**2 C2(IP) = 1.0-PP*(3.0-2.0*P)+PP/2.0*(1.0-P) C3(IP) = PP*(3.0-2.0*P)+P/2.0*(1.0-P)**2 C4(IP) = -PP/2*(1.0-P) 10 CONTINUE ENDIF C C V1 IS REQUESTED LOWER V, VBOT = V1-VBOUND. VBOUND ALLOWS FOR C 4 POINT INTERPOLATION OF THE FIRST DATA POINT. C THE FIRST PANEL OF DATA IS STORED IN T, STARTING AT T(5) C WITH A CORRESPONDING WAVENUMBER V1I. C T(1-4) ARE USED TO STORE THE LAST IBOUND POINTS FROM THE C PREVIOUS PANEL, BUT ARE ZEROED OUT FOR THE FIRST PANEL. C THE INTERPOLATED POINTS ARE STORED IN THE ARRAY R. C THE INDEX I REFERS TO THE INPUT POINTS, J TO THE OUTPUT POINTS. C P VARIES FROM 0 TO 1 AND IS THE FRACTIONAL DISTANCE OF THE C CURRENT OUTPUT WAVENUMBER VJ TO THE NEXT LOWEST INPUT WAVENUMBER C RELATIVE TO THE INPUT DV: P = (VJ-VI(II))/DVI C INRANG IS 0 IF VJ IS WITHIN THE RANGE OF THE INPUT DATA, -1 C IF VJ IS LESS THAN THE INPUT DATA, AND 1 IF IT IS GREATER C C INITIALIZE THE VARIABLES C V1J = V1 DVJ = DVO VRATIO = DVJ/DVI VJ = V1J C RMIN = 1.0E15 RMAX = -1.0 RSUM = 0.0 C C EXTRAPOLATE DOWN TO V1I-DVI SO THAT THE POINT I=4 IS AVAILABLE C FOR THE FIRST PANEL. THIS ALLOWS 4 POINT INTERPOLATION BETWEEN C V1I AND V1I+DVI C T(4) = 2.0*T(5)-T(6) C C LOOP OVER THE OUTPUT PANELS C C IF V1J .LT. V1I, THEN ZERO FILL UP TO V1I. C 20 IF (V1J.LT.V1I) THEN J1 = 1 J2 = MIN(INT((V1I-V1J)/DVJ)+1,2400) C C FILL IN C DO 30 J = J1, J2 R(J) = 0.0 30 CONTINUE C V2J = V1J+DVJ*(J2-1) NNJ = J2 CALL OTPANL
(R,JFILE,NPTS) V1J = V2J+DVJ VJ = V1J C GO TO 20 ENDIF C C AT THIS POINT, VJ >= V1I C 40 CONTINUE C C I INDEXES THE LARGEST VI .LE. VJ C AND AT THIS POINT SHOULD .GE. 1. C I = (VJ-V1I)/DVI+1.00001 IF (I.LT.1) THEN WRITE (IPR,*) ' INTERP-ERROR: I SHOULD >= 1, IS ',I ENDIF VI = V1I+DVI*FLOAT(I-1) C C P IS INCREMENTED BY ADDING DVJ/DVI BUT WILL BE REINITIALIZED C HERE FOR EACH OUTPUT PANEL TO AVOID THE ACCUMULATION OF C TRUNCATION ERRORS C P = (VJ-VI)/DVI C J1 = INT((VJ-V1J)/DVJ+1.001) J2 = MIN(INT((V2-V1J)/DVJ+1.001),INT((V2I-DVI-V1J)/DVJ+1.),2400) C C LOOP OVER A SINGLE OUTPUT PANEL C IF (I4PT.GT.0) THEN C C 4 POINT INTERPOLATION C DO 50 J = J1, J2 C C PERFORM INTERPOLATION C IP = P*XNUMCF+1.00001 R(J) = C1(IP)*T(I-1)+C2(IP)*T(I)+C3(IP)*T(I+1)+ * C4(IP)*T(I+2) C C ACCUMULATE STATISTICS C RMIN = MIN(RMIN,R(J)) RMAX = MAX(RMAX,R(J)) RSUM = RSUM+R(J) C C INCREMENT P AND I C P = P+VRATIO IF (P.GE.1.0) THEN I = I+P P = P-FLOAT(INT(P)) ENDIF C 50 CONTINUE C ELSE C C LINEAR INTERPOLATION C DO 60 J = J1, J2 C C PERFORM INTERPOLATION C R(J) = T(I)*(1.0-P)+T(I+1)*P C C ACCUMULATE STATISTICS C RMIN = MIN(RMIN,R(J)) RMAX = MAX(RMAX,R(J)) RSUM = RSUM+R(J) C C INCREMENT P AND I C P = P+VRATIO IF (P.GE.1.0) THEN I = I+P P = P-FLOAT(INT(P)) ENDIF 60 CONTINUE C ENDIF C C VJ IS THE FREQUENCY OF THE NEXT OUTPUT POINT (NOT THE LAST C POINT IS THE CURRENT PANEL) C VJ = V1J+DVJ*J2 C C IF THE OUTPUT PANEL IS FULL OR IF V2 REACHED, C WRITE OUT THE PANEL C IF (J2.GE.2400.OR.VJ.GE.V2) THEN NNJ = J2 V2J = V1J+DVJ*(J2-1) CALL OTPANL
(R,JFILE,NPTS) V1J = V2J+DVJ J2 = 0 ENDIF C C IF REACHED V2, THEN FINISH C IF (VJ.GE.V2) GO TO 100 C C IF THE INPUT FILE REACHED AN EOF, THEN ZERO FILL TO END C IF (IEOFSC.LE.0) GO TO 80 C C IF THE DATA FROM CURRENT INPUT PANEL IS EXHAUSTED, GET MORE C IF (I.GE.NNI-2) THEN C C SHIFT THE LAST IBOUND POINTS DOWN TO T(1-4) C DO 70 II = 1, IBOUND T(II) = T(II+NNI-IBOUND) 70 CONTINUE C C GET THE NEXT PANEL OF DATA AND RESET I C CALL RDPANL
(S,JTREM,IFILE,ISCAN,JEMIT,ICNVRT) IF (IEOFSC.LE.0) THEN C C IF EOF ON INPUT FILE, THEN EXTRAPOLATE OUT TWO MORE C POINTS BEYOND I=NNI SO THAT 4 POINT INTERPOLATION CAN C BE PERFORMED UP TO VJ=V2I. (ACTUALLY, ONLY T(NNI+1) NEED C BE EXTRAPOLATED, T(NNI+2) NEED ONLY BE DEFINED.) C EXTEND THE INPUT PANEL BY ONE POINT AND LOOP AROUND THE C INTERPOLATION ONE LAST TIME C T(NNI+1) = 2.0*T(NNI)-T(NNI-1) T(NNI+2) = 0.0 V2I = V2I+DVI ENDIF ENDIF C C LOOP BACK C GO TO 40 C 80 CONTINUE J1 = J2+1 J2 = MIN(INT((V2-V1J)/DVJ+1.0001),2400) C DO 90 J = J1, J2 R(J) = 0.0 90 CONTINUE VJ = V1J+DVJ*J2 C C IF THE OUTPUT PANEL IS FULL OR IF V2 REACHED, C WRITE OUT THE PANEL C IF (J2.GE.2400.OR.VJ.GE.V2) THEN NNJ = J2 V2J = V1J+DVJ*(J2-1) CALL OTPANL
(R,JFILE,NPTS) V1J = V2J+DVJ J2 = 0 ENDIF C C IF REACHED V2, THEN FINISH C IF (VJ.LT.V2) GO TO 80 C 100 CONTINUE C RSTAT(1) = RSUM*DVJ RSTAT(2) = RMIN RSTAT(3) = RMAX C CALL CPUTIM
(TIME2) TIMCNV = TIMCNV+TIME2-TIME1 C RETURN C END C C -------------------------------------------------------------- C
SUBROUTINE FLTRFN (IFILE) 1,9 C C NFLTPT sets the maximum number of points in the incoming filter C PARAMETER (NFLTPT = 3001) C IMPLICIT REAL*8 (V) C COMMON S(4650),R1(5750) C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ logical op C COMMON /HVERSN/ HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG, * HVROPR,HVRPST,HVRPLT,HVRTST,HVRUTL,HVRXMR COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DVC,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /COMFLT/ V1F,V2F,DVF,NPTS,NPTF,JEMIT,IUNIT,IFILST,NIFILS, * HEDDR(9),XF(NFLTPT),SUMFLT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /FLFORM/ CFORM DIMENSION FILHDR(2) CHARACTER*80 CVAR CHARACTER*11 CFORM CHARACTER*8 HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG,HVROPR, * HVRPLT,HVRPST,HVRTST,HVRUTL,HVRXMR character ctape*4,fltinf*7,fltout*7 integer*4 itest,itest2 C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCAN) , (FSCDID(7),IPLOT), * (FSCDID(8),IPATHL) , (FSCDID(9),JRAD), * (FSCDID(12),SCNID) , (FSCDID(13),HWHM), * (FSCDID(16),LAYR1) DATA FLTINF / ' '/,FLTOUT / ' ' /, * CTAPE / 'TAPE'/ data itest / 0 /, itest2 / 0 / save itest save itest2 C C C ASSIGN SCCS VERSION NUMBER TO MODULE C HVRPST = '5.11' C NLIMF = 2401 NREN = 0 IPRT = 1 NSHIFT = 0 10 READ (IRD,900) V1F,DVF,NPTF,JEMIT,IUNIT,IFILST,NIFILS,junit,HEDDR C C Test to ensure NPTF is less than NFLTPT, the maximum number C of filter points allowed C IF (NPTF.GT.NFLTPT) THEN WRITE(IPR,*) 'FLTRFN: NPTS > NFLTPT limit', NFLTPT STOP 'FLTRFN: NPTS > NFLTPT limit' ENDIF C JABS = 0 IF (JEMIT.GE.0) GO TO 20 JEMIT = 0 JABS = 1 20 IEOFT = 1 IF (IUNIT.LE.0) IUNIT = IFILE IFILE = IUNIT IF (NIFILS.LE.0) NIFILS = 99 C IF (V1F.LT.0) RETURN c c DVF < 0 option flags V1F value to be the center frequency c Check that there NPTF is odd (to ensure a center frequency), c save center frequency value, and reset V1F to endpoint value. if (DVF.lt.0.) then dvf = abs(dvf) if (mod((nptf-1),2).ne.0) then write(*,*) 'Use of V1F as center frequency requires odd * number of points' write(ipr,*) 'Use of V1F as center frequency requires odd * number of points, stopping in FLTFRN' stop 'FLTRFN' endif V1F_center = V1F nptf_half = (abs(nptf)-1)/2 V1F = V1F_center - DVF*float(nptf_half) write(ipr,*) ' ``````````````````````````````' write(ipr,*) ' Use of V1F as center frequency:' write(ipr,*) ' V center = ',V1F_center write(ipr,*) ' V1F = ',V1F write(ipr,*) " ''''''''''''''''''''''''''''''" endif C WRITE (IPR,905) REWIND IFILE inquire(ifile,opened=op) IF (.NOT.OP) THEN WRITE (FLTINF,970) CTAPE,IFILE OPEN (IFILE,FILE=FLTINF,STATUS='UNKNOWN',FORM=CFORM) REWIND IFILE ENDIF JFILE = junit if (jfile.ne.0) then inquire(jfile,opened=op) if (itest.eq.0) then if (op) close(jfile) itest = 1 fltout = 'FLT_OUT' OPEN (JFILE,FILE=FLTOUT,STATUS='UNKNOWN') rewind jfile endif endif IF (IFILST.GT.1) CALL SKIPFL
(IFILST-1,IFILE,IEOF) IEOFSC = 0 ISTOP = 0 C IF (NPTF.LE.0) GO TO 30 NPTS = NPTF 30 V2F = V1F+DVF*FLOAT(NPTS-1) WRITE (IPR,910) V1F,V2F,DVF,NPTF,JEMIT,JABS,IUNIT,IFILST,NIFILS, * HEDDR V1 = V1F V2 = V2F DV = DVF IF (NPTF.LE.0) GO TO 40 READ (IRD,915) CVAR READ (IRD,CVAR) (XF(I),I=1,NPTS) WRITE (IPR,CVAR) (XF(I),I=1,NPTS) C C MAKE ADJUSTMENT FOR END POINT CORRECTIONS C XF(1) = 0.5*XF(1) XF(NPTS) = 0.5*XF(NPTS) 40 SUMFLT = 0.0 DO 50 I = 1, NPTS SUMFLT = SUMFLT+XF(I) 50 CONTINUE SUMFLT = SUMFLT*DVF C 60 RFILTR = 0.0 VFT = V1 VBOT = V1 VTOP = V2 TIMRDF = 0.0 TIMCNV = 0.0 CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) ISCHDR = ISCAN IF (ISCAN.LE.0.OR.SCNID.EQ.-99.) ISCAN = 0 IF (ISCHDR.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCHDR IF (MOD(ISCAN,1000).EQ.0) GO TO 70 JEMSCN = SCNID/100. IF (JEMIT.EQ.JEMSCN) GO TO 70 WRITE (*,920) WRITE (IPR,920) CALL SKIPFL
(1,IFILE,IEOF) IF (IEOF.EQ.0) GO TO 10 GO TO 60 70 CONTINUE IF (IEOF.LT.1) GO TO 10 C C JEMIT=-1 FILTER PASSED OVER ABSORPTION C JEMIT=0 FILTER PASSED OVER TRANSMISSION C JEMIT=1 FILTER PASSED OVER EMISSION C JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF (JTREM.LT.0) GO TO 10 WRITE (IPR,925) XID,(YID(M),M=1,2) WRITE (IPR,930) LAYR1,LAYER WRITE (IPR,935) SECANT,PAVE,TAVE,DVC,V1C,V2C WRITE (IPR,940) WBROAD,(HMOLID(M),WK(M),M=1,NMOL) WRITE (IPR,945) V1F,V2F,DVF,NPTF,IEMIT,JEMIT,JABS,IUNIT,IFILST, * NIFILS,HEDDR if ((jfile.ne.0).and.(itest2.eq.0)) then WRITE (jfile,925) XID,(YID(M),M=1,2) WRITE (jfile,935) SECANT,PAVE,TAVE,DVC,V1C,V2C WRITE (jfile,940) WBROAD,(HMOLID(M),WK(M),M=1,NMOL) WRITE(jfile,980) itest2 = 1 endif IDATA = -1 80 CALL CPUTIM
(TIMEO) CALL RDSCAN
(S,JTREM,IFILE,ISCAN,IPRT) CALL CPUTIM
(TIME) TIMRDF = TIMRDF+TIME-TIMEO IF (IEOFSC.NE.1) GO TO 90 CALL CNVFLT
(S,RFILTR,XF) IF (IDATA.EQ.1) GO TO 90 GO TO 80 90 CALL CPUTIM
(TIME) WRITE (IPR,950) TIME,TIMRDF,TIMCNV IF (JEMIT.EQ.1) GO TO 100 TRNSM = RFILTR RFILTR = RFILTR*DVC/SUMFLT IF (JABS.EQ.0) WRITE (IPR,955) RFILTR,SUMFLT,TRNSM IF (JABS.EQ.1) WRITE (IPR,960) RFILTR,SUMFLT,TRNSM if (jfile.ne.0) then write(JFILE,975) RFILTR endif GO TO 110 100 RFILTR = RFILTR*DVC WRITE (IPR,965) RFILTR,SUMFLT if (jfile.ne.0) then write(JFILE,975) RFILTR endif 110 IF (IEOFSC.EQ.1) CALL SKIPFL
(1,IFILE,IEOFSC) IEOFT = IEOFT+1 IF (IEOFT.GT.NIFILS) GO TO 10 IF (IEOFSC.LT.0) GO TO 60 GO TO 10 C 900 FORMAT (2F10.4,6I5,8A4,A3) 905 FORMAT ('1',/' *** FILTER ***',8(' ********** ')) 910 FORMAT ('0 V1F=',F10.4,' V2F=',F10.4,',DVF=',F10.4,',NPTF =', * I5,/,'0',10X,', JEMIT= ',I2,', JABS= ',I2, * ', INPUT FILE= ',I3,' ,IFILST =',I5,' ,NIFILS =',I5,2X, * 8A4,A3) 915 FORMAT (A80) 920 FORMAT ('0 RESULT FROM SCANNING FUNCTION INCONSISTENT WITH ', * 'FILTER REQUEST') 925 FORMAT ('0',//,8(' ------- '),/,'0',10A8,2X,2(1X,A8,1X)) 930 FORMAT (//,' INITIAL LAYER = ',I5,' FINAL LAYER =',I5) 935 FORMAT ('0 SECANT =',F15.5,/'0 PRESS(MB) =',F12.5/'0 TEMP(K) =', * F11.2,/'0 DV(CM-1) = ',F12.8,/'0 V1(CM-1) = ',F12.6,/ * '0 V2(CM-1) = ',F12.6) 940 FORMAT ('0 COLUMN DENSITY (MOLECULES/CM**2)'//5X,'WBROAD = ', * 1PE10.3,/(5X,A6,' = ',1PE10.3)) 945 FORMAT ('0 V1F=',F10.4,' V2F=',F10.4,',DVF=',F10.4,',NPTF =', * I5,/'0 , IEMIT= ',I2,', JEMIT= ',I2,', JABS= ',I2, * ', INPUT FILE= ',I3,' ,IFILST =',I5,' ,NIFILS =',I5,2X, * 8A4,A3) 950 FORMAT ('0',5X,'TIME =',F7.3,', READ =',F6.3,', CONV. =',F7.3) 955 FORMAT ('0 INTEGRATED TRANSMISSION = ',1PE14.5, * ' NORMALIZATION OF THE FILTER = ',E14.5,/ * '0 UNNORMALIZED INTEGRATED TRANSMISSION = ',E14.5) 960 FORMAT ('0 INTEGRATED ABSORPTION = ',1PE14.5, * ' NORMALIZATION OF THE FILTER = ',E14.5,/ * '0 UNNORMALIZED INTEGRATED ABSORPTION = ',E14.5) 965 FORMAT ('0 INTEGRATED EMISSION = ',1PE14.5, * ' NORMALIZATION OF THE',' FILTER = ',E14.5) 970 format (a4,i2.2) 975 format (1p,e14.5,0p) 980 format (' Filter output:') C END C C -------------------------------------------------------------- C
SUBROUTINE FLTRRD (IFILE) 3,1 C C NFLTPT sets the maximum number of points in the incoming filter C PARAMETER (NFLTPT = 3001) C IMPLICIT REAL*8 (V) C C READ CONTROL CARD FOR FILTER WITH WEIGHTING FUNCTIONS C COMMON S(4650),R1(5750) C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DVC,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /COMFLT/ V1F,V2F,DVF,NPTS,NPTF,JEMIT,IUNIT,IFILST,NIFILS, * HEDDR(9),XF(NFLTPT),SUMFLT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /FLFORM/ CFORM DIMENSION FILHDR(2) C CHARACTER*80 CVAR CHARACTER CFORM*11,TAPE13*6,CTAPE*4 LOGICAL OP C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCAN) , (FSCDID(7),IPLOT), * (FSCDID(8),IPATHL) , (FSCDID(9),JRAD), * (FSCDID(12),SCNID) , (FSCDID(13),HWHM), * (FSCDID(16),LAYR1) C DATA TAPE13 / ' '/,CTAPE / 'TAPE'/ C NLIMF = 2401 NSHIFT = 0 READ (IRD,900) V1F,DVF,NPTF,JEMIT,NNFILE,HEDDR C JABS = 0 IEOFT = 1 IUNIT = IFILE IFILE = IUNIT IFILST = 1 NIFILS = 1 IF (NNFILE.NE.NFILE.AND.NNFILE.GT.0) THEN INQUIRE (UNIT=NFILE,OPENED=OP) IF (OP) CLOSE (NFILE) NFILE = NNFILE INQUIRE (UNIT=NFILE,OPENED=OP) IF (.NOT.OP) THEN WRITE (TAPE13,905) CTAPE,NFILE OPEN (NFILE,FILE=TAPE13,STATUS='UNKNOWN',FORM=CFORM) REWIND NFILE ENDIF ENDIF C IF (V1F.LT.0) RETURN WRITE (IPR,910) REWIND IFILE IF (IFILST.GT.1) CALL SKIPFL
(IFILST-1,IFILE,IEOF) IEOFSC = 0 ISTOP = 0 C IF (NPTF.LE.0) GO TO 10 NPTS = NPTF 10 V2F = V1F+DVF*FLOAT(NPTS-1) WRITE (IPR,915) V1F,V2F,DVF,NPTF,JEMIT,JABS,IUNIT,IFILST,NIFILS, * NFILE,HEDDR V1 = V1F V2 = V2F DV = DVF IF (NPTF.LE.0) GO TO 20 READ (IRD,920) CVAR READ (IRD,CVAR) (XF(I),I=1,NPTS) WRITE (IPR,CVAR) (XF(I),I=1,NPTS) C C MAKE ADJUSTMENT FOR END POINT CORRECTIONS C XF(1) = 0.5*XF(1) XF(NPTS) = 0.5*XF(NPTS) 20 SUMFLT = 0.0 DO 30 I = 1, NPTS SUMFLT = SUMFLT+XF(I) 30 CONTINUE SUMFLT = SUMFLT*DVF C RETURN C 900 FORMAT (2F10.4,I5,I5,I5,10X,8A4,A3) 905 FORMAT (A4,I2.2) 910 FORMAT ('1',/' *** FILTER ***',8(' ********** ')) 915 FORMAT ('0 V1F=',F10.4,' V2F=',F10.4,',DVF=',F10.4, * ',NPTF =',I5,/,'0',10X,', JEMIT= ',I2,', JABS= ', * I2,', INPUT FILE= ',I3,' ,IFILST =',I5,' ,NIFILS =', * I5,', OUTPUT FILE= ',I3,2X,8A4,A3) 920 FORMAT (A80) C END C C -------------------------------------------------------------- C
SUBROUTINE FLTMRG (IFILE,JFILE) 4,11 C C NFLTPT sets the maximum number of points in the incoming filter C PARAMETER (NFLTPT = 3001) C IMPLICIT REAL*8 (V) C C SUBROUTINE FLTMRG CALCULATES AND OUTPUTS THE RESULTS C OF THE FILTER TO FILE JFILE C COMMON S(4650),R1(5750) C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DVC,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR, * AVFIX,LAYMA,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS, * DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1, * ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY, * EXTID(10) COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /COMFLT/ V1F,V2F,DVF,NPTS,NPTF,JEMIT,IUNIT,IFILST,NIFILS, * HEDDR(9),XF(NFLTPT),SUMFLT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SPANEL/ V1P,V2P,DV,NLIM DIMENSION FILHDR(2),PNLHDR(2),RF(4) EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCNHD) , (FSCDID(7),IPLOT), * (FSCDID(8),IPATHL) , (FSCDID(9),JRAD), * (FSCDID(12),SCNID) , (FSCDID(13),HWHM), * (FSCDID(16),LAYR1) , (PNLHDR(1),V1P) C NLIMF = 2401 NREN = 0 IPRT = 1 NSHIFT = 0 IUNIT = IFILE REWIND IFILE C 10 RFILTR = 0.0 VFT = V1 VBOT = V1 VTOP = V2 TIMRDF = 0.0 TIMCNV = 0.0 C CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) C ISCAN = ISCNHD IF (ISCAN.LE.0.OR.SCNID.EQ.-99.) ISCAN = 0 IF (ISCNHD.GE.1000.AND.ISCAN.EQ.0) ISCAN = ISCNHD ISCNHD = ISCAN+100 IF (MOD(ISCAN,1000).EQ.0) GO TO 20 JEMSCN = SCNID/100. IF (JEMIT.EQ.JEMSCN) GO TO 20 WRITE (*,900) WRITE (IPR,900) CALL SKIPFL
(1,IFILE,IEOF) C IF (IEOF.EQ.0) RETURN C GO TO 10 20 CONTINUE C IF (IEOF.LT.1) RETURN C C JEMIT=-1 FILTER PASSED OVER ABSORPTION C JEMIT=0 FILTER PASSED OVER TRANSMISSION C JEMIT=1 FILTER PASSED OVER EMISSION C JTREM = -1 IF ((IEMIT.EQ.0).AND.(JEMIT.EQ.0)) JTREM = 0 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.0)) JTREM = 2 IF ((IEMIT.EQ.1).AND.(JEMIT.EQ.1)) JTREM = 1 ISCANT = MOD(ISCAN,1000) IF ((ISCANT.GE.1).AND.(JEMIT.EQ.0)) JTREM = 2 C IF (JTREM.LT.0) RETURN C WRITE (IPR,905) XID,(YID(M),M=1,2) WRITE (IPR,910) LAYR1,LAYER WRITE (IPR,915) SECANT,PAVE,TAVE,DVC,V1C,V2C WRITE (IPR,920) WBROAD,(HMOLID(M),WK(M),M=1,NMOL) WRITE (IPR,925) V1F,V2F,DVF,NPTF,IEMIT,JEMIT,JABS,IUNIT,IFILST, * NIFILS,HEDDR C XSCID = 100*JEMIT SCNID = XSCID+0.01 C CALL BUFOUT
(JFILE,FILHDR(1),NFHDRF) IDATA = -1 30 CALL CPUTIM
(TIMEO) CALL RDSCAN
(S,JTREM,IFILE,ISCAN,IPRT) CALL CPUTIM
(TIME) TIMRDF = TIMRDF+TIME-TIMEO IF (IEOFSC.NE.1) GO TO 40 CALL CNVFLT
(S,RFILTR,XF) IF (IDATA.EQ.1) GO TO 40 GO TO 30 C 40 CALL CPUTIM
(TIME) WRITE (IPR,930) TIME,TIMRDF,TIMCNV IF (JEMIT.EQ.1) GO TO 50 TRNSM = RFILTR RFILTR = RFILTR*DVC/SUMFLT RF(1) = RFILTR RF(2) = SUMFLT RF(3) = TRNSM RF(4) = PLAY IF (JABS.EQ.0) WRITE (IPR,935) RFILTR,SUMFLT,TRNSM IF (JABS.EQ.1) WRITE (IPR,940) RFILTR,SUMFLT,TRNSM C C V1P IS FIRST FREQ OF PANEL C V2P IS LAST FREQ OF PANEL C V1P = V1F V2P = V2F DVP = DVF NLIM = 4 CALL BUFOUT
(JFILE,PNLHDR(1),NPHDRF) CALL BUFOUT
(JFILE,RF(1),NLIM) GO TO 60 C 50 RFILTR = RFILTR*DVC WRITE (IPR,945) RFILTR,SUMFLT C 60 IF (IEOFSC.EQ.1) CALL SKIPFL
(1,IFILE,IEOFSC) IEOFT = IEOFT+1 IF (IEOFT.GT.NIFILS) RETURN IF (IEOFSC.LT.0) GO TO 10 C RETURN C 900 FORMAT ('0 RESULT FROM SCANNING FUNCTION INCONSISTENT WITH ', * 'FILTER REQUEST') 905 FORMAT ('0',//,8(' ------- '),/,'0',10A8,2X,2(1X,A8,1X)) 910 FORMAT (//,' INITIAL LAYER = ',I5,' FINAL LAYER =',I5) 915 FORMAT ('0 SECANT =',F15.5,/'0 PRESS(MB) =',F12.5/'0 TEMP(K) =', * F11.2,/'0 DV(CM-1) = ',F12.8,/'0 V1(CM-1) = ',F12.6,/ * '0 V2(CM-1) = ',F12.6) 920 FORMAT ('0 COLUMN DENSITY (MOLECULES/CM**2)'//5X,'WBROAD = ', * 1PE10.3,/(5X,A6,' = ',1PE10.3)) 925 FORMAT ('0 V1F=',F10.4,' V2F=',F10.4,',DVF=',F10.4,',NPTF =', * I5,/,'0 , IEMIT= ',I2,', JEMIT= ',I2,', JABS= ',I2, * ', INPUT FILE= ',I3,' ,IFILST =',I5,' ,NIFILS =',I5,2X, * 8A4,A3) 930 FORMAT ('0',5X,'TIME =',F7.3,', READ =',F6.3,', CONV. =',F7.3) 935 FORMAT ('0 INTEGRATED TRANSMISSION = ',1PE14.5, * ' NORMALIZATION OF THE FILTER = ',E14.5,/ * '0 UNNORMALIZED INTEGRATED TRANSMISSION = ',E14.5) 940 FORMAT ('0 INTEGRATED ABSORPTION = ',1PE14.5, * ' NORMALIZATION OF THE FILTER = ',E14.5,/ * '0 UNNORMALIZED INTEGRATED ABSORPTION = ',E14.5) 945 FORMAT ('0 INTEGRATED EMISSION = ',1PE14.5, * ' NORMALIZATION OF THE FILTER = ',E14.5) C END C C -------------------------------------------------------------- C
SUBROUTINE CNVFLT (S,RFILTR,XF) 2,2 C C NFLTPT sets the maximum number of points in the incoming filter C PARAMETER (NFLTPT = 3001) C IMPLICIT REAL*8 (V) C COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /COMFLT/ V1F,V2F,DVF,NPTS,NPTF,JEMIT,IUNIT,IFILST,NIFILS, * HEDDR(9),XFS(NFLTPT),SUMFLT COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL C DIMENSION XF(*),S(*) C CALL CPUTIM
(TIMEO) IMIN = (V1F-V1I)/DVI+1.0001 c IMIN = (V1F-V1I)/DVI+1.5 IMIN = MAX(IMIN,ILO) IMAX = (V2F+V1F-V1I)/DVI+1.0001 c IMAX = (V2F+V1F-V1I)/DVI+1.5 IMAX = MIN(IMAX,IHI) XIF0 = (V1I-V1F)/DVF+1.0001 c XIF0 = (V1I-V1F)/DVF+1.5 XDVIF = DVI/DVF DO 10 I = IMIN, IMAX IFL = XIF0+XDVIF*FLOAT(I) c IFL = XIF0+XDVIF*FLOAT(I-1) c c Linearly interpolate filter function XF to avoid c discontinuities in output spectrum c v1s = v1i+(i-1)*dvi v2s = v1i+i*dvi vxf1 = v1f + (ifl-1)*dvf vxf2 = v1f + (ifl)*dvf p = (vxf2-v2s)/(vxf2-vxf1) RFILTR = RFILTR+S(I)*(p*XF(IFL)+(1.-p)*xf(IFL+1)) c write(88,*) v1s,xf(ifl),(p*XF(IFL)+(1.-p)*xf(IFL+1)) c write(89,*) i,v1i,dvi,v2s,xif0 c write(89,*) ifl,v1f,dvf,vxf1,vxf2,p 10 CONTINUE IF (IMAX.LT.IHI) VFT = VFT+((FLOAT(IHI)-FLOAT(ILO))+1.0)*DVI CALL CPUTIM
(TIME) TIMCNV = TIMCNV+TIME-TIMEO C RETURN C END C C -------------------------------------------------------------- C
SUBROUTINE FLTPRT (IFILE) 1,5 C C NFLTPT sets the maximum number of points in the incoming filter C PARAMETER (NFLTPT = 3001) C IMPLICIT REAL*8 (V) C C SUBROUTINE FLTPRT READS FROM IFILE AND FORMATS OUT THE RESULTS C OF THE FILTERED WEIGHTING FUNCTION TO IPR C COMMON S(4650),R1(5750) C character*8 XID, HMOLID, YID real*8 SECANT, XALTZ C COMMON /SCNHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4), * WK(60),PZL,PZU,TZL,TZU,WBROAD,DVC,V1C,V2C,TBOUND, * EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF COMMON /SSUBS/ VFT,VBOT,VTOP,V1,V2,DVO,NLIMF,NSHIFT,MAXF,ILO,IHI, * NLO,NHI,RATIO,SUMIN,IRATSH,SRATIO,IRATM1,NREN, * DVSC,XDUM,V1SHFT COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR, * AVFIX,LAYMA,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS, * DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1, * ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY, * EXTID(10) COMMON /CONTRL/ IEOFSC,IPANEL,ISTOP,IDATA,JVAR,JABS COMMON /XTIME/ TIME,TIMRDF,TIMCNV,TIMPNL COMMON /RSCAN/ V1I,V2I,DVI,NNI COMMON /COMFLT/ V1F,V2F,DVF,NPTS,NPTF,JEMIT,IUNIT,IFILST,NIFILS, * HEDDR(9),XF(NFLTPT),SUMFLT COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL, * NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL, * NLTEFL,LNFIL4,LNGTH4 COMMON /SPANEL/ V1P,V2P,DV,NLIM DIMENSION FILHDR(2),PNLHDR(2),RF(4) C EQUIVALENCE (FILHDR(1),XID(1)) , (FSCDID(5),IEMIT), * (FSCDID(6),ISCAN) , (FSCDID(7),IPLOT), * (FSCDID(8),IPATHL) , (FSCDID(9),JRAD), * (FSCDID(12),SCNID) , (FSCDID(13),HWHM), * (FSCDID(16),LAYR1) , (PNLHDR(1),V1P) C NLIMF = 2401 NSHIFT = 0 IUNIT = IFILE REWIND IFILE C WRITE (IPR,900) OLDTRN = 1.0 TIMRDF = 0.0 CALL CPUTIM
(TIMEO) 10 CONTINUE CALL BUFIN
(IFILE,IEOF,FILHDR(1),NFHDRF) IF (IEOF.EQ.-99) GO TO 10 IF (IEOF.EQ.0) GO TO 20 C CALL BUFIN
(IFILE,IEOF,PNLHDR(1),NPHDRF) CALL BUFIN
(IFILE,IEOF,RF(1),NLIM) C RFILTR = RF(1) SUMFLT = RF(2) TRNSM = RF(3) PLAY = RF(4) DTAU = OLDTRN-RFILTR OLDTRN = RFILTR WRITE (IPR,905) LAYER,PLAY,DTAU,RFILTR,TRNSM C IF (IEOF.EQ.1) GO TO 10 20 WRITE (IPR,910) SUMFLT CALL CPUTIM
(TIME) TIMRDF = TIMRDF+TIME-TIMEO WRITE (IPR,915) TIME,TIMRDF C RETURN C 900 FORMAT ('1',15X, * 'FORMATTED RESULTS OF FILTERED WEIGHTING FUNCTIONS', * 2(/),10X,'LAYER',5X,'PRESSURE',4X,'TRANSMISSION',6X, * 'INTEGRATED',6X,'UNNORMALIZED',/,10X,' # ',5X, * ' (MB) ',5X,'(N-1) - (N)',5X,'TRANSMISSION',5X, * ' INT TRANS ',/) 905 FORMAT (10X,I3,5X,F8.3,5X,1PE13.6,4X,1PE13.6,4X,1PE13.6) 910 FORMAT ('0',5X,'NORMALIZATION OF THE FILTER =',1PE13.6) 915 FORMAT ('0',5X,'TIME =',F7.3,', IN FLTPRT =',F7.3) C END