From 7d9c38fa0380241832934855bae9788f0362039c Mon Sep 17 00:00:00 2001
From: Pietro Incardona <i-bird@private-incardon-3.mpi-cbg.de>
Date: Wed, 11 May 2016 12:17:40 +0200
Subject: [PATCH] Adding missing file

---
 src/Vector/Vector_petsc.hpp | 325 ++++++++++++++++++++++++++++++++++++
 1 file changed, 325 insertions(+)
 create mode 100644 src/Vector/Vector_petsc.hpp

diff --git a/src/Vector/Vector_petsc.hpp b/src/Vector/Vector_petsc.hpp
new file mode 100644
index 00000000..4bfff2fb
--- /dev/null
+++ b/src/Vector/Vector_petsc.hpp
@@ -0,0 +1,325 @@
+/*
+ * Vector_petsc.hpp
+ *
+ *  Created on: Apr 29, 2016
+ *      Author: i-bird
+ */
+
+#ifndef OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_PETSC_HPP_
+#define OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_PETSC_HPP_
+
+#include "Vector/map_vector.hpp"
+#include <boost/mpl/int.hpp>
+#include <petscvec.h>
+#include "util/petsc_util.hpp"
+
+#define PETSC_RVAL 2
+
+/*! \brief It store one row value of a vector
+ *
+ * Given a row, store a value
+ *
+ *
+ */
+template<typename T>
+class rval<T,PETSC_RVAL>
+{
+public:
+
+	//! boost fusion that store the point
+	typedef boost::fusion::vector<PetscInt,T> type;
+
+	//! structure that store the data of the point
+	type data;
+
+	//! Property id of the point
+	static const unsigned int row = 0;
+	static const unsigned int value = 1;
+	static const unsigned int max_prop = 2;
+
+	// Get the row
+	long int & rw()
+	{
+		return boost::fusion::at_c<row>(data);
+	}
+
+	// Get the value
+	T & val()
+	{
+		return boost::fusion::at_c<value>(data);
+	}
+
+	/*! \brief Default constructor
+	 *
+	 */
+	rval()	{}
+
+	/*! \brief Constructor from row, colum and value
+	 *
+	 * \param i row
+	 * \param val value
+	 *
+	 */
+	rval(long int i, T val)
+	{
+		rw() = i;
+		val() = val;
+	}
+};
+
+constexpr unsigned int row_id = 0;
+constexpr unsigned int val_id = 1;
+
+template<typename T>
+class Vector<T,Vec>
+{
+	// n_row
+	size_t n_row;
+
+	// n_row_local
+	size_t n_row_local;
+
+	// Mutable vector
+	mutable Vec v;
+
+	// Mutable row value vector
+	openfpm::vector<rval<T,PETSC_RVAL>,HeapMemory,typename memory_traits_inte<rval<T,PETSC_RVAL>>::type > row_val;
+
+	// Global to local map
+	mutable std::unordered_map<size_t,size_t> map;
+
+	// invalid
+	T invalid;
+
+	/*! \brief Set the Eigen internal vector
+	 *
+	 *
+	 */
+	void setPetsc() const
+	{
+		// Create the vector
+		PETSC_SAFE_CALL(VecCreate(PETSC_COMM_WORLD,&v));
+		PETSC_SAFE_CALL(VecSetSizes(v,n_row_local,n_row));
+
+		// set the vector
+
+		PETSC_SAFE_CALL(VecSetValues(v,n_row_local,&row_val.template get<row_id>(0),&row_val.template get<val_id>(0),INSERT_VALUES))
+
+//		for (size_t i = 0 ; i < row_val.size() ; i++)
+//			v[row_val.get(i).row()] = row_val.get(i).value();
+	}
+
+public:
+
+	/*! \brief Copy the vector
+	 *
+	 * \param v vector to copy
+	 *
+	 */
+	Vector(const Vector<T> & v)
+	{
+		this->operator=(v);
+	}
+
+	/*! \brief Copy the vector
+	 *
+	 * \param v vector to copy
+	 *
+	 */
+	Vector(const Vector<T> && v)
+	{
+		this->operator=(v);
+	}
+
+	/*! \brief Create a vector with n elements
+	 *
+	 * \param n number of elements in the vector
+	 *
+	 */
+	Vector(size_t n)
+	{
+		resize(n);
+	}
+
+	/*! \brief Create a vector with 0 elements
+	 *
+	 */
+	Vector()
+	{
+	}
+
+	/*! \brief Resize the Vector
+	 *
+	 * \param row numbers of row
+	 *
+	 */
+	void resize(size_t row)
+	{
+		n_row = row;
+	}
+
+	/*! \brief Return a reference to the vector element
+	 *
+	 * \param i element
+	 * \param val value
+	 *
+	 */
+	void insert(size_t i, T val)
+	{
+		row_val.add();
+
+		// Map
+		map[i] = row_val.size()-1;
+
+		row_val.last().template get<row_id>() = i;
+		row_val.last().template get<val_id>() = val;
+	}
+
+	/*! \brief Return a reference to the vector element
+	 *
+	 * \param i element
+	 *
+	 * \return reference to the element vector
+	 *
+	 */
+	inline T & insert(size_t i)
+	{
+		row_val.add();
+
+		// Map
+		map[i] = row_val.size()-1;
+
+		row_val.last().template get<row_id>() = i;
+		return row_val.last().template get<val_id>();
+	}
+
+	/*! \brief Return a reference to the vector element
+	 *
+	 * \param i element
+	 *
+	 * \return reference to the element vector
+	 *
+	 */
+	inline const T & insert(size_t i) const
+	{
+		row_val.add();
+
+		// Map
+		map[i] = row_val.size()-1;
+
+		row_val.last().row() = i;
+		return row_val.last().value();
+	}
+
+	/*! \brief Return a reference to the vector element
+	 *
+	 * \warning The element must exist
+	 *
+	 * \param i element
+	 *
+	 * \return reference to the element vector
+	 *
+	 */
+	const T & operator()(size_t i) const
+	{
+		// Search if exist
+
+		std::unordered_map<size_t,size_t>::iterator it = map.find(i);
+
+		if ( it != map.end() )
+			return row_val.template get<val_id>(it->second);
+
+		return insert(i);
+	}
+
+	/*! \brief Return a reference to the vector element
+	 *
+	 * \warning The element must exist
+	 *
+	 * \param i element
+	 *
+	 * \return reference to the element vector
+	 *
+	 */
+	T & operator()(size_t i)
+	{
+		// Search if exist
+
+		std::unordered_map<size_t,size_t>::iterator it = map.find(i);
+
+		if ( it != map.end() )
+			return row_val.template get<val_id>(it->second);
+
+		return insert(i);
+	}
+
+	/*! \brief Get the Eigen Vector object
+	 *
+	 * \return the Eigen Vector
+	 *
+	 */
+	const Vec & getVec() const
+	{
+		setPetsc();
+
+		return v;
+	}
+
+	/*! \brief Get the Eigen Vector object
+	 *
+	 * \return the Eigen Vector
+	 *
+	 */
+	Vec & getVec()
+	{
+		setPetsc();
+
+		return v;
+	}
+
+
+	/*! \brief Copy the vector
+	 *
+	 * \param v vector to copy
+	 *
+	 */
+	Vector<T,Vec> & operator=(const Vector<T,Vec> & v)
+	{
+		map = v.map;
+		row_val = v.row_val;
+
+		return *this;
+	}
+
+	/*! \brief Copy the vector
+	 *
+	 * \param v vector to copy
+	 *
+	 */
+	Vector<T,Vec> & operator=(const Vector<T,Vec> && v)
+	{
+		map = v.map;
+		row_val = v.row_val;
+
+		return *this;
+	}
+
+	/*! \brief Copy the vector (it is used for special purpose)
+	 *
+	 * \warning v MUST contain at least all the elements of the vector
+	 *
+	 * \param v base eigen vector to copy
+	 *
+	 */
+	Vector<T> & operator=(Eigen::Matrix<T, Eigen::Dynamic, 1> & v)
+	{
+		for (size_t i = 0 ; i < row_val.size() ; i++)
+			row_val.get(i).value() = v(row_val.get(i).row());
+
+		return *this;
+	}
+};
+
+
+#endif /* OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_EIGEN_HPP_ */
+
-- 
GitLab