

#
# A) Package-specific configuration options
#

ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_PETSC)
SET(HAVE_PETSC ${${PACKAGE_NAME}_ENABLE_PETSC})
SET(HAVE_LIBPARMETIS ${Zoltan_ENABLE_ParMETIS})

TRIBITS_CONFIGURE_FILE(${PACKAGE_NAME}_config.h)

#
# B) Define the header and source files (and directories)
#

#
# src
#

SET(HEADERS "")
SET(SOURCES "")
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
SET(HEADERS ${HEADERS}
 ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h
)

TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

SET(HEADERS ${HEADERS}
  EpetraExt_ConfigDefs.h
  EpetraExt_MMHelpers.h
  EpetraExt_MatrixMatrix.h
  EpetraExt_ProductOperator.h
  EpetraExt_TimedEpetraOperator.hpp
  EpetraExt_Version.h
  )

SET(SOURCES ${SOURCES}
  EpetraExt_ProductOperator.cpp
  EpetraExt_MMHelpers.cpp
  EpetraExt_MatrixMatrix.cpp
  EpetraExt_MatrixMatrix_mult_A_B.cpp
  EpetraExt_TimedEpetraOperator.cpp
  )

#
# src/transform
#

IF (${PACKAGE_NAME}_BUILD_TRANSFORM)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/transform)

  SET(HEADERS ${HEADERS}
    transform/EpetraExt_SubCopy_CrsMatrix.h
    transform/EpetraExt_Transform.h
    transform/EpetraExt_Transform_Composite.h
    transform/EpetraExt_Permutation.h
    transform/EpetraExt_Permutation_impl.h
    transform/EpetraExt_LPTrans_From_GraphTrans.h
    transform/EpetraExt_LPTrans_From_MatrixTrans.h
    transform/EpetraExt_View_CrsGraph.h
    transform/EpetraExt_View_CrsMatrix.h
    transform/EpetraExt_View_MultiVector.h
    transform/EpetraExt_Transpose_CrsGraph.h
    transform/EpetraExt_Transpose_RowMatrix.h
    transform/EpetraExt_Scale_LinearProblem.h
    transform/EpetraExt_CrsSingletonFilter_LinearProblem.h
    transform/EpetraExt_Overlap_CrsGraph.h
    transform/EpetraExt_Reindex_CrsMatrix.h
    transform/EpetraExt_Reindex_MultiVector.h
    transform/EpetraExt_Reindex_LinearProblem.h
    transform/EpetraExt_Reindex_LinearProblem2.h
    transform/EpetraExt_SolverMap_CrsMatrix.h
    transform/EpetraExt_SolverMap_LinearProblem.h
    transform/EpetraExt_BlockAdjacencyGraph.h
    )

  SET(SOURCES ${SOURCES}
    transform/EpetraExt_SubCopy_CrsMatrix.cpp
    transform/EpetraExt_Permutation.cpp
    transform/EpetraExt_LPTrans_From_GraphTrans.cpp
    transform/EpetraExt_LPTrans_From_MatrixTrans.cpp
    transform/EpetraExt_View_CrsGraph.cpp
    transform/EpetraExt_View_CrsMatrix.cpp
    transform/EpetraExt_View_MultiVector.cpp
    transform/EpetraExt_Transpose_CrsGraph.cpp
    transform/EpetraExt_Transpose_RowMatrix.cpp
    transform/EpetraExt_Scale_LinearProblem.cpp
    transform/EpetraExt_CrsSingletonFilter_LinearProblem.cpp
    transform/EpetraExt_Overlap_CrsGraph.cpp
    transform/EpetraExt_Reindex_CrsMatrix.cpp
    transform/EpetraExt_Reindex_MultiVector.cpp
    transform/EpetraExt_Reindex_LinearProblem.cpp
    transform/EpetraExt_Reindex_LinearProblem2.cpp
    transform/EpetraExt_SolverMap_CrsMatrix.cpp
    transform/EpetraExt_SolverMap_LinearProblem.cpp
    transform/EpetraExt_BlockAdjacencyGraph.cpp
    )

  IF (${PACKAGE_NAME}_BUILD_GRAPH_REORDERINGS AND ${PACKAGE_NAME}_BUILD_EXPERIMENTAL)

    SET(HEADERS ${HEADERS}
      transform/EpetraExt_SymmRCM_CrsGraph.h
      transform/EpetraExt_AMD_CrsGraph.h
      )

    SET(SOURCES ${SOURCES}
      transform/EpetraExt_SymmRCM_CrsGraph.cpp
      transform/EpetraExt_AMD_CrsGraph.cpp
      )

  ENDIF()

