diff --git a/dumux/io/staggeredvtkoutputmodule.hh b/dumux/io/staggeredvtkoutputmodule.hh index 47b9d0019c35b14ef9f8ae87208b473b9dbb7c2a..d779ce7cacb0de3cf4d66c0d74708cbc464d8d83 100644 --- a/dumux/io/staggeredvtkoutputmodule.hh +++ b/dumux/io/staggeredvtkoutputmodule.hh @@ -65,6 +65,17 @@ class StaggeredVtkOutputModule : public VtkOutputModuleBase<TypeTag> struct PriVarScalarDataInfo { unsigned int pvIdx; std::string name; }; struct PriVarVectorDataInfo { std::vector<unsigned int> pvIdx; std::string name; }; + using Positions = std::vector<Scalar>; + using Data = std::vector<std::vector<Scalar>>; + + struct BundleOfTypes + { + using Positions = StaggeredVtkOutputModule::Positions; + using PriVarScalarDataInfo = StaggeredVtkOutputModule::PriVarScalarDataInfo; + using PriVarVectorDataInfo = StaggeredVtkOutputModule::PriVarVectorDataInfo; + using Data = StaggeredVtkOutputModule::Data; + }; + public: StaggeredVtkOutputModule(const Problem& problem, @@ -97,11 +108,9 @@ public: void write(double time, Dune::VTK::OutputType type = Dune::VTK::ascii) { ParentType::write(time, type); - // faceWriter_.write(facePriVarScalarDataInfo_, facePriVarVectorDataInfo_); - getData_(); + getFaceDataAndWrite_(); } - protected: unsigned int numDofs_() const { @@ -116,16 +125,16 @@ protected: private: - void getData_() + void getFaceDataAndWrite_() { const int numPoints = this->problem().model().numFaceDofs(); // get fields for all primary coordinates and variables std::vector<bool> dofVisited(numPoints, false); - std::vector<Scalar> positions(numPoints*3); - std::vector<std::vector<Scalar>> priVarScalarData(facePriVarScalarDataInfo_.size(), std::vector<Scalar>(numPoints)); + Positions positions(numPoints*3); + Data priVarScalarData(facePriVarScalarDataInfo_.size(), std::vector<Scalar>(numPoints)); - std::vector<std::vector<Scalar>> priVarVectorData(facePriVarVectorDataInfo_.size()); + Data priVarVectorData(facePriVarVectorDataInfo_.size()); for (std::size_t i = 0; i < facePriVarVectorDataInfo_.size(); ++i) priVarVectorData[i].resize(numPoints*facePriVarVectorDataInfo_[i].pvIdx.size()); @@ -148,7 +157,7 @@ private: } template<class Facet> - void getPositions_(std::vector<Scalar>& positions, const Facet& facet) + void getPositions_(Positions& positions, const Facet& facet) { const int dofIdxGlobal = facet.dofIndexSelf(); auto pos = facet.center(); @@ -173,7 +182,7 @@ private: } template<class Facet> - void getScalarData_(std::vector<std::vector<Scalar>>& priVarScalarData, const Facet& facet) + void getScalarData_(Data& priVarScalarData, const Facet& facet) { const int dofIdxGlobal = facet.dofIndexSelf(); for(int pvIdx = 0; pvIdx < facePriVarScalarDataInfo_.size(); ++pvIdx) @@ -183,7 +192,7 @@ private: } template<class Facet> - void getVectorData_(std::vector<std::vector<Scalar>>& priVarVectorData, const Facet& facet) + void getVectorData_(Data& priVarVectorData, const Facet& facet) { // const int dofIdxGlobal = this->problem().gridView().indexSet().index(facet); @@ -201,7 +210,7 @@ private: } - StaggeredVtkWriter<TypeTag, std::vector<PriVarScalarDataInfo>, std::vector<PriVarVectorDataInfo>> faceWriter_; + StaggeredVtkWriter<TypeTag, BundleOfTypes> faceWriter_; std::vector<PriVarScalarDataInfo> facePriVarScalarDataInfo_; std::vector<PriVarVectorDataInfo> facePriVarVectorDataInfo_; }; diff --git a/dumux/io/staggeredvtkwriter.hh b/dumux/io/staggeredvtkwriter.hh index a8a7e28f70b0276adb89672ace81878560094d50..21fb940259c507f8d4958decabd0e282309b98ad 100644 --- a/dumux/io/staggeredvtkwriter.hh +++ b/dumux/io/staggeredvtkwriter.hh @@ -46,7 +46,7 @@ namespace Dumux * initialization and/or be turned on/off using the designated properties. Additionally * non-standardized scalar and vector fields can be added to the writer manually. */ -template<class TypeTag, class ScalarInfo, class VectorInfo> +template<class TypeTag, class BundleOfTypes> class StaggeredVtkWriter { using Problem = typename GET_PROP_TYPE(TypeTag, Problem); @@ -63,12 +63,16 @@ class StaggeredVtkWriter static constexpr unsigned int precision = 6; static constexpr unsigned int numBeforeLineBreak = 15; + using ScalarInfo = std::vector<typename BundleOfTypes::PriVarScalarDataInfo>; + using VectorInfo = std::vector<typename BundleOfTypes::PriVarVectorDataInfo>; + using Positions = typename BundleOfTypes::Positions; + using Data = typename BundleOfTypes::Data; + public: StaggeredVtkWriter(const Problem& problem) : problem_(problem) {} - template<class ScalarData, class VectorData, class Positions> - void write(const ScalarData& priVarScalarData, const VectorData& priVarVectorData, const Positions& positions, + void write(const Data& priVarScalarData, const Data& priVarVectorData, const Positions& positions, const ScalarInfo& scalarInfo, const VectorInfo& vectorInfo) { if(scalarInfo.empty() && vectorInfo.empty()) @@ -89,8 +93,7 @@ private: file_ << header; } - template<class ScalarData, class VectorData, class Positions> - void write_(const ScalarData& priVarScalarData, const VectorData& priVarVectorData, const Positions& positions, + void write_(const Data& priVarScalarData, const Data& priVarVectorData, const Positions& positions, const ScalarInfo& scalarInfo, const VectorInfo& vectorInfo) { const int numPoints = problem_.model().numFaceDofs(); @@ -124,7 +127,7 @@ private: file_ << "</VTKFile>"; } - void writeCoordinates_(const std::vector<Scalar>& positions) + void writeCoordinates_(const Positions& positions) { // write the positions to the file file_ << "<Points>\n"; @@ -144,7 +147,7 @@ private: file_ << "</Points>\n"; } - void writeScalarFacePriVars_(const std::vector<std::vector<Scalar>>& priVarScalarData, const ScalarInfo& info) + void writeScalarFacePriVars_(const Data& priVarScalarData, const ScalarInfo& info) { // write the priVars to the file for(int pvIdx = 0; pvIdx < info.size(); ++pvIdx) @@ -165,7 +168,7 @@ private: } } - void writeVectorFacePriVars_(const std::vector<std::vector<Scalar>>& priVarVectorData, const VectorInfo& info) + void writeVectorFacePriVars_(const Data& priVarVectorData, const VectorInfo& info) { // write the priVars to the file for(int i = 0; i < info.size(); ++i)