INSCAL Introduction

Purpose

Inscal analyzes incoherent scatter autocorrelation functions (acfs) to determine ionospheric plasma parameters. The input data are taken from labeled common ifam. The output parameters are placed in labeled common ofam. Data from any I. S. radar may be analyzed by writing a routine to convert the native data format of that radar to ifam format. Output parameters may be saved in any format by writing a routine to convert ofam to the desired output format.

In this version of inscal, the native raw data format is the midas cmst structure used at Millstone Hill, and the output format is CEDAR format. The input routine, readifamrecord, can handle both the current cmst format and historical cmst and ifam file formats. In addition, the ncar graphics package is used to produce a summary plot of each analyzed record. These are stored in subdirectories of the Madrigal experiment directory and are accessible through the Madrigal Web interface.

Control

Inscal reads control information from four sources:
  1. Command line. See args.h for a detailed description of all input parameters. The command line parameters specify the input data and control files, output Madrigal file, directory for inscal list and error files, records to analyze, etc. Arguments may also be read from an argument file. Typically the first inscal argument specifies an argument file and the remaining arguments overide some ot the arguments in the argument file. The standard default control file is /usr/oasis/oasis2004/Oasis/inscal/controlFiles/insc_cmd_0.
  2. Control File. See ctrl.h for a detailed description of all control parameters. The control parameters specify options for fitting the acfs and diagnostic output. The default control file is /usr/oasis/oasis2004/Oasis/inscal/controlFiles/insc_ctrl_0 which is suitable for most inscal production runs.
  3. Calibration file. Mode calibration information. This file contains an entry for each transmitter mode on each antenna. The only entry used by inscal is the calibration factor, which typically comes from the calibration model. Some experiments are individually calibrated. The default calibration file is /usr/oasis/oasis2004/Oasis/inscal/controlFiles/mhr_parms.dat_0.
  4. Profile integration specification file. This file contains a specification for profile integration (range smoothing) to be applied to a particular mode. Thes files have names of the form a480.30z8910.dat. If a file of this form is present in the analysis directory (oasisdir) the lag profiles for that mode are processed as specified in that file. See, for example, /usr/oasis/oasis2004/Oasis/inscal/controlFiles/a480.30m8910.dat.npt.

Basic Flow and Main Subroutines

inscal - Inscal main program
    setsignals - Register exinsc to catch signals
    argin - Processe input arguments
    ctrlin - Read control parameters
    openmhrparms - Open calibration file (e.g. mhr_parms.dat)
    openmidasfile - Open input file (Cmst or ifam - any version)
    cedaropen - Open Madrigal file for each record in input file
        readifamrecord - Read next record of input file
	postint - Postintegrate when the ifam record contains subintegrations
	          (e.g. median of subintegrations)
	profint - smooth each lag profile
	          (e.g. median filter, L1 spline fit etc.)
        acfit - Process single record (integration period)
                for each range in record
                aquik,arget - Get initial guess for fit parameters
                fit1 - Fit for Ti, Te
                       for each iteration in least-squares fit
                        curfit
                            functn - Evaluate theroretical acf
                    end for
                fit1 - Add CO at low altitudes or PH at high altitudes
                              for each iteration in least-squares fit
                        curfit
                            functn - Evaluate theroretical acf
                    end for
            end for
        ofam2cedar - put results in ofam
        plotpar - Plot Ti, Te, Vo and Pol
        ofam2cedar - Convert inscal native output format (ofam) to external format (Cedar)
	             and write to Madrigal file
    end for
    exinsc - Clean up, print statistics and exit

Inscal Usage:

inscal argument_list

Arguments:

    -cmdfile - File containing a series of arguments (commands), one
               line per argument. When this argument is encountered on
               the command line, cmdfile is read and its contents are
               treated exactly as if they had been entered on the
               command line. Typically this is the first argument in  
               a call to inscal is followed by a small number of
               additional arguments which overide the values in
               cmdfile.
    -oasisdir - oasisdir where analysis results will be wriitten.
                e.g.:
                /usr/oasis/experiments/2003/20nov03/oasis/inscal
                Default is the current oasisdir               
    -tag - Character string tag added to end of inscal output files.
           Use #startTime to specify that tag should be the current 
           Unix time in seconds, e.g. "_1101217411"
           -tag #startTime
    -outfile - Madrigal output file. Use #tag to specify mlh_tag where
              tag is specified by the tag command.
              -outfile #tag
    -insfile - Real-time status file. Inscal gets the input file
               (otherwise specified by -infile) and output Madrigal
               file (otherwise specified by -outfile) from insfile
               if  -runmode = "realTime". 
    -infile - Input file, typically a cmst file. Full path name.
             -infile "infile_default'
    -runmode - dataFile: Get infile and outfile from inscal arguments
               realTime: Get infile and outfile from insfile
               asciiIfam: Like dataFile, but infile is ascii format
    -startrec - First record to analyze
                -startRec 1
    -endrec - Last record to analyze
              -endrec 99999999
    -delrec - Record increment, e.g. 2 to analyze every other record
              -delrec 1
    -sdate - Start Date for data to be analyzed.
             -sdate 01jan70
    -stime - Start time (hours, minutes, seconds) for data to be
             analyzed. stime=(0,0,0) is 0000 UT on sdate.
             -stime 0 0 0
    -etime - END time (hours, minutes, seconds) for data to be
             analyzed. etime=(0,0,0) is 0000 UT on sdate.
             -etime 999 59 59
    -ctrlfile - Inscal control file. This contains parameters which
                control the ACF fitting process.
                -ctrlfile insc_ctrl
    -parmsfile - Inscal calibration file.
                 -parmsfile mhr_parms.dat
		 
Example: /usr/oasis/oasis2004/Oasis/inscal/source/inscal -cmdfile insc_cmd_rt_50kHz

In this example all required arguments are in insc_cmd_rt_50kHz and the only inscal argument
specifies the argument file.

insc_cmd_rt_50kHz:

    -cmdfile     insc_cmd_rt_50kHz
    -oasisdir    /usr/oasis/experiments/2004/06dec04/
    -tag         50-2
    -outfile     #dummy
    -insfile     /usr/oasis/experiments/midasw_realtime/status/current_50kHz_cmst.status
    -infile      #dummy
    -runmode     realTime
    -startrec    1577
    -endrec      99999999
    -delrec      1
    -sdate       06dec04
    -stime           0   0   0
    -etime         999  59  59
    -ctrlfile    /usr/oasis/oasis2004/Oasis/inscal/controlFiles/insc_ctrl_diag
    -parmsfile   /usr/oasis/oasis2004/Oasis/inscal/controlFiles/mhr_parms.dat_0
    

Inscal control file

CNTRL defines the INSCAL search control parameters. They are read from an ASCII command file by SUBROUTINE CMDIN.
VER    - INSCAL version number (*100). VER=800 for version 8.0.
         FMT='(A3, 3X, I4)'
QSSW   - Control switches
         FMT='(A4, 3X, 16(I3))'
         QSSW( 1) -
         QSSW( 2) - QOUT1=1 - PRINT LEVEL 1 DIAGNOSTIC OUTPUT
                              (LEAST DETAILED)
         QSSW( 3) - QOUT2=1 - PRINT LEVEL 2 DIAGNOSTIC OUTPUT
                              (INTERMEDIATE DETAIL)
         QSSW( 4) - QOUT3=1 - PRINT LEVEL 3 DIAGNOSTIC OUTPUT
                              (MOST DETAILED)
         QSSW( 5) - QOUTT=1 - PRINT TERMINAL DIAGNOSTIC OUTPUT
         QSSW( 6) - QFTZL=1 - INCLUDE ZERO LAG PRODUCT IN FIT
         QSSW( 7) - QFFIT=1 - SEARCH ALL ACFS REGARDLESS OF SNR
         QSSW( 8) - QQUIK=1 - USE QUICK SEARCH FOR INITIAL GUESS
         QSSW( 9) - QGRID=1 - USE GRID SEARCH FOR INITIAL GUESS
         QSSW(10) - QRCOR=1 - APPLY RANGE CORRECTION
                              USING ASET(11)
         QSSW(11) - QACOR=1 - APPLY SPECTRAL ASSYMETRY CORRECTION
                              USING ASET(8)
         QSSW(12) - QRTIM=1 - FOLLOW AND FIT REAL-TIME DATA FILE
         QSSW(13) - QISDB=1 - UPDATE INSCOHERENT SCATTER DATABASE
                              WITH RESULTS OF FIT
         QSSW(14) - QERFP=1 - DO E-REGION FULL PROFILE FIT
         QSSW(15) - QRCPL=1 - MAKE PLOTS OF FIT PARAMETERS
         QSSW(16) - QNPTF>0 - MULTIPLY NO. OF POINTS IN SPECTUM CALCULATION BY QNPTF
         QSSW(17) - QRTUT=1 - MAKE RADAR TUTORIAL
         QSSW(18) - QFTFN=1 - FIT TI, TR
                          2 - FIT (TE+TI)/2, (TE-TI)/2
                          3 - FIT TI, TE
         QSSW(19) - QIFMI=1 - INPUT DATA WITH IFAM_IN
         QSSW(20) - QIFMO=1 - OUTPUT DATA WITH IFAM_OUT
         QSSW(21) -
         QSSW(22) -
         QSSW(23) -
         QSSW(24) -
NMODEA - Number of modes to analyze. If NMODES<0, all modes are
         analyzed. If NMODES>=0, only the modes specified by MODE
         are analyzed. Up to 32 modes may be specified.
         FMT='(A6, 3X, I2)'
MODEA  - List of modes to be analyzed. These are compared with
         the MODE parameter in ifam (see ifamf.h).
         FMT='(A32)'
PARMF  - Fixed parameters. Up to 16 may be specified.
         FMT='(E13.5)'
         PARMF( 1) = Calculate theoretical ACF to at least
                     this lag
NZR    - Number of altitude segments to be analyzed. Search
         parameters are different in each altitude segment.
         Ther may be at most 6 altitude segments.
         FMT='(A3, 3X, I1)'
Z1     - Lowest altitude in an altitude segment.
         FMT='(A2, 3X, 6(F6.1,1X))'
Z2     - Highest altitude in an altitude segment.
         FMT='(A2, 3X, 6(F6.1,1X))'
SMLIM  - Lower limit on signal to noise ratio. Data for which
         SNR

Profile integration specification file

For a specified mode, include a file of the form modename.dat in the directory (oasisdir) in which inscal is run, e.g. a480.30m8910.dat. This file has the following format:
MDNAME = A480.30M8910
MDPTYPE = 2
MDNROWS = 5
MDNCOLS = 3
150.0 200.0  3.0
200.0 300.0  6.0
300.0 400.0  8.0
400.0 500.0 10.0
500.0 800.0 12.0
MDPTYPE = 1 (N-point centered mean), MDTYPE = 2 (N-point centered median), MDTYPE = 3 (L2 spline fit) AMD MDPTYPE= 4 (L1 spline fit) are supported. the integration parameters are mdptype dependent and are entered as an array with mdrows rows and mdcols columns. For MDPTYPE = 1 and 2, each row contains a minimum and maximum altitude and the a specification of the number of points in the mean or median. thus the first row states that between 200 and 300 km a 13-point average will be computed. acfs below 150 km are left unchanged in this example. For MDTYPE = 3 and 4, the format is as follows
MDNAME = A480.30M8910
MDPTYPE = 4
MDNROWS = 1
MDNCOLS = 4
100.0 5.0 600.0 100.0
In the example,
Z1 = 100.0  - Lowest spline knot
DZ1 = 5.0   - Distance from z1 to next spline knot
Z2 = 600.0  - Highest spline knot
DZ2 = 100.0 - Approximate knot spacing at z2
In practice the actual spacing between the second-highest knot and z2 will be somewhat larger than dz2. Knot spacing increases linearly with altitude. the example yields the following knots:
   100.0  105.0  111.2  118.6  127.5  138.1  150.9 166.2 184.5
   206.4  232.6  264.0  301.7  346.8  400.8  465.5 600.0
   

Verifying Inscal

A simple regression analysis is performed by "make verify". Results are in verify.txt. Changes in inscal or its input parameters may change the output files prduced by make verify. Also, the inscal list file (insc_list_v for these checks) contains several lines which always change. So, verify inscal is an aid to verifying changes in inscal, but is not an automatic validity checker. The output files in the CVS archive, insc_list_v_rock, mlh_v_rock and print_mlh_v_rock may need to be updated, following thorough checking, after inscal has been modified.

Running inscal in real-time mode

Inscal can analyze data in real-time. In this case it typically is executed from within a script.

Inscal control input is organized so that all parameters which typically need to be changed from experiment to experiment are command line parameters. It is also possible to read these parameters from a command file. Basically there are two ways of running real-time inscal

1. Read all parameters from a file.

The following example shows how the 28 January, 2005 realtime analyis was run in this manner for single-pulse data:

/usr/oasis/oasis2004/Oasis/inscal/bin/inscal -cmdfile insc_cmd_rt_50kHz_28jan05 where insc_cmd_rt_50kHz_28jan05 was:

-cmdfile     insc_cmd_rt_50kHz_28jan05
-oasisdir    /usr/oasis/experiments/2005/28jan05/
-tag         #startTime
-outfile     #dummy
-insfile     /usr/oasis/experiments/midasw_realtime/status/current_50kHz_cmst.status
-infile      #dummy
-runmode     realTime
-startrec    1
-endrec      99999999
-delrec      1
-sdate       28jan05
-stime           0   0   0
-etime         999  59  59
-ctrlfile    /usr/oasis/oasis2004/Oasis/inscal/controlFiles/insc_ctrl_0
-parmsfile   /usr/oasis/oasis2004/Oasis/inscal/controlFiles/mhr_parms.dat_0
To run another day, change oasisdir, insfile and sdate as appropriate. When read from a command file, cmdfile is ignored. Inscal writes a command file containing the commands actually used to oasisdir, including the value of cmdfile.

2. Read default parameters from a file and overide some of these on the command line.

For example:

/usr/oasis/oasis2004/Oasis/inscal/bin/inscal -cmdfile /usr/oasis/oasis2004/Oasis/inscal/controlFiles/insc_cmd_rt -oasidir /usr/oasis/experiments/2005/28jan05/ -insfile /usr/oasis/experiments/midasw_realtime/status/current_50kHz_cmst.status -sdate 28jan05

When runmode=realTime, inscal gets the name of the output Madrigal file from insfile. This will usually be a Madrigal experiment directory. In addition to the Madrigal file, inscal places a link to inscal output files and record plots in the Madrigal experiment directory. The inscal output files are written to oasisdir, which should normally be of the form shown in the example. Inscal creates oasisdir and the Madrigal experiment directory and its subdirectories if they do not already exist. However, the experiment will not be accessible through Madrigal until it has been properly entered into Madrigal.

When running in real-time mode, inscal will continue polling insfile indefinitely. For most experiments, inscal should be stopped at the conclusion of the experiment. SIGTERM will signal inscal to exit gracefully.

After analyzing each record, inscal writes a one-line status file of the form inscalStatusFile_tag to oasisdir. The fields are defined by the following Fortran write statement:


      UTIME = TIME()
      PID = GETPID()
      WRITE (LFN,FMT=
     *'(I6, 2X, A, 2X, I10, 2X, I8, 2X,
     *I2.2, 1X, I2.2, 1X, I4.4, 2X,
     *I2.2, 1X, I2.2, 1X, I2.2, 2X,
     *I2.2, 1X, I2.2, 1X, I2.2,
     *I4, 4F7.1, 2X, A)') PID,OUTFILE(1:LNBLNK(OUTFILE)),UTIME,RECNUM,
     *  IDATE(1,ICACF),IDATE(2,ICACF),IDATE(3,ICACF),
     *  STIME(1,ICACF),STIME(2,ICACF),STIME(3,ICACF),
     *  ETIME(1,ICACF),ETIME(2,ICACF),ETIME(3,ICACF),
     *  KINST,
     *  BAZ(ICACF),EAZ(ICACF),BEL(ICACF),EEL(ICACF),
     *  MODE(1) (1:LNBLNK(MODE(1)))
> where the output parameters are from ifam, except for utime, pid and recnum. Recnum is as defined in the Midas_io Fortran Library, i.e. recnum=0 for the first record.

For example:

4786 /opt/madrigal/experiments/2005/mlh/28jan05/mlh050128a.000 1107441325 8 28 01 2005 16 14 00 16 18 00 32 178.0 178.0 88.0 88.0 s480.20z8910

This file can be polled to determine whether inscal is running properly. In the examples, inscal used its Unix start time as the tag. Altenatively. a controlling script might specify tag to inscal, for example, the Unix time when it initiated inscal. This would ensure that the script knows the name of the appropriate inscal status file.

analyzeData

THE FOLLOWING IS OUT OF DATE When not in real-time mode, typically Inscal is run by the analyzeData Tcl script.

Usage: analyzeData [options]
    Options
        -inscal inscal_executable
        -expStartDate   experiment_start_date
        -inscalCtrl inscal_control_file
        -mhrParms mhr_parms.dat_template
        -calibrate calibration_executable
        -calibrateCtrl calibration_control_file_template
        -expDir experiment_directory
        -expLabel experiment_label
        -doCal do_calibration_flag
        -dataFile data_file
Example:
/usr/oasis/inscal2002/Oasis/inscal/bin/analyzeData -expDir /usr/oasis/inscal2002/midaswCalibration/20feb04 -dataFile /usr/oasis/experiments/2004/20feb04/run/2004-02-20_50kHz.ifam 
 
If no data files are specified, this help message is printed.
If one or more data files are specified, they are analyzed by inscal.
Data records will be anlyzed by inscal if they begin after incsal control file parameter
   STIMEC (UT) relative to expStartDate   and end before ETIMEC (UT) relative to
   experimentStartDat.
