function vterp = serene ( type, ve, vn, vne, vnw, vs, vse, vsw, vw )

%*****************************************************************************80
%
%% serene() interpolates data using a Q8 element.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    14 April 2005
%
%  Author:
%
%    John Burkardt
%
%  Input:
%
%    character TYPE, tells SERENE the geometry of the
%    finite element that surrounds the point of interest.  The options
%    are displayed in the following table, which suggests the meaning
%    of each option by its position:
%
%        |   |
%     NW * N * NE
%        |   |
%     -*-*-*-*-*-
%        |   |
%      W * C * E
%        |   |
%     -*-*-*-*-*-
%        |   |
%     SW * S * SE
%        |   |
%
%    real VE, VN, VNE, VNW, VS, VSE, VSW, VW,
%    are the values of the function at the nodes to the east,
%    north, northeast, northwest, south, southeast, southwest and
%    west of the point of interest.  If the finite element is of
%    type 'C', then all 8 values are needed.  However, if the
%    finite element is of type 'SE', for instance, then only three
%    values are needed, namely VE, VN, and VNW, since these are
%    the only node positions defined in such a finite element.
%
%  Output:
%
%    real VTERP, the interpolated value of the
%    function at the point of interest.
%

%
%  To make this routine more general, simply pass in the values of XSI
%  and ETA at which the interpolated value is desired.
%
%  By setting XSI = ETA = 0, we are asking for the interpolated value
%  at the center of the finite element.
%
  xsi = 0.0;
  eta = 0.0;
%
%  8 node center
%
%  Polynomial space is spanned by:
%
%         1
%       x    y
%    x^2  xy  y^2
%      x^2y xy^2
%
%
%    ^   1    4--7--3
%    |        !     !
%    E        !     !
%    T   0    8  X  6
%    A        !     !
%    |        !     !
%    V  -1    1--5--2
%
%            -1  0  1
%
%           <---XSI--->
%
  if ( s_eqi ( type, 'C' ) )

    psw = - 0.25 * ( 1.0 - xsi ) * ( 1.0 - eta ) * ( 1.0 + xsi + eta );
    pse = - 0.25 * ( 1.0 + xsi ) * ( 1.0 - eta ) * ( 1.0 - xsi + eta );
    pne = - 0.25 * ( 1.0 + xsi ) * ( 1.0 + eta ) * ( 1.0 - xsi - eta );
    pnw = - 0.25 * ( 1.0 - xsi ) * ( 1.0 + eta ) * ( 1.0 + xsi - eta );
    ps =    0.50 * ( 1.0 - xsi ) * ( 1.0 + xsi ) * ( 1.0 - eta );
    pe =    0.50 * ( 1.0 + xsi ) * ( 1.0 + eta ) * ( 1.0 - eta );
    pn =    0.50 * ( 1.0 - xsi ) * ( 1.0 + xsi ) * ( 1.0 + eta );
    pw =    0.50 * ( 1.0 - xsi ) * ( 1.0 + eta ) * ( 1.0 - eta );

    vterp = vsw * psw + vse * pse + vne * pne + vnw * pnw ...
      + vs * ps + ve * pe + vn * pn + vw * pw;
%
%  5 node side
%
%    ^   1
%    |
%    E
%    T   0    8  X  6
%    A        !     !
%    |        !     !
%    V  -1    1--5--2
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'N' ) )

    psw =  0.5 * ( xsi - 1.0 ) * ( 1.0 + xsi + eta );
    pse = -0.5 * ( xsi + 1.0 ) * ( 1.0 - xsi + eta );
    ps =  -          ( xsi + 1.0 ) * ( xsi - 1.0 );
    pe =   0.5 * ( xsi + 1.0 ) * ( eta + 1.0 );
    pw =  -0.5 * ( xsi - 1.0 ) * ( eta + 1.0 );

    vterp = vsw * psw + vse * pse + vs * ps + ve * pe + vw * pw;
