GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/io/vtkoutputmodule.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 281 314 89.5%
Functions: 1766 2472 71.4%
Branches: 786 1713 45.9%

Line Branch Exec Source
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
3 //
4 // SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5 // SPDX-License-Identifier: GPL-3.0-or-later
6 //
7 /*!
8 * \file
9 * \ingroup InputOutput
10 * \brief A VTK output module to simplify writing dumux simulation data to VTK format
11 */
12 #ifndef DUMUX_IO_VTK_OUTPUT_MODULE_HH
13 #define DUMUX_IO_VTK_OUTPUT_MODULE_HH
14
15 #include <functional>
16 #include <memory>
17 #include <string>
18
19 #include <dune/common/timer.hh>
20 #include <dune/common/fvector.hh>
21 #include <dune/common/typetraits.hh>
22
23 #include <dune/geometry/type.hh>
24 #include <dune/geometry/multilineargeometry.hh>
25
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>
31
32 #include <dumux/common/parameters.hh>
33 #include <dumux/io/format.hh>
34 #include <dumux/discretization/method.hh>
35
36 #include <dumux/io/vtk/function.hh>
37 #include <dumux/io/vtk/fieldtype.hh>
38 #include "velocityoutput.hh"
39
40 namespace Dumux {
41
42 /*!
43 * \ingroup InputOutput
44 * \brief A VTK output module to simplify writing dumux simulation data to VTK format
45 * \note This is a base class providing only rudimentary features
46 */
47 template<class GridGeometry>
48 class VtkOutputModuleBase
49 {
50 using GridView = typename GridGeometry::GridView;
51 static constexpr int dim = GridView::dimension;
52
53 public:
54 //! the type of Field that can be added to this writer
55 using Field = Vtk::template Field<GridView>;
56
57 1013 VtkOutputModuleBase(const GridGeometry& gridGeometry,
58 const std::string& name,
59 const std::string& paramGroup = "",
60 Dune::VTK::DataMode dm = Dune::VTK::conforming,
61 bool verbose = true)
62 1013 : gridGeometry_(gridGeometry)
63
1/2
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
1013 , name_(name)
64
1/2
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
1013 , paramGroup_(paramGroup)
65 1013 , dm_(dm)
66
7/9
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 656 times.
✓ Branch 5 taken 111 times.
✓ Branch 6 taken 638 times.
✓ Branch 8 taken 492 times.
✗ Branch 9 not taken.
✓ Branch 7 taken 104 times.
2046 , verbose_(gridGeometry.gridView().comm().rank() == 0 && verbose)
67 {
68
1/2
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
1013 const auto precisionString = getParamFromGroup<std::string>(paramGroup, "Vtk.Precision", "Float32");
69
1/2
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
1013 precision_ = Dumux::Vtk::stringToPrecision(precisionString);
70
2/4
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 755 times.
✗ Branch 5 not taken.
1013 const auto coordPrecision = Dumux::Vtk::stringToPrecision(getParamFromGroup<std::string>(paramGroup, "Vtk.CoordPrecision", precisionString));
71
3/6
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 755 times.
✓ Branch 6 taken 755 times.
✗ Branch 7 not taken.
1013 writer_ = std::make_shared<Dune::VTKWriter<GridView>>(gridGeometry.gridView(), dm, coordPrecision);
72
1/2
✓ Branch 1 taken 755 times.
✗ Branch 2 not taken.
1013 sequenceWriter_ = std::make_unique<Dune::VTKSequenceWriter<GridView>>(writer_, name);
73 1013 addProcessRank_ = getParamFromGroup<bool>(this->paramGroup(), "Vtk.AddProcessRank", true);
74 1013 }
75
76
1/2
✓ Branch 2 taken 755 times.
✗ Branch 3 not taken.
3020 virtual ~VtkOutputModuleBase() = default;
77
78 //! the parameter group for getting parameter from the parameter tree
79
3/6
✓ Branch 1 taken 625 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 128 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
755 const std::string& paramGroup() const
80
43/86
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 1 times.
✗ Branch 73 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 76 not taken.
✓ Branch 78 taken 1 times.
✗ Branch 79 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 82 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 85 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 1 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 1 times.
✗ Branch 97 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 1 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 1 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 1 times.
✗ Branch 121 not taken.
✓ Branch 123 taken 1 times.
✗ Branch 124 not taken.
✓ Branch 126 taken 1 times.
✗ Branch 127 not taken.
✓ Branch 129 taken 1 times.
✗ Branch 130 not taken.
✓ Branch 132 taken 1 times.
✗ Branch 133 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 1 times.
✗ Branch 143 not taken.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
✓ Branch 1 taken 50 times.
✗ Branch 4 not taken.
826 { return paramGroup_; }
81
82 /*!
83 * \brief Add a scalar or vector valued vtk field
84 *
85 * \param v The field to be added. Can be any indexable container. Its value type can be a number or itself an indexable container.
86 * \param name The name of the field
87 * \param fieldType The type of the field.
88 * This determines whether the values are associated with vertices or elements.
89 * By default, the method automatically deduces the correct type for the given input.
90 */
91 template<typename Vector>
92 579 void addField(const Vector& v,
93 const std::string& name,
94 Vtk::FieldType fieldType = Vtk::FieldType::automatic)
95 579 { addField(v, name, this->precision(), fieldType); }
96
97 /*!
98 * \brief Add a scalar or vector valued vtk field
99 *
100 * \param v The field to be added. Can be any indexable container. Its value type can be a number or itself an indexable container.
101 * \param name The name of the field
102 * \param fieldType The type of the field.
103 * This determines whether the values are associated with vertices or elements.
104 * By default, the method automatically deduces the correct type for the given input.
105 * \param precision The output precision of this field (see Dune::VTK::Precision)
106 */
107 template<typename Vector>
108
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
978 void addField(const Vector& v,
109 const std::string& name,
110 Dumux::Vtk::Precision precision,
111 Vtk::FieldType fieldType = Vtk::FieldType::automatic)
112 {
113 // Deduce the number of components from the given vector type
114 978 const auto nComp = getNumberOfComponents_(v);
115
116 981 const auto numElemDofs = gridGeometry().elementMapper().size();
117
2/2
✓ Branch 0 taken 402 times.
✓ Branch 1 taken 190 times.
978 const auto numVertexDofs = gridGeometry().vertexMapper().size();
118
119 // Automatically deduce the field type ...
120
2/2
✓ Branch 0 taken 402 times.
✓ Branch 1 taken 190 times.
978 if(fieldType == Vtk::FieldType::automatic)
121 {
122
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
598 if(numElemDofs == numVertexDofs)
123
2/22
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 33 taken 52 times.
✓ Branch 34 taken 341 times.
585 DUNE_THROW(Dune::InvalidStateException, "Automatic deduction of FieldType failed. Please explicitly specify FieldType::element or FieldType::vertex.");
124
125
2/2
✓ Branch 0 taken 61 times.
✓ Branch 1 taken 341 times.
598 if(v.size() == numElemDofs)
126 fieldType = Vtk::FieldType::element;
127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 61 times.
72 else if(v.size() == numVertexDofs)
128 fieldType = Vtk::FieldType::vertex;
129 else
130 DUNE_THROW(Dune::RangeError, "Size mismatch of added field!");
131 }
132 // ... or check if the user-specified type matches the size of v
133 else
134 {
135
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 59 times.
380 if(fieldType == Vtk::FieldType::element)
136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 131 times.
262 if(v.size() != numElemDofs)
137 DUNE_THROW(Dune::RangeError, "Size mismatch of added field!");
138
139
2/2
✓ Branch 0 taken 59 times.
✓ Branch 1 taken 131 times.
380 if(fieldType == Vtk::FieldType::vertex)
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 59 times.
118 if(v.size() != numVertexDofs)
141 DUNE_THROW(Dune::RangeError, "Size mismatch of added field!");
142 }
143
144 // add the appropriate field
145
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 59 times.
380 if (fieldType == Vtk::FieldType::element)
146
1/2
✓ Branch 2 taken 472 times.
✗ Branch 3 not taken.
1576 addField(Field(gridGeometry_.gridView(), gridGeometry_.elementMapper(), v, name, nComp, 0, dm_, precision));
147 else
148
1/2
✓ Branch 2 taken 120 times.
✗ Branch 3 not taken.
380 addField(Field(gridGeometry_.gridView(), gridGeometry_.vertexMapper(), v, name, nComp, dim, dm_, precision));
149 978 }
150
151 /*!
152 * \brief Add a scalar or vector valued vtk field
153 * \param field The parameters passed on to the field constructor
154 */
155 704 void addField(Field&& field)
156 {
157 // data arrays in the vtk output have to be unique within cell and point data
158 // look if we have a field by the same name with the same codim, if so, replace it
159
2/2
✓ Branch 0 taken 1006 times.
✓ Branch 1 taken 592 times.
1746 for (auto i = 0UL; i < fields_.size(); ++i)
160 {
161
4/12
✓ Branch 1 taken 1006 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1006 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1006 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1006 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
2084 if (fields_[i].name() == field.name() && fields_[i].codim() == field.codim())
162 {
163 fields_[i] = std::move(field);
164 std::cout << Fmt::format(
165 "VtkOutputModule: Replaced field \"{}\" (codim {}). "
166 "A field by the same name & codim had already been registered previously.\n",
167 field.name(), field.codim()
168 );
169 return;
170 }
171 }
172
173 // otherwise add it to the end of the fields
174 704 fields_.push_back(std::move(field));
175 }
176
177 //! Write the data for this timestep to file in four steps
178 //! (1) We assemble all registered variable fields
179 //! (2) We register them with the vtk writer
180 //! (3) The writer writes the output for us
181 //! (4) Clear the writer for the next time step
182 8200 void write(double time, Dune::VTK::OutputType type = Dune::VTK::ascii)
183 {
184 8200 Dune::Timer timer;
185
186 // write to file depending on data mode
187
2/2
✓ Branch 0 taken 6904 times.
✓ Branch 1 taken 52 times.
8200 if (dm_ == Dune::VTK::conforming)
188 8128 writeConforming_(time, type);
189
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
72 else if (dm_ == Dune::VTK::nonconforming)
190 72 writeNonConforming_(time, type);
191 else
192 DUNE_THROW(Dune::NotImplemented, "Output for provided VTK data mode");
193
194 //! output
195 8200 timer.stop();
196
2/2
✓ Branch 0 taken 6583 times.
✓ Branch 1 taken 373 times.
8200 if (verbose_)
197 15654 std::cout << Fmt::format("Writing output for problem \"{}\". Took {:.2g} seconds.\n", name_, timer.elapsed());
198 8200 }
199
200 protected:
201
8/8
✓ Branch 0 taken 277 times.
✓ Branch 1 taken 96 times.
✓ Branch 2 taken 73 times.
✓ Branch 3 taken 44 times.
✓ Branch 4 taken 25 times.
✓ Branch 5 taken 46 times.
✓ Branch 6 taken 18 times.
✓ Branch 7 taken 4 times.
588 const GridGeometry& gridGeometry() const { return gridGeometry_; }
202
203
1/2
✓ Branch 0 taken 170 times.
✗ Branch 1 not taken.
170 bool verbose() const { return verbose_; }
204
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
176 const std::string& name() const { return name_; }
205
4/12
✓ Branch 1 taken 1700 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1700 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 170 times.
3576 Dune::VTK::DataMode dataMode() const { return dm_; }
206
26/40
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 115 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 56 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 37 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 6 times.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 2 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 2 taken 21 times.
✓ Branch 5 taken 21 times.
✓ Branch 8 taken 21 times.
✓ Branch 1 taken 171 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
56059 Dumux::Vtk::Precision precision() const { return precision_; }
207
208 176 Dune::VTKWriter<GridView>& writer() { return *writer_; }
209
4/26
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1700 times.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 15 taken 170 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 170 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
98766 Dune::VTKSequenceWriter<GridView>& sequenceWriter() { return *sequenceWriter_; }
210
211
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7124 const std::vector<Field>& fields() const { return fields_; }
212
213 73681 void addCellData(const Field& field)
214 {
215
1/2
✓ Branch 2 taken 63922 times.
✗ Branch 3 not taken.
147362 if (std::ranges::find(addedCellData_, field.name()) == addedCellData_.end())
216 {
217
2/4
✓ Branch 2 taken 63922 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63922 times.
✗ Branch 5 not taken.
147362 this->sequenceWriter().addCellData(field.get());
218
1/2
✓ Branch 2 taken 63922 times.
✗ Branch 3 not taken.
73681 addedCellData_.push_back(field.name());
219 }
220 73681 }
221
222 33881 void addVertexData(const Field& field)
223 {
224
1/2
✓ Branch 2 taken 32798 times.
✗ Branch 3 not taken.
67762 if (std::ranges::find(addedVertexData_, field.name()) == addedVertexData_.end())
225 {
226
2/4
✓ Branch 2 taken 32798 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32798 times.
✗ Branch 5 not taken.
67762 this->sequenceWriter().addVertexData(field.get());
227
1/2
✓ Branch 2 taken 32798 times.
✗ Branch 3 not taken.
33881 addedVertexData_.push_back(field.name());
228 }
229 33881 }
230
231 // keep track of what has been already added because Dune::VTK::Writer
232 // potentially adds the same field twice which is not allowed in VTK/Paraview
233 std::vector<std::string> addedCellData_;
234 std::vector<std::string> addedVertexData_;
235
236 private:
237 //! Assembles the fields and adds them to the writer (conforming output)
238 6 virtual void writeConforming_(double time, Dune::VTK::OutputType type)
239 {
240 //////////////////////////////////////////////////////////////
241 //! (1) Assemble all variable fields and add to writer
242 //////////////////////////////////////////////////////////////
243
244 // process rank
245 6 std::vector<int> rank;
246
247 //! Abort if no data was registered
248
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6 if (!fields_.empty() || addProcessRank_)
249 {
250
2/3
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 0 taken 1 times.
6 const auto numCells = gridGeometry_.gridView().size(0);
251
252 // maybe allocate space for the process rank
253
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 if (addProcessRank_)
254 {
255
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 rank.resize(numCells);
256
257
4/13
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 29 times.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
87 for (const auto& element : elements(gridGeometry_.gridView(), Dune::Partitions::interior))
258 {
259
0/3
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 0 not taken.
25 const auto eIdxGlobal = gridGeometry_.elementMapper().index(element);
260
1/5
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
✗ Branch 0 not taken.
✗ Branch 4 not taken.
25 rank[eIdxGlobal] = gridGeometry_.gridView().comm().rank();
261 }
262 }
263
264 //////////////////////////////////////////////////////////////
265 //! (2) Register data fields with the vtk writer
266 //////////////////////////////////////////////////////////////
267
268 // the process rank
269
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 if (addProcessRank_)
270
3/8
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
10 this->addCellData(Field(gridGeometry_.gridView(), gridGeometry_.elementMapper(), rank, "process rank", 1, 0));
271
272 // also register additional (non-standardized) user fields if any
273
3/4
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 6 times.
25 for (auto&& field : fields_)
274 {
275
1/2
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
19 if (field.codim() == 0)
276
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
19 this->addCellData(field);
277 else if (field.codim() == dim)
278 this->addVertexData(field);
279 else
280
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
19 DUNE_THROW(Dune::RangeError, "Cannot add wrongly sized vtk scalar field!");
281 }
282 }
283
284 //////////////////////////////////////////////////////////////
285 //! (2) The writer writes the output for us
286 //////////////////////////////////////////////////////////////
287
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 this->sequenceWriter().write(time, type);
288
289 //////////////////////////////////////////////////////////////
290 //! (3) Clear the writer
291 //////////////////////////////////////////////////////////////
292 6 this->writer().clear();
293
294
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 this->addedCellData_.clear();
295
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
6 this->addedVertexData_.clear();
296 6 }
297
298 //! Assembles the fields and adds them to the writer (nonconforming output)
299 virtual void writeNonConforming_(double time, Dune::VTK::OutputType type)
300 {
301 DUNE_THROW(Dune::NotImplemented, "Non-conforming VTK output");
302 }
303
304 //! Deduces the number of components of the value type of a vector of values
305 template<class Vector>
306 std::size_t getNumberOfComponents_(const Vector& v)
307 {
308 if constexpr (Dune::IsIndexable<decltype(std::declval<Vector>()[0])>::value)
309
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 return v[0].size();
310 else
311 return 1;
312 }
313
314 const GridGeometry& gridGeometry_;
315 std::string name_;
316 const std::string paramGroup_;
317 Dune::VTK::DataMode dm_;
318 bool verbose_;
319 Dumux::Vtk::Precision precision_;
320
321 std::shared_ptr<Dune::VTKWriter<GridView>> writer_;
322 std::unique_ptr<Dune::VTKSequenceWriter<GridView>> sequenceWriter_;
323
324 std::vector<Field> fields_; //!< Registered scalar and vector fields
325
326 bool addProcessRank_ = true;
327 };
328
329 /*!
330 * \ingroup InputOutput
331 * \brief A VTK output module to simplify writing dumux simulation data to VTK format
332 *
333 * \tparam GridVariables The grid variables
334 * \tparam SolutionVector The solution vector
335 *
336 * Handles the output of scalar and vector fields to VTK formatted file for multiple
337 * variables and timesteps. Certain predefined fields can be registered on
338 * initialization and/or be turned on/off using the designated properties. Additionally
339 * non-standardized scalar and vector fields can be added to the writer manually.
340 */
341 template<class GridVariables, class SolutionVector>
342 class VtkOutputModule : public VtkOutputModuleBase<typename GridVariables::GridGeometry>
343 {
344 using ParentType = VtkOutputModuleBase<typename GridVariables::GridGeometry>;
345 using GridGeometry = typename GridVariables::GridGeometry;
346
347 using VV = typename GridVariables::VolumeVariables;
348 using Scalar = typename GridVariables::Scalar;
349
350 using GridView = typename GridGeometry::GridView;
351
352 enum {
353 dim = GridView::dimension,
354 dimWorld = GridView::dimensionworld
355 };
356
357 using Element = typename GridView::template Codim<0>::Entity;
358 using VolVarsVector = Dune::FieldVector<Scalar, dimWorld>;
359
360 static constexpr bool isBox = GridGeometry::discMethod == DiscretizationMethods::box;
361 static constexpr bool isDiamond = GridGeometry::discMethod == DiscretizationMethods::fcdiamond;
362 static constexpr bool isPQ1Bubble = GridGeometry::discMethod == DiscretizationMethods::pq1bubble;
363
364 struct VolVarScalarDataInfo { std::function<Scalar(const VV&)> get; std::string name; Dumux::Vtk::Precision precision_; };
365 struct VolVarVectorDataInfo { std::function<VolVarsVector(const VV&)> get; std::string name; Dumux::Vtk::Precision precision_; };
366
367 using VelocityOutputType = Dumux::VelocityOutput<GridVariables>;
368
369 public:
370 //! the type of Field that can be added to this writer
371 using Field = Vtk::template Field<GridView>;
372 //! export type of the volume variables for the outputfields
373 using VolumeVariables = VV;
374
375 1043 VtkOutputModule(const GridVariables& gridVariables,
376 const SolutionVector& sol,
377 const std::string& name,
378 const std::string& paramGroup = "",
379 Dune::VTK::DataMode dm = Dune::VTK::conforming,
380 bool verbose = true)
381 1042 : ParentType(gridVariables.gridGeometry(), name, paramGroup, dm, verbose)
382 1043 , gridVariables_(gridVariables)
383 1043 , sol_(sol)
384
1/2
✓ Branch 2 taken 749 times.
✗ Branch 3 not taken.
1043 , velocityOutput_(std::make_shared<VelocityOutputType>())
385 {
386
1/2
✓ Branch 1 taken 749 times.
✗ Branch 2 not taken.
1043 enableVelocityOutput_ = getParamFromGroup<bool>(this->paramGroup(), "Vtk.AddVelocity", false);
387
1/2
✓ Branch 1 taken 749 times.
✗ Branch 2 not taken.
1043 addProcessRank_ = getParamFromGroup<bool>(this->paramGroup(), "Vtk.AddProcessRank", true);
388 1043 }
389
390 //////////////////////////////////////////////////////////////////////////////////////////////
391 //! Methods to conveniently add primary and secondary variables upon initialization
392 //! Do not call these methods after initialization i.e. _not_ within the time loop
393 //////////////////////////////////////////////////////////////////////////////////////////////
394
395 /*!
396 * \brief Add a velocity output policy
397 *
398 * \param velocityOutput the output policy
399 * \note the default policy does not add any velocity output
400 */
401 462 void addVelocityOutput(std::shared_ptr<VelocityOutputType> velocityOutput)
402
24/48
✓ Branch 1 taken 405 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
462 { velocityOutput_ = velocityOutput; }
403
404 //! Output a scalar volume variable
405 //! \param name The name of the vtk field
406 //! \param f A function taking a VolumeVariables object and returning the desired scalar
407 5584 void addVolumeVariable(std::function<Scalar(const VolumeVariables&)>&& f,
408 const std::string& name)
409 {
410 // data arrays in the vtk output have to be unique within cell and point data
411 // look if we have a field by the same name with the same codim, if so, replace it
412
2/2
✓ Branch 0 taken 27952 times.
✓ Branch 1 taken 4483 times.
38600 for (auto i = 0UL; i < volVarScalarDataInfo_.size(); ++i)
413 {
414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27952 times.
33016 if (volVarScalarDataInfo_[i].name == name)
415 {
416 volVarScalarDataInfo_[i] = VolVarScalarDataInfo{f, name, this->precision()};
417 std::cout << Fmt::format(
418 "VtkOutputModule: Replaced volume variable output \"{}\". "
419 "A field by the same name had already been registered previously.\n",
420 name
421 );
422 return;
423 }
424 }
425
426 // otherwise add it to the end of the fields
427 5584 volVarScalarDataInfo_.push_back(VolVarScalarDataInfo{f, name, this->precision()});
428 11168 }
429
430 //! Add a vector-valued variable
431 //! \param f A function taking a VolumeVariables object and returning the desired vector
432 //! \param name The name of the vtk field
433 //! \note This method is only available for dimWorld > 1. For 1-D problems, the overload for volVar methods returning a Scalar will be used.
434 template<class VVV = VolVarsVector, typename std::enable_if_t<(VVV::dimension > 1), int> = 0>
435 151 void addVolumeVariable(std::function<VolVarsVector(const VolumeVariables&)>&& f,
436 const std::string& name)
437 {
438 // data arrays in the vtk output have to be unique within cell and point data
439 // look if we have a field by the same name with the same codim, if so, replace it
440
2/2
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 111 times.
221 for (auto i = 0UL; i < volVarVectorDataInfo_.size(); ++i)
441 {
442
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
70 if (volVarVectorDataInfo_[i].name == name)
443 {
444 volVarVectorDataInfo_[i] = VolVarVectorDataInfo{f, name, this->precision()};
445 std::cout << Fmt::format(
446 "VtkOutputModule: Replaced volume variable output \"{}\". "
447 "A field by the same name had already been registered previously.\n",
448 name
449 );
450 return;
451 }
452 }
453
454 // otherwise add it to the end of the fields
455 151 volVarVectorDataInfo_.push_back(VolVarVectorDataInfo{f, name, this->precision()});
456 302 }
457
458 protected:
459 // some return functions for differing implementations to use
460
11/19
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 22 taken 4368 times.
✗ Branch 23 not taken.
✓ Branch 26 taken 2014 times.
✗ Branch 27 not taken.
✓ Branch 2 taken 21 times.
✓ Branch 5 taken 21 times.
✓ Branch 8 taken 21 times.
227942 const auto& problem() const { return gridVariables_.curGridVolVars().problem(); }
461 const GridVariables& gridVariables() const { return gridVariables_; }
462
242/477
✓ Branch 1 taken 3362 times.
✓ Branch 2 taken 38 times.
✓ Branch 4 taken 23556 times.
✓ Branch 5 taken 46780 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 2527475 times.
✓ Branch 10 taken 33735 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2187 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 11 times.
✓ Branch 17 taken 45 times.
✓ Branch 19 taken 111567 times.
✓ Branch 20 taken 665 times.
✓ Branch 22 taken 4397 times.
✓ Branch 23 taken 2331 times.
✓ Branch 25 taken 3468 times.
✓ Branch 26 taken 814972 times.
✓ Branch 28 taken 557465 times.
✓ Branch 29 taken 11488 times.
✓ Branch 30 taken 648 times.
✓ Branch 31 taken 579102 times.
✓ Branch 34 taken 3229 times.
✓ Branch 35 taken 222 times.
✓ Branch 37 taken 457 times.
✓ Branch 38 taken 6 times.
✓ Branch 40 taken 22 times.
✓ Branch 41 taken 410 times.
✓ Branch 43 taken 1982 times.
✓ Branch 44 taken 129141 times.
✓ Branch 46 taken 304450 times.
✓ Branch 47 taken 850 times.
✓ Branch 49 taken 941 times.
✓ Branch 50 taken 7 times.
✓ Branch 52 taken 1609 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 15456 times.
✓ Branch 55 taken 49 times.
✓ Branch 58 taken 124 times.
✓ Branch 59 taken 2 times.
✓ Branch 61 taken 22 times.
✓ Branch 62 taken 4460 times.
✓ Branch 64 taken 44 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 25 times.
✓ Branch 68 taken 67 times.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 21 times.
✓ Branch 76 taken 3 times.
✓ Branch 77 taken 11 times.
✓ Branch 78 taken 2 times.
✓ Branch 79 taken 25 times.
✓ Branch 82 taken 10 times.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 1 times.
✓ Branch 95 taken 8 times.
✓ Branch 97 taken 3 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 1 times.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✓ Branch 103 taken 25 times.
✓ Branch 106 taken 9 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 4 times.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✓ Branch 115 taken 1 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 1 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 1 times.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✓ Branch 127 taken 25 times.
✓ Branch 130 taken 12 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 2 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 1100 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 1 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 1 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 1 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 11 times.
✓ Branch 151 taken 25 times.
✓ Branch 154 taken 16 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 2 times.
✗ Branch 158 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✓ Branch 163 taken 1 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 1 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 1 times.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✓ Branch 175 taken 25 times.
✓ Branch 178 taken 19 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 2 times.
✗ Branch 182 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 1 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✓ Branch 199 taken 25 times.
✓ Branch 202 taken 10 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 2 times.
✗ Branch 206 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✓ Branch 211 taken 1 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 1 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 1 times.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✓ Branch 223 taken 25 times.
✓ Branch 226 taken 13 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 2 times.
✗ Branch 230 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 1 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 1 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 1 times.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✓ Branch 247 taken 25 times.
✓ Branch 250 taken 17 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 2 times.
✗ Branch 254 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✓ Branch 259 taken 1 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 1 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✓ Branch 271 taken 25 times.
✓ Branch 274 taken 20 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 2 times.
✗ Branch 278 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✓ Branch 283 taken 1 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 1 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✓ Branch 295 taken 25 times.
✓ Branch 298 taken 15 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 2 times.
✗ Branch 302 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✓ Branch 307 taken 1 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 1 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 1 times.
✗ Branch 317 not taken.
✗ Branch 318 not taken.
✓ Branch 319 taken 25 times.
✓ Branch 322 taken 18 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 2 times.
✗ Branch 326 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✓ Branch 331 taken 1 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 1 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 1 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 1 times.
✗ Branch 341 not taken.
✗ Branch 342 not taken.
✓ Branch 343 taken 25 times.
✓ Branch 346 taken 22 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 2 times.
✗ Branch 350 not taken.
✗ Branch 352 not taken.
✗ Branch 353 not taken.
✓ Branch 355 taken 1 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 1 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 1 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 1 times.
✗ Branch 365 not taken.
✗ Branch 366 not taken.
✓ Branch 367 taken 25 times.
✓ Branch 370 taken 25 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 2 times.
✗ Branch 374 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✓ Branch 379 taken 1 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 1 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 1 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 1 times.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✓ Branch 391 taken 25 times.
✓ Branch 394 taken 11 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 2 times.
✗ Branch 398 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✓ Branch 403 taken 1 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 1 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 1 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 1 times.
✗ Branch 413 not taken.
✗ Branch 414 not taken.
✓ Branch 415 taken 25 times.
✓ Branch 418 taken 14 times.
✗ Branch 419 not taken.
✓ Branch 421 taken 2 times.
✗ Branch 422 not taken.
✗ Branch 424 not taken.
✗ Branch 425 not taken.
✓ Branch 427 taken 1 times.
✗ Branch 428 not taken.
✓ Branch 430 taken 1 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 1 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 1 times.
✗ Branch 437 not taken.
✗ Branch 438 not taken.
✓ Branch 439 taken 25 times.
✓ Branch 442 taken 18 times.
✗ Branch 443 not taken.
✓ Branch 445 taken 2 times.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✓ Branch 451 taken 1 times.
✗ Branch 452 not taken.
✓ Branch 454 taken 1 times.
✗ Branch 455 not taken.
✓ Branch 457 taken 1 times.
✗ Branch 458 not taken.
✓ Branch 460 taken 1 times.
✗ Branch 461 not taken.
✗ Branch 462 not taken.
✓ Branch 463 taken 25 times.
✓ Branch 466 taken 21 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 2 times.
✗ Branch 470 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✓ Branch 475 taken 1 times.
✗ Branch 476 not taken.
✓ Branch 478 taken 1 times.
✗ Branch 479 not taken.
✓ Branch 481 taken 1 times.
✗ Branch 482 not taken.
✓ Branch 484 taken 1 times.
✗ Branch 485 not taken.
✗ Branch 486 not taken.
✓ Branch 487 taken 25 times.
✓ Branch 490 taken 11 times.
✗ Branch 491 not taken.
✓ Branch 493 taken 2 times.
✗ Branch 494 not taken.
✗ Branch 496 not taken.
✗ Branch 497 not taken.
✓ Branch 499 taken 1 times.
✗ Branch 500 not taken.
✓ Branch 502 taken 1 times.
✗ Branch 503 not taken.
✓ Branch 505 taken 1 times.
✗ Branch 506 not taken.
✓ Branch 508 taken 1 times.
✗ Branch 509 not taken.
✗ Branch 510 not taken.
✓ Branch 511 taken 25 times.
✓ Branch 514 taken 14 times.
✗ Branch 515 not taken.
✓ Branch 517 taken 2 times.
✗ Branch 518 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✓ Branch 523 taken 1 times.
✗ Branch 524 not taken.
✓ Branch 526 taken 1 times.
✗ Branch 527 not taken.
✓ Branch 529 taken 1 times.
✗ Branch 530 not taken.
✓ Branch 532 taken 1 times.
✗ Branch 533 not taken.
✗ Branch 534 not taken.
✓ Branch 535 taken 25 times.
✓ Branch 538 taken 18 times.
✗ Branch 539 not taken.
✓ Branch 541 taken 2 times.
✗ Branch 542 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✓ Branch 547 taken 1 times.
✗ Branch 548 not taken.
✓ Branch 550 taken 1 times.
✗ Branch 551 not taken.
✓ Branch 553 taken 1 times.
✗ Branch 554 not taken.
✓ Branch 556 taken 1 times.
✗ Branch 557 not taken.
✗ Branch 558 not taken.
✓ Branch 559 taken 25 times.
✓ Branch 562 taken 21 times.
✗ Branch 563 not taken.
✓ Branch 565 taken 2 times.
✗ Branch 566 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✓ Branch 571 taken 1 times.
✗ Branch 572 not taken.
✓ Branch 574 taken 1 times.
✗ Branch 575 not taken.
✓ Branch 626 taken 1 times.
✗ Branch 627 not taken.
✓ Branch 630 taken 1 times.
✗ Branch 631 not taken.
✓ Branch 634 taken 1 times.
✗ Branch 635 not taken.
✓ Branch 638 taken 1 times.
✗ Branch 639 not taken.
✓ Branch 642 taken 1 times.
✗ Branch 643 not taken.
✓ Branch 646 taken 1 times.
✗ Branch 647 not taken.
✓ Branch 650 taken 1 times.
✗ Branch 651 not taken.
✓ Branch 654 taken 1 times.
✗ Branch 655 not taken.
✓ Branch 658 taken 1 times.
✗ Branch 659 not taken.
✓ Branch 662 taken 1 times.
✗ Branch 663 not taken.
✓ Branch 666 taken 1 times.
✗ Branch 667 not taken.
✓ Branch 670 taken 1 times.
✗ Branch 671 not taken.
✓ Branch 674 taken 1 times.
✗ Branch 675 not taken.
✓ Branch 678 taken 1 times.
✗ Branch 679 not taken.
✓ Branch 682 taken 1 times.
✗ Branch 683 not taken.
✓ Branch 686 taken 1 times.
✗ Branch 687 not taken.
✓ Branch 690 taken 1 times.
✗ Branch 691 not taken.
✓ Branch 694 taken 1 times.
✗ Branch 695 not taken.
✓ Branch 698 taken 1 times.
✗ Branch 699 not taken.
✓ Branch 702 taken 1 times.
✗ Branch 703 not taken.
✓ Branch 706 taken 1 times.
✗ Branch 707 not taken.
✓ Branch 710 taken 1 times.
✗ Branch 711 not taken.
✓ Branch 714 taken 1 times.
✗ Branch 715 not taken.
✓ Branch 718 taken 1 times.
✗ Branch 719 not taken.
✓ Branch 3 taken 31944 times.
✓ Branch 8 taken 5739 times.
✓ Branch 9 taken 1210 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 11 times.
✓ Branch 18 taken 78 times.
✓ Branch 21 taken 5408 times.
✓ Branch 24 taken 292 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 513 times.
✓ Branch 36 taken 3 times.
✓ Branch 39 taken 261 times.
✓ Branch 42 taken 107 times.
✓ Branch 45 taken 557 times.
✓ Branch 48 taken 9134 times.
✗ Branch 51 not taken.
✓ Branch 57 taken 76 times.
✓ Branch 60 taken 661 times.
✓ Branch 27 taken 275459 times.
✓ Branch 56 taken 87 times.
✗ Branch 63 not taken.
✓ Branch 66 taken 2202 times.
✗ Branch 69 not taken.
✓ Branch 0 taken 9 times.
✗ Branch 72 not taken.
✗ Branch 75 not taken.
✗ Branch 81 not taken.
✓ Branch 84 taken 33 times.
✗ Branch 87 not taken.
✗ Branch 90 not taken.
✗ Branch 104 not taken.
✓ Branch 80 taken 33 times.
✓ Branch 93 taken 11 times.
✗ Branch 96 not taken.
✗ Branch 99 not taken.
✗ Branch 120 not taken.
✗ Branch 123 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 132 not taken.
✗ Branch 135 not taken.
✓ Branch 138 taken 33 times.
✗ Branch 141 not taken.
✗ Branch 144 not taken.
✗ Branch 147 not taken.
11741827 const GridGeometry& gridGeometry() const { return gridVariables_.gridGeometry(); }
463
2/8
✓ Branch 1 taken 95912 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 275054 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
394666 const SolutionVector& sol() const { return sol_; }
464
465
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 170 times.
✓ Branch 2 taken 170 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
340 const std::vector<VolVarScalarDataInfo>& volVarScalarDataInfo() const { return volVarScalarDataInfo_; }
466
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 170 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 170 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
340 const std::vector<VolVarVectorDataInfo>& volVarVectorDataInfo() const { return volVarVectorDataInfo_; }
467
468 using VelocityOutput = VelocityOutputType;
469
4/40
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 4 taken 170 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 10 taken 257656 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 257656 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 22 taken 170 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
515652 const VelocityOutput& velocityOutput() const { return *velocityOutput_; }
470
471 private:
472
473 //! Assembles the fields and adds them to the writer (conforming output)
474 8298 void writeConforming_(double time, Dune::VTK::OutputType type) override
475 {
476 8298 const Dune::VTK::DataMode dm = Dune::VTK::conforming;
477 //////////////////////////////////////////////////////////////
478 //! (1) Assemble all variable fields and add to writer
479 //////////////////////////////////////////////////////////////
480
481 // instantiate the velocity output
482 using VelocityVector = typename VelocityOutput::VelocityVector;
483 8298 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
484
485 // process rank
486 8298 std::vector<double> rank;
487
488 // volume variable data
489 8298 std::vector<std::vector<Scalar>> volVarScalarData;
490 8298 std::vector<std::vector<VolVarsVector>> volVarVectorData;
491
492 //! Abort if no data was registered
493
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 6885 times.
8298 if (!volVarScalarDataInfo_.empty()
494
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9 times.
13 || !volVarVectorDataInfo_.empty()
495
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 || !this->fields().empty()
496 || velocityOutput_->enableOutput()
497
2/4
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 6885 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8298 || addProcessRank_)
498 {
499
2/3
✓ Branch 1 taken 5964 times.
✗ Branch 2 not taken.
✓ Branch 0 taken 11 times.
8298 const auto numCells = gridGeometry().gridView().size(0);
500 8298 const auto numDofs = numDofs_();
501
502 // get fields for all volume variables
503
2/2
✓ Branch 0 taken 6760 times.
✓ Branch 1 taken 13 times.
8298 if (!volVarScalarDataInfo_.empty())
504
2/4
✓ Branch 1 taken 6885 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6885 times.
✗ Branch 5 not taken.
16570 volVarScalarData.resize(volVarScalarDataInfo_.size(), std::vector<Scalar>(numDofs));
505
2/2
✓ Branch 0 taken 1142 times.
✓ Branch 1 taken 5756 times.
8298 if (!volVarVectorDataInfo_.empty())
506
2/4
✓ Branch 1 taken 1142 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1142 times.
✗ Branch 5 not taken.
2372 volVarVectorData.resize(volVarVectorDataInfo_.size(), std::vector<VolVarsVector>(numDofs));
507
508
3/4
✓ Branch 1 taken 6898 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3305 times.
✓ Branch 4 taken 3593 times.
8298 if (velocityOutput_->enableOutput())
509 {
510
3/4
✓ Branch 1 taken 7147 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3842 times.
✓ Branch 4 taken 3305 times.
8468 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
511 {
512
3/4
✓ Branch 1 taken 3842 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 369 times.
✓ Branch 4 taken 3473 times.
4515 if (velocityOutput_->fieldType() == VelocityOutput::FieldType::element)
513
1/2
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
489 velocity[phaseIdx].resize(numCells);
514
2/4
✓ Branch 1 taken 3473 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3473 times.
4026 else if (velocityOutput_->fieldType() == VelocityOutput::FieldType::vertex)
515 velocity[phaseIdx].resize(numDofs);
516 else
517 {
518 if(isBox && dim == 1)
519
1/2
✓ Branch 1 taken 737 times.
✗ Branch 2 not taken.
811 velocity[phaseIdx].resize(numCells);
520 else
521
1/2
✓ Branch 1 taken 2736 times.
✗ Branch 2 not taken.
3215 velocity[phaseIdx].resize(numDofs);
522 }
523 }
524 }
525
526 // maybe allocate space for the process rank
527
3/4
✓ Branch 0 taken 6854 times.
✓ Branch 1 taken 44 times.
✓ Branch 3 taken 6854 times.
✗ Branch 4 not taken.
8298 if (addProcessRank_) rank.resize(numCells);
528
529
1/2
✓ Branch 1 taken 6022 times.
✗ Branch 2 not taken.
8298 auto fvGeometry = localView(gridGeometry());
530
1/2
✓ Branch 1 taken 6026 times.
✗ Branch 2 not taken.
8298 auto elemVolVars = localView(gridVariables_.curGridVolVars());
531
13/15
✓ Branch 1 taken 6026 times.
✓ Branch 2 taken 179267 times.
✓ Branch 4 taken 4999716 times.
✓ Branch 5 taken 259367 times.
✓ Branch 7 taken 527409 times.
✓ Branch 8 taken 5 times.
✓ Branch 10 taken 1383229 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1382735 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1382735 times.
✓ Branch 16 taken 584 times.
✓ Branch 3 taken 184224 times.
✓ Branch 6 taken 88046 times.
✓ Branch 9 taken 550014 times.
27070646 for (const auto& element : elements(gridGeometry().gridView(), Dune::Partitions::interior))
532 {
533
1/2
✓ Branch 1 taken 2112016 times.
✗ Branch 2 not taken.
9364946 const auto eIdxGlobal = gridGeometry().elementMapper().index(element);
534 // If velocity output is enabled we need to bind to the whole stencil
535 // otherwise element-local data is sufficient
536
4/5
✓ Branch 0 taken 2415934 times.
✓ Branch 1 taken 4356115 times.
✓ Branch 3 taken 4812351 times.
✓ Branch 4 taken 1959698 times.
✗ Branch 2 not taken.
9364946 if (velocityOutput_->enableOutput())
537 {
538 3904957 fvGeometry.bind(element);
539
1/2
✓ Branch 1 taken 2754911 times.
✗ Branch 2 not taken.
3904957 elemVolVars.bind(element, fvGeometry, sol_);
540 }
541 else
542 {
543
1/2
✓ Branch 1 taken 1301381 times.
✗ Branch 2 not taken.
5459989 fvGeometry.bindElement(element);
544
2/5
✓ Branch 1 taken 1991303 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 600 times.
✗ Branch 0 not taken.
5621247 elemVolVars.bindElement(element, fvGeometry, sol_);
545 }
546
547
4/4
✓ Branch 0 taken 60257 times.
✓ Branch 1 taken 6711792 times.
✓ Branch 2 taken 47769 times.
✓ Branch 3 taken 12488 times.
9364946 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
548 {
549
3/3
✓ Branch 0 taken 5758403 times.
✓ Branch 1 taken 6759561 times.
✓ Branch 2 taken 5254402 times.
23417076 for (const auto& scv : scvs(fvGeometry))
550 {
551 14064618 const auto dofIdxGlobal = scv.dofIndex();
552 14064618 const auto& volVars = elemVolVars[scv];
553
554 // get the scalar-valued data
555
3/3
✓ Branch 0 taken 83514928 times.
✓ Branch 1 taken 32032463 times.
✓ Branch 2 taken 3499066 times.
134248546 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
556
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 108033652 times.
240367856 volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo_[i].get(volVars);
557
558 // get the vector-valued data
559
2/2
✓ Branch 0 taken 731107 times.
✓ Branch 1 taken 11012805 times.
14808789 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
560
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 731107 times.
1488342 volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo_[i].get(volVars);
561 }
562 }
563
564 // velocity output
565
3/4
✓ Branch 1 taken 6772049 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2864911 times.
✓ Branch 4 taken 3907138 times.
9364946 if (velocityOutput_->enableOutput())
566 {
567
1/2
✓ Branch 1 taken 989160 times.
✗ Branch 2 not taken.
3966537 const auto elemFluxVarsCache = localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
568
569
3/4
✓ Branch 1 taken 5803674 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2938763 times.
✓ Branch 4 taken 2864911 times.
7893766 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
570
1/2
✓ Branch 1 taken 2938763 times.
✗ Branch 2 not taken.
3988809 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
571 1346614 }
572
573 //! the rank
574
2/2
✓ Branch 0 taken 6439129 times.
✓ Branch 1 taken 332920 times.
9364946 if (addProcessRank_)
575
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4982063 times.
9032026 rank[eIdxGlobal] = static_cast<double>(gridGeometry().gridView().comm().rank());
576 }
577
578 //////////////////////////////////////////////////////////////
579 //! (2) Register data fields with the vtk writer
580 //////////////////////////////////////////////////////////////
581
582 // volume variables if any
583 if constexpr (isBox || isPQ1Bubble)
584 {
585
2/2
✓ Branch 0 taken 29413 times.
✓ Branch 1 taken 2804 times.
33260 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
586
1/2
✓ Branch 1 taken 29413 times.
✗ Branch 2 not taken.
60576 this->addVertexData( Field(gridGeometry().gridView(), gridGeometry().dofMapper(), volVarScalarData[i],
587
1/2
✓ Branch 1 taken 29413 times.
✗ Branch 2 not taken.
30288 volVarScalarDataInfo_[i].name, /*numComp*/1, /*codim*/dim, dm, this->precision()) );
588
2/2
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 2804 times.
3031 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
589
1/2
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
118 this->addVertexData( Field(gridGeometry().gridView(), gridGeometry().dofMapper(), volVarVectorData[i],
590
1/2
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
59 volVarVectorDataInfo_[i].name, /*numComp*/dimWorld, /*codim*/dim, dm, this->precision()) );
591
592 if constexpr (isPQ1Bubble)
593 {
594
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
14 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
595
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 this->addCellData( Field(gridGeometry().gridView(), gridGeometry().dofMapper(), volVarScalarData[i],
596
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 volVarScalarDataInfo_[i].name, /*numComp*/1, /*codim*/0,dm, this->precision()) );
597
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
16 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
598
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 this->addCellData( Field(gridGeometry().gridView(), gridGeometry().dofMapper(), volVarVectorData[i],
599
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 volVarVectorDataInfo_[i].name, /*numComp*/dimWorld, /*codim*/0,dm, this->precision()) );
600 }
601
602 }
603 else
604 {
605
2/2
✓ Branch 0 taken 45412 times.
✓ Branch 1 taken 4094 times.
59013 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
606
1/2
✓ Branch 1 taken 45412 times.
✗ Branch 2 not taken.
107374 this->addCellData( Field(gridGeometry().gridView(), gridGeometry().elementMapper(), volVarScalarData[i],
607
1/2
✓ Branch 1 taken 45412 times.
✗ Branch 2 not taken.
53687 volVarScalarDataInfo_[i].name, /*numComp*/1, /*codim*/0,dm, this->precision()) );
608
2/2
✓ Branch 0 taken 2214 times.
✓ Branch 1 taken 4094 times.
7580 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
609
1/2
✓ Branch 1 taken 2214 times.
✗ Branch 2 not taken.
4508 this->addCellData( Field(gridGeometry().gridView(), gridGeometry().elementMapper(), volVarVectorData[i],
610
1/2
✓ Branch 1 taken 2214 times.
✗ Branch 2 not taken.
2254 volVarVectorDataInfo_[i].name, /*numComp*/dimWorld, /*codim*/0,dm, this->precision()) );
611 }
612
613 // the velocity field
614
3/4
✓ Branch 1 taken 6898 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3305 times.
✓ Branch 4 taken 3593 times.
8298 if (velocityOutput_->enableOutput())
615 {
616
3/4
✓ Branch 1 taken 3305 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 2981 times.
7906 if (velocityOutput_->fieldType() == VelocityOutput::FieldType::vertex
617
4/6
✓ Branch 0 taken 3305 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3305 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 540 times.
✓ Branch 6 taken 9 times.
3953 || ( (velocityOutput_->fieldType() == VelocityOutput::FieldType::automatic) && dim > 1 && isBox ))
618 {
619
3/4
✓ Branch 1 taken 1217 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 677 times.
✓ Branch 4 taken 540 times.
1217 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
620
3/6
✓ Branch 1 taken 677 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 677 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 677 times.
✗ Branch 8 not taken.
2031 this->addVertexData( Field(gridGeometry().gridView(), gridGeometry().vertexMapper(), velocity[phaseIdx],
621
1/2
✓ Branch 1 taken 677 times.
✗ Branch 2 not taken.
677 "velocity_" + velocityOutput_->phaseName(phaseIdx) + " (m/s)",
622 /*numComp*/dimWorld, /*codim*/dim, dm, this->precision()) );
623 }
624 // cell-centered models
625 else
626 {
627
3/4
✓ Branch 1 taken 5930 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3165 times.
✓ Branch 4 taken 2765 times.
7251 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
628
3/6
✓ Branch 1 taken 3165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3165 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3165 times.
✗ Branch 8 not taken.
11514 this->addCellData( Field(gridGeometry().gridView(), gridGeometry().elementMapper(), velocity[phaseIdx],
629
1/2
✓ Branch 1 taken 3165 times.
✗ Branch 2 not taken.
3838 "velocity_" + velocityOutput_->phaseName(phaseIdx) + " (m/s)",
630 /*numComp*/dimWorld, /*codim*/0, dm, this->precision()) );
631 }
632 }
633
634 // the process rank
635
2/2
✓ Branch 0 taken 6854 times.
✓ Branch 1 taken 44 times.
8298 if (addProcessRank_)
636
3/8
✓ Branch 1 taken 6854 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6854 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6854 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
16508 this->addCellData(Field(gridGeometry().gridView(), gridGeometry().elementMapper(), rank, "process rank", 1, 0));
637
638 // also register additional (non-standardized) user fields if any
639
4/4
✓ Branch 0 taken 6181 times.
✓ Branch 1 taken 2433 times.
✓ Branch 2 taken 8614 times.
✓ Branch 3 taken 6898 times.
17993 for (auto&& field : this->fields())
640 {
641
2/2
✓ Branch 0 taken 6181 times.
✓ Branch 1 taken 2433 times.
9695 if (field.codim() == 0)
642
1/2
✓ Branch 1 taken 6181 times.
✗ Branch 2 not taken.
7074 this->addCellData(field);
643
1/2
✓ Branch 0 taken 2433 times.
✗ Branch 1 not taken.
2621 else if (field.codim() == dim)
644
1/2
✓ Branch 1 taken 2433 times.
✗ Branch 2 not taken.
2621 this->addVertexData(field);
645 else
646
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
9695 DUNE_THROW(Dune::RangeError, "Cannot add wrongly sized vtk scalar field!");
647 }
648 7819 }
649
650 //////////////////////////////////////////////////////////////
651 //! (2) The writer writes the output for us
652 //////////////////////////////////////////////////////////////
653
1/2
✓ Branch 1 taken 6898 times.
✗ Branch 2 not taken.
8298 this->sequenceWriter().write(time, type);
654
655 //////////////////////////////////////////////////////////////
656 //! (3) Clear the writer
657 //////////////////////////////////////////////////////////////
658 8298 this->writer().clear();
659
660
2/2
✓ Branch 0 taken 6895 times.
✓ Branch 1 taken 3 times.
8298 this->addedCellData_.clear();
661
2/2
✓ Branch 0 taken 2804 times.
✓ Branch 1 taken 4094 times.
8298 this->addedVertexData_.clear();
662 16552 }
663
664 //! Assembles the fields and adds them to the writer (nonconforming output)
665 72 void writeNonConforming_(double time, Dune::VTK::OutputType type) override
666 {
667 72 const Dune::VTK::DataMode dm = Dune::VTK::nonconforming;
668
669 // only supports finite-element-like discretization schemes
670 if(!isBox && !isDiamond)
671
0/22
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
72 DUNE_THROW(Dune::NotImplemented,
672 "Non-conforming output for discretization scheme " << GridGeometry::discMethod
673 );
674
675 //////////////////////////////////////////////////////////////
676 //! (1) Assemble all variable fields and add to writer
677 //////////////////////////////////////////////////////////////
678
679 // check the velocity output
680
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
72 if (enableVelocityOutput_ && !velocityOutput_->enableOutput())
681 std::cerr << "Warning! Velocity output was enabled in the input file"
682 << " but no velocity output policy was set for the VTK output module:"
683 << " There will be no velocity output."
684 72 << " Use the addVelocityOutput member function of the VTK output module." << std::endl;
685 using VelocityVector = typename VelocityOutput::VelocityVector;
686 72 std::vector<VelocityVector> velocity(velocityOutput_->numFluidPhases());
687
688 // process rank
689 72 std::vector<double> rank;
690
691 // volume variable data (indexing: volvardata/element/localindex)
692 using ScalarDataContainer = std::vector< std::vector<Scalar> >;
693 using VectorDataContainer = std::vector< std::vector<VolVarsVector> >;
694 72 std::vector< ScalarDataContainer > volVarScalarData;
695 72 std::vector< VectorDataContainer > volVarVectorData;
696
697 //! Abort if no data was registered
698
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 46 times.
72 if (!volVarScalarDataInfo_.empty()
699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 || !volVarVectorDataInfo_.empty()
700 || !this->fields().empty()
701 || velocityOutput_->enableOutput()
702
2/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
72 || addProcessRank_)
703 {
704
3/5
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
✗ Branch 0 not taken.
72 const auto numCells = gridGeometry().gridView().size(0);
705 72 const auto outputSize = numDofs_();
706
707 // get fields for all volume variables
708
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 6 times.
72 if (!volVarScalarDataInfo_.empty())
709
2/4
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
66 volVarScalarData.resize(volVarScalarDataInfo_.size(), ScalarDataContainer(numCells));
710
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 46 times.
72 if (!volVarVectorDataInfo_.empty())
711
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 volVarVectorData.resize(volVarVectorDataInfo_.size(), VectorDataContainer(numCells));
712
713
3/4
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 48 times.
72 if (velocityOutput_->enableOutput())
714 {
715
3/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
8 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
716 {
717 if((isBox && dim == 1) || isDiamond)
718
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 velocity[phaseIdx].resize(numCells);
719 else
720 velocity[phaseIdx].resize(outputSize);
721 }
722 }
723
724 // maybe allocate space for the process rank
725
2/4
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 52 times.
✗ Branch 4 not taken.
72 if (addProcessRank_) rank.resize(numCells);
726
727 // now we go element-local to extract values at local dof locations
728
1/2
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
72 auto fvGeometry = localView(gridGeometry());
729
1/2
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
72 auto elemVolVars = localView(gridVariables_.curGridVolVars());
730
8/15
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 125398 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 55524 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 36006 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 36000 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 36000 times.
✓ Branch 16 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 9 taken 55504 times.
✗ Branch 6 not taken.
536744 for (const auto& element : elements(gridGeometry().gridView(), Dune::Partitions::interior))
731 {
732
1/2
✓ Branch 1 taken 91504 times.
✗ Branch 2 not taken.
197352 const auto eIdxGlobal = gridGeometry().elementMapper().index(element);
733 // If velocity output is enabled we need to bind to the whole stencil
734 // otherwise element-local data is sufficient
735
3/5
✗ Branch 0 not taken.
✓ Branch 1 taken 161352 times.
✓ Branch 3 taken 125152 times.
✓ Branch 4 taken 36200 times.
✗ Branch 2 not taken.
197352 if (velocityOutput_->enableOutput())
736 {
737 55304 fvGeometry.bind(element);
738
1/2
✓ Branch 1 taken 55304 times.
✗ Branch 2 not taken.
197352 elemVolVars.bind(element, fvGeometry, sol_);
739 }
740 else
741 {
742
1/2
✓ Branch 1 taken 63848 times.
✗ Branch 2 not taken.
142048 fvGeometry.bindElement(element);
743
1/2
✓ Branch 1 taken 106048 times.
✗ Branch 2 not taken.
142048 elemVolVars.bindElement(element, fvGeometry, sol_);
744 }
745
746 197352 const auto numLocalDofs = fvGeometry.numScv();
747 // resize element-local data containers
748
2/2
✓ Branch 0 taken 465904 times.
✓ Branch 1 taken 161352 times.
741672 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
749
1/2
✓ Branch 1 taken 465904 times.
✗ Branch 2 not taken.
544320 volVarScalarData[i][eIdxGlobal].resize(numLocalDofs);
750
2/2
✓ Branch 0 taken 42000 times.
✓ Branch 1 taken 161352 times.
239352 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
751
1/2
✓ Branch 1 taken 42000 times.
✗ Branch 2 not taken.
42000 volVarVectorData[i][eIdxGlobal].resize(numLocalDofs);
752
753
3/4
✓ Branch 0 taken 42000 times.
✓ Branch 1 taken 119352 times.
✓ Branch 2 taken 42000 times.
✗ Branch 3 not taken.
197352 if (!volVarScalarDataInfo_.empty() || !volVarVectorDataInfo_.empty())
754 {
755
2/2
✓ Branch 0 taken 609408 times.
✓ Branch 1 taken 161352 times.
914760 for (const auto& scv : scvs(fvGeometry))
756 {
757 717408 const auto& volVars = elemVolVars[scv];
758
759 // get the scalar-valued data
760
2/2
✓ Branch 0 taken 1785200 times.
✓ Branch 1 taken 609408 times.
2737856 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
761
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1785200 times.
4040896 volVarScalarData[i][eIdxGlobal][scv.localDofIndex()] = volVarScalarDataInfo_[i].get(volVars);
762
763 // get the vector-valued data
764
2/2
✓ Branch 0 taken 168000 times.
✓ Branch 1 taken 609408 times.
885408 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
765
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168000 times.
336000 volVarVectorData[i][eIdxGlobal][scv.localDofIndex()] = volVarVectorDataInfo_[i].get(volVars);
766 }
767 }
768
769 // velocity output
770
3/4
✓ Branch 1 taken 161352 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55304 times.
✓ Branch 4 taken 106048 times.
197352 if (velocityOutput_->enableOutput())
771 {
772
1/2
✓ Branch 1 taken 55304 times.
✗ Branch 2 not taken.
55304 const auto elemFluxVarsCache = localView(gridVariables_.gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars);
773
3/4
✓ Branch 1 taken 110608 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55304 times.
✓ Branch 4 taken 55304 times.
110608 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
774
1/2
✓ Branch 1 taken 55304 times.
✗ Branch 2 not taken.
55304 velocityOutput_->calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx);
775 }
776
777 //! the rank
778
1/2
✓ Branch 0 taken 161352 times.
✗ Branch 1 not taken.
197352 if (addProcessRank_)
779
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 125352 times.
197352 rank[eIdxGlobal] = static_cast<double>(gridGeometry().gridView().comm().rank());
780 }
781
782 //////////////////////////////////////////////////////////////
783 //! Register data fields with the vtk writer
784 //////////////////////////////////////////////////////////////
785
786 // volume variables if any
787 static constexpr int dofLocCodim = isDiamond ? 1 : dim;
788
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 52 times.
348 for (std::size_t i = 0; i < volVarScalarDataInfo_.size(); ++i)
789
1/2
✓ Branch 1 taken 234 times.
✗ Branch 2 not taken.
552 this->addVertexData(Field(
790
1/2
✓ Branch 1 taken 234 times.
✗ Branch 2 not taken.
276 gridGeometry().gridView(), gridGeometry().elementMapper(),
791
1/2
✓ Branch 1 taken 234 times.
✗ Branch 2 not taken.
276 volVarScalarData[i], volVarScalarDataInfo_[i].name,
792 /*numComp*/1, /*codim*/dofLocCodim, /*nonconforming*/dm, this->precision()
793 ));
794
795
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 52 times.
78 for (std::size_t i = 0; i < volVarVectorDataInfo_.size(); ++i)
796
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 this->addVertexData(Field(
797
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 gridGeometry().gridView(), gridGeometry().elementMapper(),
798
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 volVarVectorData[i], volVarVectorDataInfo_[i].name,
799 /*numComp*/dimWorld, /*codim*/dofLocCodim, /*nonconforming*/dm, this->precision()
800 ));
801
802 // the velocity field
803
3/4
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 48 times.
72 if (velocityOutput_->enableOutput())
804 {
805 // node-wise velocities
806 if (dim > 1 && !isDiamond)
807 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
808 this->addVertexData(Field(
809 gridGeometry().gridView(), gridGeometry().vertexMapper(), velocity[phaseIdx],
810 "velocity_" + velocityOutput_->phaseName(phaseIdx) + " (m/s)",
811 /*numComp*/dimWorld, /*codim*/dofLocCodim, dm, this->precision()
812 ));
813
814 // cell-wise velocities
815 else
816
3/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
8 for (int phaseIdx = 0; phaseIdx < velocityOutput_->numFluidPhases(); ++phaseIdx)
817
2/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
12 this->addCellData(Field(
818
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 gridGeometry().gridView(), gridGeometry().elementMapper(), velocity[phaseIdx],
819
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 "velocity_" + velocityOutput_->phaseName(phaseIdx) + " (m/s)",
820 /*numComp*/dimWorld, /*codim*/0, dm, this->precision()
821 ));
822 }
823 68 }
824
825 // the process rank
826
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
72 if (addProcessRank_)
827
3/6
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 52 times.
✗ Branch 8 not taken.
144 this->addCellData(Field(
828
1/2
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
72 gridGeometry().gridView(), gridGeometry().elementMapper(),
829 rank, "process rank", /*numComp*/1, /*codim*/0
830 ));
831
832 // also register additional (non-standardized) user fields if any
833
3/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 52 times.
78 for (const auto& field : this->fields())
834 {
835
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (field.codim() == 0)
836
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 this->addCellData(field);
837 else if (field.codim() == dim || field.codim() == 1)
838 this->addVertexData(field);
839 else
840
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
6 DUNE_THROW(Dune::RangeError, "Cannot add wrongly sized vtk scalar field!");
841 }
842
843 //////////////////////////////////////////////////////////////
844 //! (2) The writer writes the output for us
845 //////////////////////////////////////////////////////////////
846
1/2
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
72 this->sequenceWriter().write(time, type);
847
848 //////////////////////////////////////////////////////////////
849 //! (3) Clear the writer
850 //////////////////////////////////////////////////////////////
851 72 this->writer().clear();
852
853
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
72 this->addedCellData_.clear();
854
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
72 this->addedVertexData_.clear();
855 144 }
856
857 //! return the number of dofs, we only support vertex and cell data
858
27/48
✓ Branch 0 taken 4148 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 2399 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 82 times.
✓ Branch 5 taken 101 times.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
6936 std::size_t numDofs_() const
859 {
860 // TODO this should actually always be dofMapper.size()
861 // maybe some discretizations needs special treatment (?)
862 if constexpr (isBox || isDiamond || isPQ1Bubble)
863
9/16
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2736 times.
✓ Branch 3 taken 19 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 26 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 11 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 11 times.
✗ Branch 15 not taken.
2868 return gridGeometry().dofMapper().size();
864 else
865
27/48
✓ Branch 0 taken 3399 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 425 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 25 times.
✓ Branch 5 taken 101 times.
✓ Branch 6 taken 23 times.
✓ Branch 7 taken 101 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 102 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
4207 return gridGeometry().elementMapper().size();
866 }
867
868 const GridVariables& gridVariables_;
869 const SolutionVector& sol_;
870
871 std::vector<VolVarScalarDataInfo> volVarScalarDataInfo_; //!< Registered volume variables (scalar)
872 std::vector<VolVarVectorDataInfo> volVarVectorDataInfo_; //!< Registered volume variables (vector)
873
874 std::shared_ptr<VelocityOutput> velocityOutput_; //!< The velocity output policy
875 bool enableVelocityOutput_ = false;
876 bool addProcessRank_ = true;
877 };
878
879 } // end namespace Dumux
880
881 #endif
882