If calibration is specified by the doCal option, an electron density calibration
    is calculated.
 
  -inscal - inscal I.S. analysis program executable
            default = /usr/oasis/inscal2002/Oasis/inscal/bin/inscal
  -expStartDate   - experiment start date, e.g. 23jun05
            default = 01jan02
  -inscalCtrl - inscal control file template
                default = /usr/oasis/inscal2002/Oasis/inscal/controlFiles/insc_ctrl_0
  -mhrParms - mode parameter file for inscal
              default = /usr/oasis/inscal2002/Oasis/inscal/controlFiles/mhr_parms.dat_0
  -calibrate - calibration program executable
               default = /usr/oasis/inscal2002/Oasis/inscal/bin/calibrate
  -calibrateCtrl - calibration program control file
                   default = /usr/oasis/inscal2002/Oasis/inscal/controlFiles/calibrate.cmd
  -expDir - experiment directory for results; it will be created if necessary
            default = inscal_UnixTimeInSeconds
  -expLabel - string used in plot titles and labels
              default = Inscal run at UnixTimeInSeconds
  -doCal - 1 for calibration experiment, otherwise, 0
              default = 0
  -dataFile - the data files: may be more than one; each will be analyzed in turn
              default = None

INSCAL Call Graph

   1  INSCAL
   2      GETWTIME [external]
   3      CEDAROPEN [external]
   4      GETCWD [external]
   5      HOSTNM [external]
   6      LNBLNK [external]
   7      OPENMHRPARMS [external]
   8      OPENMIDASFILE [external]
   9      READIFAMRECORD [external]
  10      CKIFAM
  11          ERROR
  12              FLUSH [external]
  13      GETCMDFILE
  14      GETCTRLFILE
  15      GETDELREC
  16      GETENDREC
  17      GETETIME
  18          LNBLNK [external]
  19      GETINFILE
  20      GETINSFILE
  21      GETOASISDIR
  22      GETOUTFILE
  23      GETPARMSFILE
  24      GETRUNMODE
  25      GETSDATE
  26      GETSTARTREC
  27      GETSTIME
  28          LNBLNK [external]
  29      GETTAG
  30      ACFIT
  31          FCHISQ
  32          LNBLNK [external]
  33          AQUIK
  34              BNEWT
  35              DFUN
  36              VELX
  37              BADAQ
  38              DOPP
  39              FITPH
  40                  CURFIT
  41                      FCHISQ
  42                      FDERIV
  43                          FUNCTLWE
  44                              ACFMINI
  45                              ACFP2ACFM
  46                              ACFPINI
  47                              ATM2ACFP
  48                                  DFUN
  49                                  FOURS
  50                                      FOUR2
  51                                          BITRV
  52                                          COOL2
  53                                          FIXRL
  54                                  SPECT2
  55                                      DAW
  56                                  SPECTC
  57                                      WOFZ
  58                              ATMLWE
  59                                  DENSTY
  60                              ATMPRN
  61                          FUNCTLWE [see line 43]
  62                          FUNCTN
  63                              DFUN
  64                              FOURS [see line 49]
  65                              FULLSPEC
  66                                  FOUR1
  67                              SP2TITE
  68                              SPECT2 [see line 54]
  69                              SPECTC [see line 56]
  70                          FUNPH
  71                      MINV
  72                      FUNCTLWE [see line 43]
  73                      FUNCTLWE [see line 43]
  74                      FUNCTN [see line 62]
  75                      FUNPH
  76                  FUNPH
  77          ARGET
  78          ARUPD
  79          BADACF
  80          CONVRT [external]
  81          EFITFP
  82              DENSTY
  83              ACFDPRN
  84              ACFMPRN
  85              ACFPPRN
  86              ATM2OFAM
  87              ATMINI
  88              ATMMOD
  89              ATMMSIS
  90                  GTS5 [external]
  91                  METERS [external]
  92                  TRETRV [external]
  93                  TSELEC [external]
  94              ATMPRN
  95              CURFIT [see line 40]
  96              FUNCTLWE [see line 43]
  97              GTS5 [external]
  98              METERS [external]
  99              OFAM2ATM
 100              SETCON
 101                  ERROR [see line 11]
 102              TRETRV [external]
 103              TSELEC [external]
 104          EXINSC
 105              CLOSEMIDASFILE [external]
 106              CEDARCLOSE [external]
 107              EXIT [external]
 108              FDATE [external]
 109              FLUSH [external]
 110              IEEE_FLAGS [external]
 111              PRPARM
 112                  LNBLNK [external]
 113                  GETPARMSFILE
 114              PRSTAT [external]
 115          FIT1
 116              A2SP
 117              CURFIT [see line 40]
 118              DSP2DA
 119              DSP2DT
 120              SP2TITE
 121              TITE2A
 122          FITPH [see line 39]
 123          FITSTATS
 124          FLUSH [external]
 125          IF2OFI
 126          PARAM
 127              PARMOD
 128                  ERROR [see line 11]
 129          POINT [external]
 130          SETCON [see line 100]
 131          SETFIT
 132          SETSTAT
 133          STACOR
 134              CONVRT [external]
 135      ARGIN
 136          GETCWD [external]
 137          IARGC [external]
 138          LNBLNK [external]
 139          TIME [external]
 140          EXINSC [see line 104]
 141          GETARG [external]
 142          READARGS
 143              LNBLNK [external]
 144              TIME [external]
 145              GETOKEN
 146      ARINI
 147      CEDARCLOSE [external]
 148      CTRLIN
 149      CTRLOUT
 150      EXINSC [see line 104]
 151      FDATE [external]
 152      FIXIFAM
 153          FIXSPEC
 154              FOUR1
 155          GTCMTM
 156              DATER [external]
 157              JDAY [external]
 158              GETETIME [see line 17]
 159              GETSDATE
 160              GETSTIME [see line 27]
 161      FLUSH [external]
 162      GEOPRM
 163      GETDATAFILE [external]
 164      GETMADFILE [external]
 165      GETMIDASIOERR [external]
 166      GTCMTM [see line 155]
 167      GTIFTM
 168          JDAY [external]
 169      IFAMINF
 170      IFAMOUTNF
 171      INICOM
 172      MAKENOTES
 173          LNBLNK [external]
 174          GETOASISDIR
 175          GETETIME [see line 17]
 176          GETOUTFILE
 177          GETSDATE
 178          GETSTIME [see line 27]
 179          GETTAG
 180          SPLITMF
 181              LNBLNK [external]
 182      OFAM2CEDAR
 183          CEDARGETSCALEFACTOR [external]
 184          CEDARCREATE [external]
 185          CEDARSET1DPARM [external]
 186          CEDARSET2DPARM [external]
 187          CEDARWRITE [external]
 188          JDATER [external]
 189          JDAY [external]
 190      PLOTPAR [external]
 191      POSTINT
 192          SHELL1
 193      PRECSM
 194          LNBLNK [external]
 195          FLUSH [external]
 196      PROFINT
 197          DEFINELPFIT
 198              KNOTSION
 199          FTL1L2
 200              COVC
 201                  COV
 202              INCLDC
 203                  SROTM
 204                  SROTMG
 205              L1
 206                  PSLV
 207              REGRSC
 208              SHELL1
 209              LPBASIS
 210                  BSPLVD
 211                      BSPLVN
 212                  INTERV
 213          GTMDAT
 214          KNOTSION
 215          SHELL1
 216          LNBLNK [external]
 217      PRSFIL
 218          GETPID [external]
 219          LNBLNK [external]
 220          TIME [external]
 221          FLUSH [external]
 222      SETOUTFILE
 223      SETSIGNALS [external]
 224      SPLITMF [see line 180]
 225      SYSTEM [external]
 226      WRITEARGS
 227          LNBLNK [external]
 228          EXINSC [see line 104]
 229          SYSTEM [external]
 230  CEDAR2OFAM
 231      GRECNO [external]
 232      MDGKST [external]
 233      MDGNRW [external]
 234      MDIBCS [external]
 235      MDIBDT [external]
 236      MDIBHM [external]
 237      MDIBYR [external]
 238      MDIECS [external]
 239      MDIEDT [external]
 240      MDIEHM [external]
 241      MDIEYR [external]
 242      MDISDR [external]
 243      JDAY [external]
 244      MDG1DP [external]
 245      MDGEOD [external]
 246      MDGFLT [external]
 247  GETEXT
 248      LNBLNK [external]
 249  PRNTEXT
 250      LNBLNK [external]
 251  IFAMOUTF
 252  POLBAS
 253  LEGBAS
 254  HRMBAS
 255  SPLBASI
 256      BSPLVD [see line 210]
 257      INTERV
 258  SPLBAS22
 259      SPLBAS
 260          BSPLVD [see line 210]
 261          INTERV
 262  SPLBASP2
 263      SPLBAS [see line 259]
 264      SPLBASP
 265          BSPLVD [see line 210]
 266          INTERV
 267  KNOTS1
 268  KNOTS2
 269  KNOTSP
 270  PARINI
 271  SP2A
 272  TITE2SP
 273  A2TITE

INSCAL Procedure Synopsis

The inscal library contains the following procedures.
PROGRAM INSCAL ()
C
C     INCOHERENT SCATTER DATA ANALYSIS PROGRAM
C     JOHN M. HOLT
C     MIT HAYSTACK OBSERVATORY
C     WESTFORD, MASSACHUSETTS 01886
C
C     VERSION  1.0 -    10/83 - ORIGINAL HARRIS VERSION
C     VERSION  2-6 -            SEE HARRIS DOCUMENTATION
C     VERSION  6.0 - 12/25/92 - MIDAS/IFAM/OFAM/MADRIGAL PRODUCTION
C     VERSION  6.1 - 07/16/93 - NUMEROUS SMALL ENHANCEMENTS
C     VERSION  7.0 - 11/22/93 - FULL-PROFILE E-REGION SEARCHES
C     VERSION  7.1 - 06/06/94 - OUTPUTS HTML FILE FOR MOSAIC
C     VERSION  8.0 - 11/21/97 - SOLARIS VERSION W ASSYMETRY CORRECTION
C     VERSION  8.1 - 10/04/99 - DOPPLER VELOCITY, STATISTICS
C     VERSION  8.2 - 08/22/00 - MADREC OUTPUT, RT SUPPORT
C     VERSION  9.0 - 03/07/03 - MIDASW SUPPORT, MADLIB FREE
C     VERSION 10.0 - 06/??/04 - FULL MIDASW SUPPORT, MULTIPLE ACFS
C
C     INSCAL ANALYZES INCOHERENT SCATTER AUTOCORRELATION FUNCTIONS
C     (ACFS) TO DETERMINE IONOSPHERIC PLASMA PARAMETERS.  THE INPUT
C     DATA ARE TAKEN FROM IFAMF.  THE OUTPUT PARAMETERS ARE PLACED
C     IN OFAMF.  INSCAL CONTROL PARAMETERS ARE IN CNTRL.  DATA FROM
C     ANY I. S. RADAR MAY BE ANALYZED BY WRITING A ROUTINE TO CONVERT
C     THE NATIVE DATA FORMAT OF THAT RADAR TO IFAMF FORMAT.  OUTPUT
C     PARAMETERS MAY BE SAVED IN ANY FORMAT BY WRITING A ROUTINE TO
C     CONVERT OFAMF TO THE DESIRED OUTPUT FORMAT.
C
C     IN THIS VERSION OF INSCAL, THE NATIVE RAW DATA FORMAT IS THE
C     MIDAS CMST STRUCTURE USED AT MILLSTONE HILL, AND THE OUTPUT
C     FORMAT IS THE NCAR DATABASE MADRIGAL FORMAT.  IN ADDITION, THE
C     NCAR GRAPHICS PACKAGE IS USED TO PRODUCE A SUMMARY PLOT OF EACH
C     ANALYZED RECORD.
C
C     Use egrep '(\.\.\.\.\.)' inscal.f for INSCAL summary.
C
C     Usage: inscal control_file working_OASISDIR
C        [file_tag output_file real_time_status_file inscal_status_file]
C

SUBROUTINE ACFDPRN (LFNPRN,ALT1,ALT2,FAC)
      INTEGER LFNPRN      !Read-only
      DOUBLE PRECISION ALT1      !Read-only
      DOUBLE PRECISION ALT2      !Read-only
      DOUBLE PRECISION FAC(*)      !Read-only
C
C     ACFDPRN PRINTS THE DIFFERENCE BETWEEN THE MEASURED
C     AUTOCORRELATION FUNCTIONS IF IFAM AND ACFM.
C
C     LFNPRN - LFN FOR OUTPUT
C     ALT1   - BEGIN ALTITUDE TO PRINT
C     ALT2   - END ALTITUDE TO PRINT
C     FAC    - FACTOR TO APPLY TO ACFM ACF BEFORE TAKING DIFFERENCE
C
C     JMH - 11/97
C

SUBROUTINE ACFIT (NZR,Z1,Z2,NSI,SNLIM,NITER,ASET,IER)
      INTEGER NZR      !Read-only
      DOUBLE PRECISION Z1(6)      !Read-only
      DOUBLE PRECISION Z2(6)      !Read-only
      INTEGER NSI(NFPMAX,6)      !Read-only
      DOUBLE PRECISION SNLIM(6)      !Read-only
      INTEGER NITER(6)      !Read-only
      DOUBLE PRECISION ASET(NFPMAX,6)      !Read-only
      INTEGER IER
C
C     JMH - 11/83   HARRIS FORTRAN 77
C     JMH - 12/92   Initial production Sun Version
C
C     ACFIT FITS THEORETICAL ACFS TO THE EXPERIMENTAL ACFS PASSED TO IT
C     IN COMMON/IFAM/. IF THE SEARCH IS SUCCESSFUL, THE VALUES PUT IN A
C     BY THE SUCCESSFUL FIT ARE UNORMALIZED AND PUT IN AA.  FINALLY,
C     THE VALUES IN AA, WHETHER "BAD" OR "GOOD", ARE TRANSFERED TO PART
C     AND HENCE TO THE DATABASE RECORD.
C     Use egrep '(\.\.\.\.\.)' acfit.f for ACFIT summary
C

SUBROUTINE ACFMINI ()
C
C     ACFMINI INITIALIZES THE TAU ARRAY IN ACFM
C
C     JMH - 11/93
C

SUBROUTINE ACFMPRN (LFNPRN,FAC)
      INTEGER LFNPRN      !Read-only
      DOUBLE PRECISION FAC(*)      !Read-only
C
C     ACFMPRN PRINTS THE MEASURED PART OF THE ACF IN ACFM
C
C     JMH - 11/93
C

SUBROUTINE ACFP2ACFM ()
C
C     JMH - 11/93  ADAPTED FROM FUNCTN
C
C     FUNCTN CALCULATES AN AUTOCORRELATION OBJECT FUNCTION MATRIX FROM
C     AN ATMOSPHERIC PARAMETERS MATRIX.
C

SUBROUTINE ACFPINI ()
C
C     JMH - 11/93
C

SUBROUTINE ACFPPRN (LFNPRN)
      INTEGER LFNPRN      !Read-only
C
C     JMH - 11/93
C

SUBROUTINE AQUIK (NLAG,DTAU,PO,ACFR,ACFI,NE,TI,TR,VO,IER)
      INTEGER NLAG      !Read-only
      DOUBLE PRECISION DTAU      !Read-only
      DOUBLE PRECISION PO      !Read-only
      DOUBLE PRECISION ACFR(*)      !Read-only
      DOUBLE PRECISION ACFI(*)      !Read-only
      DOUBLE PRECISION NE
      DOUBLE PRECISION TI
      DOUBLE PRECISION TR
      DOUBLE PRECISION VO
      INTEGER IER
C
C     JMH - 11/82  HARRIS FORTRAN 77
C
C     AQUIK COMPUTES ION AND ELECTRON TEMPERATURE FROM THE FIRST ZERO
C     CROSSING AND DEPTH OF FIRST MINIMUM OF AN ACF, AND THE VELOCITY
C     FROM THE PHASE OF THE ACF. THYPICALLY AQUICK PROVIDES A FIRST
C     GUESS OF THE PARAMETERS PRIOR TO A NON-LINEAR LEAST-SQUARES FIT.
C
C     INPUT PARAMETERS
C        NLAG  - NUMBER OF ACF LAGS
C        DTAU  - ACF LAG SPACING (MICRO SEC)
C        PO    - LOG POWER, NORMALIZED TO NE=.5*(1+TR+DF)*(1+DF)*10**PO
C        ACFR  - REAL PART OF ACF, NORMALIZED TO 1.0 AT ZERO LAG
C        ACFI  - IMAGINARY PART OF ACF
C
C     OUTPUT PARAMETERS
C        NE   - ELECTRON DENSITY (1/CM**2)
C        TI   - ION TEMPERATURE (DEG K)
C        TR   - ELECTRON/ION TEMPERATURE RATIO
C        VO   - LINE-OF SIGHT DRIFT (M/SEC)
C        IER=0 - SUCCESSFUL NE,TI,TR,VO DETERMINATION
C            1 - FIRST TWO LAGS NOT BOTH > 0
C            2 - ALL ACFR POINTS > 0
C            3 - IMAGINARY ZERO CROSSING
C            4 - NO MINIMUM FOUND AFTER FIRST ZERO CROSSING
C            5 - FIRST MINIMUM OUT OF TABULATED RANGE
C            6 - SUCCESSFUL TI,TR,VO DETERMINATION, PO OUT OF RANGE
C            7 - TI OR TR OUT OF RANGE
C            8 - VO OUT OF RANGE
C

SUBROUTINE ARGIN (ISTAT)
      INTEGER ISTAT
C
C     JMH - 10/25/04
C
C     ARGIN PARSES INSCAL COMMAND LINE ARGUMENTS.
C

SUBROUTINE READARGS (ISTAT)
      INTEGER ISTAT