ENDIF()

#
# src/btf
#

IF (${PACKAGE_NAME}_BUILD_BTF)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/btf)

  SET(HEADERS ${HEADERS}
    btf/EpetraExt_BTF_CrsGraph.h
    btf/EpetraExt_BTF_CrsMatrix.h
    btf/EpetraExt_BTF_LinearProblem.h
    btf/EpetraExt_BlockJacobi_LinearProblem.h
    )

  SET(SOURCES ${SOURCES}
    btf/EpetraExt_BTF_CrsGraph.cpp
    btf/EpetraExt_BTF_CrsMatrix.cpp
    btf/EpetraExt_BTF_LinearProblem.cpp
    btf/EpetraExt_BlockJacobi_LinearProblem.cpp
    btf/pothen/concmp.f
    btf/pothen/genbtf.f
    btf/pothen/corsum.f
    btf/pothen/finsum.f
    btf/pothen/fnrsum.f
    btf/pothen/izero.f
    btf/pothen/maxmatch.f
    btf/pothen/rectblk.f
    btf/pothen/mmc13e.f
    btf/pothen/prtivs.f
    btf/pothen/strchk.f
    btf/pothen/mattrans.f
    )

ENDIF()

#
# src/inout
#

IF (${PACKAGE_NAME}_BUILD_INOUT)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/inout)

  SET(HEADERS ${HEADERS}
    inout/EpetraExt_mmio.h
    inout/EpetraExt_OperatorOut.h
    inout/EpetraExt_RowMatrixOut.h
    inout/EpetraExt_MultiVectorOut.h
    inout/EpetraExt_VectorOut.h
    inout/EpetraExt_BlockMapOut.h
    inout/EpetraExt_BlockMapIn.h
    inout/EpetraExt_CrsMatrixIn.h
    inout/EpetraExt_MultiVectorIn.h
    inout/EpetraExt_VectorIn.h
    inout/EpetraExt_Exception.h
    inout/EpetraExt_Utils.h
    inout/EpetraExt_XMLReader.h
    inout/EpetraExt_XMLWriter.h
    inout/EpetraExt_HDF5.h
    inout/EpetraExt_HDF5_Handle.h
    inout/EpetraExt_DistArray.h
    )

  SET(SOURCES ${SOURCES}
    inout/EpetraExt_mmio.cpp
    inout/EpetraExt_OperatorOut.cpp
    inout/EpetraExt_RowMatrixOut.cpp
    inout/EpetraExt_MultiVectorOut.cpp
    inout/EpetraExt_VectorOut.cpp
    inout/EpetraExt_BlockMapOut.cpp
    inout/EpetraExt_BlockMapIn.cpp
    inout/EpetraExt_CrsMatrixIn.cpp
    inout/EpetraExt_MultiVectorIn.cpp
    inout/EpetraExt_VectorIn.cpp
    inout/EpetraExt_Utils.cpp
    inout/EpetraExt_XMLReader.cpp
    inout/EpetraExt_XMLWriter.cpp
    inout/EpetraExt_HDF5.cpp
    inout/EpetraExt_HDF5_DistObject.cpp
    )

  IF (${PACKAGE_NAME}_ENABLE_Triutils)

    SET(HEADERS ${HEADERS}
      inout/EpetraExt_readEpetraLinearSystem.h
      )

    SET(SOURCES ${SOURCES}
      inout/EpetraExt_readEpetraLinearSystem.cpp
      )

  ENDIF()

ENDIF()

#
# src/coloring
#

IF (${PACKAGE_NAME}_BUILD_COLORING)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/coloring)

  SET(HEADERS ${HEADERS}
    coloring/EpetraExt_MapColoring.h
    coloring/EpetraExt_TCrsGraph_MapColoringIndex.h
    coloring/EpetraExt_MapColoringIndex.h
    )

  SET(SOURCES ${SOURCES}
    coloring/EpetraExt_MapColoring.cpp
    coloring/EpetraExt_MapColoringIndex.cpp
    )

ENDIF()

#
# src/matlab
#

