C Subroutine file 'srfc.for' for specification and interpolation of
C smooth surfaces in the model in rectangular grids.
C
C By Vlastislav Cerveny, Ludek Klimes, Ivan Psencik
C
C This file consists of the following subroutines:
C     SRFC1...Subroutine reading the input data for smooth surfaces.
C     SRFC2...Subroutine evaluating the function values and their first
C             and second derivatives.  Outside the specified rectangular
C             grid, the functions are continued smoothly.
C Subroutines SRFC1 and SRFC2 supporting the complete ray tracing
C algorithm only mediate the work of subroutines VAL1 and VAL2 which
C must be appended.  In addition, subroutines CURVN1 (or its alternative
C CURVB1), CURV2D (or its alternative CURVBD), SURFB1, SURFBD, VAL3B1,
C VAL3BD, VGEN, TERMS, SNHCSH, TRIDEC, TRISOL, DSPLNZ, INTRVL from the
C subroutine package 'FITPACK' by Alan Kaylor Cline, Department of
C Computer Sciences, University of Texas at Austin, are used.  In the
C complete ray tracing, this software file 'srfc.for' may be  replaced
C by any user-defined package containing subroutines SRFC1 and SRFC2
C with the same number, type and meaning of their parameters as in this
C file.
C
C If model variations are taken into account:
C     Model variations are assumed to be stored while evaluating the
C     function describing a given surface during the invocation of
C     subroutine VAL of file 'val.for' and subsequent routines of file
C     'fit.for'.  The variations are assumed to be stored in register 1
C     of the system VAR*.
C
C Input data (read in by subroutine SRFC1):
C     These input data define the surfaces.  They are read in by
C     subroutine SRFC1.  The number nsrfc of the surfaces to be defined
C     is an input argument of subroutine SRFC1.  The data are read in by
C     the list directed input (free format).
C (1) NSRFC-times (i.e. once for each surface) input data (1A)+(1B):
C (1A) TEXTG,ISRFC
C     Identification of the surface.
C     TEXTG...Any string. Its first 3 characters must differ from 'END'.
C     ISRFC...Index of the surface.
C (1B) 'Input data for one surface', see below.
C (2) TEXTE,AUX
C     End of data.
C     TEXTE...String, the first 3 characters of which must be upper-case
C             'END'.
C     AUX...  Any number or a slash.
C For an example refer to the sample input data for the model.
C
C Input data for one surface:
C     The data are read in by the list directed input (free format).  In
C     the list of input data below, each numbered paragraph indicates
C     the beginning of a new input operation (new read statement).  If
C     the first letter of the symbolic name of the input variable is
C     I-N, the corresponding value in input data must be of the type
C     INTEGER.  Otherwise, the input parameter is of the type REAL.
C (1) IVAR1,IVAR2,IVAR3,SIGMA,POWERW,/
C     The form of the function.
C     IVAR1,IVAR2,IVAR3... Denote the form of the function. The function
C             must be of the form
C               F(X1,X2,X3) = W(A1,A2,A3)-B1-B2-B3   .
C             X1, X2, X3 are the general coordinates. Each of A1, A2,
C             A3, B1, B2, B3 must be either:  (a) one of general
C             coordinates X1, X2, X3,  or (b) must be left out.  At most
C             3 of parameters A1-B3 may be of kind (a).  Note that IVAR1
C             controls the type of A1 and B1, IVAR2 controls the type of
C             A2 and B2, IVAR3 controls the type of A3 and B3.
C             For IVAR1.EQ.0: A1, B1 are empty (left out),
C             for IVAR1.EQ.1: A1=X1, B1 is empty,
C             for IVAR1.EQ.2: A1=X2, B1 is empty,
C             for IVAR1.EQ.3: A1=X3, B1 is empty,
C             for IVAR1.EQ.-1: B1=X1, A1 is empty,
C             for IVAR1.EQ.-2: B1=X2, A1 is empty,
C             for IVAR1.EQ.-3: B1=X3, A1 is empty,
C             the meaning of the parameters IVAR2, IVAR3 is similar.
C             Examples:
C             IVAR1: IVAR2: IVAR3: the form of the function:
C               1      2      3     F(X1,X2,X3)=W(X1,X2,X3)
C               3      1      2     F(X1,X2,X3)=W(X3,X1,X2)
C               1      2      0     F(X1,X2,X3)=W(X1,X2)
C               1      2     -3     F(X1,X2,X3)=W(X1,X2)-X3
C               1     -3      2     F(X1,X2,X3)=W(X1,X2)-X3
C             Function W is interpolated by means of splines under
C             tension.
C     SIGMA...Is the tension factor (its sign is ignored).  This value
C             indicates the curviness desired.  If ABS(SIGMA) is nearly
C             zero (e.g. 0.001), the resulting surface is approximately
C             the tensor product of cubic splines.  If ABS(SIGMA) is
C             large (e.g. 50.), the resulting surface is approximately
C             tri-linear.  If SIGMA equals zero, tensor products of
C             cubic splines result.  A recommended value for SIGMA is
C             approximately 1. In absolute value.
C     POWERW..Given grid values (6) correspond to the POWERW-th power of
C             interpolated function W.  The given grid values (6) are
C             thus raised to the (1/POWERW)-th power immediately after
C             reading and then interpolated.  POWERW=1 is recommended.
C     /...    Obligatory slash at the end of line for future extensions.
C     Default: IVAR1=0, IVAR2=0, IVAR3=0, SIGMA=0, POWERW=1.
C (2) NX(1),...,NX(NVAR)
C     The numbers of grid coordinates for the interpolation.
C     This input is performed if at least one of IVAR1, IVAR2, IVAR3 is
C     positive.
C     Each of NX(1),...,NX(NVAR) corresponds to one positive value of
C     IVAR1, IVAR2, IVAR3 and specifies the number of grid coordinates
C     corresponding to that independent variable of function W, see (1).
C     The sign of NX(1),...,NX(NVAR) is ignored. NVAR (.LE.3) is the
C     number of positive values of the above quantities IVAR1, IVAR2,
C     IVAR3, i.e. The number of independent variables of function W,
C     see (1).
C (3) X1(1),...,X1(NX(1))
C     The grid coordinates corresponding to the first independent
C     variable of function W, see (1).
C     This input is performed if NX(1) is specified, see (2), and is not
C     zero. The grid coordinates may be specified in any order.
C (4) X2(1),...,X2(NX(2))
C     The grid coordinates corresponding to the second independent
C     variable of function W, see (1).
C     This input is performed if NX(2) is specified, see (2), and is not
C     zero. The grid coordinates may be specified in any order.
C (5) X3(1),...,X3(NX(3))
C     The grid coordinates corresponding to the third independent
C     variable of function W, see (1).
C     This input is performed if NX(3) is specified, see (2), and is not
C     zero. The grid coordinates may be specified in any order.
C (6) (((W(I,J,K),I=1,MAX(NX(1),1)),J=1,MAX(NX(2),1)),K=1,MAX(NX(3),1))
C     The values of function W at grid points. Function value W(I,J,K)
C     corresponds to point (X1(I),X2(J),X3(K)).
C
C Date: 1996, September 30
C Coded by Ludek Klimes
C
C=======================================================================
C
      SUBROUTINE SRFC1(LUN,NSRFC)
      INTEGER LUN,NSRFC
