C
C File 'crtin.for' for reading the input data for complete ray tracing
C
C Date: 2003, May 15
C Coded by Ludek Klimes
C
C.......................................................................
C
C This file consists of:
C CRTIN...Subroutine designed to open the data files for complete
C ray tracing and to read the input data sets CRT, MODEL,
C DCRT and INIT.
C CRTIN
C UNIT... Subroutine designed to control connecting and
C disconnecting the data files to logical units, and to
C determine the logical units from which the given data sets
C are to be read. Called e.g. by the subroutine CRTIN.
C UNIT
C
C.......................................................................
C
C
C Description of data files:
C
C Input data - main data set 'CRT':
C This main data file for the complete ray tracing program must have
C the form of SEP (Stanford
C Exploration Project) parameter or history file. It contains the
C names of other input files and the name of the output log file of
C program CRT.
C Names of the input files:
C MODEL='string'... String containing the name of the file with the
C input data for the model. The data are read by subroutine
C MODEL1. See the description of the
C data file MODEL.
C in subroutine file 'model.for'.
C Note that it is recommended to define only surfaces
C covering structural interfaces (Model Surfaces) in data
C set MODEL, and to define Auxiliary Surfaces in data set
C DCRT.
C Default: MODEL='model.dat'
C SRC='string'... Name of the input file containing the coordinates
C of the single initial point and the initial value of the
C travel time for each calculation.
C If there are several source points in file SRC, ray
C tracing is repeated for all these source points, repeating
C for each source point all elementary waves specified in
C data set CODE for each source
C point. Data in data sets RPAR
C and WRIT are not repeated,
C they should be specified for all elementary waves of all
C source points.
C Parameter SRC has no meaning for line or surface initial
C conditions for rays.
C Description of file SRC
C Default: SRC='src.dat'
C REC='string'... Name of the file with profile or receiver
C coordinates.
C Required just for two-point ray tracing.
C Description of file REC
C Default: REC='rec.dat'
C DCRT='string'... String containing the name of the file with the
C input data for the complete ray tracing. The data are
C read by subroutine RAY1. See the
C description of data set DCRT
C in subroutine file 'ray.for'.
C Default: DCRT='crt.dat'
C INIT='string'... String containing the name of the file with the
C input data specifying the line or surface initial
C conditions for rays.
C Parameter INIT has no meaning for a point source.
C If INIT=DCRT, data set INIT is appended to file DCRT
C (before possible data sets CODE, INIT or WRIT). See the
C description of data set INIT
C in subroutine file 'init.for'.
C The data are read by subroutine INIT1.
C Default: INIT=' '
C CODE='string'... String containing the name of the file with the
C codes of elementary waves. It is recommended to write
C data set CODE into a separate file. See the
C description of data set CODE
C in subroutine file 'code.for'.
C The data are read by subroutine CODE1.
C Note: for single source, it is possible to specify
C CODE=DCRT, and to append data set CODE to file DCRT.
C It is recommended to append at most one of sets CODE,
C RPAR, WRIT to DCRT.
C Default: CODE='code.dat'
C RPAR='string'... String containing the name of the file with the
C data specifying the take-off parameters of the required
C rays. The data are read by subroutine RPAR1.
C If RPAR=DCRT, data set RPAR is appended to file DCRT.
C It is recommended to append at most one of sets CODE,
C RPAR, WRIT to DCRT. See the
C description of data set RPAR
C in subroutine file 'rpar.for'.
C Default: RPAR='rpar.dat'
C WRIT='string'... String containing the name of the file specifying
C the names of the output files with the computed
C quantities. These data are read by subroutine WRIT1.
C If WRIT=DCRT, data set WRIT is appended to file DCRT.
C It is recommended to append at most one of sets CODE,
C RPAR, WRIT to DCRT. See the
C description of data set WRIT
C in subroutine file 'writ.for'.
C Default: WRIT='writ.dat'
C Names of the output files:
C The names of the output files with the computed quantities
C (C.R.T.5.5) are specified by the file given by input
C parameter WRIT described above.
C CRTLOG='string'... The string containing the name of the output
C log file. The data are written by subroutines WRIT1,
C WRIT2, WRIT4 and WRIT5 of file
C writ.for.
C Unfortunately, there is no description of the output file,
C yet.
C Default: CRTLOG='crtlog.out'
C
C Numerical parameters to optionally specify anisotropic ray tracing:
C CRTANI=real... Switch to anisotropic ray tracing:
C CRTANI=0... Isotropic ray tracing.
C CRTANI.NE.0... Anisotropic ray tracing.
C Anisotropic ray tracing is now applicable only under the
C following restrictions:
C (1) Coordinates: Only Cartesian coordinates (raycb.for,
C init.for).
C (2) Model: No structural interfaces
C (trans.for: reference isotropic model is now used
C for the transformation at the interfaces, direction
C of the incident slowness vector is preserved but its
C norm is adjusted before transformation).
C (3) Model: No attenuation is considered with anisotropic
C ray tracing.
C (4) Source: Initial point or constant travel time along
C an initial line or initial surface (init.for).
C Default: CRTANI=0.
C DEGREE=real... Degree of the homogeneous Hamiltonian to be
C arithmetically avereged for common S-wave ray tracing.
C Only values -2, -1, 1 and 2 are now allowed.
C Default: DEGREE=-1.
C
C Numerical parameters defining the kind of initial conditions (the kind
C of the source), read by subroutine file
C init.for:
C INIDIM=integer... Determines the dimensionality of the source:
C 0...Single initial point (point source), its coordinates
C are read from file given by parameter SRC.
C 1...Initial curve (line source), see parameter INIT above.
C 2...Initial surface, see parameter INIT above.
C Default: INIDIM=0 (point source)
C INIE1=real, INIE2=real, INIE3=real ... Three components of the
C optional rotation vector describing the rotation of the
C local Cartesian basis vectors.
C The local Cartesian basis vectors are used to define the
C local spherical coordinates if INIDIM=0, or if INIDIM=2
C and INIPAR is positive.
C The contravariant (covariant) components of the local
C Cartesian basis vectors, expressed in the curvilinear
C global model coordinates, are given by the square root of
C the contravariant (covariant) metric tensor.
C The local Cartesian basis vectors thus coincide with the
C basis vectors of the global model coordinate system if
C the model coordinates are Cartesian.
C The local Cartesian basis vectors may then optionally
C be rotated about the axis given by the rotation vector.
C The angle of the rotation in radians is given by the
C Cartesian length of the rotation vector.
C The rotation vector is expressed with respect to the
C local Cartesian basis vectors before rotation.
C Equations:
C The i-th component of the j-th rotated local Cartesian
C basis vector, expressed with respect to the local
C Cartesian basis vectors before rotation, is
C E_ij = cos(E) delta_ij + [1-cos(E)] E_i/E E_j/E
C - sin(E) epsilon_ijk E_k/E
C where (E_1,E_2,E_3)=(INIE1,INIE2,INIE3),
C E = sqrt(E_k E_k)
C is the Cartesian length of the rotation vector,
C delta_ij is the Kronecker delta, and
C epsilon_ijk is completely skew Levi-Civita's symbol,
C with epsilon_123=epsilon_231=epsilon_312=1.
C The contravariant (covariant) components of the rotated
C local Cartesian basis vectors, expressed in the
C curvilinear global model coordinates, are obtained by
C multiplying E_ij from the left by the square root of
C the contravariant (covariant) metric tensor.
C Default:
C For positive INIPAR: INIE1=INIE2=INIE3=0. (no rotation)
C For negative INIPAR: INIE1=pi, INIE2=INIE3=0. (rotation
C by pi radians (180 degrees) about the local Cartesian
C X1 coordinate axis.
C INIDIR=integer... A special option for the above described
C rotation vector:
C INIDIR.EQ.0: Rotation vector is given by parameters INIE1,
C INIE2 and INIE3. Parameters INIE1, INIE2, INIE3 thus
C specify a single rotation vector for the whole run of
C program CRT.
C INIDIR.NE.0: The information on the rotation is taken from
C the input SRC file.
C Each source point in input file SRC must be supplemented
C by directional vector E1DIR,E2DIR,E3DIR, expressed with
C respect to the local Cartesian basis vectors (before
C rotation). The rotation vector is not determined by
C input parameters INIE1, INIE2 and INIE3, but is derived,
C for each source point, from the directional vector:
C the third local Cartesian basis vector is rotated
C towards the directional vector along the rotation vector
C perpendicular to the local Cartesian X3 axis and to the
C specified directional vector E1DIR,E2DIR,E3DIR.
C This option corrresponds to the minimum rotation angle
C of the local Cartesian X3 axis towards the specified
C directional vector.
C Default: INIDIR=0
C INIPAR=integer... Determines the parametrization of rays:
C For INIDIM.LE.0:
C INIPAR.LT.0: Different default values of components
C INIE1, INIE2 and INIE3 of the above described rotation
C vector. This option is left just for backward
C compatibility.
C INIPAR.EQ.1: Ray parameters are polar-like spherical
C coordinates (colatitude,longitude) connected with the
C local Cartesian coordinate system which basis vectors
C are given by the square root of the metric tensor at
C the initial point, optionally rotated about rotation
C vector given by parameters INIE1, INIE2 and INIE3.
C Equator plane coincides with the local (X1,X2)-plane.
C Zero longitude is determined by the positive local X1
C half-axis. Longitude PI/2 then corresponds to the
C positive local X2 half-axis. The zero colatitude
C corresponds to the positive local X3 half-axis.
C If SIN(colatitude).LT.0, the ray is reported out of
C the ray-parameter domain: IEND=71 in subroutine INIT2.
C INIPAR.EQ.2: Ray parameters are geographic-like
C spherical coordinates (longitude,latitude) connected
C with the local Cartesian coordinate system which basis
C vectors are given by the square root of the metric
C tensor at the initial point.
C Equator plane coincides with the local (X1,X2)-plane.
C Zero longitude is determined by the positive local X1
C half-axis. Longitude PI/2 then corresponds to the
C positive local X2 half-axis. The latitude is positive
C in the direction given by the positive X3 half-axis.
C If COS(latitude).LT.0, the ray is reported out of
C the ray-parameter domain: IEND=71 in subroutine INIT2.
C INIPAR.EQ.3: Azimuthal equidistant projection of a unit
C sphere is parametrized by 2 Cartesian coordinates
C centred at the projection point. This option is
C suitable especially for reflection seismic studies.
C The unit vector tangent to the ray, expressed in the
C local Cartesian coordinate system which basis vectors
C are given by the square root of the metric tensor at
C the initial point, is given by
C T1=PAR1*SIN(R)/R
C T2=PAR2*SIN(R)/R
C T3= COS(R)
C with R=SQRT(PAR1*PAR1+PAR2*PAR2).
C If R.GT.2*PI, the ray is reported out of the
C ray-parameter domain: IEND=71 in subroutine INIT2.
C For INIDIM=1:
C INIPAR must be 1 or 2. The INIPAR-th ray parameter is
C identical with the parameter parametrizing the initial
C curve. The other ray parameter is the angle between the
C ray take-off plane and the normal to the interpolated
C surface. The ray take-off plane is given by the tangent
C to the initial line and by the slowness vector.
C For INIPAR=1, the initial line is the line PAR2=0 at the
C interpolated surface and is parametrized by PAR1.
C For INIPAR=2, the initial line is the line PAR1=0 at the
C interpolated surface and is parametrized by PAR2.
C For INIDIM=2:
C Ray parameters are identical with two parameters
C parametrizing the initial surface.
C INIPAR.LE.0: Initial surface is described in terms of
C functions specifying the dependence of general
C coordinates (X1,X2,X3) on two parameters of the
C initial surface.
C INIPAR.EQ.1: Initial surface is specified in the
C polar-like spherical coordinates (colatitude,
C longitude, radius) connected with the local Cartesian
C coordinate system which basis vectors are given by the
C square root of the metric tensor at the given point.
C Colatitude and longitude are the parameters, and the
C initial surface is determined by a function specifying
C the dependence of the radius on these parameters
C (colatitude and longitude).
C INIPAR.GE.2: Initial surface is specified in the
C geographic-like spherical coordinates (longitude,
C latitude, radius) connected with the local Cartesian
C coordinate system which basis vectors are given by the
C square root of the metric tensor at the given point.
C Longitude and latitude are the parameters, and the
C initial surface is determined by a function specifying
C the dependence of the radius on these parameters
C (longitude and latitude).
C Default: INIPAR=2
C ADVANC=real... Initial point of the ray is shifted by distance
C ADVANC perpendicularly to the initial surface or line,
C or tangentially to the ray for the single initial point.
C All initial and other quantities (except for the metric
C tensor) are then evaluated at the shifted initial point.
C Finally, the initial travel time is linearly updated
C using the initial slowness vector. This option may be
C useful if the source is situated close to a structural
C interface.
C Default: ADVANC=0. (mostly sufficient)
C
C Parameters to control screen output:
C The parameters are read by subroutine file
C scro.for.
C
C Parameters to control textual screen output:
C SCRANSI=integer... Identification how the screen handles the ANSI
C escape sequences.
C SCRANSI=0: The screen does not support the ANSI escape
C sequences. Program 'crt.for' thus does not use the ANSI
C escape sequences for screen output.
C SCRANSI=1: The screen supports the ANSI escape sequences.
C Program 'crt.for' thus uses the ANSI escape sequences
C for screen output.
C Default: SCRANSI=1 (good for MS-DOS with ansi.sys, and
C for most contemporary versions of Linux).
C SCRPLUS=integer... Identification how the screen handles the first
C character of a record.
C SCRPLUS=0: All characters of a record are displayed,
C including the first character (e.g., Linux Fortran
C compiler g77). Program 'crt.for' thus does not use the
C first character to control the screen output.
C SCRPLUS.GT.0: The first character of a record is not
C displayed. Since the ANSI escape sequences are preferred
C to the first-column control characters, all options
C SCRPLUS.GT.0 are equal if SCRANSI=1.
C SCRPLUS=1: The first character of a record has no impact
C upon the screen display.
C (Note that program 'crt.for' uses '+' as the
C first-column control character even in this case.)
C SCRPLUS=2: If the first character of a record is '+',
C the record overwrites the preceding record,
C but '1' has no impact upon the screen display
C (e.g., MS-DOS Fortran compilers by Lahey).
C Program 'crt.for' thus uses '+' as the first-column
C control character.
C SCRPLUS=3: If the first character of a record is '+',
C the record overwrites the preceding record.
C If the first character of a record is '1',
C the record is written on the first line of the screen.
C Program 'crt.for' thus uses '+' and '1' as the
C first-column control characters.
C Default: SCRPLUS=1 (good for all compilers).
C SCRWIDTH=integer... Width in characters of the textual part of the
C screen. SCRWIDTH cannot be smaller than 20. Program
C 'crt.for' generates textual output of maximum line length
C equal to SCRWIDTH.
C Hint: Specify SCRWIDTH=20 if you use graphical screen
C output.
C Default: SCRWIDTH=79
C SCRHEIGHT=integer... Height in lines of the textual part of the
C screen. SCRHEIGHT influences only the textual output on
C histories and ray endpoints, the number of lines used for
C other textual output may exceed SCRHEIGHT.
C SCRHEIGHT may be lower than the actual number of lines but
C should not exceed that. SCRHEIGHT=25 is a good choice for
C IBM-PC's, but SCRHEIGHT=24 fits also VAX computers.
C Used only if SCRANSI=1.
C Default: SCRHEIGHT=25
C CRTSCRO='string'... Verbose option of the CRT program, enabling to
C select various levels of screen output.
C The 'string' is composed of zero to several characters.
C Each character may be entered either in lowercase or
C uppercase. The characters may be entered in any order,
C the order of characters does not influence the output.
C Each character enables a particular output:
C 'S' (source): To display the index of the source.
C 'W' (wave): To display the index of the elementary wave.
C 'R' (ray): To display the index of the ray being traced.
C This option is not recommended if simultaneously
C SCRANSI=0 and SCRPLUS.LE.1.
C 'A' (activity): To inform about the current activity of
C the program, e.g., 'Aiming' or 'Tracing'.
C This option is not recommended if simultaneously
C SCRANSI=0 and SCRPLUS.LE.1.
C 'P' (parameters): To display two ray take-off parameters.
C This option is not recommended if simultaneously
C SCRANSI=0 and SCRPLUS.LE.1.
C 'H' (history): To display the indices of simple blocks,
C complex blocks and interfaces passed through by a ray.
C This option considerably slows down the calculation and
C should be used just for debugging.
C This option should be avoided if SCRANSI=0.
C 'E' (end of ray): To display reason IEND of the
C termination of the computation of a ray. See the
C description of IEND in RAY2
C and INIT2.
C This option should be avoided if SCRANSI=0.
C 'G' (graphics): Option to switch on and off the graphical
C screen output.
C This option affects the output only if the
C CalComp graphics in
C program crt.for is enabled.
C A blank string means no screen output on the progress of
C ray tracing. Only the messages related to the start and
C termination of the program are displayed.
C Notes:
C The default setting is relatively conservative and
C innocuous.
C If the ANSI escape sequences are not supported, switch
C to SCRANSI=0.
C If the ANSI escape sequences are supported, options
C CRTSCRO='SWR' and CRTSCRO='SWRA' may also be
C reasonably fast.
C These options may also be reasonably fast if the
C Fortran compiler supports option SCRPLUS=2.
C If SCRANSI=0 but SCRPLUS=2, it is recommended to
C accumulate the screen output within a single line.
C In this case, only options 'S', 'W', 'R', 'A', 'P'
C are recommended. The minimum numbers of output
C characters corresponding to individual options are:
C 'S' 11, 'W' 9, 'R' 12, 'A' 7, 'P' 35, plus the number
C of used options (with 'RA' counted as a single option)
C minus 1 for spaces separating the output strings.
C The resulting number of characters should not exceed
C the value of SCRWIDTH.
C If SCRWIDTH is greater, up 8 spaces are used to
C separate the output strings.
C Without counting, the default value of SCRWIDTH=79
C is sufficient to accomodate any combination of options
C 'S', 'W', 'R', 'A', 'P' within a single line.
C Options 'H' or 'E' always generate multiline screen
C output, which is awfully slow if SCRANSI=0.
C SCRANSI=0, SCRPLUS=1 or 2, CRTSCRO=' ' correspond to
C optional screen output subroutine file 'scronul.for'
C in CRT version 5.60 or older.
C SCRANSI=0, SCRPLUS=2, SCRWIDTH=79, CRTSCRO='SWRA'
C correspond to basic screen output subroutine file
C 'scronum.for' in CRT version 5.60 or older.
C SCRANSI=1, SCRPLUS=1 or more, SCRWIDTH=20,
C CRTSCRO='WRAPHEG' correspond to optional screen output
C subroutine file 'scropc.for' in CRT version 5.60 or
C older.
C Default: CRTSCRO='SW'
C
C Parameters to control graphical screen output:
C The graphical screen output is
C available only if the CalComp
C graphics in program crt.for is enabled,
C and character 'G' in the input parameter CRTSCRO is specified.
C SCRBBOX1=real, SCRBBOX2=real, SCRBBOX3=real, SCRBBOX4=real...
C Bounding box (plotting area) of the graphical
C screen output.
C Used only if the CalComp
C graphics in program crt.for is
C enabled.
C SCRBBOX1, SCRBBOX2: CalComp coordinates of the left bottom
C corner of the plotting area in the CalComp units.
C SCRBBOX3, SCRBBOX4: CalComp coordinates of the right top
C corner of the plotting area in the CalComp units.
C Default: SCRBBOX1=2.77, SCRBBOX2=0.02, SCRBBOX3=10.98,
C SCRBBOX4=8.48 (The rightmost 3/4 of the Landscape US
C Letter form 11.0in * 8.5in mapped onto the screen area.
C The leftmost 1/4 of the screen area is reserved for the
C text output, which is controlled by SCRWIDTH.
C Note that the analogous values for the metric A4 form
C 29.7cm * 21.0cm are SCRBBOX1=7.45, SCRBBOX2=0.00,
C SCRBBOX3=29.66, SCRBBOX4=21.00)
C SCRLINE=real... Estimated thickness of a line plotted on the
C screen (in the CalComp units). Program 'crt.for' uses
C this value to set the thickness of spacing between lines.
C Used only if the CalComp graphics is enabled, see program
C crt.for.
C Default: SCRLINE=0.017 (for low resolution and US Letter,
C note that the analogous value for the metric A4 is
C SCRLINE=0.045)
C CRTPAUSE=integer... Positive value enables waiting for ENTER from
C the standard input after each elementary wave.
C This option is useful just when running program CRT
C manually, with optional 'scro.for' and with CalComp
C graphics erasing the screen when opening a new plot.
C The program then waits to confirm erasing of the ray
C diagram of each elementary wave.
C Attention:
C Do not enable this feature when executing the CRT
C program from a history file.
C Default: CRTPAUSE=0 (no pause, mostly sufficient)
C Note (very detailed):
C Filenames MODEL, DCRT, INIT, CODE, RPAR, WRIT and CRTOUT need not
C be mutually different, several data sets may be read from (or
C written to) the same data file. Each data file is closed when
C read over, and its logical unit number may be connected to another
C file to be opened. When more than one elementary wave is
C computed, it is not recommended to write the LOG output data set
C to the file containing the CODE, RPAR or WRIT data set.
C
C Example of data CRT all data sets separated
C
C Example of data CRT with DCRT and INIT
C
C=======================================================================
C
C
C
SUBROUTINE CRTIN(FILE1,LUCODE,LURPAR,LUWRIT,LULOG)
CHARACTER*(*) FILE1
INTEGER LUCODE,LURPAR,LUWRIT,LULOG
C
C Subroutine CRTIN is designed to open the data files for complete ray
C tracing and to read the input data sets CRT, MODEL, DCRT and INIT.
C
C Input:
C FILE1...The name of the main input data file CRT. The file is
C opened with the logical unit number LU(1)=5 defined in
C this subroutine. The name may be blank to use
C preconnected input device. Note that also logical units
C LU(2)=4, LU(3)=3 and LU(4)=2 may be used to connect other
C input data files always having non-blank filenames.
C
C Output:
C LUCODE..The logical unit connected to the file with the CODE data.
C LURPAR..The logical unit connected to the file with the RPAR data.
C LUWRIT..The logical unit connected to the file with the WRIT data.
C LULOG...The logical unit connected to the output LOG file.
C
C Subroutines and external functions required:
EXTERNAL MODEL1,RAY1,INIT1,UNIT
C MODEL1..File 'model.for' of the package 'model'.
C RAY1... File 'ray.for'.
C INIT1...File 'init.for'.
C UNIT... This file.
C Note that the above subroutines reference many other external
C procedures from various subroutine files. These indirectly
C referenced procedures are not named here, but are listed in the
C particular subroutine files.
C
C Date: 1999, May 11
C Coded by Ludek Klimes
C
C-----------------------------------------------------------------------
C
C Local storage locations:
C
C Auxiliary storage locations:
INTEGER I
C I... Auxiliary loop variable
C
C Quantities describing data files and logical units:
INTEGER NFILE,IU,NU
PARAMETER (NFILE=8)
CHARACTER*80 FILE(NFILE)
PARAMETER (NU=4)
INTEGER LU(NU),KU(NU)
DATA LU/5,4,3,2/
C NFILE, FILE, IU, NU, LU, KU... For the description of these
C quantities see the subroutine unit below.
C
C.......................................................................
C
C The name of the main input file. This file contains the names of
C other input files
IF(NU.LT.4) THEN
C 102
CALL ERROR('102 in CRTIN: Less than 4 logical units')
C Four logical units must be available to read the input data and
C to write the output log file.
END IF
C
C (1) Main data file - contains the names of other input files
CALL RSEP1(LU(1),FILE1)
CALL RSEP3T('MODEL' ,FILE(1),'model.dat' )
CALL RSEP3T('DCRT' ,FILE(2),'crt.dat' )
CALL RSEP3T('INIT' ,FILE(3),' ' )
CALL RSEP3T('CODE' ,FILE(4),'code.dat' )
CALL RSEP3T('RPAR' ,FILE(5),'rpar.dat' )
CALL RSEP3T('WRIT' ,FILE(6),'writ.dat' )
CALL RSEP3T('CRTLOG',FILE(7),'crtlog.out')
C
C (2) Data for model
CALL UNIT(1,NFILE,FILE,IU,NU,LU,KU,'OLD')
CALL MODEL1(LU(IU))
C
C (3) Data for complete ray tracing
CALL UNIT(2,NFILE,FILE,IU,NU,LU,KU,'OLD')
CALL RAY1(LU(IU))
C
C (4) Data for initial points of rays
CALL UNIT(3,NFILE,FILE,IU,NU,LU,KU,'OLD')
IF(IU.EQ.0) THEN
CALL INIT1(0)
ELSE
CALL INIT1(LU(IU))
END IF
C
C (5) File containing the codes of elementary waves
CALL UNIT(4,NFILE,FILE,IU,NU,LU,KU,'OLD')
C The data file for the subroutine CODE1 remains open
LUCODE=LU(IU)
IU=0
C
C (6) File controlling the take-off parameters of rays
CALL UNIT(5,NFILE,FILE,IU,NU,LU,KU,'OLD')
C The data file for the subroutine RPAR1 remains open
LURPAR=LU(IU)
IU=0
C
C (7) File specifying the names of files with the computed
C quantities
CALL UNIT(6,NFILE,FILE,IU,NU,LU,KU,'OLD')
C The data file for the subroutine WRIT1 remains open
LUWRIT=LU(IU)
IU=0
C
C (8) The output LOG file
CALL UNIT(7,NFILE,FILE,IU,NU,LU,KU,'UNKNOWN')
C The output file for the subroutines WRIT1, WRIT2, WRIT4 and WRIT5
C remains open
LULOG=LU(IU)
C
RETURN
END
C
C=======================================================================
C
C
C
SUBROUTINE UNIT(IFILE,NFILE,FILE,IU,NU,LU,KU,STATUS)
INTEGER IFILE,NFILE,IU,NU,LU(NU),KU(NU)
CHARACTER*(*) FILE(NFILE),STATUS
C
C Subroutine UNIT is designed to control connecting and disconnecting
C the data files to logical units, and to determine the logical units
C from which the given data sets are to be read.
C
C Input:
C IFILE...Index of the data set to be read in. The data sets are
C indexed by integers from 1 to NFILE.
C NFILE...The total number of data sets.
C FILE... Character array containing the names of the files
C containing individual data sets. Different data sets may
C be stored in the same file. If IFILE=1, only FILE(1) has
C to be defined.
C IU... Index of the logical unit connected to the file containing
C the last read data set (i.e. the last data set was read
C from the logical unit LU(IU) connected to the file
C FILE(KU(IU)). Zero if no data are read in, or if there is
C no data file to close. Need not be defined if IFILE=1.
C NU... The maximum number of available logical units.
C LU... Array containing reference numbers of logical units.
C KU... Auxiliary array of the dimension at least NU.
C Its elements KU(1) to KU(NU) must not be modified between
C two invocations of this subroutine. Its values need not
C be defined if IFILE=1.
C KU(I)...Zero if the logical unit LU(I) is closed,
C otherwise the sequential number of the next data set to
C be read from this unit.
C
C Output:
C IU... Index of the logical unit connected to file with the data
C set to be read in (i.e. the next data set will be read
C from the logical unit LU(IU) connected to the file
C FILE(IFILE)).
C Zero if the filename is blank or if no logical unit is
C available.
C KU... Updated input values.
C
C Date: 1999, May 11
C Coded by Ludek Klimes
C
C-----------------------------------------------------------------------
C
C Auxiliary storage locations:
INTEGER IERR,JU,I
C
IF(IFILE.EQ.1) THEN
C No logical units are connected when opening the first data file
DO 10 JU=1,NU
KU(JU)=0
10 CONTINUE
ELSE
C Updating indices of next data sets to be read from open files:
DO 13 JU=1,NU
IF(0.LT.KU(JU).AND.KU(JU).LT.IFILE) THEN
C The data set from the file connected to the logical unit
C LU(JU) has been read. Determining the next data set
C contained in the file:
DO 11 I=IFILE,NFILE
IF(FILE(KU(JU)).EQ.FILE(I)) THEN
C The I-th data set will also be read from the last file
C connected to the logical unit LU(JU)
KU(JU)=I
GO TO 12
END IF
11 CONTINUE
C No other data set will be read from the last file. The file
C may be closed and the logical unit LU(IU) disconnected
12 CONTINUE
END IF
13 CONTINUE
C Closing the data file:
IF(IU.GT.0) THEN
C There is a file submitted to be closed
IF(0.LT.KU(IU).AND.KU(IU).LT.IFILE) THEN
C No other data set will be read from this file. The file
C may be closed and the logical unit LU(IU) disconnected
CLOSE(LU(IU))
KU(IU)=0
END IF
END IF
END IF
C
C Opening new data file:
IF(IFILE.GT.0) THEN
DO 21 JU=1,NU
IF(KU(JU).EQ.IFILE) THEN
C The data file is already open
IU=JU
RETURN
END IF
21 CONTINUE
C The data file has to be opened
DO 22 JU=1,NU
IF(KU(JU).EQ.0) THEN
C The logical unit LU(JU) may be connected to the data file
IF(FILE(IFILE).EQ.' ') THEN
IU=0
ELSE
IU=JU
KU(IU)=IFILE
OPEN(LU(IU),FILE=FILE(IFILE)
* ,STATUS=STATUS,IOSTAT=IERR,ERR=90)
END IF
RETURN
END IF
22 CONTINUE
C No logical unit available
IU=0
END IF
RETURN
C
90 CONTINUE
C 101
WRITE(*,'('' STATUS'',I5,'': '',A)') IERR,FILE(IFILE)
CALL ERROR('101 in UNIT: Open file error')
C Error encountered during execution of the OPEN statement.
END
C
C======================================================================
C