%
%    ^   1    4--7
%    |        !
%    E        !
%    T   0    8  X
%    A        !
%    |        !
%    V  -1    1--5
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'E' ) )

    pse =  0.5 * ( eta - 1.0 ) * ( 1.0 + xsi + eta );
    pne = -0.5 * ( eta + 1.0 ) * ( 1.0 + xsi - eta );
    ps =  -0.5 * ( xsi + 1.0 ) * ( eta - 1.0 );
    pn =   0.5 * ( xsi + 1.0 ) * ( eta + 1.0 );
    pw =  -      ( eta + 1.0 ) * ( eta - 1.0 );

    vterp = vse * pse + vne * pne + vs * ps + vn * pn + vw * pw;
%
%  5 node side
%
%    ^   1       7--3
%    |              !
%    E              !
%    T   0       X  6
%    A              !
%    |              !
%    V  -1       5--2
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'W' ) )

    pse =   0.5 * ( eta - 1.0 ) * ( 1.0 - xsi + eta );
    pne = - 0.5 * ( eta + 1.0 ) * ( 1.0 - xsi - eta );
    ps =    0.5 * ( xsi - 1.0 ) * ( eta - 1.0 );
    pe =  -       ( eta - 1.0 ) * ( eta + 1.0 );
    pn =  - 0.5 * ( xsi - 1.0 ) * ( eta + 1.0 );

    vterp = vse * pse + vne * pne + vs * ps + ve * pe + vn * pn;
%
%  5 node side
%
%    ^   1    4--7--3
%    |        !     !
%    E        !     !
%    T   0    8  X  6
%    A
%    |
%    V  -1
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'S' ) )

    pne = - 0.5 * ( xsi + 1.0 ) * ( 1.0 - xsi - eta );
    pnw =   0.5 * ( xsi - 1.0 ) * ( 1.0 + xsi - eta );
    pe =  - 0.5 * ( eta - 1.0 ) * ( xsi + 1.0 );
    pn =  -           ( xsi + 1.0 ) * ( xsi - 1.0 );
    pw =    0.5 * ( eta - 1.0 ) * ( xsi - 1.0 );

    vterp = vne * pne + vnw * pnw + ve * pe + vn * pn + vw * pw;
%
%  3 node corner
%
%  Polynomial space is spanned by:
%
%         1
%       x    y
%
%
%    ^   1
%    |
%    E
%    T   0    8  X
%    A        !
%    |        !
%    V  -1    1--5
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'NE' ) )

    psw = - 1.0 - xsi - eta;
    ps =    1.0 + xsi;
    pw =    1.0       + eta;

    vterp = vsw * psw + vs * ps + vw * pw;
%
%  3 node corner
%
%  Polynomial space is spanned by:
%
%         1
%       x    y
%
%    ^   1
%    |
%    E
%    T   0       X  6
%    A              !
%    |              !
%    V  -1       5--2
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'NW' ) )

    pse = 1.0 + xsi - eta;
    ps =  1.0 - xsi;
    pe =  1.0       + eta;

    vterp = + vse * pse + vs * ps + ve * pe;
%
%  3 node corner
%
%  Polynomial space is spanned by:
%         1
%       x    y
%
%
%    ^   1    4--7
%    |        !
%    E        !
%    T   0    8  X
%    A
%    |
%    V  -1
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'SE' ) )

    pnw = - 1.0 - xsi + eta;
    pn =    1.0 + xsi;
    pw =    1.0       - eta;

    vterp = vnw * pnw + vn * pn + vw * pw;
%
%  3 node corner
%
%  Polynomial space is spanned by:
%
%         1
%       x    y
%
%    ^   1       7--3
%    |              !
%    E              !
%    T   0       X  6
%    A
%    |
%    V  -1
%
%            -1  0  1
%
%           <---XSI--->
%
  elseif ( s_eqi ( type, 'SW' ) )

    pne = - 1.0 + xsi + eta;
    pe =    1.0       - eta;
    pn =    1.0 - xsi;

    vterp = vne * pne + ve * pe + vn * pn;

  else

    fprintf ( 1, '\n' );
    fprintf ( 1, 'SERENE - Fatal error!\n' );
    fprintf ( 1, '  Illegal value of TYPE = "%s"\n', type );
    error ( 'SERENE - Fatal error!' );

  end

  return
end

