From fb34ea74b45c99f199a55619c11273684c83c0e1 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Wed, 7 Jan 2015 14:23:15 +0100
Subject: [PATCH] [MeL] Add NodePartitionedMesh derived from Mesh.

---
 MeshLib/CMakeLists.txt        |   6 ++
 MeshLib/NodePartitionedMesh.h | 148 ++++++++++++++++++++++++++++++++++
 2 files changed, 154 insertions(+)
 create mode 100644 MeshLib/NodePartitionedMesh.h

diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index 3ea1ccadec3..3ceffa79f2e 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -1,5 +1,11 @@
 # Source files
 GET_SOURCE_FILES(SOURCES_MESHLIB)
+
+# It should be removed too for other MPI based DDC approach in future.
+IF(NOT OGS_USE_PETSC)
+	list(REMOVE_ITEM SOURCES_MESHLIB NodePartitionedMesh.h)
+ENDIF(NOT OGS_USE_PETSC)
+
 GET_SOURCE_FILES(SOURCES_ELEMENTS Elements)
 GET_SOURCE_FILES(SOURCES_EDITING MeshEditing)
 GET_SOURCE_FILES(SOURCES_GENERATORS MeshGenerators)
diff --git a/MeshLib/NodePartitionedMesh.h b/MeshLib/NodePartitionedMesh.h
new file mode 100644
index 00000000000..505f8630275
--- /dev/null
+++ b/MeshLib/NodePartitionedMesh.h
@@ -0,0 +1,148 @@
+/*!
+  \file NodePartitionedMesh.h
+  \author Wenqing Wang
+  \date   2014.06
+  \brief  Definition of mesh class for partitioned mesh (by node) for parallel computing within the
+          framework of domain decomposition (DDC).
+
+  \copyright
+  Copyright (c) 2012-2014, 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 NODE_PARTITIONED_MESH_H_
+#define NODE_PARTITIONED_MESH_H_
+
+#include <vector>
+#include <string>
+
+#include "Mesh.h"
+
+namespace FileIO
+{
+class readNodePartitionedMesh;
+};
+
+namespace MeshLib
+{
+class Node;
+class Element;
+
+/// A subdomain mesh.
+class NodePartitionedMesh : public Mesh
+{
+    public:
+        /*!
+            \brief Constructor
+            \param name          Name assigned to the mesh.
+            \param nodes         Vector for nodes, which storage looks like:
+                                 ||--active base nodes--|--ghost base nodes--|
+                                  --active extra nodes--|--ghost extra nodes--||
+                                 (extra nodes: nodes for high order interpolations)
+            \param glb_node_ids  Global IDs of nodes of a partition.
+            \param elements      Vector for elements. Ghost elements are stored
+                                 after regular (non-ghost) elements.
+            \param n_nghost_elem Number of non-ghost elements, or the start ID of
+                                 the entry of ghost element in the element vector.
+            \param n_global_base_nodes Number of the base nodes of the global mesh.
+            \param n_global_nodes      Number of all nodes of the global mesh.
+            \param n_base_nodes        Number of the base nodes.
+            \param n_active_base_nodes Number of the active base nodes.
+            \param n_active_nodes      Number of all active nodes.
+        */
+        NodePartitionedMesh(const std::string &name,
+                            const std::vector<Node*> &nodes,
+                            const std::vector<unsigned> &glb_node_ids,
+                            const std::vector<Element*> &elements,
+                            const std::size_t n_nghost_elem,
+                            const unsigned n_global_base_nodes,
+                            const unsigned n_global_nodes,
+                            const unsigned n_base_nodes,
+                            const unsigned n_active_base_nodes,
+                            const unsigned n_active_nodes)
+            : Mesh(name, nodes, elements, n_base_nodes),
+              _global_node_ids(glb_node_ids), _n_nghost_elem(n_nghost_elem),
+              _n_global_base_nodes(n_global_base_nodes),
+              _n_global_nodes(n_global_nodes),
+              _n_active_base_nodes(n_active_base_nodes),
+              _n_active_nodes(n_active_nodes)
+        {
+        }
+
+        ~NodePartitionedMesh()
+        {
+        }
+
+        /// Get the number of nodes of the global mesh for linear elements.
+        unsigned getNGlobalBaseNodes() const
+        {
+            return _n_global_base_nodes;
+        }
+
+        /// Get the number of all nodes of the global mesh.
+        unsigned getNGlobalNodes() const
+        {
+            return _n_global_nodes;
+        }
+
+        /// Get the number of the active nodes of the partition for linear elements.
+        unsigned getNActiveBaseNodes() const
+        {
+            return _n_active_base_nodes;
+        }
+
+        /// Get the number of all active nodes of the partition.
+        unsigned getNActiveNodes() const
+        {
+            return _n_active_nodes;
+        }
+
+        /// Check whether a node with ID of node_id is a ghost node
+        bool isGhostNode(const unsigned node_id)
+        {
+            if(node_id < _n_active_base_nodes)
+                return true;
+            else if(node_id >= _n_base_nodes && node_id < getLargestActiveNodeID() )
+                return true;
+            else
+                return false;
+        }
+
+        /// Get the largest ID of active nodes for higher order elements in a partition.
+        unsigned getLargestActiveNodeID() const
+        {
+            return _n_base_nodes + _n_active_nodes - _n_active_base_nodes;
+        }
+
+        /// Get the number of non-ghost elements, or the start entry ID of ghost elements in element vector.
+        size_t getNNonGhostElements() const
+        {
+            return _n_nghost_elem;
+        }
+
+    private:
+        /// Global IDs of nodes of a partition
+        std::vector<unsigned> _global_node_ids;
+
+        /// Number of non-ghost elements, or the ID of the start entry of ghost elements in _elements vector.
+        std::size_t _n_nghost_elem;
+
+        /// Number of the nodes of the global mesh linear interpolations.
+        unsigned _n_global_base_nodes;
+
+        /// Number of all nodes of the global mesh.
+        unsigned _n_global_nodes;
+
+        /// Number of the active nodes for linear interpolations
+        unsigned _n_active_base_nodes;
+
+        /// Number of the all active nodes.
+        unsigned _n_active_nodes;
+};
+
+}   // namespace MeshLib
+
+#endif // NODE_PARTITIONED_MESH_H_
-- 
GitLab