12#ifndef DUMUX_IO_VTK_OUTPUT_MODULE_HH
13#define DUMUX_IO_VTK_OUTPUT_MODULE_HH
19#include <dune/common/timer.hh>
20#include <dune/common/fvector.hh>
21#include <dune/common/typetraits.hh>
23#include <dune/geometry/type.hh>
24#include <dune/geometry/multilineargeometry.hh>
26#include <dune/grid/common/mcmgmapper.hh>
27#include <dune/grid/common/partitionset.hh>
28#include <dune/grid/io/file/vtk/vtkwriter.hh>
29#include <dune/grid/io/file/vtk/vtksequencewriter.hh>
30#include <dune/grid/common/partitionset.hh>
32#include <dumux/common/concepts/variables_.hh>
34#include <dumux/common/typetraits/localdofs_.hh>
51template<
class Gr
idGeometry>
54 using GridView =
typename GridGeometry::GridView;
55 static constexpr int dim = GridView::dimension;
62 const std::string&
name,
64 Dune::VTK::DataMode dm = Dune::VTK::conforming,
75 writer_ = std::make_shared<Dune::VTKWriter<GridView>>(
gridGeometry.gridView(), dm, coordPrecision);
76 sequenceWriter_ = std::make_unique<Dune::VTKSequenceWriter<GridView>>(writer_,
name);
84 {
return paramGroup_; }
95 template<
typename Vector>
97 const std::string&
name,
111 template<
typename Vector>
113 const std::string&
name,
118 const auto nComp = getNumberOfComponents_(v);
120 const auto numElemDofs =
gridGeometry().elementMapper().size();
121 const auto numVertexDofs =
gridGeometry().vertexMapper().size();
126 if(numElemDofs == numVertexDofs)
127 DUNE_THROW(Dune::InvalidStateException,
"Automatic deduction of FieldType failed. Please explicitly specify FieldType::element or FieldType::vertex.");
129 if(v.size() == numElemDofs)
131 else if(v.size() == numVertexDofs)
134 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
140 if(v.size() != numElemDofs)
141 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
144 if(v.size() != numVertexDofs)
145 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
163 for (
auto i = 0UL; i < fields_.size(); ++i)
165 if (fields_[i].
name() == field.name() && fields_[i].codim() == field.codim())
167 fields_[i] = std::move(field);
168 std::cout << Fmt::format(
169 "VtkOutputModule: Replaced field \"{}\" (codim {}). "
170 "A field by the same name & codim had already been registered previously.\n",
171 field.name(), field.codim()
178 fields_.push_back(std::move(field));
186 void write(
double time, Dune::VTK::OutputType type = Dune::VTK::ascii)
191 if (dm_ == Dune::VTK::conforming)
193 else if (dm_ == Dune::VTK::nonconforming)
196 DUNE_THROW(Dune::NotImplemented,
"Output for provided VTK data mode");
201 std::cout << Fmt::format(
"Writing output for problem \"{}\". Took {:.2g} seconds.\n", name_, timer.elapsed());
208 const std::string&
name()
const {
return name_; }
209 Dune::VTK::DataMode
dataMode()
const {
return dm_; }
210 Dumux::Vtk::Precision
precision()
const {
return precision_; }
212 Dune::VTKWriter<GridView>&
writer() {
return *writer_; }
215 const std::vector<Field>&
fields()
const {
return fields_; }
249 std::vector<int> rank;
252 if (!fields_.empty() || addProcessRank_)
254 const auto numCells = gridGeometry_.gridView().size(0);
259 rank.resize(numCells);
261 for (
const auto& element : elements(gridGeometry_.gridView(), Dune::Partitions::interior))
263 const auto eIdxGlobal = gridGeometry_.elementMapper().index(element);
264 rank[eIdxGlobal] = gridGeometry_.gridView().comm().rank();
274 this->
addCellData(
Field(gridGeometry_.gridView(), gridGeometry_.elementMapper(), rank,
"process rank", 1, 0));
277 for (
auto&& field : fields_)
279 if (field.codim() == 0)
281 else if (field.codim() == dim)
284 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
298 this->addedCellData_.clear();
299 this->addedVertexData_.clear();
305 DUNE_THROW(Dune::NotImplemented,
"Non-conforming VTK output");
309 template<
class Vector>
310 std::size_t getNumberOfComponents_(
const Vector& v)
312 if constexpr (Dune::IsIndexable<decltype(std::declval<Vector>()[0])>::value)
318 const GridGeometry& gridGeometry_;
320 const std::string paramGroup_;
321 Dune::VTK::DataMode dm_;
323 Dumux::Vtk::Precision precision_;
325 std::shared_ptr<Dune::VTKWriter<GridView>> writer_;
326 std::unique_ptr<Dune::VTKSequenceWriter<GridView>> sequenceWriter_;
328 std::vector<Field> fields_;
330 bool addProcessRank_ =
true;
345template<
class Gr
idVariables,
class SolutionVector>
349 using GridGeometry =
typename GridVariables::GridGeometry;
351 using VV = Concept::Variables_t<GridVariables>;
352 using Scalar =
typename GridVariables::Scalar;
354 using GridView =
typename GridGeometry::GridView;
357 dim = GridView::dimension,
358 dimWorld = GridView::dimensionworld
361 using Element =
typename GridView::template Codim<0>::Entity;
362 using VolVarsVector = Dune::FieldVector<Scalar, dimWorld>;
369 struct VolVarScalarDataInfo { std::function<Scalar(
const VV&)> get; std::string
name; Dumux::Vtk::Precision precision_; };
370 struct VolVarVectorDataInfo { std::function<VolVarsVector(
const VV&)> get; std::string
name; Dumux::Vtk::Precision precision_; };
381 const SolutionVector&
sol,
382 const std::string&
name,
384 Dune::VTK::DataMode dm = Dune::VTK::conforming,
389 , velocityOutput_(std::make_shared<VelocityOutputType>())
413 const std::string&
name)
417 for (
auto i = 0UL; i < volVarScalarDataInfo_.size(); ++i)
419 if (volVarScalarDataInfo_[i].
name ==
name)
421 volVarScalarDataInfo_[i] = VolVarScalarDataInfo{f,
name, this->
precision()};
422 std::cout << Fmt::format(
423 "VtkOutputModule: Replaced volume variable output \"{}\". "
424 "A field by the same name had already been registered previously.\n",
432 volVarScalarDataInfo_.push_back(VolVarScalarDataInfo{f,
name, this->
precision()});
439 template<
class VVV = VolVarsVector,
typename std::enable_if_t<(VVV::dimension > 1),
int> = 0>
441 const std::string&
name)
445 for (
auto i = 0UL; i < volVarVectorDataInfo_.size(); ++i)
447 if (volVarVectorDataInfo_[i].
name ==
name)
449 volVarVectorDataInfo_[i] = VolVarVectorDataInfo{f,
name, this->
precision()};
450 std::cout << Fmt::format(
451 "VtkOutputModule: Replaced volume variable output \"{}\". "
452 "A field by the same name had already been registered previously.\n",
460 volVarVectorDataInfo_.push_back(VolVarVectorDataInfo{f,
name, this->
precision()});
467 const GridGeometry&
gridGeometry()
const {
return gridVariables_.gridGeometry(); }
468 const SolutionVector&
sol()
const {
return sol_; }
478 if constexpr (Concept::FVGridVariables<GridVariables>)
479 return gridVariables_.curGridVolVars();
481 return gridVariables_.curGridVars();
489 const Dune::VTK::DataMode dm = Dune::VTK::conforming;
496 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
499 std::vector<double> rank;
502 std::vector<std::vector<Scalar>> volVarScalarData;
503 std::vector<std::vector<VolVarsVector>> volVarVectorData;
506 if (!volVarScalarDataInfo_.empty()
507 || !volVarVectorDataInfo_.empty()
508 || !this->fields().empty()
509 || velocityOutput_->enableOutput()
512 const auto numCells =
gridGeometry().gridView().size(0);
513 const auto numDofs = numDofs_();
516 if (!volVarScalarDataInfo_.empty())
517 volVarScalarData.resize(volVarScalarDataInfo_.size(), std::vector<Scalar>(numDofs));
518 if (!volVarVectorDataInfo_.empty())
519 volVarVectorData.resize(volVarVectorDataInfo_.size(), std::vector<VolVarsVector>(numDofs));
521 if (velocityOutput_->enableOutput())
523 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
526 velocity[phaseIdx].resize(numCells);
528 velocity[phaseIdx].resize(numDofs);
531 if(isBox && dim == 1)
532 velocity[phaseIdx].resize(numCells);
534 velocity[phaseIdx].resize(numDofs);
540 if (addProcessRank_) rank.resize(numCells);
544 for (
const auto& element : elements(
gridGeometry().gridView()))
546 if (!velocityOutput_->enableOutput() &&
547 element.partitionType() != Dune::PartitionType::InteriorEntity)
551 const auto eIdxGlobal =
gridGeometry().elementMapper().index(element);
554 if (velocityOutput_->enableOutput())
556 fvGeometry.bind(element);
557 elemVolVars.bind(element, fvGeometry, sol_);
561 fvGeometry.bindElement(element);
562 elemVolVars.bindElement(element, fvGeometry, sol_);
566 if (velocityOutput_->enableOutput())
568 if constexpr (Concept::FVGridVariables<GridVariables>)
570 const auto elemFluxVarsCache =
localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
572 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
573 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
577 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
578 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, phaseIdx);
581 else if (element.partitionType() != Dune::PartitionType::InteriorEntity)
586 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
588 using ElementDisc =
typename GridGeometry::LocalView;
591 for (
const auto& scv :
scvs(fvGeometry))
593 const auto dofIdxGlobal = scv.dofIndex();
594 const auto& volVars = elemVolVars[scv];
597 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
598 volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo_[i].get(volVars);
601 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
602 volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo_[i].get(volVars);
608 for (
const auto& localDof : nonCVLocalDofs(fvGeometry))
610 const auto dofIdxGlobal = localDof.dofIndex();
611 const auto& volVars = elemVolVars[localDof];
614 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
615 volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo_[i].get(volVars);
618 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
619 volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo_[i].get(volVars);
626 rank[eIdxGlobal] =
static_cast<double>(
gridGeometry().gridView().comm().rank());
634 if constexpr (isBox || isPQ1Bubble || isPQ2)
636 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
638 volVarScalarDataInfo_[i].
name, 1, dim, dm, this->
precision()) );
639 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
641 volVarVectorDataInfo_[i].
name, dimWorld, dim, dm, this->
precision()) );
643 if constexpr (isPQ1Bubble)
645 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
647 volVarScalarDataInfo_[i].
name, 1, 0,dm, this->
precision()) );
648 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
650 volVarVectorDataInfo_[i].
name, dimWorld, 0,dm, this->
precision()) );
656 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
658 volVarScalarDataInfo_[i].
name, 1, 0,dm, this->
precision()) );
659 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
661 volVarVectorDataInfo_[i].
name, dimWorld, 0,dm, this->
precision()) );
665 if (velocityOutput_->enableOutput())
670 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
672 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
673 dimWorld, dim, dm, this->precision()) );
678 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
680 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
681 dimWorld, 0, dm, this->precision()) );
690 for (
auto&& field : this->
fields())
692 if (field.codim() == 0)
694 else if (field.codim() == dim)
697 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
711 this->addedCellData_.clear();
712 this->addedVertexData_.clear();
718 const Dune::VTK::DataMode dm = Dune::VTK::nonconforming;
721 if(!isBox && !isDiamond)
722 DUNE_THROW(Dune::NotImplemented,
723 "Non-conforming output for discretization scheme " << GridGeometry::discMethod
731 if (enableVelocityOutput_ && !velocityOutput_->enableOutput())
732 std::cerr <<
"Warning! Velocity output was enabled in the input file"
733 <<
" but no velocity output policy was set for the VTK output module:"
734 <<
" There will be no velocity output."
735 <<
" Use the addVelocityOutput member function of the VTK output module." << std::endl;
737 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
740 std::vector<double> rank;
743 using ScalarDataContainer = std::vector< std::vector<Scalar> >;
744 using VectorDataContainer = std::vector< std::vector<VolVarsVector> >;
745 std::vector< ScalarDataContainer > volVarScalarData;
746 std::vector< VectorDataContainer > volVarVectorData;
749 if (!volVarScalarDataInfo_.empty()
750 || !volVarVectorDataInfo_.empty()
751 || !this->fields().empty()
752 || velocityOutput_->enableOutput()
755 const auto numCells =
gridGeometry().gridView().size(0);
756 const auto outputSize = numDofs_();
759 if (!volVarScalarDataInfo_.empty())
760 volVarScalarData.resize(volVarScalarDataInfo_.size(), ScalarDataContainer(numCells));
761 if (!volVarVectorDataInfo_.empty())
762 volVarVectorData.resize(volVarVectorDataInfo_.size(), VectorDataContainer(numCells));
764 if (velocityOutput_->enableOutput())
766 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
768 if((isBox && dim == 1) || isDiamond)
769 velocity[phaseIdx].resize(numCells);
771 velocity[phaseIdx].resize(outputSize);
776 if (addProcessRank_) rank.resize(numCells);
781 for (
const auto& element : elements(
gridGeometry().gridView()))
783 if (!velocityOutput_->enableOutput() &&
784 element.partitionType() != Dune::PartitionType::InteriorEntity)
788 const auto eIdxGlobal =
gridGeometry().elementMapper().index(element);
791 if (velocityOutput_->enableOutput())
793 fvGeometry.bind(element);
794 elemVolVars.bind(element, fvGeometry, sol_);
798 fvGeometry.bindElement(element);
799 elemVolVars.bindElement(element, fvGeometry, sol_);
802 const auto numLocalDofs = Dumux::Detail::LocalDofs::numLocalDofs(fvGeometry);
804 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
805 volVarScalarData[i][eIdxGlobal].resize(numLocalDofs);
806 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
807 volVarVectorData[i][eIdxGlobal].resize(numLocalDofs);
810 if (velocityOutput_->enableOutput())
812 if constexpr (Concept::FVGridVariables<GridVariables>)
814 const auto elemFluxVarsCache =
localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
815 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
816 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
820 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
821 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, phaseIdx);
824 else if (element.partitionType() != Dune::PartitionType::InteriorEntity)
829 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
831 using ElementDisc =
typename GridGeometry::LocalView;
834 for (
const auto& scv :
scvs(fvGeometry))
836 const auto& volVars = elemVolVars[scv];
839 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
840 volVarScalarData[i][eIdxGlobal][scv.localDofIndex()] = volVarScalarDataInfo_[i].get(volVars);
843 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
844 volVarVectorData[i][eIdxGlobal][scv.localDofIndex()] = volVarVectorDataInfo_[i].get(volVars);
850 for (
const auto& localDof : nonCVLocalDofs(fvGeometry))
852 const auto& volVars = elemVolVars[localDof];
855 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
856 volVarScalarData[i][eIdxGlobal][localDof.index()] = volVarScalarDataInfo_[i].get(volVars);
859 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
860 volVarVectorData[i][eIdxGlobal][localDof.index()] = volVarVectorDataInfo_[i].get(volVars);
867 rank[eIdxGlobal] =
static_cast<double>(
gridGeometry().gridView().comm().rank());
875 static constexpr int dofLocCodim = isDiamond ? 1 : dim;
876 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
879 volVarScalarData[i], volVarScalarDataInfo_[i].
name,
883 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
886 volVarVectorData[i], volVarVectorDataInfo_[i].
name,
887 dimWorld, dofLocCodim, dm, this->
precision()
891 if (velocityOutput_->enableOutput())
894 if (dim > 1 && !isDiamond)
895 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
898 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
899 dimWorld, dofLocCodim, dm, this->precision()
904 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
907 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
908 dimWorld, 0, dm, this->precision()
917 rank,
"process rank", 1, 0
921 for (
const auto& field : this->
fields())
923 if (field.codim() == 0)
925 else if (field.codim() == dim || field.codim() == 1)
928 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
941 this->addedCellData_.clear();
942 this->addedVertexData_.clear();
946 std::size_t numDofs_()
const
950 if constexpr (isBox || isDiamond || isPQ1Bubble || isPQ2)
956 const GridVariables& gridVariables_;
957 const SolutionVector& sol_;
959 std::vector<VolVarScalarDataInfo> volVarScalarDataInfo_;
960 std::vector<VolVarVectorDataInfo> volVarVectorDataInfo_;
962 std::shared_ptr<VelocityOutput> velocityOutput_;
963 bool enableVelocityOutput_ =
false;
964 bool addProcessRank_ =
true;
@ vertex
Definition io/velocityoutput.hh:47
@ automatic
Definition io/velocityoutput.hh:47
@ element
Definition io/velocityoutput.hh:47
std::vector< Dune::FieldVector< Scalar, dimWorld > > VelocityVector
Definition io/velocityoutput.hh:40
Velocity output for implicit (porous media) models.
Definition io/velocityoutput.hh:27
Dumux::Vtk::Precision precision() const
Definition io/vtkoutputmodule.hh:210
const std::string & paramGroup() const
Definition io/vtkoutputmodule.hh:83
void addCellData(const Field &field)
Definition io/vtkoutputmodule.hh:217
void write(double time, Dune::VTK::OutputType type=Dune::VTK::ascii)
Definition io/vtkoutputmodule.hh:186
VtkOutputModuleBase(const GridGeometry &gridGeometry, const std::string &name, const std::string ¶mGroup="", Dune::VTK::DataMode dm=Dune::VTK::conforming, bool verbose=true)
Definition io/vtkoutputmodule.hh:61
Dune::VTK::DataMode dataMode() const
Definition io/vtkoutputmodule.hh:209
Dune::VTKWriter< GridView > & writer()
Definition io/vtkoutputmodule.hh:212
Dune::VTKSequenceWriter< GridView > & sequenceWriter()
Definition io/vtkoutputmodule.hh:213
const std::string & name() const
Definition io/vtkoutputmodule.hh:208
const std::vector< Field > & fields() const
Definition io/vtkoutputmodule.hh:215
virtual ~VtkOutputModuleBase()=default
virtual void writeNonConforming_(double time, Dune::VTK::OutputType type)
Assembles the fields and adds them to the writer (nonconforming output).
Definition io/vtkoutputmodule.hh:303
std::vector< std::string > addedCellData_
Definition io/vtkoutputmodule.hh:237
void addField(const Vector &v, const std::string &name, Dumux::Vtk::Precision precision, Vtk::FieldType fieldType=Vtk::FieldType::automatic)
Add a scalar or vector valued vtk field.
Definition io/vtkoutputmodule.hh:112
bool verbose() const
Definition io/vtkoutputmodule.hh:207
Vtk::template Field< GridView > Field
the type of Field that can be added to this writer
Definition io/vtkoutputmodule.hh:59
std::vector< std::string > addedVertexData_
Definition io/vtkoutputmodule.hh:238
virtual void writeConforming_(double time, Dune::VTK::OutputType type)
Assembles the fields and adds them to the writer (conforming output).
Definition io/vtkoutputmodule.hh:242
void addField(const Vector &v, const std::string &name, Vtk::FieldType fieldType=Vtk::FieldType::automatic)
Add a scalar or vector valued vtk field.
Definition io/vtkoutputmodule.hh:96
void addVertexData(const Field &field)
Definition io/vtkoutputmodule.hh:226
const GridGeometry & gridGeometry() const
Definition io/vtkoutputmodule.hh:205
void addField(Field &&field)
Add a scalar or vector valued vtk field.
Definition io/vtkoutputmodule.hh:159
const auto & problem() const
Definition io/vtkoutputmodule.hh:465
const GridVariables & gridVariables() const
Definition io/vtkoutputmodule.hh:466
void addVolumeVariable(std::function< VolVarsVector(const VolumeVariables &)> &&f, const std::string &name)
Definition io/vtkoutputmodule.hh:440
VV VolumeVariables
export type of the volume variables for the outputfields
Definition io/vtkoutputmodule.hh:378
void addVolumeVariable(std::function< Scalar(const VolumeVariables &)> &&f, const std::string &name)
Definition io/vtkoutputmodule.hh:412
void addVelocityOutput(std::shared_ptr< VelocityOutputType > velocityOutput)
Add a velocity output policy.
Definition io/vtkoutputmodule.hh:406
const auto & curGridVariables_() const
Definition io/vtkoutputmodule.hh:476
const VelocityOutput & velocityOutput() const
Definition io/vtkoutputmodule.hh:474
VelocityOutputType VelocityOutput
Definition io/vtkoutputmodule.hh:473
Vtk::template Field< GridView > Field
the type of Field that can be added to this writer
Definition io/vtkoutputmodule.hh:376
void writeNonConforming_(double time, Dune::VTK::OutputType type) override
Assembles the fields and adds them to the writer (nonconforming output).
Definition io/vtkoutputmodule.hh:716
const SolutionVector & sol() const
Definition io/vtkoutputmodule.hh:468
const GridGeometry & gridGeometry() const
Definition io/vtkoutputmodule.hh:467
void writeConforming_(double time, Dune::VTK::OutputType type) override
Assembles the fields and adds them to the writer (conforming output).
Definition io/vtkoutputmodule.hh:487
VtkOutputModule(const GridVariables &gridVariables, const SolutionVector &sol, const std::string &name, const std::string ¶mGroup="", Dune::VTK::DataMode dm=Dune::VTK::conforming, bool verbose=true)
Definition io/vtkoutputmodule.hh:380
const std::vector< VolVarScalarDataInfo > & volVarScalarDataInfo() const
Definition io/vtkoutputmodule.hh:470
const std::vector< VolVarVectorDataInfo > & volVarVectorDataInfo() const
Definition io/vtkoutputmodule.hh:471
Concept for pure finite-element discretizations (no FV structure).
Definition concepts.hh:50
Concept for finite-volume discretizations.
Definition concepts.hh:26
Concept for hybrid finite-element/finite-volume discretizations.
Definition concepts.hh:39
Concepts for discretization types.
Vtk field types available in Dumux.
Dune style VTK functions.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition localview.hh:26
T getParamFromGroup(Args &&... args)
A free function to get a parameter from the parameter tree singleton with a model group.
Definition parameters.hh:149
Default velocity output policy for porous media models.
Class representing dofs on elements for control-volume finite element schemes.
The available discretization methods in Dumux.
constexpr FCDiamond fcdiamond
Definition method.hh:184
constexpr PQ2 pq2
Definition method.hh:178
constexpr Box box
Definition method.hh:176
constexpr PQ1Bubble pq1bubble
Definition method.hh:180
std::ranges::range auto scvs(const FVElementGeometry &fvGeometry, const LocalDof &localDof)
Definition localdof.hh:82
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.