IF (${PACKAGE_NAME}_BUILD_MATLAB)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/matlab)

  SET(HEADERS ${HEADERS}
    matlab/EpetraExt_MatlabEngine.h
    matlab/EpetraExt_PutMultiVector.h
    matlab/EpetraExt_PutRowMatrix.h
    matlab/EpetraExt_PutBlockMap.h
    )

  SET(SOURCES ${SOURCES}
    matlab/EpetraExt_MatlabEngine.cpp
    matlab/EpetraExt_PutMultiVector.cpp
    matlab/EpetraExt_PutRowMatrix.cpp
    matlab/EpetraExt_PutBlockMap.cpp
    )

ENDIF()

#
# src/model_evaluator
#

IF (${PACKAGE_NAME}_BUILD_MODEL_EVALUATOR)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/model_evaluator)

  SET(HEADERS ${HEADERS}
    model_evaluator/EpetraExt_ModelEvaluator.h
    model_evaluator/EpetraExt_ModelEvaluatorScalingTools.h
    model_evaluator/EpetraExt_PolynomialVectorTraits.h
    )

  SET(SOURCES ${SOURCES}
    model_evaluator/EpetraExt_ModelEvaluator.cpp
    model_evaluator/EpetraExt_ModelEvaluatorScalingTools.cpp
    )

ENDIF()

#
# src/block
#

IF (${PACKAGE_NAME}_BUILD_BLOCK)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/block)

  SET(HEADERS ${HEADERS}
    block/EpetraExt_BlockCrsMatrix.h
    block/EpetraExt_BlockMultiVector.h
    block/EpetraExt_BlockVector.h
    block/EpetraExt_BlockUtility.h
    block/EpetraExt_MultiComm.h
    block/EpetraExt_MultiPointModelEvaluator.h
    block/EpetraExt_MultiSerialComm.h
    block/EpetraExt_BlockDiagMatrix.h
    block/EpetraExt_PointToBlockDiagPermute.h
    )

  SET(SOURCES ${SOURCES}
    block/EpetraExt_BlockCrsMatrix.cpp
    block/EpetraExt_BlockMultiVector.cpp
    block/EpetraExt_BlockVector.cpp
    block/EpetraExt_BlockUtility.cpp
    block/EpetraExt_MultiPointModelEvaluator.cpp
    block/EpetraExt_MultiSerialComm.cpp
    block/EpetraExt_BlockDiagMatrix.cpp
    block/EpetraExt_PointToBlockDiagPermute.cpp
    )

  IF(TPL_ENABLE_MPI)

    SET(HEADERS ${HEADERS}
      block/EpetraExt_MultiMpiComm.h
      )

    SET(SOURCES ${SOURCES}
      block/EpetraExt_MultiMpiComm.cpp
      )

  ENDIF()

ENDIF()

#
# src/restrict
#

IF (${PACKAGE_NAME}_BUILD_RESTRICT)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/restrict)

  SET(HEADERS ${HEADERS}
    restrict/EpetraExt_RestrictedMultiVectorWrapper.h
    restrict/EpetraExt_RestrictedCrsMatrixWrapper.h
    )

  SET(SOURCES ${SOURCES}
    restrict/EpetraExt_RestrictedMultiVectorWrapper.cpp
    restrict/EpetraExt_RestrictedCrsMatrixWrapper.cpp
    )

ENDIF()

#
# src/petsc
#

IF (${PACKAGE_NAME}_USING_PETSC)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/petsc)

  SET(HEADERS ${HEADERS}
    petsc/EpetraExt_PETScAIJMatrix.h
    )

  SET(SOURCES ${SOURCES}
    petsc/EpetraExt_PETScAIJMatrix.cpp
    )

ENDIF()

#
# src/hypre
#
ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_HYPRE)
IF (${PACKAGE_NAME}_ENABLE_HYPRE)

  TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/hypre)

  SET(HEADERS ${HEADERS}
    hypre/EpetraExt_HypreIJMatrix.h
    )

  SET(SOURCES ${SOURCES}
    hypre/EpetraExt_HypreIJMatrix.cpp
    )

ENDIF()

#
# PyTrilinos support
#

IF (${PROJECT_NAME}_ENABLE_PyTrilinos)

  FIND_PACKAGE(PythonInclude REQUIRED)

  TRIBITS_INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})

ENDIF()

#
# C) Define the targets for package's library(s)
#

TRIBITS_ADD_LIBRARY(
  epetraext
  HEADERS ${HEADERS}
  SOURCES ${SOURCES}
  )
