From 75353937d2282e17cf36d60eb0160f7c47d9d33a Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Fri, 8 Apr 2016 12:10:26 +0200
Subject: [PATCH] [MaL] added: unified setting of vector values

---
 MathLib/LinAlg/UnifiedMatrixSetters.cpp | 19 +++++++++++++++++++
 MathLib/LinAlg/UnifiedMatrixSetters.h   | 10 ++++++++++
 2 files changed, 29 insertions(+)

diff --git a/MathLib/LinAlg/UnifiedMatrixSetters.cpp b/MathLib/LinAlg/UnifiedMatrixSetters.cpp
index 3b762f0a985..00dbc7ce0ab 100644
--- a/MathLib/LinAlg/UnifiedMatrixSetters.cpp
+++ b/MathLib/LinAlg/UnifiedMatrixSetters.cpp
@@ -67,6 +67,12 @@ void setVector(Eigen::VectorXd& v, std::initializer_list<double> values)
     for (std::size_t i=0; i<values.size(); ++i) v[i] = *(it++);
 }
 
+void setVector(Eigen::VectorXd& v, MatrixVectorTraits<Eigen::VectorXd>::Index const index,
+               double const value)
+{
+    v[index] = value;
+}
+
 } // namespace MathLib
 
 #endif // OGS_USE_EIGEN
@@ -97,6 +103,12 @@ void setVector(PETScVector& v,
     v.set(idcs, vals);
 }
 
+void setVector(PETScVector& v, MatrixVectorTraits<PETScVector>::Index const index,
+               double const value)
+{
+    v.set(index, value); // TODO handle negative indices
+}
+
 void setMatrix(PETScMatrix& m,
                std::initializer_list<double> values)
 {
@@ -173,6 +185,13 @@ void setVector(EigenVector& v,
     setVector(v.getRawVector(), values);
 }
 
+void setVector(EigenVector& v, MatrixVectorTraits<EigenVector>::Index const index,
+               double const value)
+{
+    v.getRawVector()[index] = value;
+}
+
+
 void setMatrix(EigenMatrix& m,
                std::initializer_list<double> values)
 {
diff --git a/MathLib/LinAlg/UnifiedMatrixSetters.h b/MathLib/LinAlg/UnifiedMatrixSetters.h
index 4ece2dd9400..d7402b25139 100644
--- a/MathLib/LinAlg/UnifiedMatrixSetters.h
+++ b/MathLib/LinAlg/UnifiedMatrixSetters.h
@@ -13,6 +13,7 @@
 #define MATHLIB_UNIFIED_MATRIX_SETTERS_H
 
 #include <initializer_list>
+#include "MatrixVectorTraits.h"
 
 #ifdef OGS_USE_EIGEN
 
@@ -35,6 +36,9 @@ double norm(Eigen::VectorXd const& x);
 
 void setVector(Eigen::VectorXd& v, std::initializer_list<double> values);
 
+void setVector(Eigen::VectorXd& v, MatrixVectorTraits<Eigen::VectorXd>::Index const index,
+               double const value);
+
 } // namespace MathLib
 
 #endif // OGS_USE_EIGEN
@@ -55,6 +59,9 @@ double norm(PETScVector const& x);
 void setVector(PETScVector& v,
                std::initializer_list<double> values);
 
+void setVector(PETScVector& v, MatrixVectorTraits<PETScVector>::Index const index,
+               double const value);
+
 void setMatrix(PETScMatrix& m, Eigen::MatrixXd const& tmp);
 
 void addToMatrix(PETScMatrix& m,
@@ -79,6 +86,9 @@ class EigenMatrix;
 void setVector(EigenVector& v,
                std::initializer_list<double> values);
 
+void setVector(EigenVector& v, MatrixVectorTraits<EigenVector>::Index const index,
+               double const value);
+
 void setMatrix(EigenMatrix& m,
                std::initializer_list<double> values);
 
-- 
GitLab