C
C     JMH - 11/05/04
C
C     READARGS READS INSCAL COMMAND LINE ARGUMENTS FROM A FILE
C

SUBROUTINE WRITEARGS (CMDFILEOUT,ISTAT)
      CHARACTER CMDFILEOUT      !Read-only
      INTEGER ISTAT      !Read-only
C
C     JMH - 11/11/04
C
C     WRITEARGS WRITES INSCAL COMMAND LINE ARGUMENTS TO A FILE
C

SUBROUTINE SETOUTFILE (OUTFILEIN)
      CHARACTER * 128 OUTFILEIN      !Read-only
C

SUBROUTINE ARINI ()
C

SUBROUTINE ARUPD (Z,TI,DTI,TR,DTR)
      DOUBLE PRECISION Z      !Read-only
      DOUBLE PRECISION TI      !Read-only
      DOUBLE PRECISION DTI      !Read-only
      DOUBLE PRECISION TR      !Read-only
      DOUBLE PRECISION DTR      !Read-only
C

SUBROUTINE ARGET (Z,TI,TR,IER)
      DOUBLE PRECISION Z      !Read-only
      DOUBLE PRECISION TI
      DOUBLE PRECISION TR
      INTEGER IER
C

SUBROUTINE ATM2ACFP ()
C
C     JMH - 11/93  ADAPTED FROM FUNCTN
C
C     ATM2ACFP CALCULATES AN AUTOCORRELATION OBJECT FUNCTION MATRIX FROM
C     AN ATMOSPHERIC PARAMETERS MATRIX.
C

SUBROUTINE ATM2OFAM ()
C
C     JMH - 06/94
C

SUBROUTINE ATMINI ()
C
C     JMH - 10/93
C

SUBROUTINE ATMLWE (ZL,ZU,DLB,TINF,TLB,XM,ZLB,S2,T0,ZA,Z0,TR12,CLF,CPO,CVO)
      DOUBLE PRECISION ZL      !Read-only
      DOUBLE PRECISION ZU      !Read-only
      DOUBLE PRECISION DLB      !Read-only
      DOUBLE PRECISION TINF      !Read-only
      DOUBLE PRECISION TLB      !Read-only
      DOUBLE PRECISION XM      !Read-only
      DOUBLE PRECISION ZLB      !Read-only
      DOUBLE PRECISION S2      !Read-only
      DOUBLE PRECISION T0      !Read-only
      DOUBLE PRECISION ZA      !Read-only
      DOUBLE PRECISION Z0      !Read-only
      DOUBLE PRECISION TR12      !Read-only
      DOUBLE PRECISION CLF      !Read-only
      DOUBLE PRECISION CPO(*)      !Read-only
      DOUBLE PRECISION CVO(*)      !Read-only
C
C     Z1    - lower altitude boundry for calculation altitude (km)
C     Z2    - upper altitude boundry for calculation altitude (km)
C     DLB   - density at lower boundry ZLB
C     TINF  - exospheric temperature (K)
C     TLB   - temperature at ZLB (K)
C     XM    - molecular weight of gas species
C     ZLB   - lower boundry (120 km)
C     S2    - TLB'/(TINF-TLB)
C     T0    - mesopause temperature (K)
C     ZA    - altitude of temperature profile junction
C     Z0    - mesopause height (km)
C     TR12  - mesopause shape parameter
C     CLF   - log collision frequency factor
C     CPO   - polynomial coefficients for PO
C

SUBROUTINE ATMMOD ()
C
C     JMH - 10/93
C

SUBROUTINE ATMMSIS (ZL,ZU)
      DOUBLE PRECISION ZL      !Read-only
      DOUBLE PRECISION ZU      !Read-only
C

SUBROUTINE ATMPRN (LFNPRN,INDPRN)
      INTEGER LFNPRN      !Read-only
      INTEGER INDPRN(*)      !Read-only
C
C     JMH - 10/93
C

SUBROUTINE BADACF (A,SIGA,ISTBAD)
      DOUBLE PRECISION A(*)
      DOUBLE PRECISION SIGA(*)
      INTEGER ISTBAD
C
C     JMH - 9/81
C
C     BADACF SETS ACF SEARCH PARAMETERS TO A STANDARD BAD VALUE.
C
C     A      - SEARCH PARAMETERS
C     SIGA   - SEARCH PARAMETER ERRORS
C     ISTBAD - ISTBAD=1 -> BAD PARAMETERS
C

SUBROUTINE BADAQ (TI,TR,VO)
      DOUBLE PRECISION TI
      DOUBLE PRECISION TR
      DOUBLE PRECISION VO
C
C     JMH - 11/82
C

DOUBLE PRECISION FUNCTION BNEWT (I,X,DX,Y,XVAL)
      INTEGER I      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION DX      !Read-only
      DOUBLE PRECISION Y(*)      !Read-only
      DOUBLE PRECISION XVAL      !Read-only
C
C     JMH - 11/82
C

SUBROUTINE CEDAR2OFAM (MADFIL,RECNO,IER)
      INTEGER MADFIL      !Unknown (program incomplete)
      INTEGER RECNO      !Unknown (program incomplete)
      INTEGER IER
C
C     CEDAR2OFAM reads a cedar record from an in-memory madrec structure
C     and populates an ofam structure.
C
C         Inputs: INTEGER MADFIL - pointer to in-memory madrec structure
C                 (that is, opened with iotype 30 or greater)
C
C                 INTEGER RECNO - record number of interest
C
C         Effect: Populates ofam.h common blocks OFAM, OFAMC
C                 Sets IER to 0 if success, negitive otherwise
C                 Sets current record in MADFIL to recno
C
C      Errors: If MADFIL is NULL, or RECNO does not point to data record
C

LOGICAL FUNCTION CKIFAM (IREC)
      INTEGER IREC      !Read-only
C
C     JMH - 12/92
C

SUBROUTINE CTRLIN (CTRLFIL,ISTAT)
      CHARACTER CTRLFIL      !Read-only
      INTEGER ISTAT
C
C     JMH - 1/5/93
C

SUBROUTINE CTRLOUT (CTRLFIL,ISTAT)
      CHARACTER CTRLFIL      !Read-only
      INTEGER ISTAT
C
C     JMH - 12/98 - UPDATED TO INSCAL 8.0
C

SUBROUTINE CURFIT (X,Y,NPTS,NTERMS,W,A,SIGMA,FLAMDA,YFIT,CHISQR,CORMAT,NTS,
                   COVMAT,DERIV,INIT,NS,FUNCTN,NTYPE,MODE)
      DOUBLE PRECISION X(*)
      DOUBLE PRECISION Y(*)      !Read-only
      INTEGER NPTS      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION W(*)      !Read-only
      DOUBLE PRECISION A(*)
      DOUBLE PRECISION SIGMA(*)
      DOUBLE PRECISION FLAMDA
      DOUBLE PRECISION YFIT(*)
      DOUBLE PRECISION CHISQR
      DOUBLE PRECISION CORMAT(*)
      INTEGER NTS
      DOUBLE PRECISION COVMAT(*)
      DOUBLE PRECISION DERIV(NPTS,*)
      INTEGER INIT
      INTEGER NS(NTERMS)      !Read-only
      SUBROUTINE FUNCTN
            Argument 1: INTEGER 
            Argument 2: DOUBLE PRECISION ARRAY
            Argument 3: INTEGER ARRAY
            Argument 4: INTEGER 
            Argument 5: DOUBLE PRECISION ARRAY
            Argument 6: INTEGER ARRAY
            Argument 7: DOUBLE PRECISION ARRAY
      INTEGER NTYPE(NPTS)      !Read-only
      INTEGER MODE      !Read-only
C
C      SUBROUTINE CURFIT
C
C      PURPOSE
C        MAKE A LEAST-SQUARES FIT TO A NON-LINEAR FUNCTION
C           WITH A LINEARIZATION OF THE FITTING FUNCTION
C
C      USAGE
C      CALL CURFIT(X,Y,NPTS,NTERMS,W,A,SIGMA,FLAMDA,YFIT,CHISQR,
C     *            CORMAT,NTS,COVMAT,DERIV,INIT,NS,FUNCTN,NTYPE,MODE)
C
C      INPUT PARAMETERS
C        X      - ARRAY OF DATA POINTS FOR INDEPENDENT VARIABLE
C        Y      - ARRAY OF DATA POINTS FOR DEPENDENT VARIABLE
C        NPTS   - NUMBER OF PAIRS OF DATA POINTS
C        NTERMS - NUMBER OF SEARCH PARAMETERS
C        W      - ARRAY OF WEIGHTS FOR Y DATA POINTS
C        FLAMDA - PROPORTION OF GRADIENT SEARCH INCLUDED
C        NS     - NS(I)=1 -> SEARCH PARAMETER A(I)
C        FUNCTN - LEAST SQUARES OBJECTIVE FUNCTION
C        NTYPE  - PASSED THROUGH TO FUNCTN
C        MODE   - MODE=2 -> DIAGNOSTIC OUTPUT
C        INIT   - ITERATION COUNTER
C      OUTPUT PARAMETERS
C        SIGMA  - ARRAY OF STANDARD DEVIATIONS FOR PARAMETERS A
C        YFIT   - ARRAY OF CALCULATED VALUES OF Y
C        CHISQR - REDUCED CHI-SQUARE FOR FIT
C        NTS    - NUMBER OF SEARCHED PARAMETERS
C        COVMAT - COVARIANCE MATRIX
C        CORMAT - CORRELATION MATRIX
C        DERIV  - DERIVATIVES OF THE FITTING FUNCTION
C      INPUT/OUTPUT PARAMETERS
C        A      - ARRAY OF SEARCH PARAMETERS
C
C      SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
C        FUNCTN (X, NPTS, A, YFIT)
C           EVALUATES THE FITTING FUNCTION
C        FCHISQ (Y, NPTS, NFREE, WEIGHT, YFIT)
C           EVALUATES REDUCED CHI-SQUARE FOR FIT TO DATA
C        FDERIV (X, NPTS, A, NTERMS, YFIT, DERIV)
C           EVALUATES THE DERIVATIVES OF THE FITTING FUNCTION
C        MINV (ARRAY, NTERMS, DET, L, M)
C          INVERTS A SYMETRIC TWO-DIMENSIONAL MATRIX
C          OF DEGREE NTERMS AND CALCULATED ITS DETERMINANT
C
C      COMMENTS
C        SET FLAMDA = 0.001 AT BEGINNING OF SEARCH
C
C     FROM:
C     PHILIP R. BEVINGTON
C     DATA REDUCTION AND ERROR ANALYSIS FOR THE PHYSICAL SCIENCES
C     MCGRAW-HILL BOOK COMPANY, 1969
C

DOUBLE PRECISION FUNCTION DAW (X)
      DOUBLE PRECISION X      !Read-only
C
C     DAW COMPUTES DAWSON'S INTEGRAL, DAW(X), TO 11 SIGNIFICANT
C     FIGURES, USING RATIONAL CHEBYSHEV APPROXIMATIONS
C     (W. J. CODY ET AL., MATH COMP. 24, 1970, 171-178).
C

SUBROUTINE DEFINELPFIT (X,Y,DY,CB,M,N,TIN)
      DOUBLE PRECISION X(MDIM)
      DOUBLE PRECISION Y(MDIM)
      DOUBLE PRECISION DY(MDIM)
      DOUBLE PRECISION CB(MDIM,5)
      INTEGER M
      INTEGER N
      DOUBLE PRECISION TIN(NDIM)
C
C     JMH - 1/2004
C

DOUBLE PRECISION FUNCTION DENSTY (ALT,DLB,TINF,TLB,XM,ALPHA,TZ,ZLB,S2,T0,
                                  ZA,Z0,TR12)
      DOUBLE PRECISION ALT      !Read-only
      DOUBLE PRECISION DLB      !Read-only
      DOUBLE PRECISION TINF      !Read-only
      DOUBLE PRECISION TLB      !Read-only
      DOUBLE PRECISION XM      !Read-only
      DOUBLE PRECISION ALPHA      !Read-only
      DOUBLE PRECISION TZ
      DOUBLE PRECISION ZLB      !Read-only
      DOUBLE PRECISION S2      !Read-only
      DOUBLE PRECISION T0      !Read-only
      DOUBLE PRECISION ZA      !Read-only
      DOUBLE PRECISION Z0      !Read-only
      DOUBLE PRECISION TR12      !Read-only
C
C     Calculate Temperature and Density Profiles for MSIS models
C
C     ALT   - altitude (km)
C     DLB   - density at lower boundry ZLB
C     TINF  - exospheric temperature (K)
C     TLB   - temperature at ZLB (K)
C     XM    - molecular weight of gas species
C     ALPHA - thermal diffusion coefficient
C     TZ    - temperature at ALT (K) (OUTPUT PARAMETER)
C     ZLB   - lower boundry (120 km)
C     S2    - TLB'/(TINF-TLB)
C     T0    - mesopause temperature (K)
C     ZA    - altitude of temperature profile junction
C     Z0    - mesopause height (km)
C     TR12  - mesopause shape parameter
C

DOUBLE PRECISION FUNCTION DFUN (TR,PFAC)
      DOUBLE PRECISION TR      !Read-only
      DOUBLE PRECISION PFAC      !Read-only
C
C     DFUN CALCULATES THE DEBYE FACTOR CORRESPONDING TO GIVEN
C     TEMPERATURE RATIO AND POWER FACTOR PFAC=4761.*TE*RK**2/(PNORM*P).
C     NEWTON'S METHOD IS USED TO SOLVE DFUN*(1+TR+DFUN)*(1+DFUN)-PFAC=0.
C

SUBROUTINE DOPP (ACFR,ACFI,DTAU,NLAGS,DLAG,LMULTI,VEL,IERROR)
      DOUBLE PRECISION ACFR(*)      !Read-only
      DOUBLE PRECISION ACFI(*)      !Read-only
      DOUBLE PRECISION DTAU      !Read-only
      INTEGER NLAGS      !Read-only
      INTEGER DLAG      !Read-only
      LOGICAL LMULTI      !Read-only
      DOUBLE PRECISION VEL
      INTEGER IERROR
C
C     Created 8/3/89 ... DT
C
C     F:DOPP computes the Doppler velocity from the average lag-to-lag
C     phase change, in contrast to F:VELX, which uses the average phase
C     change referred to lag 0.
C
C     Input parameters:
C
C     ACFR(): Real part of a.c.f.
C
C     ACFI(): Imaginary part of a.c.f.
C
C     DTAU:   Lag spacing in usecs
C
C     NLAGS:  Maximum lag to use in computation. NLAGS is less than
C             or equal to the total a.c.f. length
C
C     DLAG:   Pair separation for phase change. DLAG=1 uses
C             (0,1), (1,2), etc, while DLAG=2 uses
C             (0,2), (1,3), etc.
C
C     LMULTI:  Multipulse indicator tells the algorithm to NOT use
C             the missing lags 0 and 6.
C
C     Output parameters:
C
C     VEL:    Doppler velocity
C
C     IERROR: IERROR = 0 ---> velocity o.k.
C             IERROR = 1 ---> error while computing velocity
C
C     *** NOTE ***
C
C     The constant FACTOR is hard-wired for Millstone Hill, and is
C     equal to 10**6 * (wavelength / ( 4 * pi ))
C

SUBROUTINE EFITFP (ALT1,ALT2,IER)
      DOUBLE PRECISION ALT1      !Read-only
      DOUBLE PRECISION ALT2      !Read-only
      INTEGER IER
C
C     JMH - 10/93
C

SUBROUTINE ERROR (IER,NAME)
      INTEGER IER      !Read-only
      CHARACTER * 6 NAME      !Read-only
C
C     ERROR PRINTS AN ERROR MESSAGE WHEN AN ERROR IS ENCOUNTERED BY THE
C     CALLING ROUTINE. IER INDICATES THE SEVERITY OF THE ERROR AND IS OF
C     THE FORM TYPE+N WHERE
C        TYPE = 200  IMPLIES WARNING WITH FIX
C        TYPE = 100  IMPLIES WARNING
C           N = ERROR CODE DEFINED IN CALLING ROUTINE
C     NAME IS A SIX CHARACTER LITERAL STRING CONTAINING THE NAME OF
C     THE CALLING ROUTINE.
C

SUBROUTINE EXINSC (SIGNAL)
      INTEGER SIGNAL      !Read-only
C
C     JMH - 3/93
C
C     EXINSC EXITS INSCAL GRACEFULLY
C

DOUBLE PRECISION FUNCTION FCHISQ (Y,NPTS,NFREE,W,YFIT)
      DOUBLE PRECISION Y(*)      !Read-only
      INTEGER NPTS      !Read-only
      INTEGER NFREE      !Read-only
      DOUBLE PRECISION W(*)      !Read-only
      DOUBLE PRECISION YFIT(*)      !Read-only
C
C     PURPOSE
C       EVALUATE REDUCED CHI SQUARE FOR FIT TO DATA
C          FCHISQ = SUM((Y-YFIT)**2 / SIGMA**2) / NFREE
C
C     USAGE
C       RESULT = FCHISQ(Y, NPTS, NFREE, W, YFIT)
C
C     DESCRIPTION OF PARAMETERS
C       Y       - ARRAY OF DATA POINTS
C       NPTS    - NUMBER OF DATA POINTS
C       NFREE   - NUMBER OF DEGREES OF FREEDOM
C       W       - ARRAY OF WEIGHTS
C       YFIT    - ARRAY OF CALCULATED VALUES OF Y
C
C     FROM:
C     PHILIP R. BEVINGTON
C     DATA REDUCTION AND ERROR ANALYSIS FOR THE PHYSICAL SCIENCES
C     MCGRAW-HILL BOOK COMPANY, 1969
C

