/* 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 * * * 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 * The VTI reader is able to read from VTI files and create and fill * corresponding data structures. The reading process starts with * the construction of the reader object. The name of the data type * to be read (e.g. "physVelocity") is mandatory. * * * Single cuboids (BlockVTIreader) and cuboid geometries * (SuperVTIreader) are supported in 2D and 3D. * * The Base reader class is reading the generic information of the * VTI file like origin, extend and number of nodes of the surrounding * cuboid as well as the size (dimension) of the data vector to be read. * * In case of cuboid geometries, the reader follows these steps: * * 1. Create a CuboidGeometry and add all Cuboids. * * 2. Create a (Heuristic) LoadBalancer out of the CuboidGeometry. * * 3. Create a SuperData object out of the CuboidGeometry and * LoadBalancer and by that also allocate all the neccessary memory * for the actual data. * * 4. Iterate through the VTI data and fill the BlockData objects of SuperData. * * */ #ifndef VTI_READER_H #define VTI_READER_H #include #include #include "io/xmlReader.h" #include "geometry/cuboid3D.h" #include "geometry/cuboidGeometry3D.h" #include "core/superData3D.h" #include "core/blockData3D.h" #include "io/ostreamManager.h" #include "communication/loadBalancer.h" //typedef double T; namespace olb { template< typename T> class CuboidGeometry3D; //template< typename T> class Cuboid2D; template< typename T> class Cuboid3D; template< typename T> class LoadBalancer; template< typename T, typename BaseType> class SuperData3D; template< typename T, typename BaseType> class BlockData3D; template class BaseVTIreader { public: BaseVTIreader(const std::string& fName, int dim, std::string dName, const std::string class_name="BaseVTIreader"); virtual ~BaseVTIreader() {}; void printInfo(); protected: mutable OstreamManager clout; /* Dimension (2D or 3D) */ int _dim; /// Size of Data Field int _size; /* Origin */ std::vector _origin; /* #Nodes */ std::vector _extent; T _delta; XMLreader _xmlReader; // Number of Cuboids int _nCuboids; /// Reads Extent from extAttrName from XML Tag and returns as vector std::vector readExtent(const XMLreader* reader, std::string extAttrName); /// Converts 4D (or 6D) extents vector into 2D (3D) nb_nodes vector std::vector getNbNodes(std::vector& extents); /// Reads size from XML tag (attribute "NumberOfComponents") int getSize(const XMLreader& tag); }; template class BaseVTIreader3D : public BaseVTIreader { public: BaseVTIreader3D(const std::string& fName, std::string dName, const std::string class_name="BaseVTIreader3D"); ~BaseVTIreader3D() override {}; protected: /// Reads cuboid from piece node void readCuboid(Cuboid3D& cuboid, XMLreader* piece); /// Reads from pointDataTag and fills blockData bool readBlockData(BlockData3D& blockData, const XMLreader& pointDataTag, const std::string dName); }; template class BlockVTIreader3D : public BaseVTIreader3D { public: BlockVTIreader3D(const std::string& fName, const std::string dName); ~BlockVTIreader3D() override {}; BlockData3D& getBlockData(); Cuboid3D& getCuboid(); protected: Cuboid3D _cuboid; BlockData3D _blockData; }; template class SuperVTIreader3D : public BaseVTIreader3D { private: CuboidGeometry3D* _cGeometry; LoadBalancer* _loadBalancer; SuperData3D* _superData; public: SuperVTIreader3D(const std::string& fName, const std::string dName); ~SuperVTIreader3D() override; SuperData3D& getSuperData(); CuboidGeometry3D& getCuboidGeometry(); LoadBalancer& getLoadBalancer(); private: /// Reads Cuboid Geometry and creates Cuboid objects void readCuboidGeometry(); /// Fills all BlockData objects of SuperData void readSuperData(const std::string dName); }; /// \todo implement 2D version above /* template class VTIreader2D : public XMLreader { public: VTIreader2D(); VTIreader2D(const std::string& fName); ~VTIreader2D(); void getCuboid(Cuboid2D& cuboid); void getCuboids(std::vector* >& cuboids); //bool getScalarData(ScalarField2D* base, const std::string dName); //bool getVectorData(TensorField2D* base, const std::string dName); //void getScalarMultiPieceData(std::vector* >& bases, const std::string dName); //void getVectorMultiPieceData(std::vector* >& bases, const std::string dName); void printInfo(); private: int _x0, _y0, _z0; int _x, _y, _z; T _delta; }; */ } // namespace olb #endif