C
C     INCLUDE 'val.inc'
C     ------------------------------------------------------------------
      INTEGER NPAR
      PARAMETER (NPAR=500000)
      INTEGER IPAR(0:NPAR)
      REAL RPAR(0:NPAR)
      EQUIVALENCE (IPAR,RPAR)
      COMMON/VALC/IPAR
      SAVE /VALC/
C     ------------------------------------------------------------------
C     Common block /VALC/ is included in subroutines VAL1 and VAL2.
C     The parameters are stored sequentially in one array regardless of
C     the fact whether they are of type INTEGER or REAL.  The individual
C     numeric storage units of the array are indexed starting from 0 and
C     are named IPAR(I) or RPAR(I) depending on the type of a parameter.
C     The index of the last allocated numeric storage unit is NPAR (see
C     (f) below).  If NPAR is changed (see the third statement of the
C     above block data subroutine VALB), it must be adjusted in
C     subroutines VAL1 and VAL2, too.
C
C     Common block /VALC/ can be divided into two parts.  The first part
C     (see (a)-(d) below) of the common block /VALC/ contains integers.
C     The number of these integers in the first part equals to
C     1+MCLASS+NG+NF, where MCLASS is the total number of classes, NG is
C     the total number of all groups of all classes, NF is the total
C     number of all functions of all groups of all classes. The first
C     part of the common block specifies the division of the common
C     block /VALC/ into parameters describing individual functions.
C     The second part (see (e) below) of the common block /VALC/
C     contains the parameters describing individual functions, stored
C     successively for the first, second, ..., last function of the
c     first group of the first class, for the first, second, ..., last
c     function of the second group of the first class, ..., for the
c     first, second, ..., last function of the first group of the second
c     class, ..., for the first, second, ..., last function of the last
C     group of the last class.  The second part of the common block
C     /VALC/ contains both integer and real parameters.
C     For an example refer to the sample input data for the model.
C
C     (a) Numeric storage unit IPAR(0) contains the number MCLASS of
C     classes.
C
C     (b) Classes:
C     Subsequent numeric storage units (IPAR(I),I=1,MCLASS) correspond
C     to the individual classes.  One numeric storage unit corresponds
C     to one class.  The numeric storage unit corresponding to a class
C     contains the index of the numeric storage unit corresponding to
C     the last group of the class.
C
C     (c) Groups:
C     Subsequent numeric storage units (IPAR(I),I=MCLASS+1,MCLASS+NG)
C     correspond to the individual groups.  The total number of these
C     storage units is NG.  One numeric storage unit corresponds to one
C     group.  The numeric storage unit corresponding to a group contains
C     the index of the numeric storage unit corresponding to the last
C     function of the group.
C
C     (d) Functions:
C     Subsequent numeric storage units (IPAR(I),I=MCLASS+NG+1,
C     MCLASS+NG+NF) correspond to the individual functions.  The total
C     number of these storage units is NF.  One numeric storage unit
C     corresponds to one function.  The numeric storage unit
C     corresponding to a function contains the index of the numeric
C     storage unit corresponding to the last parameter that describes
C     the function.  The functions are stored in the order in which they
C     have been specified by the input data.  Since the number of
C     functions in the input data corresponding to one group may be less
C     than their maximum number NFUNCT (input parameter of subroutine
C     VAL1), some numeric storage units relevant to functions may not
C     correspond to the functions specified by the input data.  Each
C     such numeric storage unit contains the same address as the
C     previous numeric storage unit (i.e.  the corresponding function is
C     specified by no parameter) and has no influence on the function
C     evaluation.
C
C     (e) Parameters of functions:
C     Subsequent numeric storage units (IPAR(I),I=MCLASS+NG+NF+1,
C     MCLASS+NG+NF+NP) contain the parameters describing individual
C     functions.  Here we have denoted by NP the total number of these
C     storage units.  Any number of numeric storage units may correspond
C     to the parameters of one function.  The first numeric storage unit
C     corresponding to a function contains the integer that identifies
C     the physical meaning of the function, e.g.  its values may
C     identify P-wave velocity, S-wave velocity, density, etc.  The
C     second numeric storage unit contains the power of the physical
C     quantity, see 'Input data for one function' (1).  If item (1) of
C     'Input data for one function' is omitted, the two first numeric
C     storage units corresponding to the parameters of the function
C     contain 1 (the first INTEGER, the second REAL).  The subsequent
C     numeric storage units contain 'Input data for one function' (2),
C     (3), (4), (5) and (6), stored in the same amount as read from the
C     input data.  Data (4), (5), (6) and (7) are reordered to render
C     the grid coordinates in ascending order.  Instead of the grid
C     values (7), the coefficients describing the function in terms of a
C     B-spline under tension basis are stored (only if subroutine CURVN1
C     (Hermite representation) is used, the grid values (7) are stored).
C     These parameters are followed by arrays of length 5*NX(1), ...,
C     5*NX(NVAR) respectively, containing the B-spline under tension
C     basis data computed for the projections of the grid onto the axes
C     of individual independent variables (only if subroutine CURVN1
C     (Hermite representation) is used, the first NX(1) numeric storage
C     units contain the second derivatives and the following 4*NX(1)
C     numeric storage units are undefined.
C
C     (f) Undefined part of the common block:
C     Subsequent numeric storage units (IPAR(I),I=MCLASS+NG+NF+NP+1,
C     NPAR) are undefined.
C
C     Memory model of the common block /VALC/:
C     ------------------------------------------------------------------
C     Address:     0    JCLASS-1 JCLASS JGROUP-1 JGROUP JFUNCT-1 JFUNCT
C     Value:     MCLASS LGROUP-1 MGROUP LFUNCT-1 MFUNCT  LADR-1   MADR
C     ..................................................................
C     For the meaning of individual items in this table see below.
C     ------------------------------------------------------------------
C     The way of access to IFUNCT-th function of IGROUP-th group of the
C     ICLASS-th class:
C     Address of last class..................... MCLASS=IPAR(0)
C     Address of ICLASS-th class................ JCLASS=ICLASS
C             (It must be: 1.LE.JCLASS.LE.MCLASS)
C     Address of first group of the class....... LGROUP=IPAR(JCLASS-1)+1
C     Address of last group of the class........ MGROUP=IPAR(JCLASS)
C     Address of IGROUP-th group of the class... JGROUP=LGROUP-1+IGROUP
C             (it must be: LGROUP.LE.JGROUP.LE.MGROUP)
C     Address of first function of the group.... LFUNCT=IPAR(JGROUP-1)+1
C     Address of last function of the group..... MFUNCT=IPAR(JGROUP)
C     Address of IFUNCT-th function of the group JFUNCT=LFUNCT-1+IFUNCT
C             (it must be: LFUNCT.LE.JFUNCT.LE.MFUNCT)
C     Address of first function parameter....... LADR=IPAR(JFUNCT-1)+1
C     Address of last function parameter........ MADR=IPAR(JFUNCT)
C     The parameters of the function are stored in IPAR(LADR) to
C     IPAR(MADR).
C
C     Common block /VALC/ is included in FORTRAN 77 source code file
C     'val.for', and also in source code files 'invsoft.for' and
C     'invtt.for' of package CRT.
C
C Date: 1999, September 15
C Coded by Ludek Klimes
C
C=======================================================================
C