SUBROUTINE FDERIV (NPTS,X,NTYPE,NTERMS,A,NS,YFIT,DERIV,FUNCTN)
      INTEGER NPTS      !Read-only
      DOUBLE PRECISION X(*)
      INTEGER NTYPE(*)      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION A(*)
      INTEGER NS(*)      !Read-only
      DOUBLE PRECISION YFIT(*)      !Read-only
      DOUBLE PRECISION DERIV(NPTS,*)
      SUBROUTINE FUNCTN
            Argument 1: INTEGER 
            Argument 2: DOUBLE PRECISION ARRAY
            Argument 3: INTEGER ARRAY
            Argument 4: INTEGER 
            Argument 5: DOUBLE PRECISION ARRAY
            Argument 6: INTEGER ARRAY
            Argument 7: DOUBLE PRECISION Array Element
C
C     PURPOSE
C       EVALUATE DERIVATIVES OF FUNCTION FOR LEAST-SQUARES SEARCH
C          FOR ARBITRARY FUNCTION GIVEN BY FUNCTN
C
C     USAGE
C       CALL FDERIV(X, NPTS, A, NTERMS, YFIT, DERIV)
C
C     DESCRIPTION OF PARAMETERS
C       X      - ARRAY OF DATA POINTS FOR INDEPENDENT VARIABLE
C       NPTS   - NUMBER OF DATA POINTS
C       A      - ARRAY OF PARAMETERS
C       NTERMS - NUMBER OF PARAMETERS
C       YFIT   - ARRAY OF FUNCTION VALUES
C       DERIV  - DERIVATIVES OF FUNCTION
C
C     SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
C       FUNCTN (NPTS, X, NTYPE, NTERMS, A, NS, DERIV)
C          EVALUATES YFIT
C

SUBROUTINE FOURS (DATA,N,ISIGN,ISYM)
      DOUBLE PRECISION DATA(*)
      INTEGER N      !Read-only
      INTEGER ISIGN      !Read-only
      INTEGER ISYM      !Read-only
C     FOURIER TRANSFORM OF REAL, SYMMETRIC DATA BY THE FAST FOURIER
C     TRANSFORM.  WRITTEN BY JAMES COOLEY, IBM, AND NORMAN BRENNER, MIT,
C     OCTOBER 1968.
C     THE INPUT ARRAY IS REAL, LENGTH N/2+1, REPRESENTING A REAL ARRAY
C     OF LENGTH N.  N IS AN ARBITRARY MULTIPLE OF FOUR, THO IF IT IS
C     NOT A POWER OF TWO, REPLACE FOUR2 BELOW BY FOURT.
C     THE FULL ARRAY OF LENGTH N HAS EITHER EVEN OR ODD SYMMETRY (ISYM=
C     +1 OR -1) ACCORDING TO WHETHER DATA(N+2-I)=+DATA(I) OR
C     - DATA(I), FOR I = 2,3,...N.  DATA(1) = + OR - DATA(1).  ODD
C     SYMMETRY IMPLIES THAT DATA(1)=DATA(N/2+1)=0.  ISIGN = +1 OR -1,
C     THE DIRECTION OF THE TRANSFORM.  THE FIRST N/2+1 POINTS OF THE
C      TRANSFORM, REAL AND SAME SYMMETRY AS THE INPUT, WILL BE RETURNED
C     IN DATA, REPLACING THE INPUT. RUNNING TIME AND ARRAY
C     STORAGE ARE EQUIVALENT TO THE TRANSFORM OF N/4 COMPLEX, ASYM-
C     METRIC DATA.  NOTE THAT THE COMPLEX TRANSFORM OF EVEN OR ODD
C     SYMMETRIC DATA IS EQUIVALENT TO THE COSINE OR SINE TRANSFORM,
C     RESPECTIVELY, OF ASYMMETRIC DATA.
C

SUBROUTINE FOUR2 (DATA,N,NDIM,ISIGN,IFORM)
      DOUBLE PRECISION DATA(*)
      INTEGER N(*)      !Read-only
      INTEGER NDIM      !Read-only
      INTEGER ISIGN      !Read-only
      INTEGER IFORM      !Read-only
C     COOLEY-TUKEY FAST FOURIER TRANSFORM IN USASI BASIC FORTRAN.
C     MULTI-DIMENSIONAL TRANSFORM, EACH DIMENSION A POWER OF TWO,
C     COMPLEX OR REAL DATA.
C     TRANSFORM(K1,K2,...) = SUM(DATA(J1,J2,...)*EXP(ISIGN*2*PI*SQRT(-1)
C     *((J1-1)*(K1-1)/N(1)+(J2-1)*(K2-1)/N(2)+...))), SUMMED FOR ALL
C     J1 AND K1 FROM 1 TO N(1), J2 AND K2 FROM 1 TO N(2),
C     ETC. FOR ALL NDIM SUBSCRIPTS.  NDIM MUST BE POSITIVE AND
C     EACH N(IDIM) MUST BE A POWER OF TWO.  ISIGN IS +1 OR -1.
C     LET NTOT = N(1)*N(2)*...*N(NDIM).  THEN A -1 TRANSFORM
C     FOLLOWED BY A +1 ONE (OR VICE VERSA) RETURNS NTOT
C     TIMES THE ORIGINAL DATA.  IFORM = 1, 0 OR -1, AS DATA IS
C     COMPLEX, REAL OR THE FIRST HALF OF A COMPLEX ARRAY.  TRANSFORM
C     VALUES ARE RETURNED TO ARRAY DATA.  THEY ARE COMPLEX, REAL OR
C     THE FIRST HALF OF A COMPLEX ARRAY, AS IFORM = 1, -1 OR 0.
C     THE TRANSFORM OF A REAL ARRAY (IFORM = 0) DIMENSIONED N(1) BY N(2)
C     BY ... WILL BE RETURNED IN THE SAME ARRAY, NOW CONSIDERED TO
C     BE COMPLEX OF DIMENSIONS N(1)/2+1 BY N(2) BY ....  NOTE THAT IF
C     IFORM = 0 OR -1, N(1) MUST BE EVEN, AND ENOUGH ROOM MUST BE
C     RESERVED.  THE MISSING VALUES MAY BE OBTAINED BY COMPLEX CONJUGA-
C     TION.  THE REVERSE TRANSFORMATION, OF A HALF COMPLEX ARRAY DIMEN-
C     SIONED N(1)/2+1 BY N(2) BY ..., IS ACCOMPLISHED BY SETTING IFORM
C     TO -1.  IN THE N ARRAY, N(1) MUST BE THE TRUE N(1), NOT N(1)/2+1.
C     THE TRANSFORM WILL BE REAL AND RETURNED TO THE INPUT ARRAY.
C     RUNNING TIME IS PROPORTIONAL TO NTOT*LOG2(NTOT), RATHER THAN
C     THE NAIVE NTOT**2.  FURTHERMORE, LESS ERROR IS BUILT UP.
C     WRITTEN BY NORMAN BRENNER, MIT, JUNE 1968.  SEE-- IEEE AUDIO
C     TRANSACTIONS, JUNE 1967 AND JUNE 1969, SPECIAL FFT ISSUES.
C

SUBROUTINE BITRV (DATA,NPREV,N,NREM)
      DOUBLE PRECISION DATA(*)
      INTEGER NPREV      !Read-only
      INTEGER N      !Read-only
      INTEGER NREM      !Read-only
C     SHUFFLE THE DATA BY BIT REVERSAL.
C     DIMENSION DATA(NPREV,N,NREM)
C     COMPLEX DATA
C     EXCHANGE DATA(J1,J4REV,J5) WITH DATA(J1,J4,J5) FOR ALL J1 FROM 1
C     TO NPREV, ALL J4 FROM 1 TO N (WHICH MUST BE A POWER OF TWO), AND
C     ALL J5 FROM 1 TO NREM.  J4REV-1 IS THE BIT REVERSAL OF J4-1.  E.G.
C     SUPPOSE N = 32.  THEN FOR J4-1 = 10011, J4REV-1 = 11001, ETC.
C

SUBROUTINE COOL2 (DATA,NPREV,N,NREM,ISIGN)
      DOUBLE PRECISION DATA(*)
      INTEGER NPREV      !Read-only
      INTEGER N      !Read-only
      INTEGER NREM      !Read-only
      INTEGER ISIGN      !Read-only
C     DISCRETE FOURIER TRANSFORM OF LENGTH N.  IN-PLACE COOLEY-TUKEY
C     ALGORITHM, BIT-REVERSED TO NORMAL ORDER, SANDE-TUKEY PHASE SHIFTS.
C     DIMENSION DATA(NPREV,N,NREM)
C     COMPLEX DATA
C     DATA(J1,K4,J5) = SUM(DATA(J1,J4,J5)*EXP(ISIGN*2*PI*I*(J4-1)*
C     (K4-1)/N)), SUMMED OVER J4 = 1 TO N FOR ALL J1 FROM 1 TO NPREV,
C     K4 FROM 1 TO N AND J5 FROM 1 TO NREM.  N MUST BE A POWER OF TWO.
C     METHOD--LET IPREV TAKE THE VALUES 1, 2 OR 4, 4 OR 8, ..., N/16,
C     N/4, N.  THE CHOICE BETWEEN 2 OR 4, ETC., DEPENDS ON WHETHER N IS
C     A POWER OF FOUR.  DEFINE IFACT = 2 OR 4, THE NEXT FACTOR THAT
C     IPREV MUST TAKE, AND IREM = N/(IFACT*IPREV).  THEN--
C     DIMENSION DATA(NPREV,IPREV,IFACT,IREM,NREM)
C     COMPLEX DATA
C     DATA(J1,J2,K3,J4,J5) = SUM(DATA(J1,J2,J3,J4,J5)*EXP(ISIGN*2*PI*I*
C     (K3-1)*((J3-1)/IFACT+(J2-1)/(IFACT*IPREV)))), SUMMED OVER J3 = 1
C     TO IFACT FOR ALL J1 FROM 1 TO NPREV, J2 FROM 1 TO IPREV, K3 FROM
C     1 TO IFACT, J4 FROM 1 TO IREM AND J5 FROM 1 TO NREM.  THIS IS
C     A PHASE-SHIFTED DISCRETE FOURIER TRANSFORM OF LENGTH IFACT.
C     FACTORING N BY FOURS SAVES ABOUT TWENTY FIVE PERCENT OVER FACTOR-
C     ING BY TWOS.  DATA MUST BE BIT-REVERSED INITIALLY.
C     IT IS NOT NECESSARY TO REWRITE THIS SUBROUTINE INTO COMPLEX
C     NOTATION SO LONG AS THE FORTRAN COMPILER USED STORES REAL AND
C     IMAGINARY PARTS IN ADJACENT STORAGE LOCATIONS.  IT MUST ALSO
C     STORE ARRAYS WITH THE FIRST SUBSCRIPT INCREASING FASTEST.
C

SUBROUTINE FIXRL (DATA,N,NREM,ISIGN,IFORM)
      DOUBLE PRECISION DATA(*)
      INTEGER N      !Read-only
      INTEGER NREM      !Read-only
      INTEGER ISIGN      !Read-only
      INTEGER IFORM      !Read-only
C     FOR IFORM = 0, CONVERT THE TRANSFORM OF A DOUBLED-UP REAL ARRAY,
C     CONSIDERED COMPLEX, INTO ITS TRUE TRANSFORM.  SUPPLY ONLY THE
C     FIRST HALF OF THE COMPLEX TRANSFORM, AS THE SECOND HALF HAS
C     CONJUGATE SYMMETRY.  FOR IFORM = -1, CONVERT THE FIRST HALF
C     OF THE TRUE TRANSFORM INTO THE TRANSFORM OF A DOUBLED-UP REAL
C     ARRAY.  N MUST BE EVEN.
C     USING COMPLEX NOTATION AND SUBSCRIPTS STARTING AT ZERO, THE
C     TRANSFORMATION IS--
C     DIMENSION DATA(N/2,NREM)
C     ZSTP = EXP(ISIGN*2*PI*I/N)
C     DO 10 I2=0,NREM-1
C     DATA(0,I2) = CONJ(DATA(0,I2))*(1+I)
C     DO 10 I1=1,N/4
C     Z = (1+(2*IFORM+1)*I*ZSTP**I1)/2
C     I1CNJ = N/2-I1
C     DIF = DATA(I1,I2)-CONJ(DATA(I1CNJ,I2))
C     TEMP = Z*DIF
C     DATA(I1,I2) = (DATA(I1,I2)-TEMP)*(1-IFORM)
C     10  DATA(I1CNJ,I2) = (DATA(I1CNJ,I2)+CONJ(TEMP))*(1-IFORM)
C     IF I1=I1CNJ, THE CALCULATION FOR THAT VALUE COLLAPSES INTO
C     A SIMPLE CONJUGATION OF DATA(I1,I2).
C

SUBROUTINE FIT1 (NIT,OMEGA,ACF,MS,NTERMS,W,A00,SIGA00,NSC,K,QSSW,YFIT,A,SIGA,
                 COVMAT,CORMAT,CHISQR,QGOOD)
      INTEGER NIT
      DOUBLE PRECISION OMEGA(*)
      DOUBLE PRECISION ACF(*)      !Read-only
      INTEGER MS      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION W(*)      !Read-only
      DOUBLE PRECISION A00(NFPMAX)      !Read-only
      DOUBLE PRECISION SIGA00(NFPMAX)      !Read-only
      INTEGER NSC(*)      !Read-only
      INTEGER K      !Read-only
      INTEGER QSSW(*)      !Read-only
      DOUBLE PRECISION YFIT(*)
      DOUBLE PRECISION A(NFPMAX)
      DOUBLE PRECISION SIGA(NFPMAX)
      DOUBLE PRECISION COVMAT(NFPMAX*NFPMAX)
      DOUBLE PRECISION CORMAT(NFPMAX*NFPMAX)
      DOUBLE PRECISION CHISQR
      LOGICAL QGOOD
C
C     JMH - 9/82   HARRIS FORTRAN 77
C
C     FIT1 COMPUTES A NON-LINEAR-LEAST-SQUARES FIT TO A MEASURED ACF.
C
C     NIT    - MAXIMUM NUMBER OF ITERATIONS (INPUT)
C              ACTUAL NUMBER OF ITERATIONS (OUTPUT)
C     OMEGA  - FREQUENCIES OF MEASURED ACF
C     ACF    - MEASURED ACF
C     MS     - NUMBER OF PAIRS OF DATA POINTS (ACF)
C     NTERMS - NUMBER OF SEARCH PARAMETERS
C     W      - ACF WEIGHTS
C     A00    - INITIAL VALUES OF FIT PARAMETERS
C     SIGA00 - INITIAL VALUES OF FIT PARAMETER STANDARD DEVIATIONS
C     NSC    - NSC(I)=1 -> SEARCH PARAMETER A(I)
C     K      - REQUIRED LEVEL OF ACCURACY OF FIT CONVERGENCE (1-4)
C     QSSW   - INSCAL CONTROL SWITCH ARRAY
C
C     YFIT   - ACF FIT
C     A      - OUTPUT FIT PARAMETERS
C     SIGA   - OUTPUT STANDARD DEVIATIONS
C     COVMAT - COVARIANCE MATRIX
C     CORMAT - CORRELATION MATRIX
C     CHISQR - FIT CHISQR
C     QGOOD  - 1 - FIT WAS SUCCESSFUL
C              2 - FIT WAS UNSUCCESSFUL
C

SUBROUTINE FITPH (ACFR,ACFI,WR,WI,NLAG,DTAU,V,DV)
      DOUBLE PRECISION ACFR(*)      !Read-only
      DOUBLE PRECISION ACFI(*)      !Read-only
      DOUBLE PRECISION WR(*)      !Read-only
      DOUBLE PRECISION WI(*)      !Read-only
      INTEGER NLAG      !Read-only
      DOUBLE PRECISION DTAU      !Read-only
      DOUBLE PRECISION V
      DOUBLE PRECISION DV
C
C     JMH - 3/99
C

SUBROUTINE FITSTATS (SNLIM,CHISQR,CHISQT)
      DOUBLE PRECISION SNLIM      !Read-only
      DOUBLE PRECISION CHISQR(*)      !Read-only
      DOUBLE PRECISION CHISQT(*)      !Read-only
C
C     JMH - 9/97
C

SUBROUTINE FIXIFAM (ASET)
      DOUBLE PRECISION ASET(NFPMAX,6)      !Read-only
C
C     FIXIFAM APPLIES CORRECTIONS TO THE IFAM STRUCTURE. IDEALLY,
C     THIS SHOULD NOT BE NECESSARY. FOR EXAMPLE, IF IFAM IS PRODUCED
C     BY CMST2IFAM, IN MOST CASES CMST2IFAM SHOULD BE MODIFIED TO
C     CREATE A GOOD IFAM. PRACTICALLY SPEAKING, THIS IS NOT ALWAYS
C     POSSIBLE. FIXIFAM IS IN SOME SENSE A KLUDGE ROUTINE, AND
C     MAY HAVE TO BE MODIFIED WHEN DATA FROM A NEW SOURCE IS
C     ANALYZED. A PRIMARY VIRTUE IS THAT IT COLLECTS SEVERAL KLUDGES
C     TOGETHER WHERE THEY ARE MORE EASILY MONITORED THAN IF THEY WERE
C     SPREAD THROUGHOUT INSCAL.
C
C     JMH -  8/97
C     JMH - 12/98 - GENERALIZED FOR INSCAL 8.0
C

SUBROUTINE FIXSPEC (ACF,NLAG,DTAU,IND,ASYM,SPECFAC,NSPECT,OMEGA,SPECT,AACF)
      DOUBLE PRECISION ACF(2,*)      !Read-only
      INTEGER NLAG      !Read-only
      DOUBLE PRECISION DTAU      !Read-only
      INTEGER IND      !Read-only
      DOUBLE PRECISION ASYM      !Read-only
      DOUBLE PRECISION SPECFAC(*)      !Read-only
      INTEGER NSPECT
      DOUBLE PRECISION OMEGA(*)
      DOUBLE PRECISION SPECT(2,*)
      DOUBLE PRECISION AACF(2,*)
