//@HEADER
// ************************************************************************
//
//            LOCA: Library of Continuation Algorithms Package
//                 Copyright (2005) Sandia Corporation
//
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
// license for use of this work by or on behalf of the U.S. Government.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact Roger Pawlowski (rppawlo@sandia.gov) or
// Eric Phipps (etphipp@sandia.gov), Sandia National Laboratories.
// ************************************************************************
//  CVS Information
//  $Source$
//  $Author$
//  $Date$
//  $Revision$
// ************************************************************************
//@HEADER

// Finite Element Problem Class
/* Provides function (F) and Jacobian evaluations for the following equation
 * via a 1D linear finite element discretization with Epetra objects.
 *
 * d2u
 * --- - k * u**2 = 0
 * dx2
 *
 * subject to @ x=0, u=1
 */

#ifndef _NOX_EXAMPLE_EPETRA_NONLINEAR_FINITEELEMENTPROBLEM_H
#define _NOX_EXAMPLE_EPETRA_NONLINEAR_FINITEELEMENTPROBLEM_H

// This is needed to get the FillType enum values from NOX_Epetra_Interface
#include "NOX_Epetra.H"

// Forward Declarations
class Epetra_Comm;
class Epetra_Map;
class Epetra_Vector;
class Epetra_Import;
class Epetra_CrsGraph;
class Epetra_CrsMatrix;

// Flag to tell the evaluate routine what objects to fill
enum FillType { F_ONLY, MATRIX_ONLY, ALL };

// Finite Element Problem Class
class Brusselator {

public:

  // Constructor
  Brusselator( int NumGlobalUnknowns, Epetra_Comm& Comm);

  // Destructor
  ~Brusselator();

  // Reset problem for next parameter (time) step.
  // For now, this simply updates oldsoln with the given Epetra_Vector
  void reset(const Epetra_Vector& x);

  // Set initial condition for solution vector
  void initializeSoln();

  // Set parameters alpha, beta
  void setParameters(double alpha_, double beta_, double D1_, double D2_);

  // Evaluates the function (F) and/or the Jacobian using the solution
  // values in solnVector.
  bool evaluate(FillType fType,
                const Epetra_Vector *solnVector,
        Epetra_Vector *rhsVector, Epetra_RowMatrix *matrix,
        double jac_coeff = 1.0,
        double mass_coeff = 0.0);

  // Return a reference to the Epetra_Vector with the initial guess
  // that is generated by the Brusselator class.
  Epetra_Vector& getSolution();

  // Return a reference to the Epetra_Vector with the Jacobian
  // that is generated by the Brusselator class.
  Epetra_CrsMatrix& getJacobian();

  // Return a reference to the Epetra_Vector with the mesh positions
  Epetra_Vector& getMesh();

  // Return a reference to the Epetra_CrsGraph that is generated by
  // the Brusselator problem class.
  Epetra_CrsGraph& getGraph();

private:

  // inserts the global column indices into the Graph
  Epetra_CrsGraph& generateGraph(Epetra_CrsGraph& AA);

  // Private to prohibit copying
  Brusselator(const Brusselator&);
  Brusselator& operator=(const Brusselator&);

private:

  double xmin;
  double xmax;
  Epetra_Comm *Comm;
  int NumGlobalNodes;     // Total Number of nodes
  Epetra_Import *ColumnToOverlapImporter;
  Epetra_CrsGraph *AA;
  Epetra_CrsMatrix *A;
  double alpha, beta, D1, D2;     // Model Parameters

  // Default initialization for these
  double dx;
  Epetra_Map *StandardNodeMap;
  Epetra_Map *OverlapNodeMap;
  Epetra_Map *StandardMap;
  Epetra_Map *OverlapMap;
  Epetra_Import *Importer;
  Epetra_Import *nodeImporter;
  Epetra_Vector *xptr;
  Epetra_Vector *initialSolution;
  Epetra_Vector *rhs;

  int MyPID;              // Process number
  int NumProc;            // Total number of processes

  static constexpr int NumSpecies = 2;
  int NumMyNodes;         // Number of nodes owned by this process
  int NumMyUnknowns;      // Number of unknowns owned by this process
  int NumGlobalUnknowns;  // Total Number of unknowns

};
#endif




