summaryrefslogtreecommitdiff
path: root/src/core/superData3D.hh
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-06-24 14:43:36 +0200
committerAdrian Kummerlaender2019-06-24 14:43:36 +0200
commit94d3e79a8617f88dc0219cfdeedfa3147833719d (patch)
treec1a6894679563e271f5c6ea7a17fa3462f7212a3 /src/core/superData3D.hh
downloadgrid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.gz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.bz2
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.lz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.xz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.zst
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.zip
Initialize at openlb-1-3
Diffstat (limited to 'src/core/superData3D.hh')
-rw-r--r--src/core/superData3D.hh244
1 files changed, 244 insertions, 0 deletions
diff --git a/src/core/superData3D.hh b/src/core/superData3D.hh
new file mode 100644
index 0000000..57d9ca7
--- /dev/null
+++ b/src/core/superData3D.hh
@@ -0,0 +1,244 @@
+/* This file is part of the OpenLB library
+ *
+ * Copyright (C) 2015 Mathias J. Krause, Benjamin Förster
+ * E-mail contact: info@openlb.net
+ * The most recent release of OpenLB can be downloaded at
+ * <http://www.openlb.net/>
+ *
+ * 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.
+*/
+
+/** \file
+ * Dynamics for a generic 3D super data -- header file.
+ */
+#ifndef SUPER_DATA_3D_HH
+#define SUPER_DATA_3D_HH
+
+#include <numeric>
+#include "superData3D.h"
+#include "functors/lattice/superBaseF3D.h"
+#include "geometry/cuboid3D.h"
+
+namespace olb {
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>::~SuperData3D()
+{
+ deConstruct();
+}
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>::SuperData3D(int size)
+ : SuperStructure3D<T> (),
+ _size(size)
+{
+}
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>::SuperData3D(CuboidGeometry3D<T>& cuboidGeometry,
+ LoadBalancer<T>& loadBalancer, int overlap, int size)
+ : SuperStructure3D<T>(cuboidGeometry, loadBalancer, overlap), _size(size)
+{
+ allocateMemory();
+}
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>::SuperData3D(SuperData3D<T,BaseType>& rhs)
+ : SuperStructure3D<T>(rhs.getCuboidGeometry(), rhs.getLoadBalancer(), rhs.getOverlap())
+{
+ // copy whole BlockData3D vector and size
+ _extendedBlockData = rhs._extendedBlockData;
+ _size = rhs._size;
+}
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>::SuperData3D(SuperF3D<T,BaseType>& rhs)
+ : SuperStructure3D<T>(rhs.getSuperStructure().getCuboidGeometry(),
+ rhs.getSuperStructure().getLoadBalancer(),
+ rhs.getSuperStructure().getOverlap()),
+ _size(rhs.getTargetDim())
+{
+ allocateMemory();
+ int i[4];
+ int iX, iY, iZ;
+ for (int iCloc=0; iCloc < this->getLoadBalancer().size(); ++iCloc) {
+ i[0] = this->getLoadBalancer().glob(iCloc);
+ for (iX=0; iX < get(iCloc).getNx(); iX++) {
+ for (iY=0; iY < get(iCloc).getNy(); iY++) {
+ for (iZ=0; iZ < get(iCloc).getNz(); iZ++) {
+ i[1] = iX - this->_overlap;
+ i[2] = iY - this->_overlap;
+ i[3] = iZ - this->_overlap;
+ BaseType tmp[rhs.getTargetDim()];
+ rhs(tmp, i);
+ for (int iDim=0; iDim<rhs.getTargetDim(); iDim++ ) {
+ get(iCloc).get(iX, iY, iZ, iDim) = tmp[iDim];
+ }
+ }
+ }
+ }
+ }
+}
+
+template<typename T, typename BaseType>
+void SuperData3D<T,BaseType>::allocateMemory()
+{
+ for (int iCloc=0; iCloc < this->getLoadBalancer().size(); ++iCloc) {
+ int iCglob = this->getLoadBalancer().glob(iCloc);
+ Cuboid3D<T> extendedCuboid(this->getCuboidGeometry().get(iCglob), this->getOverlap());
+ _extendedBlockData.emplace_back(extendedCuboid.getNx(),
+ extendedCuboid.getNy(),
+ extendedCuboid.getNz(),
+ _size);
+ }
+};
+
+template<typename T, typename BaseType>
+SuperData3D<T,BaseType>& SuperData3D<T,BaseType>::operator=(SuperData3D<T,BaseType>& rhs)
+{
+ // Swap content of rhs with local content
+ swap(rhs);
+ return *this;
+}
+
+template<typename T, typename BaseType>
+void SuperData3D<T,BaseType>::swap(std::vector< BlockData3D<T,BaseType> >& blockDatas)
+{
+ // Needed for vtiReader: After building geometry, vtiReader builds Block Data vector
+ if ( blockDatas.size() == 0 ) {
+ _size = 1;
+ }
+ else {
+ _size = blockDatas[0].getSize();
+ }
+ std::swap(_extendedBlockData, blockDatas);
+}
+
+template<typename T, typename BaseType>
+void SuperData3D<T,BaseType>::swap(SuperData3D<T,BaseType>& rhs)
+{
+ std::swap(_size, rhs._size);
+ _extendedBlockData.swap(rhs._extendedBlockData);
+}
+
+template<typename T, typename BaseType>
+bool SuperData3D<T,BaseType>::isConstructed() const
+{
+ // iterate through all blocks and check if isConstructed
+ bool superIsConstructed = true;
+ for (auto & blockData : _extendedBlockData) {
+ superIsConstructed &= blockData.isConstructed();
+ }
+ return superIsConstructed;
+}
+
+template<typename T, typename BaseType>
+void SuperData3D<T,BaseType>::deConstruct()
+{
+ // for all blocks: deConstruct
+ for (auto & blockData : _extendedBlockData) {
+ blockData.deConstruct();
+ }
+}
+
+template<typename T, typename BaseType>
+void SuperData3D<T,BaseType>::reset()
+{
+ // for all blocks: reset
+ for (auto & blockData : _extendedBlockData) {
+ blockData.reset();
+ }
+}
+
+template<typename T, typename BaseType>
+BlockData3D<T,BaseType>& SuperData3D<T,BaseType>::get(int iC)
+{
+ return _extendedBlockData[iC];
+}
+
+template<typename T, typename BaseType>
+BlockData3D<T,BaseType> const& SuperData3D<T,BaseType>::get(int iC) const
+{
+ return _extendedBlockData[iC];
+}
+
+template<typename T, typename BaseType>
+BaseType& SuperData3D<T,BaseType>::get(int iC, int iX, int iY, int iZ, int iData)
+{
+ return _extendedBlockData[iC].get(iX + this->_overlap,
+ iY + this->_overlap,
+ iZ + this->_overlap, iData);
+}
+
+template<typename T, typename BaseType>
+BaseType const& SuperData3D<T,BaseType>::get(int iC, int iX, int iY, int iZ, int iData) const
+{
+ return _extendedBlockData[iC].get(iX + this->_overlap,
+ iY + this->_overlap,
+ iZ + this->_overlap, iData);
+}
+
+template<typename T, typename BaseType>
+bool* SuperData3D<T,BaseType>::operator() (int iCloc, int iX, int iY, int iZ, int iData)
+{
+ return (bool*)&get(iCloc,iX,iY,iZ,iData);
+}
+
+template<typename T, typename BaseType>
+int SuperData3D<T,BaseType>::getDataSize() const
+{
+ return _size;
+}
+
+template<typename T, typename BaseType>
+int SuperData3D<T,BaseType>::getDataTypeSize() const
+{
+ return sizeof(BaseType);
+}
+
+
+template<typename T, typename BaseType>
+size_t SuperData3D<T,BaseType>::getNblock() const
+{
+ return 1 + std::accumulate(_extendedBlockData.begin(), _extendedBlockData.end(), size_t(0),
+ Serializable::sumNblock());
+}
+
+template<typename T, typename BaseType>
+size_t SuperData3D<T,BaseType>::getSerializableSize() const
+{
+ return sizeof(int) // _size
+ + std::accumulate(_extendedBlockData.begin(), _extendedBlockData.end(), size_t(0),
+ Serializable::sumSerializableSize());
+};
+
+template<typename T, typename BaseType>
+bool* SuperData3D<T,BaseType>::getBlock(std::size_t iBlock, std::size_t& sizeBlock, bool loadingMode)
+{
+ std::size_t currentBlock = 0;
+ size_t sizeBufferIndex = 0;
+ bool* dataPtr = nullptr;
+
+ registerVar(iBlock, sizeBlock, currentBlock, dataPtr, _size);
+ registerStdVectorOfSerializablesOfConstSize(iBlock, sizeBlock, currentBlock, sizeBufferIndex, dataPtr,
+ _extendedBlockData, loadingMode);
+ return dataPtr;
+}
+
+
+} // namespace olb
+
+#endif