function fx = p10_fun ( option, nvar, x )

%*****************************************************************************80
%
%% P10_FUN evaluates the function for problem 10.
%
%  Title:
%
%    Torsion of a square rod, finite difference solution
%
%  Description:
%
%    The problem is a boundary value problem on (0,1) x (0,1)
%    of the form:
%
%      - d/dx ( PHI ( dU/dx, dU/dy ) * dU/dx )
%      - d/dy ( PHI ( dU/dx, dU/dy ) * dU/dy ) = G ( U, LAMBDA )
%
%    A standard finite difference approximation on a uniform mesh is
%    applied to yield the equations, with X(1) through X(NVAR-1) storing
%    the value of U at the mesh points, and X(NVAR) holding the value
%    of LAMBDA.
%
%  Options:
%
%    Let S = dU/dX**2 + dU/dY**2.
%
%    OPTION=1
%
%      PHI(S) = exp ( 5 * S )
%
%    OPTION=2
%
%      Let SBAR = ( 40 * S - 13 ) / 7
%
%      if ( S <= 0.15 ) then
%        PHI = 1.0
%      else if ( 0.15 <= S <= 0.50 ) then
%        PHI = 5.5 + 4.5 * ( 3 * SBAR - SBAR**3 )
%      else if ( 0.50 <= S ) then
%        PHI = 10.0
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    03 September 2008
%
%  Author:
%
%    John Burkardt
%
%  Reference:
%
%    Werner Rheinboldt,
%    On the Solution of Some Nonlinear Equations Arising in the
%    Application of Finite Element Methods,
%    in The Mathematics of Finite Elements and Applications II,
%    edited by John Whiteman
%    Academic Press, London, 1976, pages 465-482,
%    LC: TA347.F5.M37.
%
%  Parameters:
%
%    Input, integer OPTION, the option index.
%
%    Input, integer NVAR, the number of variables.
%
%    Input, real X(NVAR), the argument of the function.
%
%    Output, real FX(NVAR-1), the value of the function at X.
%

%
%  UC contains the two cornerpoints,
%  UX contains the four side-points,
%  CX contains the elements connected to the side points.
%
  nrow = 6;
  ncol = 6;

  h = 1.0 / ( nrow + 1 );

  cx(1:2,1:4) = 0.0;
  uc(1:2) = 0.0;
  ux(1:4) = 0.0;
  fx(1:nvar-1) = 0.0;

  for i = 1 : nrow

    for j = 1 : ncol

      uc(1) = 0.0;
      uc(2) = 0.0;
      ux(1:4) = 0.0;

      ij = ( j - 1 ) * nrow + i;

      if ( i ~= 1 )
        ux(1) = x(ij-1);
      end

      if ( i ~= nrow )
        ux(2) = x(ij+1);
      end

      if ( j ~= 1 )
        jk = ij - nrow;
        ux(3) = x(jk);
        if ( i ~= 1 )
          uc(1) = x(jk-1);
        end
      end

      if ( j ~= ncol )

        jk = ij + nrow;
        ux(4) = x(jk);

        if ( i ~= nrow )
          uc(2) = x(jk+1);
        end

      end
%
%  k = 1, 2*qw calculated and stored in ( cx(1,k) + cx(2,k) )
%  k = 2, 2*qe calculated and stored in ( cx(1,k) + cx(2,k) )
%  k = 3, 2*qs calculated and stored in ( cx(1,k) + cx(2,k) )
%  k = 4, 2*qn calculated and stored in ( cx(1,k) + cx(2,k) )
%
      sc = 0.0;

      for k = 1 : 4

        if ( k == 1 || k == 3 )
          k1 = 1;
        else
          k1 = 2;
        end

        k2 = 5 - k;

        for l = 1 : 2

          rlk = ( ux(k) - x(ij) )^2;

          if ( l == 1 )
            rlk = ( rlk + ( ux(k) - uc(k1) )^2 ) / h / h;
          else
            rlk = ( rlk + ( x(ij) - ux(k2) )^2 ) / h / h;
          end

          [ g, gp ] = p10_gx ( option, rlk );
          cx(l,k) = g;
          sc = sc + cx(l,k);

        end

      end
%
%  sc = qn + qs + qe + qw
%
      fx(ij) = 0.5 * sc * x(ij) - x(nvar) * h * h;
      for k = 1 : 4
        fx(ij) = fx(ij) - 0.5 * ux(k) * ( cx(1,k) + cx(2,k) );
      end

    end

  end

  return
end