C
C This subroutine reads the input data for the smooth surfaces,
C determines the parameters necessary to compute an interpolatory
C function on a three dimensional rectangular grid, and stores them in
C the memory.  The function determined can be represented as a tensor
C product of splines under tension.  For actual mapping of points it is
C necessary to call the subroutine SRFC2, which also returns the first
C and second partial derivatives.  Subroutine SRFC1 may be called
C several times.  The surfaces are indexed succesively, following the
C surfaces defined during the previous invocations.
C
C Input:
C     LUN...  Logical unit number of the external input device
C             containing the input data.
C     NSRFC...Number of the surfaces for which the input data are
C             specified during the current invocation of SRFC1.
C None of the input parameters are altered.
C
C No output.
C
C Subroutines and external functions required:
      EXTERNAL VAL1
C     VAL1, SORTV, READV... File 'val.for'.
C     CURVN1 or CURVB1 (alternatives), SURFB1, VAL3B1, SNHCSH, VGEN,
C              TERMS, TRIDEC, TRISOL... Subroutine package 'FITPACK'
C              (file 'fit.for').
C
C Date: 1992, December 31
C Coded by Ludek Klimes
C
C-----------------------------------------------------------------------
C
C     Auxiliary storage locations:
      CHARACTER*3 TFUNCT(1)
      DATA TFUNCT/'   '/
C
      CALL VAL1(LUN,1,NSRFC,1,TFUNCT)
      RETURN
      END
C
C=======================================================================
C
      SUBROUTINE SRFC2(ISRFC,COOR,F)
      INTEGER ISRFC
      REAL COOR(3),F(10)
C
C This subroutine evaluates the functions describing various smooth
C surfaces in the model at a given point. The three first and six second
C partial derivatives are also evaluated.  The specified functions are
C represented as a tensor product of splines under tension.  The
C coefficients of these functions are prepared in subroutine SRFC1, in
C which the input data concerning the function of each surface are read
C in.
C
C Input:
C     ISRFC...Index of a surface.
C     COOR... Array containing coordinates X1, X2, X3 of the given
C             point.
C None of the input parameters are altered.
C
C Output:
C     F...    The value and the first and second partial derivatives F,
C             F1, F2, F3, F11, F12, F22, F13, F23, F33 of the function
C             F(X1,X2,X3) determining the surface ISRFC at the given
C             point.
C
C Subroutines and external functions required:
      EXTERNAL VAL2
C     VAL2... File 'val.for'.
C     CURV2D or CURVBD (alternatives), SURFBD, VAL3BD, SNHCSH, DSPLNZ,
C              INTRVL... Subroutine package 'FITPACK' (file 'fit.for').
C
C Date: 1996, September 30
C Coded by Ludek Klimes
C
C-----------------------------------------------------------------------
C
C     Auxiliary storage location:
      REAL POWER(1)
C
      CALL VAL2(1,IABS(ISRFC),1,COOR,F,POWER)
      RETURN
      END
C
C=======================================================================
C
