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 |