From 4135b1e6a712a485fe12e406adf885ab797956c6 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Tue, 8 Mar 2016 11:03:16 +0100
Subject: [PATCH] [MaL] extended matrix traits to matrix and vector traits

---
 MathLib/LinAlg/MatrixVectorTraits.cpp | 163 ++++++++++++++++++++++++++
 MathLib/LinAlg/MatrixVectorTraits.h   |  72 ++++++++++++
 2 files changed, 235 insertions(+)
 create mode 100644 MathLib/LinAlg/MatrixVectorTraits.cpp
 create mode 100644 MathLib/LinAlg/MatrixVectorTraits.h

diff --git a/MathLib/LinAlg/MatrixVectorTraits.cpp b/MathLib/LinAlg/MatrixVectorTraits.cpp
new file mode 100644
index 00000000000..cba84eff4fb
--- /dev/null
+++ b/MathLib/LinAlg/MatrixVectorTraits.cpp
@@ -0,0 +1,163 @@
+/**
+ * \copyright
+ * Copyright (c) 2012-2016, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#include "MatrixVectorTraits.h"
+
+#ifdef OGS_USE_EIGEN
+
+namespace MathLib
+{
+
+std::unique_ptr<Eigen::MatrixXd>
+MatrixVectorTraits<Eigen::MatrixXd>::
+newInstance()
+{
+    return std::unique_ptr<Eigen::MatrixXd>(new Eigen::MatrixXd);
+}
+
+std::unique_ptr<Eigen::MatrixXd>
+MatrixVectorTraits<Eigen::MatrixXd>::
+newInstance(Eigen::MatrixXd const& A)
+{
+    return std::unique_ptr<Eigen::MatrixXd>(new Eigen::MatrixXd(A));
+}
+
+std::unique_ptr<Eigen::MatrixXd>
+MatrixVectorTraits<Eigen::MatrixXd>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<Eigen::MatrixXd>(new Eigen::MatrixXd(spec.nrows, spec.ncols));
+}
+
+std::unique_ptr<Eigen::VectorXd>
+MatrixVectorTraits<Eigen::VectorXd>::
+newInstance()
+{
+    return std::unique_ptr<Eigen::VectorXd>(new Eigen::VectorXd);
+}
+
+std::unique_ptr<Eigen::VectorXd>
+MatrixVectorTraits<Eigen::VectorXd>::
+newInstance(Eigen::VectorXd const& A)
+{
+    return std::unique_ptr<Eigen::VectorXd>(new Eigen::VectorXd(A));
+}
+
+std::unique_ptr<Eigen::VectorXd>
+MatrixVectorTraits<Eigen::VectorXd>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<Eigen::VectorXd>(new Eigen::VectorXd(spec.nrows));
+}
+
+} // namespace MathLib
+
+#endif // OGS_USE_EIGEN
+
+
+#ifdef USE_PETSC
+
+namespace MathLib
+{
+
+std::unique_ptr<PETScMatrix>
+MatrixVectorTraits<PETScMatrix>::
+newInstance()
+{
+    return std::unique_ptr<PETScMatrix>(new PETScMatrix(0, 0)); // TODO default constructor
+}
+
+std::unique_ptr<PETScMatrix>
+MatrixVectorTraits<PETScMatrix>::
+newInstance(PETScMatrix const& A)
+{
+    return std::unique_ptr<PETScMatrix>(new PETScMatrix(A));
+}
+
+std::unique_ptr<PETScMatrix>
+MatrixVectorTraits<PETScMatrix>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<PETScMatrix>(new PETScMatrix(spec.nrows)); // TODO sparsity pattern
+}
+
+std::unique_ptr<PETScVector>
+MatrixVectorTraits<PETScVector>::
+newInstance()
+{
+    return std::unique_ptr<PETScVector>(new PETScVector);
+}
+
+std::unique_ptr<PETScVector>
+MatrixVectorTraits<PETScVector>::
+newInstance(PETScVector const& x)
+{
+    return std::unique_ptr<PETScVector>(new PETScVector(x));
+}
+
+std::unique_ptr<PETScVector>
+MatrixVectorTraits<PETScVector>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<PETScVector>(new PETScVector(spec.nrows));
+}
+
+} // namespace MathLib
+
+
+#elif defined(OGS_USE_EIGEN)
+
+namespace MathLib
+{
+
+std::unique_ptr<EigenMatrix>
+MatrixVectorTraits<EigenMatrix>::
+newInstance()
+{
+    return std::unique_ptr<EigenMatrix>(new EigenMatrix(0, 0)); // TODO default constructor
+}
+
+std::unique_ptr<EigenMatrix>
+MatrixVectorTraits<EigenMatrix>::
+newInstance(EigenMatrix const& A)
+{
+    return std::unique_ptr<EigenMatrix>(new EigenMatrix(A));
+}
+
+std::unique_ptr<EigenMatrix>
+MatrixVectorTraits<EigenMatrix>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<EigenMatrix>(new EigenMatrix(spec.nrows)); // TODO sparsity pattern
+}
+
+std::unique_ptr<EigenVector>
+MatrixVectorTraits<EigenVector>::
+newInstance()
+{
+    return std::unique_ptr<EigenVector>(new EigenVector);
+}
+
+std::unique_ptr<EigenVector>
+MatrixVectorTraits<EigenVector>::
+newInstance(EigenVector const& x)
+{
+    return std::unique_ptr<EigenVector>(new EigenVector(x));
+}
+
+std::unique_ptr<EigenVector>
+MatrixVectorTraits<EigenVector>::
+newInstance(MatrixSpecifications const& spec)
+{
+    return std::unique_ptr<EigenVector>(new EigenVector(spec.nrows));
+}
+
+} // namespace MathLib
+
+#endif // defined(OGS_USE_EIGEN)
diff --git a/MathLib/LinAlg/MatrixVectorTraits.h b/MathLib/LinAlg/MatrixVectorTraits.h
new file mode 100644
index 00000000000..793e6c2bf82
--- /dev/null
+++ b/MathLib/LinAlg/MatrixVectorTraits.h
@@ -0,0 +1,72 @@
+/**
+ * \copyright
+ * Copyright (c) 2012-2016, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#ifndef MATHLIB_MATRIX_VECTOR_TRAITS_H
+#define MATHLIB_MATRIX_VECTOR_TRAITS_H
+
+#include<memory>
+
+#include "MatrixProviderUser.h"
+
+namespace MathLib
+{
+template<typename Matrix>
+struct MatrixVectorTraits;
+}
+
+#define SPECIALIZE_MATRIX_VECTOR_TRAITS(MATVEC, IDX) \
+    template<> struct MatrixVectorTraits<MATVEC> { \
+        using Index = IDX; \
+        static std::unique_ptr<MATVEC> newInstance(); \
+        static std::unique_ptr<MATVEC> newInstance(MATVEC const& A); \
+        static std::unique_ptr<MATVEC> newInstance(MatrixSpecifications const& spec); \
+    };
+
+
+#ifdef OGS_USE_EIGEN
+
+#include<Eigen/Core>
+
+namespace MathLib
+{
+SPECIALIZE_MATRIX_VECTOR_TRAITS(Eigen::MatrixXd, Eigen::MatrixXd::Index);
+SPECIALIZE_MATRIX_VECTOR_TRAITS(Eigen::VectorXd, Eigen::VectorXd::Index);
+}
+
+#endif
+
+
+#ifdef USE_PETSC
+
+#include "MathLib/LinAlg/PETSc/PETScMatrix.h"
+#include "MathLib/LinAlg/PETSc/PETScVector.h"
+
+namespace MathLib
+{
+SPECIALIZE_MATRIX_VECTOR_TRAITS(PETScMatrix, PETScMatrix::IndexType);
+SPECIALIZE_MATRIX_VECTOR_TRAITS(PETScVector, PETScVector::IndexType);
+}
+
+
+#elif defined(OGS_USE_EIGEN)
+
+#include "MathLib/LinAlg/Eigen/EigenMatrix.h"
+#include "MathLib/LinAlg/Eigen/EigenVector.h"
+
+namespace MathLib
+{
+SPECIALIZE_MATRIX_VECTOR_TRAITS(EigenMatrix, EigenMatrix::IndexType);
+SPECIALIZE_MATRIX_VECTOR_TRAITS(EigenVector, EigenVector::IndexType);
+}
+
+#endif
+
+#undef SPECIALIZE_MATRIX_VECTOR_TRAITS
+
+#endif // MATHLIB_MATRIX_VECTOR_TRAITS_H
-- 
GitLab