C
C     JMH - 8/97
C
C     SPECTCAL COMPUTES THE SPECTRUM CORRESPONDING TO A COMPLEX,
C     HERMITIAN AUTOCORRELATION FUNCTION SPECIFIED BY ITS POSITIVE
C     LAGS.
C
C       INPUT:
C        ACF    - INPUT AUTOCORRELATION FUNCTION. ACF(1,I) CONTAINS
C                 THE REAL PART OF THE ACF AND ACF(2,I) CONTAINS
C                 THE IMAGINARY PART OF THE ACF.
C        NLAG   - NUMBER OF LAGS IN ACF. IF NLAG IS NOT A
C                 POWER OF 2 THE ACF WILL BE ZERO PADDED TO
C                 THE NEXT HIGHER POWER OF 2 (=NLAGP2).
C        DTAU   - LAG SPACING (SEC)
C        IND=0  - NO CORRECTION
C            1  - APPLY ASSYMETRY FACTOR
C            2  - APPLY SPECTRAL CORRECTION FACTOR
C        ASYM   - SPECTRUM ASSYMETRY FACTOR.
C
C      OUTPUT:
C        NSPECT - NUMBER OF POINTS IN THE OUTPUT SPECTRUM. IF
C                 NLAG IS A POWER OF 2, NSPECT=2*NLAG. OTHERWISE,
C                 NSPECT = 2*NLAGP2.
C        OMEGA  - ANGULAR FREQUENCY (OMEGA=2*PI*FREQ).
C        SPECT  - OUTPUT SPECTRUM. THE SECOND DIMENSION OF
C                 SPECT MUST BE AT LEAST EQUAL TO NSPECT.
C        AACF   - OUTPUT AUTOCORRELATION FUNCTION. ACF(1,I) CONTAINS
C                 THE REAL PART OF THE ACF AND ACF(2,I) CONTAINS
C                 THE IMAGINARY PART OF THE ACF.
C
C      DO 100 I=1,NLAG
C         WRITE(30,"(1X,I4,3E13.5)") I, (I-1)*DTAU, ACF(1,I), ACF(2,I)
C     100 CONTINUE
C

SUBROUTINE FOUR1 (DATA,NN,ISIGN)
      DOUBLE PRECISION DATA(2*NN)
      INTEGER NN      !Read-only
      INTEGER ISIGN      !Read-only

SUBROUTINE FULLSPEC (ACF,NLAG,DTAU,ASYM,NSPECT,OMEGA,SPECT,AACF)
      DOUBLE PRECISION ACF(2,*)      !Read-only
      INTEGER NLAG      !Read-only
      DOUBLE PRECISION DTAU      !Read-only
      DOUBLE PRECISION ASYM      !Read-only
      INTEGER NSPECT
      DOUBLE PRECISION OMEGA(*)
      DOUBLE PRECISION SPECT(2,*)
      DOUBLE PRECISION AACF(2,*)
C
C     JMH - 8/97
C
C     SPECTCAL COMPUTES THE SPECTRUM CORRESPONDING TO A COMPLEX,
C     HERMITIAN AUTOCORRELATION FUNCTION SPECIFIED BY ITS POSITIVE
C     LAGS.
C
C       INPUT:
C        ACF    - INPUT AUTOCORRELATION FUNCTION. ACF(1,I) CONTAINS
C                 THE REAL PART OF THE ACF AND ACF(2,I) CONTAINS
C                 THE IMAGINARY PART OF THE ACF.
C        NLAG   - NUMBER OF LAGS IN ACF. IF NLAG IS NOT A
C                 POWER OF 2 THE ACF WILL BE ZERO PADDED TO
C                 THE NEXT HIGHER POWER OF 2 (=NLAGP2).
C        DTAU   - LAG SPACING (SEC)
C        ASYM   - SPECTRUM ASSYMETRY FACTOR.
C
C      OUTPUT:
C        NSPECT - NUMBER OF POINTS IN THE OUTPUT SPECTRUM. IF
C                 NLAG IS A POWER OF 2, NSPECT=2*NLAG. OTHERWISE,
C                 NSPECT = 2*NLAGP2.
C        OMEGA  - ANGULAR FREQUENCY (OMEGA=2*PI*FREQ).
C        SPECT  - OUTPUT SPECTRUM. THE SECOND DIMENSION OF
C                 SPECT MUST BE AT LEAST EQUAL TO NSPECT.
C        AACF   - OUTPUT AUTOCORRELATION FUNCTION. ACF(1,I) CONTAINS
C                 THE REAL PART OF THE ACF AND ACF(2,I) CONTAINS
C                 THE IMAGINARY PART OF THE ACF.
C
C      DO 100 I=1,NLAG
C         WRITE(30,"(1X,I4,3E13.5)") I, (I-1)*DTAU, ACF(1,I), ACF(2,I)
C     100 CONTINUE
C

SUBROUTINE FUNCTLWE (NPTS,X,NTYPE,NTERMS,A,NS,FIT)
      INTEGER NPTS      !Read-only
      DOUBLE PRECISION X(*)      !Read-only
      INTEGER NTYPE(*)      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION A(*)      !Read-only
      INTEGER NS(*)      !Read-only
      DOUBLE PRECISION FIT(*)
C
C     JMH - 11/93
C
C     FUNCTLWE CALCULATES THE CURFIT AUTOCORRELATION OBJECT FUNCTION.
C

SUBROUTINE FUNCTN (MS,OMEGA,NTYPE,NTERMS,A,NS,ACF)
      INTEGER MS      !Read-only
      DOUBLE PRECISION OMEGA(*)
      INTEGER NTYPE(*)      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION A(*)      !Read-only
      INTEGER NS(*)      !Read-only
      DOUBLE PRECISION ACF(*)
C
C     JMH - 9/81
C     JMH - 4/92   MIDAS Version
C
C     FUNCTN CALCULATES THE CURFIT AUTOCORRELATION OBJECT FUNCTION.
C
C     KIND   - INDICATES SEARCH PARAMETERS, SPECTRUM CALCULATION
C              FUNCTION
C                 1 - M+
C                 2 - M+, O+
C                 3 - O+
C                 4 - O+, H+
C                 5 - M+  COLLISIONS INCLUDED
C     JIND   - INDICATES WHETHER VELOCITY IS TO BE SEARCHED
C                 0 - V(O+)=V(H+)=0
C                 1 - V(O+)
C

SUBROUTINE FUNPH (NTAU,TAU,NTYPE,NTERMS,A,NS,PHASE)
      INTEGER NTAU      !Read-only
      DOUBLE PRECISION TAU(*)      !Read-only
      INTEGER NTYPE(*)      !Read-only
      INTEGER NTERMS      !Read-only
      DOUBLE PRECISION A(*)      !Read-only
      INTEGER NS(*)      !Read-only
      DOUBLE PRECISION PHASE(*)
C
C     JMH - 3/99
C
C     FUNPH CALCULATES THE CURFIT AUTOCORRELATION PHASE OBJECT FUNCTION.
C

SUBROUTINE GEOPRM (IYDI,SECI,GLATI,GLONGI)
      INTEGER IYDI      !Read-only
      DOUBLE PRECISION SECI      !Read-only
      DOUBLE PRECISION GLATI      !Read-only
      DOUBLE PRECISION GLONGI      !Read-only
C

SUBROUTINE GTCMTM (JDAYNC,STRSEC,ENDSEC)
      INTEGER JDAYNC      !Unknown (program incomplete)
      INTEGER STRSEC
      INTEGER ENDSEC
C
C     GTCMTM COMPUTES THE START AND END TIME OF DATA TO BE ANALYZED
C     BY INSCAL. THESE ARE CALCULATED FROM THE START DATE, START TIME
C     AND END TIME SPECIFIED ON THE INSCAL COMMAND LINE OR FILE.
C
C     JDAYNC - START JULIAN DAY NUMBER
C     STRSEC - START TIME IN SECONDS RELATIVE TO MIDNIGHT ON JDAYNC
C     ENDSEC - END TIME IN SECONDS RELATIVE TO MIDNIGHT ON JDAYNC
C

SUBROUTINE GTIFTM (JDAYNC,SEC)
      INTEGER JDAYNC      !Read-only
      INTEGER SEC
C

SUBROUTINE GTMDAT (MDFILE,ISTAT)
      CHARACTER MDFILE      !Read-only
      INTEGER ISTAT
C

SUBROUTINE GETEXT (TXTFIL,CODE,INDEX,TEXT)
      CHARACTER * 80 TXTFIL      !Read-only
      CHARACTER * 16 CODE(*)
      INTEGER INDEX(*)
      CHARACTER * 128 TEXT(*)
C

SUBROUTINE PRNTEXT (LFN,IC,CODE,INDEX,TEXT)
      INTEGER LFN      !Read-only
      CHARACTER IC      !Unknown (program incomplete)
      CHARACTER * 16 CODE(*)      !Unknown (program incomplete)
      INTEGER INDEX(*)      !Read-only
      CHARACTER * 128 TEXT(*)      !Unknown (program incomplete)
C

SUBROUTINE IF2OFI (NZR,Z1,Z2)
      INTEGER NZR      !Read-only
      DOUBLE PRECISION Z1(*)      !Read-only
      DOUBLE PRECISION Z2(*)      !Read-only
C
C     IF2OFI INITIALIZES OFAM FROM IFAM.  ALL PARAMETERS WHICH CAN
C     BE PASSED DIRECTLY FROM IFAM TO OFAM ARE HANDLED HERE.
C     PARAMETERS WHICH DEPEND ON ANALYSIS OF THE DATA IN IFAM
C     ARE HANDLED ELSEWHERE.
C

SUBROUTINE IFAMINF (INFILE)
      CHARACTER INFILE      !Read-only
C
C     JMH - 5/13/91
C
C     IFAMINF READS AN ASCII FORMAT IFAM FILE INTO
C     LABELLED COMMON IFAM.
C

SUBROUTINE IFAMOUTF (OTFILE)
      CHARACTER OTFILE      !Read-only
C
C     JMH - 5/13/91
C
C     IFAMOUTF WRITES LABELLED COMMON IFAM TO AN ASCII FORMAT
C     IFAM FILE.
C

SUBROUTINE IFAMOUTNF (LFN)
      INTEGER LFN      !Read-only
C
C     JMH - 5/13/91
C
C     IFAMOUTF WRITES LABELLED COMMON IFAM TO AN ASCII FORMAT
C     IFAM FILE.
C

SUBROUTINE INICOM ()
C
C     JMH - 10/83
C     JMH -  4/92   RENAMED FROM BLKDAT TO INICOM
C
C     INICOM INITIALIZES THE VARIABLES IN /DATA/ /STAT/, /QSSWEQ/ and
C     /PARCOM/.
C

SUBROUTINE KNOTSION (Z1,DZ1,Z2,DZ2,NDIM,N,Z)
      DOUBLE PRECISION Z1      !Read-only
      DOUBLE PRECISION DZ1      !Read-only
      DOUBLE PRECISION Z2      !Read-only
      DOUBLE PRECISION DZ2      !Read-only
      INTEGER NDIM      !Read-only
      INTEGER N
      DOUBLE PRECISION Z(NDIM)
C
C     JMH - 01/2004
C
C     KNOTSION CALCULATES A SET OF SPLINE KNOTS SUITABLE FOR
C     FITTING IONOSPHERIC PARAMETER PROFILES.
C
C     INPUT PARAMETERS
C        A,B  - EXPONENTIAL KNOT-SPACING PARAMETERS
C               DZ = 10.0D0**(A+B*Z)
C               A=0.8, B=0.002 -> DZ=10 KM AT 100 KM,
C                                 DZ=100 KM AT 600 KM
C        Z1   - LOWER ALTITUDE BOUND (FIRST KNOT)
C        Z2   - UPPER ALTITUDE BOUND (LAST KNOT)
C        NDIM - MAXIMUM NUMBER OF KNOTS
C
C      OUTPUT PARAMETERS
C        N    - NUMBER OF KNOTS
C        Z    - KNOTS
C

SUBROUTINE FTL1L2 (MDIM,NDIM,M,N,X,Y,DY,BASIS,NB,CB,IFTYPE,RESLIM,YFIT,A,
                   COVMAT,RNORM,IND,IWORK,WORK)
      INTEGER MDIM      !Read-only
      INTEGER NDIM      !Read-only
      INTEGER M      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION X(MDIM)      !Read-only
      DOUBLE PRECISION Y(MDIM)      !Read-only
      DOUBLE PRECISION DY(MDIM)      !Read-only
      SUBROUTINE BASIS
            Argument 1: INTEGER 
            Argument 2: INTEGER 
            Argument 3: DOUBLE PRECISION Array Element
            Argument 4: DOUBLE PRECISION Array Element
      INTEGER NB      !Read-only
      DOUBLE PRECISION CB(MDIM,*)      !Read-only
      INTEGER IFTYPE      !Read-only
      DOUBLE PRECISION RESLIM      !Read-only
      DOUBLE PRECISION YFIT(MDIM)
      DOUBLE PRECISION A(NDIM)
      DOUBLE PRECISION COVMAT(NDIM,NDIM)
      DOUBLE PRECISION RNORM
      INTEGER IND
      INTEGER IWORK(*)
      DOUBLE PRECISION WORK(*)
