From 94d3e79a8617f88dc0219cfdeedfa3147833719d Mon Sep 17 00:00:00 2001
From: Adrian Kummerlaender
Date: Mon, 24 Jun 2019 14:43:36 +0200
Subject: Initialize at openlb-1-3
---
src/communication/loadBalancer.hh | 167 ++++++++++++++++++++++++++++++++++++++
1 file changed, 167 insertions(+)
create mode 100644 src/communication/loadBalancer.hh
(limited to 'src/communication/loadBalancer.hh')
diff --git a/src/communication/loadBalancer.hh b/src/communication/loadBalancer.hh
new file mode 100644
index 0000000..62b7e06
--- /dev/null
+++ b/src/communication/loadBalancer.hh
@@ -0,0 +1,167 @@
+/* This file is part of the OpenLB library
+ *
+ * Copyright (C) 2007, 2014 Mathias Krause, Peter Weisbrod
+ * E-mail contact: info@openlb.net
+ * The most recent release of OpenLB can be downloaded at
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+
+#ifndef LOAD_BALANCER_HH
+#define LOAD_BALANCER_HH
+
+#include "communication/loadBalancer.h"
+
+namespace olb {
+
+
+template
+LoadBalancer::LoadBalancer(int size) : _size(size)
+{}
+
+template
+LoadBalancer::LoadBalancer(int size, std::map& loc, std::vector& glob, std::map& rank)
+ : _size(size), _loc(loc), _glob(glob), _rank(rank)
+{}
+
+template
+LoadBalancer::~LoadBalancer()
+{}
+
+template
+void LoadBalancer::swap(LoadBalancer& loadBalancer)
+{
+ std::swap(_size, loadBalancer._size);
+ _loc.swap(loadBalancer._loc);
+ _glob.swap(loadBalancer._glob);
+ _rank.swap(loadBalancer._rank);
+}
+
+template
+bool LoadBalancer::isLocal(const int& glob)
+{
+ return rank(glob) == singleton::mpi().getRank();
+}
+
+template
+int LoadBalancer::loc(const int& glob)
+{
+ return _loc[glob];
+}
+
+template
+int LoadBalancer::loc(int glob) const
+{
+ std::map::const_iterator iter = _loc.find(glob);
+ return iter->second;
+}
+
+template
+int LoadBalancer::glob(int loc) const
+{
+ return _glob[loc];
+}
+
+template
+int LoadBalancer::rank(const int& glob)
+{
+ return _rank[glob];
+}
+
+template
+int LoadBalancer::rank(int glob) const
+{
+ std::map::const_iterator iter = _rank.find(glob);
+ return iter->second;
+}
+
+template
+int LoadBalancer::size() const
+{
+ return _size;
+}
+
+template
+bool LoadBalancer::operator==(const LoadBalancer& rhs) const
+{
+ return _size == rhs._size &&
+ _loc == rhs._loc &&
+ _glob == rhs._glob &&
+ _rank == rhs._rank;
+}
+
+
+template
+size_t LoadBalancer::getNblock() const
+{
+ return 4 // _size, plus vector length of _loc, _glob and _rank
+ + _loc.size()
+ + _rank.size()
+ + _glob.size();
+}
+
+
+template
+size_t LoadBalancer::getSerializableSize() const
+{
+ return sizeof(int) // _size
+ + 3 * sizeof(size_t) // vector length of _loc, _glob and _rank
+ + _loc.size() * sizeof(std::pair)
+ + _rank.size() * sizeof(std::pair)
+ + _glob.size() * sizeof(int);
+}
+
+
+template
+bool* LoadBalancer::getBlock(std::size_t iBlock, std::size_t& sizeBlock, bool loadingMode)
+{
+ std::size_t currentBlock = 0;
+ size_t sizeBufferIndex = 0;
+ bool* dataPtr = nullptr;
+
+ this->registerVar (iBlock, sizeBlock, currentBlock, dataPtr, _size);
+ this->registerMap (iBlock, sizeBlock, currentBlock, sizeBufferIndex, dataPtr, _loc, loadingMode);
+ this->registerStdVectorOfVars(iBlock, sizeBlock, currentBlock, sizeBufferIndex, dataPtr, _glob, loadingMode);
+ this->registerMap (iBlock, sizeBlock, currentBlock, sizeBufferIndex, dataPtr, _rank, loadingMode);
+
+ return dataPtr;
+}
+
+
+template
+void LoadBalancer::print(bool multiOutput) const
+{
+ OstreamManager clout(std::cout,"LoadBalancer");
+ clout.setMultiOutput(multiOutput);
+ for (unsigned i = 0; i < this->_glob.size(); i++) {
+ clout << "glob[" << i << "]=" << this->_glob[i] << std::endl;
+ }
+ for (auto it = this->_loc.cbegin(); it != this->_loc.cend();
+ it++) {
+ clout << "loc[" << (*it).first << "]=" << (*it).second << std::endl;
+ }
+ for (auto it = this->_rank.cbegin(); it != this->_rank.cend();
+ it++) {
+ clout << "rank[" << (*it).first << "]=" << (*it).second << std::endl;
+ }
+ clout.setMultiOutput(false);
+}
+
+
+} // namespace olb
+#endif
--
cgit v1.2.3