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>
35#include <dumux/common/typetraits/localdofs_.hh>
52template<
class Gr
idGeometry>
55 using GridView =
typename GridGeometry::GridView;
56 static constexpr int dim = GridView::dimension;
63 const std::string&
name,
65 Dune::VTK::DataMode dm = Dune::VTK::conforming,
76 writer_ = std::make_shared<Dune::VTKWriter<GridView>>(
gridGeometry.gridView(), dm, coordPrecision);
77 sequenceWriter_ = std::make_unique<Dune::VTKSequenceWriter<GridView>>(writer_,
name);
85 {
return paramGroup_; }
96 template<
typename Vector>
98 const std::string&
name,
112 template<
typename Vector>
114 const std::string&
name,
119 const auto nComp = getNumberOfComponents_(v);
121 const auto numElemDofs =
gridGeometry().elementMapper().size();
122 const auto numVertexDofs =
gridGeometry().vertexMapper().size();
127 if(numElemDofs == numVertexDofs)
128 DUNE_THROW(Dune::InvalidStateException,
"Automatic deduction of FieldType failed. Please explicitly specify FieldType::element or FieldType::vertex.");
130 if(v.size() == numElemDofs)
132 else if(v.size() == numVertexDofs)
135 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
141 if(v.size() != numElemDofs)
142 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
145 if(v.size() != numVertexDofs)
146 DUNE_THROW(Dune::RangeError,
"Size mismatch of added field!");
164 for (
auto i = 0UL; i < fields_.size(); ++i)
166 if (fields_[i].
name() == field.name() && fields_[i].codim() == field.codim())
168 fields_[i] = std::move(field);
169 std::cout << Fmt::format(
170 "VtkOutputModule: Replaced field \"{}\" (codim {}). "
171 "A field by the same name & codim had already been registered previously.\n",
172 field.name(), field.codim()
179 fields_.push_back(std::move(field));
187 void write(
double time, Dune::VTK::OutputType type = Dune::VTK::ascii)
192 if (dm_ == Dune::VTK::conforming)
194 else if (dm_ == Dune::VTK::nonconforming)
197 DUNE_THROW(Dune::NotImplemented,
"Output for provided VTK data mode");
202 std::cout << Fmt::format(
"Writing output for problem \"{}\". Took {:.2g} seconds.\n", name_, timer.elapsed());
209 const std::string&
name()
const {
return name_; }
210 Dune::VTK::DataMode
dataMode()
const {
return dm_; }
211 Dumux::Vtk::Precision
precision()
const {
return precision_; }
213 Dune::VTKWriter<GridView>&
writer() {
return *writer_; }
216 const std::vector<Field>&
fields()
const {
return fields_; }
250 std::vector<int> rank;
253 if (!fields_.empty() || addProcessRank_)
255 const auto numCells = gridGeometry_.gridView().size(0);
260 rank.resize(numCells);
262 for (
const auto& element : elements(gridGeometry_.gridView(), Dune::Partitions::interior))
264 const auto eIdxGlobal = gridGeometry_.elementMapper().index(element);
265 rank[eIdxGlobal] = gridGeometry_.gridView().comm().rank();
275 this->
addCellData(
Field(gridGeometry_.gridView(), gridGeometry_.elementMapper(), rank,
"process rank", 1, 0));
278 for (
auto&& field : fields_)
280 if (field.codim() == 0)
282 else if (field.codim() == dim)
285 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
299 this->addedCellData_.clear();
300 this->addedVertexData_.clear();
306 DUNE_THROW(Dune::NotImplemented,
"Non-conforming VTK output");
310 template<
class Vector>
311 std::size_t getNumberOfComponents_(
const Vector& v)
313 if constexpr (Dune::IsIndexable<decltype(std::declval<Vector>()[0])>::value)
319 const GridGeometry& gridGeometry_;
321 const std::string paramGroup_;
322 Dune::VTK::DataMode dm_;
324 Dumux::Vtk::Precision precision_;
326 std::shared_ptr<Dune::VTKWriter<GridView>> writer_;
327 std::unique_ptr<Dune::VTKSequenceWriter<GridView>> sequenceWriter_;
329 std::vector<Field> fields_;
331 bool addProcessRank_ =
true;
346template<
class Gr
idVariables,
class SolutionVector>
352 using VV = Concept::Variables_t<GridVariables>;
353 using Scalar =
typename GridVariables::Scalar;
355 using GridView =
typename GridGeometry::GridView;
358 dim = GridView::dimension,
359 dimWorld = GridView::dimensionworld
362 using Element =
typename GridView::template Codim<0>::Entity;
363 using VolVarsVector = Dune::FieldVector<Scalar, dimWorld>;
370 struct VolVarScalarDataInfo { std::function<Scalar(
const VV&)> get; std::string
name; Dumux::Vtk::Precision precision_; };
371 struct VolVarVectorDataInfo { std::function<VolVarsVector(
const VV&)> get; std::string
name; Dumux::Vtk::Precision precision_; };
382 const SolutionVector&
sol,
383 const std::string&
name,
385 Dune::VTK::DataMode dm = Dune::VTK::conforming,
390 , velocityOutput_(std::make_shared<VelocityOutputType>())
414 const std::string&
name)
418 for (
auto i = 0UL; i < volVarScalarDataInfo_.size(); ++i)
420 if (volVarScalarDataInfo_[i].
name ==
name)
422 volVarScalarDataInfo_[i] = VolVarScalarDataInfo{f,
name, this->
precision()};
423 std::cout << Fmt::format(
424 "VtkOutputModule: Replaced volume variable output \"{}\". "
425 "A field by the same name had already been registered previously.\n",
433 volVarScalarDataInfo_.push_back(VolVarScalarDataInfo{f,
name, this->
precision()});
440 template<
class VVV = VolVarsVector,
typename std::enable_if_t<(VVV::dimension > 1),
int> = 0>
442 const std::string&
name)
446 for (
auto i = 0UL; i < volVarVectorDataInfo_.size(); ++i)
448 if (volVarVectorDataInfo_[i].
name ==
name)
450 volVarVectorDataInfo_[i] = VolVarVectorDataInfo{f,
name, this->
precision()};
451 std::cout << Fmt::format(
452 "VtkOutputModule: Replaced volume variable output \"{}\". "
453 "A field by the same name had already been registered previously.\n",
461 volVarVectorDataInfo_.push_back(VolVarVectorDataInfo{f,
name, this->
precision()});
469 const SolutionVector&
sol()
const {
return sol_; }
479 if constexpr (Concept::FVGridVariables<GridVariables>)
480 return gridVariables_.curGridVolVars();
482 return gridVariables_.curGridVars();
490 const Dune::VTK::DataMode dm = Dune::VTK::conforming;
497 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
500 std::vector<double> rank;
503 std::vector<std::vector<Scalar>> volVarScalarData;
504 std::vector<std::vector<VolVarsVector>> volVarVectorData;
507 if (!volVarScalarDataInfo_.empty()
508 || !volVarVectorDataInfo_.empty()
509 || !this->fields().empty()
510 || velocityOutput_->enableOutput()
513 const auto numCells =
gridGeometry().gridView().size(0);
514 const auto numDofs = numDofs_();
517 if (!volVarScalarDataInfo_.empty())
518 volVarScalarData.resize(volVarScalarDataInfo_.size(), std::vector<Scalar>(numDofs));
519 if (!volVarVectorDataInfo_.empty())
520 volVarVectorData.resize(volVarVectorDataInfo_.size(), std::vector<VolVarsVector>(numDofs));
522 if (velocityOutput_->enableOutput())
524 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
527 velocity[phaseIdx].resize(numCells);
529 velocity[phaseIdx].resize(numDofs);
532 if(isBox && dim == 1)
533 velocity[phaseIdx].resize(numCells);
535 velocity[phaseIdx].resize(numDofs);
541 if (addProcessRank_) rank.resize(numCells);
545 for (
const auto& element : elements(
gridGeometry().gridView()))
547 if (!velocityOutput_->enableOutput() &&
548 element.partitionType() != Dune::PartitionType::InteriorEntity)
552 const auto eIdxGlobal =
gridGeometry().elementMapper().index(element);
555 if (velocityOutput_->enableOutput())
557 fvGeometry.bind(element);
558 elemVolVars.bind(element, fvGeometry, sol_);
562 fvGeometry.bindElement(element);
563 elemVolVars.bindElement(element, fvGeometry, sol_);
567 if (velocityOutput_->enableOutput())
569 if constexpr (Concept::FVGridVariables<GridVariables>)
571 const auto elemFluxVarsCache =
localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
573 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
574 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
578 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
579 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, phaseIdx);
582 else if (element.partitionType() != Dune::PartitionType::InteriorEntity)
587 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
589 using ElementDisc =
typename GridGeometry::LocalView;
592 for (
const auto& scv :
scvs(fvGeometry))
594 const auto dofIdxGlobal = scv.dofIndex();
595 const auto& volVars = elemVolVars[scv];
598 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
599 volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo_[i].get(volVars);
602 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
603 volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo_[i].get(volVars);
609 for (
const auto& localDof : nonCVLocalDofs(fvGeometry))
611 const auto dofIdxGlobal = localDof.dofIndex();
612 const auto& volVars = elemVolVars[localDof];
615 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
616 volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo_[i].get(volVars);
619 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
620 volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo_[i].get(volVars);
627 rank[eIdxGlobal] =
static_cast<double>(
gridGeometry().gridView().comm().rank());
635 if constexpr (isBox || isPQ1Bubble || isPQ2)
637 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
639 volVarScalarDataInfo_[i].
name, 1, dim, dm, this->
precision()) );
640 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
642 volVarVectorDataInfo_[i].
name, dimWorld, dim, dm, this->
precision()) );
644 if constexpr (isPQ1Bubble)
646 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
648 volVarScalarDataInfo_[i].
name, 1, 0,dm, this->
precision()) );
649 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
651 volVarVectorDataInfo_[i].
name, dimWorld, 0,dm, this->
precision()) );
657 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
659 volVarScalarDataInfo_[i].
name, 1, 0,dm, this->
precision()) );
660 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
662 volVarVectorDataInfo_[i].
name, dimWorld, 0,dm, this->
precision()) );
666 if (velocityOutput_->enableOutput())
671 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
673 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
674 dimWorld, dim, dm, this->precision()) );
679 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
681 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
682 dimWorld, 0, dm, this->precision()) );
691 for (
auto&& field : this->
fields())
693 if (field.codim() == 0)
695 else if (field.codim() == dim)
698 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
712 this->addedCellData_.clear();
713 this->addedVertexData_.clear();
719 const Dune::VTK::DataMode dm = Dune::VTK::nonconforming;
722 if(!isBox && !isDiamond)
723 DUNE_THROW(Dune::NotImplemented,
724 "Non-conforming output for discretization scheme " << GridGeometry::discMethod
732 if (enableVelocityOutput_ && !velocityOutput_->enableOutput())
733 std::cerr <<
"Warning! Velocity output was enabled in the input file"
734 <<
" but no velocity output policy was set for the VTK output module:"
735 <<
" There will be no velocity output."
736 <<
" Use the addVelocityOutput member function of the VTK output module." << std::endl;
738 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
741 std::vector<double> rank;
744 using ScalarDataContainer = std::vector< std::vector<Scalar> >;
745 using VectorDataContainer = std::vector< std::vector<VolVarsVector> >;
746 std::vector< ScalarDataContainer > volVarScalarData;
747 std::vector< VectorDataContainer > volVarVectorData;
750 if (!volVarScalarDataInfo_.empty()
751 || !volVarVectorDataInfo_.empty()
752 || !this->fields().empty()
753 || velocityOutput_->enableOutput()
756 const auto numCells =
gridGeometry().gridView().size(0);
757 const auto outputSize = numDofs_();
760 if (!volVarScalarDataInfo_.empty())
761 volVarScalarData.resize(volVarScalarDataInfo_.size(), ScalarDataContainer(numCells));
762 if (!volVarVectorDataInfo_.empty())
763 volVarVectorData.resize(volVarVectorDataInfo_.size(), VectorDataContainer(numCells));
765 if (velocityOutput_->enableOutput())
767 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
769 if((isBox && dim == 1) || isDiamond)
770 velocity[phaseIdx].resize(numCells);
772 velocity[phaseIdx].resize(outputSize);
777 if (addProcessRank_) rank.resize(numCells);
782 for (
const auto& element : elements(
gridGeometry().gridView()))
784 if (!velocityOutput_->enableOutput() &&
785 element.partitionType() != Dune::PartitionType::InteriorEntity)
789 const auto eIdxGlobal =
gridGeometry().elementMapper().index(element);
792 if (velocityOutput_->enableOutput())
794 fvGeometry.bind(element);
795 elemVolVars.bind(element, fvGeometry, sol_);
799 fvGeometry.bindElement(element);
800 elemVolVars.bindElement(element, fvGeometry, sol_);
803 const auto numLocalDofs = Dumux::Detail::LocalDofs::numLocalDofs(fvGeometry);
805 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
806 volVarScalarData[i][eIdxGlobal].resize(numLocalDofs);
807 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
808 volVarVectorData[i][eIdxGlobal].resize(numLocalDofs);
811 if (velocityOutput_->enableOutput())
813 if constexpr (Concept::FVGridVariables<GridVariables>)
815 const auto elemFluxVarsCache =
localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
816 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
817 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
821 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
822 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, phaseIdx);
825 else if (element.partitionType() != Dune::PartitionType::InteriorEntity)
830 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
832 using ElementDisc =
typename GridGeometry::LocalView;
835 for (
const auto& scv :
scvs(fvGeometry))
837 const auto& volVars = elemVolVars[scv];
840 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
841 volVarScalarData[i][eIdxGlobal][scv.localDofIndex()] = volVarScalarDataInfo_[i].get(volVars);
844 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
845 volVarVectorData[i][eIdxGlobal][scv.localDofIndex()] = volVarVectorDataInfo_[i].get(volVars);
851 for (
const auto& localDof : nonCVLocalDofs(fvGeometry))
853 const auto& volVars = elemVolVars[localDof];
856 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
857 volVarScalarData[i][eIdxGlobal][localDof.index()] = volVarScalarDataInfo_[i].get(volVars);
860 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
861 volVarVectorData[i][eIdxGlobal][localDof.index()] = volVarVectorDataInfo_[i].get(volVars);
868 rank[eIdxGlobal] =
static_cast<double>(
gridGeometry().gridView().comm().rank());
876 static constexpr int dofLocCodim = isDiamond ? 1 : dim;
877 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
880 volVarScalarData[i], volVarScalarDataInfo_[i].
name,
884 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
887 volVarVectorData[i], volVarVectorDataInfo_[i].
name,
888 dimWorld, dofLocCodim, dm, this->
precision()
892 if (velocityOutput_->enableOutput())
895 if (dim > 1 && !isDiamond)
896 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
899 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
900 dimWorld, dofLocCodim, dm, this->precision()
905 for (
int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
908 "velocity_" + velocityOutput_->phaseName(phaseIdx) +
" (m/s)",
909 dimWorld, 0, dm, this->precision()
918 rank,
"process rank", 1, 0
922 for (
const auto& field : this->
fields())
924 if (field.codim() == 0)
926 else if (field.codim() == dim || field.codim() == 1)
929 DUNE_THROW(Dune::RangeError,
"Cannot add wrongly sized vtk scalar field!");
942 this->addedCellData_.clear();
943 this->addedVertexData_.clear();
947 std::size_t numDofs_()
const
951 if constexpr (isBox || isDiamond || isPQ1Bubble || isPQ2)
957 const GridVariables& gridVariables_;
958 const SolutionVector& sol_;
960 std::vector<VolVarScalarDataInfo> volVarScalarDataInfo_;
961 std::vector<VolVarVectorDataInfo> volVarVectorDataInfo_;
963 std::shared_ptr<VelocityOutput> velocityOutput_;
964 bool enableVelocityOutput_ =
false;
965 bool addProcessRank_ =
true;
@ vertex
Definition io/velocityoutput.hh:48
@ automatic
Definition io/velocityoutput.hh:48
@ element
Definition io/velocityoutput.hh:48
std::vector< Dune::FieldVector< Scalar, dimWorld > > VelocityVector
Definition io/velocityoutput.hh:41
Velocity output for implicit (porous media) models.
Definition io/velocityoutput.hh:27
Dumux::Vtk::Precision precision() const
Definition io/vtkoutputmodule.hh:211
const std::string & paramGroup() const
Definition io/vtkoutputmodule.hh:84
void addCellData(const Field &field)
Definition io/vtkoutputmodule.hh:218
void write(double time, Dune::VTK::OutputType type=Dune::VTK::ascii)
Definition io/vtkoutputmodule.hh:187
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:62
Dune::VTK::DataMode dataMode() const
Definition io/vtkoutputmodule.hh:210
Dune::VTKWriter< GridView > & writer()
Definition io/vtkoutputmodule.hh:213
Dune::VTKSequenceWriter< GridView > & sequenceWriter()
Definition io/vtkoutputmodule.hh:214
const std::string & name() const
Definition io/vtkoutputmodule.hh:209
const std::vector< Field > & fields() const
Definition io/vtkoutputmodule.hh:216
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:304
std::vector< std::string > addedCellData_
Definition io/vtkoutputmodule.hh:238
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:113
bool verbose() const
Definition io/vtkoutputmodule.hh:208
Vtk::template Field< GridView > Field
the type of Field that can be added to this writer
Definition io/vtkoutputmodule.hh:60
std::vector< std::string > addedVertexData_
Definition io/vtkoutputmodule.hh:239
virtual void writeConforming_(double time, Dune::VTK::OutputType type)
Assembles the fields and adds them to the writer (conforming output).
Definition io/vtkoutputmodule.hh:243
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:97
void addVertexData(const Field &field)
Definition io/vtkoutputmodule.hh:227
const Dumux::GridDiscretization_t< GridVariables > & gridGeometry() const
Definition io/vtkoutputmodule.hh:206
void addField(Field &&field)
Add a scalar or vector valued vtk field.
Definition io/vtkoutputmodule.hh:160
const auto & problem() const
Definition io/vtkoutputmodule.hh:466
const GridVariables & gridVariables() const
Definition io/vtkoutputmodule.hh:467
void addVolumeVariable(std::function< VolVarsVector(const VolumeVariables &)> &&f, const std::string &name)
Definition io/vtkoutputmodule.hh:441
VV VolumeVariables
export type of the volume variables for the outputfields
Definition io/vtkoutputmodule.hh:379
void addVolumeVariable(std::function< Scalar(const VolumeVariables &)> &&f, const std::string &name)
Definition io/vtkoutputmodule.hh:413
void addVelocityOutput(std::shared_ptr< VelocityOutputType > velocityOutput)
Add a velocity output policy.
Definition io/vtkoutputmodule.hh:407
const auto & curGridVariables_() const
Definition io/vtkoutputmodule.hh:477
const VelocityOutput & velocityOutput() const
Definition io/vtkoutputmodule.hh:475
VelocityOutputType VelocityOutput
Definition io/vtkoutputmodule.hh:474
Vtk::template Field< GridView > Field
the type of Field that can be added to this writer
Definition io/vtkoutputmodule.hh:377
void writeNonConforming_(double time, Dune::VTK::OutputType type) override
Assembles the fields and adds them to the writer (nonconforming output).
Definition io/vtkoutputmodule.hh:717
const SolutionVector & sol() const
Definition io/vtkoutputmodule.hh:469
const GridGeometry & gridGeometry() const
Definition io/vtkoutputmodule.hh:468
void writeConforming_(double time, Dune::VTK::OutputType type) override
Assembles the fields and adds them to the writer (conforming output).
Definition io/vtkoutputmodule.hh:488
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:381
const std::vector< VolVarScalarDataInfo > & volVarScalarDataInfo() const
Definition io/vtkoutputmodule.hh:471
const std::vector< VolVarVectorDataInfo > & volVarVectorDataInfo() const
Definition io/vtkoutputmodule.hh:472
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.
Type traits for classes providing a grid discretization.
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
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
typename Detail::GridDiscretizationType< T >::type GridDiscretization_t
The grid discretization type of a class exporting it.
Definition griddiscretization.hh:54
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.