C
C     JMH - 9/88
C
C     FTL1L2 COMPUTES A WEIGHTED LINEAR L1 (LEAST ABSOLUTE VALUES) OR
C     L2 (LEAST SQUARES) FIT TO AN ARRAY OF DATA. A ROBUST L2 FIT
C     MAY BE COMPUTED BY USING THE L1 FIT TO REJECT DATA OUTLIERS.
C
C     INPUT PARAMETERS
C        MDIM   - MAXIMUM NUMBER OF DATA POINTS AS DIMENSIONED
C                 IN THE CALLING PROGRAM
C        NDIM   - MAXIMUM NUMBER OF FIT COEFFICIENTS AS DIMENSIONED
C                 IN THE CALLING PROGRAM
C        M      - NUMBER OF DATA POINTS
C        N      - NUMBER OF FIT COEFFICIENTS TO BE COMPUTED
C        X      - ARRAY OF INDEPENDENT VARIABLE VALUES (USED IN BASIS
C                 FUNCTION CALCULATIONS
C        Y      - ARRAY OF DEPENDENT VARIABLE VALUES (THE DATA TO BE FIT
C        DY     - ARRAY OF DATA ERRORS, USED TO WEIGHT THE FITS
C        BASIS  - BASIS FUNCTION ROUTINE BASIS(N,I,X,F)
C                    N - NUMBER OF BASIS FUNCTIONS TO CALCULATE (INPUT)
C                    I - INDEX INTO X,F ARRAYS (INPUT)
C                    X - X VALUE AT WHICH TO EVALUATE BASIS FUNCTION (IN
C                    F - ARRAY OF N BASIS FUNCTION VALUES (OUTPUT)
C                 IN SIMPLE CASES, SUCH AS A POLYNOMIAL IN X, BASIS MAY
C                 ABLE TO EVALUATE F GIVEN ONLY X.  IN MORE COMPLEX CASE
C                 ADDITIONAL INFORMATION MAY BE REQUIRED. IN THESE CASES
C                 A COMMON AREA MAY BE USED TO PASS THE REQUIRED INFORMA
C                 FROM THE ROUTINE WHICH CALLS FTL1L2 DIRECTLY TO BASIS.
C                 THESE CASES I MAY BE NEEDED TO CORRECTLY ACCESS TARRAY
C                 THE COMMON BLOCK.
C        NB     - NUMBER OF BASIS VECTORS
C        CB     - COEFFICIENTS OF BASIS VECTORS IN BASIS FUNCTION.
C                 I.E., SPLINE FUNCTION BASIS FUNCTIONS CAN RETURN UP TO
C                 FOUR BASIS VECTORS, THE 0TH THROUGH THIRD DERIVATIVES.
C                THE DERIVATIVES ARE OFTEN USED TO CONSTRAIN THE SPLINE.
C                 MORE GENERALLY, CB ALLOW DATA WHICH ARE A LINEAR
C                 COMBINATION OF DERIVATIVES TO BE FIT, AS MIGHT BE
C                 REQUIRED TO CONSTRAIN THE FIT TO OBEY A DIFFERENTIAL
C                 EQUATION.
C        IFTYPE - 1 -> DO L1 FIT
C                 2 -> DO L2 FIT
C                 3 -> DO L1 FIT, REJECT DATA FARTHER THAN RESLIM FROM
C                      THE MEDIAN L1 RESIDUAL, DO L2 FIT TO REMAINING DA
C        RESLIM - RESIDUAL LIMIT FOR ACCEPTING DATA FOR ROBUST L2 FIT
C
C     OUTPUT PARAMETERS
C        YFIT   - ARRAY OF FIT VALUES (THE BEST FIT TO Y)
C        A      - ARRAY OF FIT COEFFICIENTS (THE SOLUTION VECTOR)
C        COVMAT - COVARIANCE MATRIX OF L2 FIT
C        RNORM  - L1 NORM (IFTYPE=1) OR L2 NORM (IFTYPE=2,3) OF THE
C                 RESIDUAL VECTOR
C        IND    - 10*IND1 + IND2
C                    IND1= 0 -> L1 SOLUTION VECTOR IS UNIQUE
C                        =+1 -> L1 SOLUTION VECTOR PROBABLY NOT UNIQUE
C                        =-1 -> L1 FIT TERMINATED PREMATURELY
C                    IND2= 0 -> L2 FIT SUCCESSFUL
C
C     WORK ARRAYS
C        IWORK  - DIMENSIONED AT LEAST 2MDIM*NDIM
C        WORK   - DIMENSIONED AT LEAST NDIM*MDIM+4*NDIM+5*MDIM+NDIM**2+
C                                      MDIM*(MDIM+3)/2+4*MDIM
C

SUBROUTINE SHELL1 (A,N)
      DOUBLE PRECISION A(*)
      INTEGER N      !Read-only
C
C     SHELL1 IS AN ADAPTATION OF THE SORTING ROUTINE SHELLSORT
C     (ACM ALGORITHM 201) BY J. BOOTHROYD. THE CONTENTS OF THE ARRAY
C     A, COMPRISING N ELEMENTS IN N SUCCESSIVE WORDS, WILL BE SORTED
C     INTO NON-DESCENDING ORDER.
C

SUBROUTINE PSLV (ID,K,MM,MMM,P,B,X)
      INTEGER ID      !Read-only
      INTEGER K      !Read-only
      INTEGER MM      !Read-only
      INTEGER MMM      !Read-only
      DOUBLE PRECISION P(MMM)      !Read-only
      DOUBLE PRECISION B(MM)      !Read-only
      DOUBLE PRECISION X(MM)
C     this subroutine solves the square non-singular system
C     of linear equations
C                            p*x=b,
C     or the square non-singular system of linear equations
C                         p(transpose)*x=b,
C     where p is an upper triangular matrix, b is the right hand
C     side vector and x is the solution vector.
C     the input data to the subroutine.
C     id     an integer indicator specified by the user.
C        if id=1 the equation p*x=b is solved.
C        if id= any integer other than 1, the equation
C        p(transpose)*x=b is solved.
C     k      an integer = the number of equations of the given
C        system.
C     mm     an integer greater than or equal to k.
C     mmm    an integer = (mm*(mm+3))/2
C     p      an mmm-vector. its first (k+1) elements contain the
C        first k elements of row 1 of the upper triangular
C        matrix plus an extra location to the right. its
C        next k elements contain the (k-1) elements of row 2
C        of the upper triangular matrix plus an extra
C        location to the right, ..., etc.
C     b      an mm-vector. its first k elements contain the
C        r.h.s. vector of the given system.
C     the output of the subroutine.
C     x      an mm-vector. on exit, its first k elements contain
C        the solution to the given system.
C

SUBROUTINE L1 (M,N,MM,MMM,NN,CT,F,PREC,EPS,IC,IR,IB,UF,BP,XP,T,ALFA,P,GINV,
               VB,IRANK,ITER,R,A,Z,IND)
      INTEGER M      !Read-only
      INTEGER N      !Read-only
      INTEGER MM      !Read-only
      INTEGER MMM      !Read-only
      INTEGER NN      !Read-only
      DOUBLE PRECISION CT(MM,NN)
      DOUBLE PRECISION F(NN)      !Read-only
      DOUBLE PRECISION PREC      !Read-only
      DOUBLE PRECISION EPS      !Read-only
      INTEGER IC(NN)
      INTEGER IR(MM)
      INTEGER IB(NN)
      DOUBLE PRECISION UF(MM)
      DOUBLE PRECISION BP(MM)
      DOUBLE PRECISION XP(MM)
      DOUBLE PRECISION T(NN)
      DOUBLE PRECISION ALFA(NN)
      DOUBLE PRECISION P(MMM)
      DOUBLE PRECISION GINV(MM,MM)
      DOUBLE PRECISION VB(MM)
      INTEGER IRANK
      INTEGER ITER
      DOUBLE PRECISION R(NN)
      DOUBLE PRECISION A(MM)
      DOUBLE PRECISION Z
      INTEGER IND
C     this subroutine solves an overdetermined system of
C     linear equations in the l1 norm by using a dual simplex
C     algorithm to the linear programming formulation of the
C     given problem. in this algorithm certain intermediate
C     simplex iterations are skipped.
C     for purpose of numerical stability, this subroutine
C     uses a triangular decomposition to the basis matrix.
C     the system of linear equations has the form
C                          c*a=f,
C     where c is a given real n by m matrix of rank k.le.m.le.n
C     and f is a given real n-vector.
C     the problem to be solved is to calculate the elements
C     of the m-vector  a*  which gives the minimum norm z.
C               z= abs(r(1)) + abs(r(2)) + ... + abs(r(n)) ,
C     where r(i) is the ith residual and is given by
C     r(i)=c(i,1)*a(1)+c(i,2)*a(2)+ ... +c(i,m)*a(m)-f(i).
C     subroutine l1 is completely self contained (consists
C     of two subroutines l1   and pslv).
C     the input data to the subroutine.
C     m      the number of columns of matrix c.
C     n      the number of rows of matrix c.
C     mm     an integer greater than or equal to m.
C     mmm    an integer = (mm*(mm+3))/2 .
C     nn     an integer greater than or equal to n.
C     ct     a matrix of dimensions mm by nn. on entry, its first
C        m rows and first n columns contain the transpose of
C        matrix c in the given system c*a=f.
C     f      an nn-vector. on entry, its first n elements contain
C        the r.h.s. of the given system c*a=f.
C     prec   the round-off level of the computer. for the ibm
C        360/67 computer, prec is about 1.e-6 and 1.e-16 for
C        single and double precision respectively.
C     eps    a specified tolerance such that a calculated number
C        x is considered zero if  abs(x).LT.eps. for the ibm 360/67
C        computer, eps is usually taken 1.e-4 and 1.e-11
C        respectively.
C     the results of the problem.
C     irank  the calculated rank of matrix c.
C     iter   the number of iterations which the solution needed.
C     a      an mm-vector. its first m elements are the solution
C        vector a*.
C     r      an nn-vector. its first n elements contain the
C        the residual vector r=c*a-f.
C     z      the minimum l1 norm of the residual vector r.
C     ind    a return indicator. ind=0 indicates that the
C        solution vector a* is unique. ind=1, indicates that
C        a* is most probably not unique. ind=-1 indicates
C        premature termination of the calculation due to
C        very ill-conditioning of matrix c.
C     the meaning of the other parameters.
C     ginv   an mm-square matrix. its first irank columns and
C        first irank rows contain the inverse of the initial
C        basis matrix and its update.
C     vb     an mm-vector. its first irank elements contain the
C        initial basic solution and its update.
C     t      an nn-vector. its first n elements contain the
C        elements of the row in the simplex tableau, that
C        corresponds to the column which leaves the basis.
C     alfa   an nn-vector. its first n elements contain the
C        ratios:  alfa(j) = r(j)/t(j).
C     ic     an nn-vector. its first n elements contain the
C        column indices of matrix ct.
C     ir     an mm vector. its first irank elements contain the
C        row indices of the linearly independent rows of ct.
C     ib     a sign nn-vector. its first n elements have the
C        values +1 or -1. ib(j)=+1 indicates that column j
C        in the tableau is at its lower bound 0. ib(j)=-1
C        indicates that column j is at its upper bound 2.
C     p      an mmm-vector. its first ((irank*(irank+3))/2)-1
C        elements contain the (irank*(irank+1))/2 elements of
C        the upper triangular matrix + extra (irank-1) working
C        locations. see the comments in subroutine pslv.
C     bp     an mm-vector. its first irank elements are the
C        r.h.s. of the triangular equations as p*xp=bp.
C     xp     an mm-vector . its first irank elements are the
C        solution of the triangular equations as p*xp=bp.
C     uf     an mm-working vector.

SUBROUTINE INCLDC (N,KLEFT,KRIGHT,KBAND,KBIAS,WVAL,X,YVAL,RBAR,SS)
      INTEGER N      !Read-only
      INTEGER KLEFT      !Read-only
      INTEGER KRIGHT      !Read-only
      INTEGER KBAND      !Read-only
      INTEGER KBIAS      !Read-only
      DOUBLE PRECISION WVAL      !Read-only
      DOUBLE PRECISION X(*)
      DOUBLE PRECISION YVAL      !Read-only
      DOUBLE PRECISION RBAR(*)
      DOUBLE PRECISION SS
C
C     JMH - 6/80  ANS FORTRAN 66
C           9/88  IMPROVED COMMENTS.  CODE UNCHANGED.
C
C     INCLDC USES GIVENS TRANSFORMS TO COMPUTE THE LEAST SQUARES SOLUTIO
C     OF AN OVERDETERMINED LINEAR SYSTEM.  INCLUDC MUST BE CALLED ONCE F
C     EACH EQUATION IN THE SYSTEM, THAT IS DATA ARE INCLUDED IN THE FIT
C     AT A TIME.  AFTER ALL DATA HAVE BEEN INCLUDED, REGRSC MAY BE CALLE
C     TO COMPUTE THE FIT COEFFICIENTS, AND COVC MAY BE CALLED TO COMPUTE
C     THE FIT COVARIANCE MATRIX. THIS VERSION OF THE "INCLUDE" ALGORITHM
C     PROVIDES FOR THE EFFICIENT HANDLING OF BANDED SYSTEMS. SPLBAS IS A
C     B-SPLINE BASIS FUNCTION ROUTINE WHICH MAKES USE OF THIS FEATURE.
C
C     INPUT PARAMETERS:
C        N      - NUMBER OF TERMS IN EACH EQUATION
C        KLEFT  - LEFTMOST NON-ZERO ELEMENT OF X (=1 FOR UNBANDED SYSTEM
C        KRIGHT - RIGHTMOST NON-ZERO ELEMENT OF X (=N FOR UNBANDED SYSTE
C        KBAND  - BANDWIDTH OF THE SYSTEM (=N FOR UNBANDED SYSTEM)
C        KBIAS  - BIAS INTO X (USUALLY 0)
C        WVAL   - WEIGHT OF THE EQUATION (TYPICALLY 1/YVAL_ERROR**2)
C        X      - LEFT-HAND-SIDE OF EQUATION TO BE INCLUDED
C        YVAL   - RIGHT-HAND-SIDE OF EQUATION TO BE INCLUDED
C
C     OUTPUT PARAMETERS:
C        RBAR   - AUGMENTED TRIANGULAR SYSTEM. MUST BE INITIALIZED TO
C                 ZERO BEFORE INCLDC IS CALLED FOR THE FIRST TIME.
C                 MUST BE DIMENSIONED AT LEAST (KBAND+2)*N-KBAND*(KBAND-
C        SS     - SUM-OF-SQUARES DEVIATION.
C
C     IMPORTANT LOCAL VARIABLES:
C        IT    - IT<0 IF ROW HAS ZEROES. IT>0 IF ROW HAS NO ZEROES.
C        ILZ   - INDEX OF LAST ROW WITH ZEROES.
C        NRZ0  - TOTAL NUMBER OF ELEMENTS IN ROWS WITH ZEROES.
C        IB    - MAGIC NUMBER USED TO COMPUTE INDEX (NT) OF LAST
C                ELEMENT IN ROW.
C        ND    - INDEX OF FIRST ELEMENT IN ROW.
C        NT    - INDEX OF LAST ELEMENT IN ROW.
C        I     - ROW INDEX.
C
C     EXAMPLE:
C
C                    RBAR           I   ND    NT    IT
C
C         D R R R R 0 0 0 0 0 0 T   1    1     6    -5      N = 10
C           D R R R R 0 0 0 0 0 T   2    7    12    -4      KBAND = 4
C             D R R R R 0 0 0 0 T   3   13    18    -3
C               D R R R R 0 0 0 T   4   19    24    -2
C                 D R R R R 0 0 T   5   25    30    -1
C                   D R R R R 0 T   6   31    36     0      NRZ0 = 36
C                     D R R R R T   7   37    42     1
C                       D R R R T   8   43    47     2
C                         D R R T   9   48    51     3
C                           D R T  10   52    54     4
C

SUBROUTINE SROTMG (SD1,SD2,SX1,SY1,SPARAM)
      DOUBLE PRECISION SD1
      DOUBLE PRECISION SD2
      DOUBLE PRECISION SX1
      DOUBLE PRECISION SY1      !Read-only
      DOUBLE PRECISION SPARAM(5)
C
C     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
C     THE SECOND COMPONENT OF THE 2-VECTOR (SQRT(SD1)*SX1,SQRT(SD2)*
C     SY1)**T).
C     WITH SPARAM((1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
C
C       SFLAG=-1.E0     SFLAG=0.E0     SFLAG=1.E0     SFLAG=-2.E0
C
C       (SH11  SH12)   (1.E0  SH12)   (SH11  1.E0)   (1.E0  0.E0)
C     H=(          )   (          )   (          )   (          )
C       (SH21  SH22)   (SH21  1.E0)   (-1.E0 SH22)   (0.E0  1.E0)
C     LOCATIONS 2-5 OF SPARAM CONTAIN SH11, SH21, SH12 AND SH22
C     RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
C     VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)
C
C     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
C     INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
C     OF SD1 AND SD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
C

SUBROUTINE SROTM (N,SX,INCX,SY,INCY,SPARAM)
      INTEGER N      !Read-only
      DOUBLE PRECISION SX(*)
      INTEGER INCX      !Read-only
      DOUBLE PRECISION SY(*)
      INTEGER INCY      !Read-only
      DOUBLE PRECISION SPARAM(5)      !Read-only
C
C     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
C
C     (SX**T), WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN
C     (DX**T)
C
C     SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
C     LX = (-INCX)*N, AND SIMILARLY FOR SY USING LX AND INCY.
C     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
C
C        SFLAG=-1.E0     SFLAG=0.E0      SFLAG=1.E0      SFLAG=-2.E0
C       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)
C     H=(          )    (          )    (          )    (          )
C       (SH21  SH22)    (SH21  1.E0)    (-1.E0 SH22)    (0.E0  1.E0)
C     SEE SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM.
C

SUBROUTINE REGRSC (N,KBAND,RBAR,BETA)
      INTEGER N      !Read-only
      INTEGER KBAND      !Read-only
      DOUBLE PRECISION RBAR(*)      !Read-only
      DOUBLE PRECISION BETA(*)
C
C     JMH - 11/79  ANS FORTRAN 66
C

SUBROUTINE COVC (NCLMN,N,KBAND,RBAR,A)
      INTEGER NCLMN      !Read-only
      INTEGER N      !Read-only
      INTEGER KBAND      !Read-only
      DOUBLE PRECISION RBAR(*)      !Read-only
      DOUBLE PRECISION A(NCLMN,NCLMN)
C
C     JMH - 1/81  ANS FORTRAN 66
C
C        IT    - IT<0 IF ROW HAS ZEROES. IT>0 IF ROW HAS NO ZEROES.
C        ILZ   - INDEX OF LAST ROW WITH ZEROES.
C        NRZ0  - TOTAL NUMBER OF ELEMENTS IN ROWS WITH ZEROES.
C        IB    - MAGIC NUMBER USED TO COMPUTE INDEX (NT) OF LAST
C                ELEMENT IN ROW.
C        ND    - INDEX OF FIRST ELEMENT IN ROW.
C        NT    - INDEX OF LAST ELEMENT IN ROW.
C        I     - ROW INDEX.
C
C                    RBAR           I   ND    NT    IT
C
C         D R R R R 0 0 0 0 0 0 T   1    1     6    -5      N = 10
C           D R R R R 0 0 0 0 0 T   2    7    12    -4      KBAND = 4
C             D R R R R 0 0 0 0 T   3   13    18    -3
C               D R R R R 0 0 0 T   4   19    24    -2
C                 D R R R R 0 0 T   5   25    30    -1
C                   D R R R R 0 T   6   31    36     0      NRZ0 = 36
C                     D R R R R T   7   37    42     1
C                       D R R R T   8   43    47     2
C                         D R R T   9   48    51     3
C                           D R T  10   52    54     4
C

SUBROUTINE COV (NCLMN,N,A)
      INTEGER NCLMN      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION A(NCLMN,NCLMN)
C
C     COMPUTE UNSCALED COVARIANCE MATRIX  ((A**T)*A)**(-1)
C

SUBROUTINE POLBAS (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(*)
C
C     JMH - 9/88
C
C     POLBAS COMPUTES THE FIRST N MONOMIALS AT X, EG. 1.0,X,X**2 ETC.
C     THE RESULTS ARE RETURNED IN F. IX IS NOT USED. SEE FTL1L2 FOR AN
C     EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION ROUTINES OF
C     THIS FORM.
C

SUBROUTINE LEGBAS (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(*)
C
C     JMH - 9/88
C
C     LEGBAS COMPUTES THE FIRST N LEGENDRE POLYNOMIALS AT X, EG.
C     1.0, X, (3*X**2-1 )/2 ETC. THE RESULTS ARE RETURNED IN F.
C     IX IS NOT USED BY LEGBAS. SEE FTL1L2 FOR AN
C     EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION ROUTINES OF
C     THIS FORM.
C     THESE POLYNOMIALS ARE ORTHOGONAL ON THE INTERVAL [-1,+1]
C     AND AS A RESULT ARE A BETTER CHOICE THAN THE MONOMIALS FOR
C     LEAST SQUARES FITS TO DATA MORE OR LESS EVENLY DISTRIBUTED OVER
C     THIS INTERVAL.
C

SUBROUTINE HRMBAS (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(*)
C
C     JMH - 9/88
C
C     HRMBAS COMPUTES THE FIRST N TERMS OF A HARMONIC EXPANSION AT X, EG
C     1.0, COS(X), SIN(X), COS(2*X), SIN(2*X), ...  THE RESULTS ARE
C     RETURNED IN F. IX IS NOT USED.
C

SUBROUTINE SPLBAS (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,*)
C
C     JMH - 9/88
C     JMH - 7/02 - UPDATED
C
C     SPLBAS COMPUTES THE N B-SPLINES OF ORDER K AND KNOT SEQUENCE K AT
C     X.  THE SPLINE AND ITS DERIVATIVES ARE RETURNED IN F. SEE FTL1L2
C     FOR AN EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION
C     ROUTINES OF THIS FORM.  COMMON/SPFTCM/ (IN l1l2.h) MUST BE SET UP
C     BEFORE SPLBAS IS CALLED.  SEE SUBROUTINE KNOTS1. SPLBAS CALLS
C     SUBROUTINES INTERV AND BSPLVD WHICH ARE FROM CARL DEBOOR'S
C     B-SPLINE PACKAGE.
C

SUBROUTINE SPLBASP (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,*)
C
C     JMH - 2/02
C
C     SPLBASP COMPUTES THE N PERIODIC B-SPLINES OF ORDER K AND KNOT
C     SEQUENCE K AT X.  THE RESULTS OR ONE OF THE FIRST THREE
C     DERIVATIVES ARE RETURNED IN F. IX SPECIFIES THE ORDER OF THE
C     DERIVATIVE, I.E IX=1 FOR THE FIRST DERIVATIVE. SEE FTL1L2 FOR AN
C     EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION ROUTINES OF
C     THIS FORM.  COMMON/SPFTCM/ MUST BE SET UP BEFORE SPLBAS IS
C     CALLED.  SEE SUBROUTINE KNOTSP IN THE MATH LIBRARY FOR AN EXAMPLE
C     OF A ROUTINE WHICH DOES THIS. SPLBASP CALLS SUBROUTINES INTERV
C     AND BSPLVD WHICH ARE FROM CARL DEBOOR'S B-SPLINE PACKAGE AND ARE
C     ALSO IN THE MATH LIBRARY.
C

SUBROUTINE SPLBASI (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,*)
C
C     JMH - 1/04
C
C     SPLBASI COMPUTES THE N B-SPLINES OF ORDER K AND KNOT SEQUENCE K AT
C     X.  THE SPLINE, ITS DERIVATIVES AND A DEFINITE INTEGRAL DEFINED
C     BY splbas.h ARE RETURNED IN F. SEE FTL1L2
C     FOR AN EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION
C     ROUTINES OF THIS FORM.  COMMON/SPFTCM/ (IN l1l2.h) MUST BE SET UP
C     BEFORE SPLBAS IS CALLED.  SEE SUBROUTINE KNOTS1. SPLBAS CALLS
C     SUBROUTINES INTERV AND BSPLVD WHICH ARE FROM CARL DEBOOR'S
C     B-SPLINE PACKAGE.
C
C        N      - NUMBER OF B-SPLINES = NUMBER OF FIT COEFFICIENTS
C      IX     - INDEX OF THIS ELEMENT OF DATA ARRAY. NOT USED IN SPLBASI
C        X      - INDEPENDENT VARIABLE
C        F(*,1) - VALUE OF B-SPLINE AT X
C        F(*,2) - FIRST DERIVATIVE OF B-SPLINE AT X
C        F(*,3) - SECOND DERIVATIVE OF B-SPLINE AT X
C        F(*,4) - THIRD DERIVATIVE OF B-SPLINE AT X
C     F(*,5) - INEGRAL OF B-SPLINE AROUND AT X AS DEFINED BY INTEGRATION
C                 COEFFICIENTS IN intdef.h
C

SUBROUTINE SPLBAS22 (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,*)
C
C     JMH - 7/02
C
C     SPLBAS22 COMPUTES THE 2-DIMENSIONAL TENSOR PRODUCT OF BASIS
C     FUNCTIONS SPLBAS AND SPLBAS.
C

SUBROUTINE SPLBASP2 (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,*)
C
C     JMH - 7/02
C
C     SPLBASP2 COMPUTES THE 2-DIMENSIONAL TENSOR PRODUCT OF BASIS
C     FUNCTIONS SPLBASP AND SPLBAS.
C

SUBROUTINE KNOTS1 (K,N,X1,X2,T)
      INTEGER K      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION X1      !Read-only
      DOUBLE PRECISION X2      !Read-only
      DOUBLE PRECISION T(*)
C
C     JMH - 9/88
C
C     F:KNOTS1 - COMPUTES AN ARRAY OF KNOTS FOR A SPLINE FUNCTION.
C                THE FIRST AND LAST INTER-KNOT SPACINGS ARE TWICE AS
C                LONG AS THE EQUAL INTERIOR KNOT SPACINGS.
C
C     INPUT PARAMETERS:
C        K      - ORDER (=DEGREE+1) OF B-SPLINES (K=4 FOR CUBIC SPLINES)
C        X1     - LOCATION OF FIRST SPLINE KNOT
C        X2     - LOCATION OF LAST SPLINE KNOT
C        N      - NUMBER OF B-SPLINES OF ORDER K FOR THE GIVEN KNOT
C                 SEQUENCE (N = NBKPT+K-2).
C
C     OUTPUT PARAMETERS
C        T      - ARRAY OF KNOTS
C
C     OTHER VARIABLES
C        NBKPT  - NUMBER OF BREAKPOINTS
C
C     EXAMPLE (K=4, NBKPT=5, N=7):
C
C      I1=1                                                        I2=8
C        |         :         |         |         |         :         |
C        |         :         | <-DT->  |         |         :         |
C        |         :         |         |         |         :         |
C        1                   5         6         7                   8
C        2                                                           9
C        3                                                          10
C        4                                                          11
C

SUBROUTINE KNOTS2 (K,N,X1,X2,T)
      INTEGER K      !Read-only
      INTEGER N
      DOUBLE PRECISION X1      !Read-only
      DOUBLE PRECISION X2      !Read-only
      DOUBLE PRECISION T(*)
C
C     JMH -  9/88
C     JMH - 11/01  MODIFIED FROM KNOTS
C
C     F:KNOTS2 - COMPUTES AN ARRAY OF KNOTS FOR A SPLINE FUNCTION.
C                THE FIRST AND LAST INTER-KNOT SPACINGS ARE HALF AS
C                LONG AS THE EQUAL INTERIOR KNOT SPACINGS.
C
C     INPUT PARAMETERS:
C        K      - ORDER (=DEGREE+1) OF B-SPLINES (K=4 FOR CUBIC SPLINES)
C        X1     - LOCATION OF FIRST SPLINE KNOT
C        X2     - LOCATION OF LAST SPLINE KNOT
C
C     OUTPUT PARAMETERS
C        T      - ARRAY OF KNOTS
C        N      - NUMBER OF B-SPLINES OF ORDER K FOR THE GIVEN KNOT
C                 SEQUENCE (N = NBKPT+K-2).
C
C     OTHER VARIABLES
C        NBKPT  - NUMBER OF BREAKPOINTS
C
C     EXAMPLE (K=4, NBKPT=5, N=7):
C
C      I1=1                             I2=8
C        |     |          |         |     |
C        |     |  <-DT->  |         |     |
C        |     |          |         |     |
C        1     5          6         7     8
C        2                                9
C        3                               10
C        4                               11
C

SUBROUTINE KNOTSP (K,N,X1,X2,T)
      INTEGER K      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION X1      !Read-only
      DOUBLE PRECISION X2      !Read-only
      DOUBLE PRECISION T(*)
C
C     JMH -  6/02
C
C     F:KNOTSP - COMPUTES AN ARRAY OF KNOTS FOR A PERIODIC SPLINE
C                FUNCTION.
C
C     INPUT PARAMETERS:
C        K      - ORDER (=DEGREE+1) OF B-SPLINES (K=4 FOR CUBIC SPLINES)
C        X1     - LOCATION OF FIRST SPLINE KNOT
C        X2     - LOCATION OF LAST SPLINE KNOT
C
C     OUTPUT PARAMETERS
C        T      - ARRAY OF KNOTS
C        N      - NUMBER OF B-SPLINES OF ORDER K FOR THE GIVEN KNOT
C                 SEQUENCE (N = NBKPT+K-2).
C
C     OTHER VARIABLES
C        NBKPT  - NUMBER OF BREAKPOINTS
C
C     EXAMPLE (K=4, NBKPT=5, N=7):
C
C      I1=1                             I2=8
C        |     |          |         |     |
C        |     |  <-DT->  |         |     |
C        |     |          |         |     |
C        1     5          6         7     8
C        2                                9
C        3                               10
C        4                               11
C

SUBROUTINE INTERV (XT,LXT,X,ILEFT,MFLAG)
      DOUBLE PRECISION XT(LXT)      !Read-only
      INTEGER LXT      !Read-only
      DOUBLE PRECISION X      !Read-only
      INTEGER ILEFT
      INTEGER MFLAG
C     OMPUTES LARGEST ILEFT IN (1,LXT) SUCH THAT XT(ILEFT) .LE. X

SUBROUTINE BSPLVD (T,K,X,ILEFT,VNIKX,NDERIV)
      DOUBLE PRECISION T(*)      !Read-only
      INTEGER K      !Read-only
      DOUBLE PRECISION X      !Read-only
      INTEGER ILEFT      !Read-only
      DOUBLE PRECISION VNIKX(K,NDERIV)
      INTEGER NDERIV      !Read-only
C     CALCULATES VALUE AND DERIV.S OF ALL B-SPLINES WHICH DO NOT VANISH
C     AT X.  FILL VNIKX(J,IDERIV), J=IDERIV, ... ,K WITH NONZERO VALUES
C     OF B-SPLINES OF ORDER K+1-IDERIV , IDERIV=NDERIV, ... ,1, BY
C     REPEATED CALLS TO BSPLVN
C     DIMENSION T(ILEFT+K)

SUBROUTINE BSPLVN (T,JHIGH,INDEX,X,ILEFT,VNIKX)
      DOUBLE PRECISION T(*)      !Read-only
      INTEGER JHIGH      !Read-only
      INTEGER INDEX      !Read-only
      DOUBLE PRECISION X      !Read-only
      INTEGER ILEFT      !Read-only
      DOUBLE PRECISION VNIKX(JHIGH)
C     ALCULATES THE VALUE OF ALL POSSIBLY NONZERO B-SPLINES AT 'X' OF
C     ORDER MAX(JHIGH,(J+1)(INDEX-1)) ON 'T'.
C     DIMENSION T(ILEFT+JHIGH)

SUBROUTINE LPBASIS (N,IX,X,F)
      INTEGER N      !Read-only
      INTEGER IX      !Read-only
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION F(NDIM,5)
C
C     JMH - 1/04
C
C     LPBASIS COMPUTES THE N B-SPLINES OF ORDER K AND KNOT SEQUENCE K AT
C     X.  THE SPLINE, ITS DERIVATIVES AND A DEFINITE INTEGRAL DEFINED
C     BY splbas.h ARE RETURNED IN F. SEE FTL1L2
C     FOR AN EXAMPLE OF A SUBROUTINE WHICH CALLS BASIS FUNCTION
C     ROUTINES OF THIS FORM.  COMMON/SPFTCM/ (IN l1l2.h) MUST BE SET UP
C     BEFORE SPLBAS IS CALLED.  SEE SUBROUTINE KNOTS1. LPBASIS CALLS
C     SUBROUTINES INTERV AND BSPLVD WHICH ARE FROM CARL DEBOOR'S
C     B-SPLINE PACKAGE.
C
C        N      - NUMBER OF B-SPLINES = NUMBER OF FIT COEFFICIENTS
C        IX     - INDEX OF THIS ELEMENT OF DATA ARRAY. NOT USED IN LPBASIS
C        X      - INDEPENDENT VARIABLE
C        F(*,1) - VALUE OF B-SPLINE AT X
C        F(*,2) - FIRST DERIVATIVE OF B-SPLINE AT X
C        F(*,3) - SECOND DERIVATIVE OF B-SPLINE AT X
C        F(*,4) - THIRD DERIVATIVE OF B-SPLINE AT X
C        F(*,5) - INEGRAL OF B-SPLINE AROUND AT X AS DEFINED BY 
C                 INTEGRATION COEFFICIENTS IN intdef.h
C

SUBROUTINE MAKENOTES ()
C

SUBROUTINE MINV (A,N,D,L,M)
      DOUBLE PRECISION A(*)
      INTEGER N      !Read-only
      DOUBLE PRECISION D
      INTEGER L(*)
      INTEGER M(*)
C
C        ...............................................................
C
C        IF A DOUBLE PRECISION VERSION OF THIS ROUTINE IS DESIRED, THE
C        C IN COLUMN 1 SHOULD BE REMOVED FROM THE DOUBLE PRECISION
C        STATEMENT WHICH FOLLOWS.
C
C     DOUBLE PRECISION A,D,BIGA,HOLD
C
C        THE C MUST ALSO BE REMOVED FROM DOUBLE PRECISION STATEMENTS
C        APPEARING IN OTHER ROUTINES USED IN CONJUNCTION WITH THIS
C        ROUTINE.
C
C        THE DOUBLE PRECISION VERSION OF THIS SUBROUTINE MUST ALSO
C        CONTAIN DOUBLE PRECISION FORTRAN FUNCTIONS.  ABS IN STATEMENT
C        10 MUST BE CHANGED TO DABS.
C
C        ...............................................................
C
C        SEARCH FOR LARGEST ELEMENT
C

SUBROUTINE OFAM2ATM ()
C
C     JMH - 10/93
C

SUBROUTINE OFAM2CEDAR ()
C
C     OFAM2CEDAR TRANSFERS THE CONTENTS OF THE INSCAL OUTPUT STRUCTURE,
C     OFAM, TO A CEDAR RECORD AND WRITES THE RECORD TO A CEDAR FILE.
C

SUBROUTINE PARAM (ASET,IACF,A)
      DOUBLE PRECISION ASET(*)      !Read-only
      INTEGER IACF      !Read-only
      DOUBLE PRECISION A(*)
C
C     JMH - 9/81
C     JMH - 10/83 COPIED FROM 2INSC*F:PARAM. THIS WILL BE USED AS
C           STARTING POINT FOR USING NEW DATABASE ROUTINES IN INSCAL.
C
C     PARAM CALCULATES INITIAL GUESSES FOR THE ACF PARAMETERS A.
C     IF ASET CONTAINS A VALUE OTHER THAN RMISS, THAT VALUE IS
C     USED.  OTHERWISE, PARMOD IS CALLED.
C
C     ASET - SPECIFIED VALUE FOR A PARAMETER
C     IACF - INDEX OF ACF
C     A    - INITIAL GUESS FOR PARAMETER
C

DOUBLE PRECISION FUNCTION PARMOD (IACF,I)
      INTEGER IACF      !Read-only
      INTEGER I      !Read-only
C
C     JMH - 9/81
C     JMH - 10/83 COPIED FROM 2INSC*F:PARMOD
C     GBL - 5/84 CHANGED CALC. OF "A" FOR E-DENSITY
C

SUBROUTINE A2SP (IT,A1,A2,SP1,SP2)
      INTEGER IT      !Read-only
      DOUBLE PRECISION A1      !Read-only
      DOUBLE PRECISION A2      !Read-only
      DOUBLE PRECISION SP1
      DOUBLE PRECISION SP2
C

SUBROUTINE SP2A (IT,SP1,SP2,A1,A2)
      INTEGER IT      !Read-only
      DOUBLE PRECISION SP1      !Read-only
      DOUBLE PRECISION SP2      !Read-only
      DOUBLE PRECISION A1
      DOUBLE PRECISION A2
C

SUBROUTINE TITE2SP (IT,TI,TE,SP1,SP2)
      INTEGER IT      !Read-only
      DOUBLE PRECISION TI      !Read-only
      DOUBLE PRECISION TE      !Read-only
      DOUBLE PRECISION SP1
      DOUBLE PRECISION SP2
C

SUBROUTINE SP2TITE (IT,SP1,SP2,TI,TE)
      INTEGER IT      !Read-only
      DOUBLE PRECISION SP1      !Read-only
      DOUBLE PRECISION SP2      !Read-only
      DOUBLE PRECISION TI
      DOUBLE PRECISION TE
C

SUBROUTINE DSP2DT (IT,SP1,SP2,DSP1,DSP2,DSP12,DTI,DTE,DTR)
      INTEGER IT      !Read-only
      DOUBLE PRECISION SP1      !Read-only
      DOUBLE PRECISION SP2      !Read-only
      DOUBLE PRECISION DSP1      !Read-only
      DOUBLE PRECISION DSP2      !Read-only
      DOUBLE PRECISION DSP12      !Read-only
      DOUBLE PRECISION DTI
      DOUBLE PRECISION DTE
      DOUBLE PRECISION DTR
C

SUBROUTINE DSP2DA (IT,SP1,SP2,DSP1,DSP2,DSP12,DA1,DA2)
      INTEGER IT      !Read-only
      DOUBLE PRECISION SP1      !Read-only
      DOUBLE PRECISION SP2      !Read-only
      DOUBLE PRECISION DSP1      !Read-only
      DOUBLE PRECISION DSP2      !Read-only
      DOUBLE PRECISION DSP12      !Read-only
      DOUBLE PRECISION DA1
      DOUBLE PRECISION DA2
C

SUBROUTINE A2TITE (A1,A2,TI,TE)
      DOUBLE PRECISION A1      !Read-only
      DOUBLE PRECISION A2      !Read-only
      DOUBLE PRECISION TI
      DOUBLE PRECISION TE
C

SUBROUTINE TITE2A (TI,TE,A1,A2)
      DOUBLE PRECISION TI      !Read-only
      DOUBLE PRECISION TE      !Read-only
      DOUBLE PRECISION A1
      DOUBLE PRECISION A2
C

SUBROUTINE POSTINT (QPOST,ISTAT)
      INTEGER QPOST      !Read-only
      INTEGER ISTAT
C
C     MEDIAN FILTERS SUB-INTEGRATION-PERIOD ACFS IN TIME
C

SUBROUTINE PRECSM (LFN)
      INTEGER LFN      !Unknown (program incomplete)
C
C     JMH - 12/92
C
C     PRECSM WRITE A ONE-LINE SUMMARY OF THE CURRENT DATA RECORD
C     TO THE SPECIFIED LOGICAL UNIT.
C

SUBROUTINE PROFINT (OASISDIR,ISTAT)
      CHARACTER OASISDIR      !Unknown (program incomplete)
      INTEGER ISTAT
C
C     PROFINT IMPLEMENTS ALTITUDE INTEGRATION OF THE IFAM ACF ARRAY.
C     BY DEFAULT, THE ACF ARRAY IS NOT MODIFIED. TO SPECIFY ALTITUDE
C     INTEGRATION FOR A SPECIFIED MODE, INCLUDE A FILE OF THE FORM 
C     MODENAME.DAT IN THE OASISDIR IN WHICH INSCAL IS RUN, E.G.
C     A480.30M8910.DAT. THIS FILE HAS THE FOLLOWING FORMAT:
C     
C     MDNAME = A480.30M8910
C     MDPTYPE = 2
C     MDNROWS = 5
C     MDNCOLS = 3
C     150.0 200.0  3.0
C     200.0 300.0  6.0
C     300.0 400.0  8.0
C     400.0 500.0 10.0
C     500.0 800.0 12.0
C     MDPTYPE = 1 (N-POINT CENTERED MEAN), MDTYPE = 2 (N-POINT
C     CENTERED MEDIAN), MDTYPE = 3 (L2 SPLINE FIT) AMD MDPTYPE= 4 (L1
C     SPLINE FIT) ARE SUPPORTED. THE INTEGRATION PARAMETERS ARE
C     MDPTYPE DEPENDENT AND ARE ENTERED AS AN ARRAY WITH MDROWS ROWS
C     AND MDCOLS COLUMNS.
C     
C     FOR MDPTYPE = 1 AND 2, EACH ROW CONTAINS A MINIMUM AND MAXIMUM
C     ALTITUDE AND THE A SPECIFICATION OF THE NUMBER OF POINTS IN THE
C     MEAN OR MEDIAN. THUS THE FIRST ROW STATES THAT BETWEEN 200 AND
C     300 KM A 13-POINT AVERAGE WILL BE COMPUTED. ACFS BELOW 150 KM
C     ARE LEFT UNCHANGED IN THIS EXAMPLE.
C     
C     FOR MDTYPE = 3 AND 4, THE FORMAT IS AS FOLLOWS
C     
C     MDNAME = A480.30M8910
C     MDPTYPE = 4
C     MDNROWS = 1
C     MDNCOLS = 4
C     100.0 5.0 600.0 100.0
C     
C     IN THE EXAMPLE,
C     
C     Z1 = 100.0  - LOWEST SPLINE KNOT
C     DZ1 = 5.0   - DISTANCE FROM Z1 TO NEXT SPLINE KNOT
C     Z2 = 600.0  - HIGHEST SPLINE KNOT
C     DZ2 = 100.0 - APPROXIMATE KNOT SPACING AT Z2
C     
C     IN PRACTICE THE ACTUAL SPACING BETWEEN THE SECOND-HIGHEST KNOT
C     AND Z2 WILL BE SOMEWHAT LARGER THAN DZ2. KNOT SPACING INCREASES
C     LINEARLY WITH ALTITUDE. THE EXAMPLE YIELDS THE FOLLOWING KNOTS:
C     
C        100.0  105.0  111.2  118.6  127.5  138.1  150.9 166.2 184.5
C        206.4  232.6  264.0  301.7  346.8  400.8  465.5 600.0
C

SUBROUTINE PRPARM (LFNLIS)
      INTEGER LFNLIS      !Read-only
C
C     JMH - 8/99
C
C     PRPARM PRINTS THE MHR PARAMETER FILE.
C

SUBROUTINE PRSFIL (OUTFILE,LFN)
      CHARACTER OUTFILE      !Unknown (program incomplete)
      INTEGER LFN      !Unknown (program incomplete)
C
C     JMH - 10/00
C
C     PRECSM WRITE A ONE-LINE SUMMARY OF THE CURRENT DATA RECORD
C     TO THE SPECIFIED LOGICAL UNIT. THIS FUNCTION IS USED TO
C     WRITE A ONE LINE STATUS INSCAL STATUS FILE WHICH CONTAINS
C     INFORMATION ABOUT THE LAST RECORD WRITTEN BY INSCAL AND THE
C     UNIX TIME WHEN IT WAS LAST WRITTEN.
C

SUBROUTINE SETFIT (NLAGI,NLAGP2I,NCORI,NDCMTI,NLAGSCI,IFTFNI,DTAUI,ACFCRI)
      INTEGER NLAGI      !Read-only
      INTEGER NLAGP2I      !Read-only
      INTEGER NCORI      !Read-only
      INTEGER NDCMTI      !Read-only
      INTEGER NLAGSCI      !Read-only
      INTEGER IFTFNI      !Read-only
      DOUBLE PRECISION DTAUI      !Read-only
      DOUBLE PRECISION ACFCRI(NCORMX,NLAGMX)      !Read-only
C
C     SETFIT SETS THE VARIABLES IN FITC. THESE VARIABLES ARE NEEDED BY
C     FUNCTN, WHICH COMPUTES THE THEORETICAL ACF.
C

SUBROUTINE SETCON (IER)
      INTEGER IER
C
C     JMH - 9/81
C
C     SETCON EVALUATES THE CONSTANTS REQUIRED IN THE CALCULATION OF AN
C     ARBITRARY INCOHERENT SCATTER AUTOCORRELATION FUNCTION. ALL
C     CONSTANTS ARE IN MKSA UNITS. FREQ, B AND ALPHA MUST BE STORED
C     IN COMMON/DATA/ BEFORE SETCON IS CALLED. THE REMAINING
C     CONSTANTS ARE CALCULATED BY SETCON AND STORED IN DATA.
C
C        FREQ  - RADAR FREQUENCY (MHZ)
C        B     - MAGNETIC FIELD (WEBER M-2)
C        ALPHA - ANGLE BETWEEN WAVE VECTOR AND B (RAD)
C        RE    - ELECTRON RADIUS (M)
C        AMU   - ATOMIC MASS UNIT (KG)
C        E     - ELECTRON CHARGE (C)
C        BOLTK - BOLTZMAN CONSTANT (J DEG-1)
C        RME   - ELECTRON MASS (KG)
C        PI    - 3.1415926536
C        RLAM  - RADAR WAVELENGTH (M)
C
C     THE REMAINING FUNCTIONS EVALUATED BY SETCON ARE FUNCTIONS OF
C     THESE CONSTANTS.
C
C        IER = 201  FREQ .LE. 0. FREQ SET EQUAL TO 440.2 MHZ.
C

SUBROUTINE SETSTAT (SN,QGOOD,NIT,IF)
      DOUBLE PRECISION SN      !Read-only
      LOGICAL QGOOD      !Read-only
      INTEGER NIT      !Read-only
      INTEGER IF      !Read-only
C

SUBROUTINE SPECT2 (TI,TE,DF,P2,RM1,RM2,INDEL,N,DELOM,SP)
      DOUBLE PRECISION TI      !Read-only
      DOUBLE PRECISION TE      !Read-only
      DOUBLE PRECISION DF      !Read-only
      DOUBLE PRECISION P2      !Read-only
      DOUBLE PRECISION RM1      !Read-only
      DOUBLE PRECISION RM2      !Read-only
      INTEGER INDEL      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION DELOM      !Read-only
      DOUBLE PRECISION SP(*)
C
C     JMH - 9/81
C
C     SPECT2 CALCULATES THE COLLISIONLESS INCOHERENT SCATTER SPECTRUM
C     CORRESPONDING TO A BINARY MIXTURE OF IONS. THIS VERSION IS
C     ACCURATE TO 11 SIGNIFICANT FIGURES.
C        TI - ION TEMPERATURE
C        TE - ELECTRON TEMPERATURE
C        DF - DEBYE FACTOR
C        P2 - PERCENTAGE OF SECOND ION
C        RM1 - MASS OF FIRST ION
C        RM2 - MASS OF SECOND ION
C        INDEL - ELECTRON ADMITTANCE CALCULATED IF INDEL .GT. 2
C        N - NUMBER OF SPECTRUM POINTS TO BE CALCULATED
C        OMEGA - ANGULAR FREQUENCIES OF SPECTRUM POINTS
C        SP - SPECTRUM
C

SUBROUTINE SPECTC (T,CL,N,DELOM,SP)
      DOUBLE PRECISION T      !Read-only
      DOUBLE PRECISION CL      !Read-only
      INTEGER N      !Read-only
      DOUBLE PRECISION DELOM      !Read-only
      DOUBLE PRECISION SP(*)
C
C     JMH - 9/84  HARRIS FORTRAN 77
C           3/85  MODIFIED TO USE DELOM INSTEAD OF OMEGA AND TO OUTPUT
C                 SPECTRUM NORMALIZED TO 1 AT ZERO LAG.
C
C     SPECTC CALCULATES THE INCOHERENT SCATTER SPECTRUM WITH COLLISIONS
C     AS DESCRIBED IN DOUGHERTY AND FARLEY, JGR, 68, 5473-5486, 1963.
C

SUBROUTINE SPLITMF (MFFULL,MFDIR,MF)
      CHARACTER MFFULL      !Unknown (program incomplete)
      CHARACTER MFDIR
      CHARACTER MF
C

SUBROUTINE STACOR (KINST,SLATGD,SLON,SALTGD,SLATGC,SR,ISTAT)
      INTEGER KINST      !Read-only
      DOUBLE PRECISION SLATGD
      DOUBLE PRECISION SLON
      DOUBLE PRECISION SALTGD
      DOUBLE PRECISION SLATGC
      DOUBLE PRECISION SR
      INTEGER ISTAT
C
C     Returns Instrument location coordinates from instrument code.
C
C      Input:
C        KINST  - Instrument code.
C
C      Output:
C        SLATGD - Instrument geodetic latitude
C          SLON - Instrument longitude
C        SALTGD - Instrument geodetic latitude
C        SLATGC - Instrument geocentric latitude
C            SR - Radial distance of instrument from center of earth
C         ISTAT - 0 if successful.
C

DOUBLE PRECISION FUNCTION VELX (ACFRR,ACFII,NLAGS,DELT,FREQ)
      DOUBLE PRECISION ACFRR(*)      !Read-only
      DOUBLE PRECISION ACFII(*)      !Read-only
      INTEGER NLAGS      !Read-only
      DOUBLE PRECISION DELT      !Read-only
      DOUBLE PRECISION FREQ      !Read-only
C

SUBROUTINE WOFZ (X,Y,WRE,WIM)
      DOUBLE PRECISION X      !Read-only
      DOUBLE PRECISION Y      !Read-only
      DOUBLE PRECISION WRE
      DOUBLE PRECISION WIM
C
C     ACM ALGORITHM 363
C     WALTER GAUTSCHI
C     FORTRAN TRANSLATION - J.M.HOLT - 9/15/76
C     9/17/84 - SOLUTION EXTENDED TO WHOLE Z-PLANE.
C
C     THIS PROCEDURE EVALUATES THE REAL AND IMAGINARY PART OF THE
C     FUNCTION W(Z) = EXP(-Z**2)*ERFC(-I*Z) FOR ARGUMENTS Z = X+I*Y IN
C     THE FIRST QUADRANT OF THE COMPLEX PLANE. THE ACCURACY IS 10
C     DECIMAL PLACES AFTER THE DECIMAL POINT, OR BETTER. FOR THE
C     UNDERLYING ANALYSIS, SEE W. GAUTSCHI, 'EFFICIENT COMPUTATION OF
C

Notes

+ Data structures in inscal

Inscal global parameters are defined in inscal.h

Inscal uses common blocks to organize data. These common blocks are
defined in include files. The key common blocks are:

COMMON /IFAM/ - ifamf.h
    acfdprn.f
    acfit.f
    ckifam.f
    efitfp.f
    fitstats.f
    fixifam.f
    gtiftm.f
    if2ofi.f
    ifam_in_f.f
    ifam_out_f.f
    inscal.f
    makehtml.f
    parmod.f
    precsm.f
    prsfil.f

COMMON /OFAM/ - ofamf.h
    acfit.f
    atm2ofam.f
    fitstats.f
    if2ofi.f
    inscal.f
    makehtml.f
    ofam2atm.f
    ofam2cedar.f
    ofam_in_f.f
    ofam_out_f.f
    plotall.f
    plotne.f
    plotpar.f
    plottite.f'
    plotvo.f

COMMON /INSCOM/ - inscom.h
    exinsc.f
    inscal.f
    precsm.f
    prsfil.f

COMMON /CNTRL/ - cntrl.h
    cmdin.f
    cmdout.f
    exinsc.f
    gtcmtm.f
    inicom.f
    inscal.f
    makenotes.f

COMMON /SSWCOM/ - qssweq.h
    acfit.f
    exinsc.f
    fixifam.f
    inicom.f
    inscal.f
    parmod.f

COMMON /PARCOM/ - qssweq.h
    acfit.f
    exinsc.f
    fixifam.f
    inicom.f
    inscal.f
    parmod.f

COMMON /FITC/ - fitc.h
    acfit.f
    fitg.f
    functn.f

COMMON /PARTAB/ - partab.h
    acfit.f
    param.f
    parini.f

COMMON /FTSTAT/ - stat.h
    acfit.f
    inicom.f
    prcmst.f
    prstat.f
    setstat.f

Character data are in a separate Common block in accordance with the
ANSII Fortran standard. This ifamf.h has COMMON /IFAMC/ in addition to
COMMON /IFAM/. Common blocks also contain save statements, e.g. 
SAVE /GEOCOM/ to ensure that Common block variables are retained
when the Common block is not referenced by the main program.


+ ACFs in inscal

Inscal gets ACFs from the ifam structure, which is defined in ifamf.h
and ifamc.h.  Ifam contains everything inscal knows about an I. S.
dataset. Note in particular that inscal only deals with ACFs, not the
more general lag-products.

ACFs contain a maximum of NACFMX lags. The actual number is given by
ifam array variable NLAGS, which contains separate values for each
ACF.  Acfit uses array index variable IACF for the ACFs in ifam, and
most of the code in acfit is inside a "DO IACF=1,NACF" loop. Inscal
deals with instrumental corrections by modifying theoretical ACF's to
match measured ACFs.  It is usually desirable to use a finer lag
spacing for these corrections than present in the measured ACF. In this
case, the correction matrix used to correct theoretical ACFs contains a
factor of NDCMT more lags than the measured ACF. The number of lags in
the correction matrix is given by ifam array variable NLAGSC, which
contains separate values for each ACF.  After the correction have been
calculated, the theoretical ACF is decimated by a factor of NDCMT.

The fitting program requires the theoretical ACFs to have a number of
lags which is equal to a power of 2. Acfit sets the variable NLAGP2 to
the first power of two greater than or equal to NLAGSC(IACF), and all
teoretical ACFs are calculated with NLAGP2 lags. NLAGP2 is passed to
functn, which calculates the theoretical ACF, in fitc.h. The measured
ACF is zero-padded from NLAGS to NLAGP2/NDCMT. The measured ACF from
ifam is transfered to a local variable ACF in acfit, which passes it as
an argument to fit1, which passes it as an argument to curfit, which
passes it as an argument to functn. ACF contains both the real and
imaginary parts of the ACF. The real part starts at index 1 and the
imaginary part starts at index NLAG2+2, where NLAG2 = NLAGP2/NDCMT1.
Acfit also defines the scalar variables NLAG=NLAGS(IACF),
NLAGSC1=NLAGSC(IACF) and M = NLAG2+1.

+ External Functions and Subroutines called by inscal

Inscal requires the Madrec, Geophysics and NCAR Graphics libraries
The Fortran Library calls may create portability problems.

AGSETC - NCAR Graphics
AGSETF - NCAR Graphics
AGSETI - NCAR Graphics
AGSETP - NCAR Graphics
CEDARCLOSE - Madrec
CEDARCREATE - Madrec
CEDARGETSCALEFACTOR - Madrec
CEDAROPEN - Madrec
CEDARSET1DPARM - Madrec
CEDARSET2DPARM - Madrec
CEDARWRITE - Madrec
CLOSE_MIDAS_FILE - midas_io.c
CONVRT - Geophysics
DATER - Geophysics
DTIME - Fortran
EXIT - Fortran
EZMXY - NCAR Graphics
FDATE - Fortran
FLUSH - Fortran
FRAME - NCAR Graphics
GACWK - NCAR Graphics
GCLKS - NCAR Graphics
GCLWK - NCAR Graphics
GDAWK - NCAR Graphics
GETARG - Fortran
GETCWD - Fortran
GETPID - Fortran
GOPKS - NCAR Graphics
GOPWK - NCAR Graphics
GPM - NCAR Graphics
GSCHH - NCAR Graphics
GSCHSP - NCAR Graphics
GSCHXP - NCAR Graphics
GSMK - NCAR Graphics
GSMKSC - NCAR Graphics
GSPLCI - NCAR Graphics
GSTXAL - NCAR Graphics
GSTXCI - NCAR Graphics
GTS5 - Geophysics (MSIS)
GTX - NCAR Graphics
HOSTNM - Fortran
IARGC - Fortran
IEEE_FLAGS - Fortran
JDATER - Geophysics
JDAY - Geophysics
LNBLNK - Fortran
METERS - Geophysics (MSIS)
NGSETC - NCAR Graphics
OPEN_MHR_PARMS - midas_io.c
OPEN_MIDAS_FILE - midas_io.c
PLOTIF - NCAR Graphics
POINT - Geophysics
READ_MIDAS_RECORD - midas_io.c
SATELLITE_DETECT - satellite_detect.c
SET - NCAR Graphics
SIGNAL - Fortran
TIME - Fortran
TRETRV - Geophysics (MSIS)
TSELEC - Geophysics (MSIS)


TO DO
_____

Verify how ACF errors, variances are used (DELACF, ACFVAR).