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-FileCopyrightInfo: 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 BoxDFMModel | ||
10 | * \brief A VTK output module to simplify writing dumux simulation data to VTK format. | ||
11 | */ | ||
12 | |||
13 | #ifndef POROUSMEDIUMFLOW_BOXDFM_VTK_OUTPUT_MODULE_HH | ||
14 | #define POROUSMEDIUMFLOW_BOXDFM_VTK_OUTPUT_MODULE_HH | ||
15 | |||
16 | #include <set> | ||
17 | |||
18 | #include <dune/grid/common/gridfactory.hh> | ||
19 | #include <dune/grid/common/mcmgmapper.hh> | ||
20 | |||
21 | #include <dumux/io/vtkoutputmodule.hh> | ||
22 | |||
23 | namespace Dumux { | ||
24 | |||
25 | /*! | ||
26 | * \ingroup BoxDFMModel | ||
27 | * \brief A VTK output module to simplify writing dumux simulation data to VTK format. | ||
28 | * | ||
29 | * This output module is specialized for writing out data obtained by the box-dfm | ||
30 | * scheme. It writes out separate vtk files for the solution on the fracture. For | ||
31 | * this, a grid type to be used the fracture-conforming lower-dimensional grid has | ||
32 | * to be provided. | ||
33 | * | ||
34 | * \tparam TypeTag The TypeTag of the problem implementation | ||
35 | * \tparam FractureGrid The Type used for the lower-dimensional grid | ||
36 | * | ||
37 | * Handles the output of scalar and vector fields to VTK formatted file for multiple | ||
38 | * variables and time steps. Certain predefined fields can be registered on | ||
39 | * initialization and/or be turned on/off using the designated properties. Additionally | ||
40 | * non-standardized scalar and vector fields can be added to the writer manually. | ||
41 | */ | ||
42 | template<class GridVariables, class SolutionVector, class FractureGrid> | ||
43 | class BoxDfmVtkOutputModule : public VtkOutputModule<GridVariables, SolutionVector> | ||
44 | { | ||
45 | using ParentType = VtkOutputModule<GridVariables, SolutionVector>; | ||
46 | using GridGeometry = typename GridVariables::GridGeometry; | ||
47 | using VV = typename GridVariables::VolumeVariables; | ||
48 | using FluidSystem = typename VV::FluidSystem; | ||
49 | using Scalar = typename GridVariables::Scalar; | ||
50 | |||
51 | using GridView = typename GridGeometry::GridView; | ||
52 | using FractureGridView = typename FractureGrid::LeafGridView; | ||
53 | using FractureMapper = Dune::MultipleCodimMultipleGeomTypeMapper<FractureGridView>; | ||
54 | |||
55 | enum | ||
56 | { | ||
57 | dim = GridView::dimension, | ||
58 | dimWorld = GridView::dimensionworld | ||
59 | }; | ||
60 | |||
61 | using GridIndexType = typename GridView::IndexSet::IndexType; | ||
62 | using Element = typename GridView::template Codim<0>::Entity; | ||
63 | using GlobalPosition = typename Element::Geometry::GlobalCoordinate; | ||
64 | |||
65 | using Field = Vtk::template Field<GridView>; | ||
66 | using FractureField = Vtk::template Field<FractureGridView>; | ||
67 | |||
68 | static_assert(dim > 1, "Box-Dfm output only works for dim > 1"); | ||
69 | static_assert(FractureGrid::dimension == int(dim-1), "Fracture grid must be of codimension one!"); | ||
70 | static_assert(FractureGrid::dimensionworld == int(dimWorld), "Fracture grid has to has the same coordinate dimension!"); | ||
71 | static_assert(GridGeometry::discMethod == DiscretizationMethods::box, "Box-Dfm output module can only be used with the box scheme!"); | ||
72 | public: | ||
73 | |||
74 | //! The constructor | ||
75 | template< class FractureGridAdapter > | ||
76 | 6 | BoxDfmVtkOutputModule(const GridVariables& gridVariables, | |
77 | const SolutionVector& sol, | ||
78 | const std::string& name, | ||
79 | const FractureGridAdapter& fractureGridAdapter, | ||
80 | const std::string& paramGroup = "", | ||
81 | Dune::VTK::DataMode dm = Dune::VTK::conforming, | ||
82 | bool verbose = true) | ||
83 |
7/26✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 6 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
|
6 | : ParentType(gridVariables, sol, name, paramGroup, dm, verbose) |
84 | { | ||
85 | // create the fracture grid and all objects needed on it | ||
86 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | initializeFracture_(fractureGridAdapter); |
87 | 6 | } | |
88 | |||
89 | ////////////////////////////////////////////////////////////////////////////////////////////// | ||
90 | //! Writing data | ||
91 | ////////////////////////////////////////////////////////////////////////////////////////////// | ||
92 | |||
93 | //! Write the data for this timestep to file in four steps | ||
94 | //! (1) We assemble all registered variable fields | ||
95 | //! (2) We register them with the vtk writer | ||
96 | //! (3) The writer writes the output for us | ||
97 | //! (4) Clear the writer for the next time step | ||
98 | 206 | void write(double time, Dune::VTK::OutputType type = Dune::VTK::ascii) | |
99 | { | ||
100 | 206 | Dune::Timer timer; | |
101 | |||
102 | // write to file depending on data mode | ||
103 | 206 | const auto dm = this->dataMode(); | |
104 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
206 | if (dm == Dune::VTK::conforming) |
105 | ✗ | writeConforming_(time, type); | |
106 |
1/2✓ Branch 0 taken 206 times.
✗ Branch 1 not taken.
|
206 | else if (dm == Dune::VTK::nonconforming) |
107 | 206 | writeNonConforming_(time, type); | |
108 | else | ||
109 | ✗ | DUNE_THROW(Dune::NotImplemented, "Output for provided vtk data mode"); | |
110 | |||
111 | //! output | ||
112 | 206 | timer.stop(); | |
113 |
1/2✓ Branch 0 taken 206 times.
✗ Branch 1 not taken.
|
206 | if (this->verbose()) |
114 | 1030 | std::cout << "Writing output for problem \"" << this->name() << "\". Took " << timer.elapsed() << " seconds." << std::endl; | |
115 | 206 | } | |
116 | |||
117 | private: | ||
118 | //! Assembles the fields and adds them to the writer (conforming output) | ||
119 | ✗ | void writeConforming_(double time, Dune::VTK::OutputType type) | |
120 | { | ||
121 | ////////////////////////////////////////////////////////////// | ||
122 | //! (1) Assemble all variable fields and add to writer | ||
123 | ////////////////////////////////////////////////////////////// | ||
124 | |||
125 | // instantiate the velocity output | ||
126 | ✗ | std::vector<typename ParentType::VelocityOutput::VelocityVector> velocity; | |
127 | |||
128 | // process rank | ||
129 | ✗ | static bool addProcessRank = getParamFromGroup<bool>(this->paramGroup(), "Vtk.AddProcessRank"); | |
130 | ✗ | std::vector<double> rank; | |
131 | |||
132 | // volume variable data | ||
133 | ✗ | std::vector<std::vector<Scalar>> volVarScalarData; | |
134 | ✗ | std::vector<std::vector<Scalar>> volVarScalarDataFracture; | |
135 | ✗ | std::vector<std::vector<GlobalPosition>> volVarVectorData; | |
136 | ✗ | std::vector<std::vector<GlobalPosition>> volVarVectorDataFracture; | |
137 | |||
138 | // some references for convenience | ||
139 | ✗ | const auto& gridView = this->gridGeometry().gridView(); | |
140 | ✗ | const auto& fractureGridView = fractureGrid_->leafGridView(); | |
141 | ✗ | const auto& volVarScalarDataInfo = this->volVarScalarDataInfo(); | |
142 | ✗ | const auto& volVarVectorDataInfo = this->volVarVectorDataInfo(); | |
143 | |||
144 | //! Abort if no data was registered | ||
145 | ✗ | if (!volVarScalarDataInfo.empty() | |
146 | ✗ | || !volVarVectorDataInfo.empty() | |
147 | ✗ | || !this->fields().empty() | |
148 | ✗ | || this->velocityOutput().enableOutput() | |
149 | ✗ | || addProcessRank) | |
150 | { | ||
151 | ✗ | const auto numCells = gridView.size(0); | |
152 | ✗ | const auto numDofs = gridView.size(dim); | |
153 | ✗ | const auto numFractureVert = fractureGridView.size(FractureGridView::dimension); | |
154 | |||
155 | // get fields for all volume variables | ||
156 | ✗ | if (!this->volVarScalarDataInfo().empty()) | |
157 | { | ||
158 | ✗ | volVarScalarData.resize(volVarScalarDataInfo.size(), std::vector<Scalar>(numDofs)); | |
159 | ✗ | volVarScalarDataFracture.resize(volVarScalarDataInfo.size(), std::vector<Scalar>(numFractureVert)); | |
160 | } | ||
161 | ✗ | if (!this->volVarVectorDataInfo().empty()) | |
162 | { | ||
163 | ✗ | volVarVectorData.resize(volVarVectorDataInfo.size(), std::vector<GlobalPosition>(numDofs)); | |
164 | ✗ | volVarVectorDataFracture.resize(volVarVectorDataInfo.size(), std::vector<GlobalPosition>(numFractureVert)); | |
165 | } | ||
166 | |||
167 | ✗ | if (this->velocityOutput().enableOutput()) | |
168 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
169 | ✗ | velocity[phaseIdx].resize(numDofs); | |
170 | |||
171 | // maybe allocate space for the process rank | ||
172 | ✗ | if (addProcessRank) rank.resize(numCells); | |
173 | |||
174 | ✗ | auto fvGeometry = localView(this->gridGeometry()); | |
175 | ✗ | auto elemVolVars = localView(this->gridVariables().curGridVolVars()); | |
176 | ✗ | auto elemFluxVarsCache = localView(this->gridVariables().gridFluxVarsCache()); | |
177 | ✗ | for (const auto& element : elements(gridView, Dune::Partitions::interior)) | |
178 | { | ||
179 | ✗ | const auto eIdxGlobal = this->gridGeometry().elementMapper().index(element); | |
180 | |||
181 | // If velocity output is enabled we need to bind to the whole stencil | ||
182 | // otherwise element-local data is sufficient | ||
183 | ✗ | if (this->velocityOutput().enableOutput()) | |
184 | { | ||
185 | ✗ | fvGeometry.bind(element); | |
186 | ✗ | elemVolVars.bind(element, fvGeometry, this->sol()); | |
187 | } | ||
188 | else | ||
189 | { | ||
190 | ✗ | fvGeometry.bindElement(element); | |
191 | ✗ | elemVolVars.bindElement(element, fvGeometry, this->sol()); | |
192 | } | ||
193 | |||
194 | ✗ | if (!volVarScalarDataInfo.empty() || !volVarVectorDataInfo.empty()) | |
195 | { | ||
196 | ✗ | for (auto&& scv : scvs(fvGeometry)) | |
197 | { | ||
198 | ✗ | const auto dofIdxGlobal = scv.dofIndex(); | |
199 | ✗ | const auto& volVars = elemVolVars[scv]; | |
200 | |||
201 | ✗ | if (!scv.isOnFracture()) | |
202 | { | ||
203 | ✗ | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) | |
204 | ✗ | volVarScalarData[i][dofIdxGlobal] = volVarScalarDataInfo[i].get(volVars); | |
205 | ✗ | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) | |
206 | ✗ | volVarVectorData[i][dofIdxGlobal] = volVarVectorDataInfo[i].get(volVars); | |
207 | } | ||
208 | else | ||
209 | { | ||
210 | ✗ | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) | |
211 | ✗ | volVarScalarDataFracture[i][vertexToFractureVertexIdx_[dofIdxGlobal]] = volVarScalarDataInfo[i].get(volVars); | |
212 | ✗ | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) | |
213 | ✗ | volVarVectorDataFracture[i][vertexToFractureVertexIdx_[dofIdxGlobal]] = volVarVectorDataInfo[i].get(volVars); | |
214 | } | ||
215 | } | ||
216 | } | ||
217 | |||
218 | // velocity output | ||
219 | ✗ | if (this->velocityOutput().enableOutput()) | |
220 | { | ||
221 | ✗ | elemFluxVarsCache.bind(element, fvGeometry, elemVolVars); | |
222 | |||
223 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
224 | ✗ | this->velocityOutput().calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx); | |
225 | } | ||
226 | |||
227 | //! the rank | ||
228 | ✗ | if (addProcessRank) | |
229 | ✗ | rank[eIdxGlobal] = static_cast<double>(gridView.comm().rank()); | |
230 | } | ||
231 | |||
232 | ////////////////////////////////////////////////////////////// | ||
233 | //! (2) Register data fields with the vtk writer | ||
234 | ////////////////////////////////////////////////////////////// | ||
235 | |||
236 | // volume variables if any | ||
237 | ✗ | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) | |
238 | { | ||
239 | ✗ | this->sequenceWriter().addVertexData(volVarScalarData[i], volVarScalarDataInfo[i].name); | |
240 | ✗ | fractureSequenceWriter_->addVertexData(volVarScalarDataFracture[i], volVarScalarDataInfo[i].name); | |
241 | } | ||
242 | |||
243 | ✗ | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) | |
244 | { | ||
245 | ✗ | this->sequenceWriter().addVertexData( Field(gridView, this->gridGeometry().vertexMapper(), volVarVectorData[i], | |
246 | ✗ | volVarVectorDataInfo[i].name, /*numComp*/dimWorld, /*codim*/dim).get() ); | |
247 | ✗ | fractureSequenceWriter_->addVertexData( FractureField(fractureGridView, *fractureVertexMapper_, volVarVectorDataFracture[i], | |
248 | ✗ | volVarVectorDataInfo[i].name, /*numComp*/dimWorld, /*codim*/dim-1).get() ); | |
249 | } | ||
250 | |||
251 | // the velocity field | ||
252 | ✗ | if (this->velocityOutput().enableOutput()) | |
253 | { | ||
254 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
255 | ✗ | this->sequenceWriter().addVertexData( Field(gridView, this->gridGeometry().vertexMapper(), velocity[phaseIdx], | |
256 | ✗ | "velocity_" + std::string(this->velocityOutput().phaseName(phaseIdx)) + " (m/s)", | |
257 | /*numComp*/dimWorld, /*codim*/dim).get() ); | ||
258 | } | ||
259 | |||
260 | // the process rank | ||
261 | ✗ | if (addProcessRank) | |
262 | ✗ | this->sequenceWriter().addCellData( Field(gridView, this->gridGeometry().elementMapper(), rank, | |
263 | "process rank", /*numComp*/1, /*codim*/0).get() ); | ||
264 | |||
265 | // also register additional (non-standardized) user fields if any (only on matrix grid) | ||
266 | ✗ | for (auto&& field : this->fields()) | |
267 | { | ||
268 | ✗ | if (field.codim() == 0) | |
269 | ✗ | this->sequenceWriter().addCellData(field.get()); | |
270 | ✗ | else if (field.codim() == dim) | |
271 | ✗ | this->sequenceWriter().addVertexData(field.get()); | |
272 | else | ||
273 | ✗ | DUNE_THROW(Dune::RangeError, "Cannot add wrongly sized vtk scalar field!"); | |
274 | } | ||
275 | } | ||
276 | |||
277 | ////////////////////////////////////////////////////////////// | ||
278 | //! (2) The writer writes the output for us | ||
279 | ////////////////////////////////////////////////////////////// | ||
280 | ✗ | this->sequenceWriter().write(time, type); | |
281 | ✗ | fractureSequenceWriter_->write(time, type); | |
282 | |||
283 | ////////////////////////////////////////////////////////////// | ||
284 | //! (3) Clear the writer | ||
285 | ////////////////////////////////////////////////////////////// | ||
286 | ✗ | this->writer().clear(); | |
287 | ✗ | fractureWriter_->clear(); | |
288 | ✗ | } | |
289 | |||
290 | //! Assembles the fields and adds them to the writer (conforming output) | ||
291 | 206 | void writeNonConforming_(double time, Dune::VTK::OutputType type) | |
292 | { | ||
293 | ////////////////////////////////////////////////////////////// | ||
294 | //! (1) Assemble all variable fields and add to writer | ||
295 | ////////////////////////////////////////////////////////////// | ||
296 | |||
297 | // instantiate the velocity output | ||
298 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 200 times.
|
206 | std::vector<typename ParentType::VelocityOutput::VelocityVector> velocity; |
299 | |||
300 | // process rank | ||
301 |
5/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 200 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
|
206 | static bool addProcessRank = getParamFromGroup<bool>(this->paramGroup(), "Vtk.AddProcessRank"); |
302 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
412 | std::vector<double> rank; |
303 | |||
304 | // volume variable data (indexing: volvardata/element/localcorner) | ||
305 | using ScalarDataContainer = std::vector< std::vector<Scalar> >; | ||
306 | using VectorDataContainer = std::vector< std::vector<GlobalPosition> >; | ||
307 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✓ Branch 3 taken 206 times.
✗ Branch 4 not taken.
|
412 | std::vector< ScalarDataContainer > volVarScalarData; |
308 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
412 | std::vector< ScalarDataContainer > volVarScalarDataFracture; |
309 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
412 | std::vector< VectorDataContainer > volVarVectorData; |
310 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
412 | std::vector< VectorDataContainer > volVarVectorDataFracture; |
311 | |||
312 | // some references for convenience | ||
313 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 206 times.
|
412 | const auto& gridView = this->gridGeometry().gridView(); |
314 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 206 times.
|
412 | const auto& fractureGridView = fractureGrid_->leafGridView(); |
315 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
206 | const auto& volVarScalarDataInfo = this->volVarScalarDataInfo(); |
316 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
206 | const auto& volVarVectorDataInfo = this->volVarVectorDataInfo(); |
317 | |||
318 | //! Abort if no data was registered | ||
319 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
206 | if (!volVarScalarDataInfo.empty() |
320 | ✗ | || !volVarVectorDataInfo.empty() | |
321 | ✗ | || !this->fields().empty() | |
322 | ✗ | || this->velocityOutput().enableOutput() | |
323 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
206 | || addProcessRank) |
324 | { | ||
325 |
1/2✓ Branch 1 taken 103 times.
✗ Branch 2 not taken.
|
206 | const auto numCells = gridView.size(0); |
326 |
1/2✓ Branch 1 taken 103 times.
✗ Branch 2 not taken.
|
206 | const auto numDofs = gridView.size(dim); |
327 | 206 | const auto numFractureCells = fractureGridView.size(0); | |
328 | |||
329 | // get fields for all volume variables | ||
330 |
3/6✓ Branch 0 taken 206 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 206 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
|
618 | if (!this->volVarScalarDataInfo().empty()) |
331 | { | ||
332 |
5/10✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 206 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 206 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 206 times.
✗ Branch 15 not taken.
|
412 | volVarScalarData.resize(volVarScalarDataInfo.size(), ScalarDataContainer(numCells)); |
333 |
4/8✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 206 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 206 times.
✗ Branch 11 not taken.
|
412 | volVarScalarDataFracture.resize(volVarScalarDataInfo.size(), ScalarDataContainer(numFractureCells)); |
334 | } | ||
335 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 206 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 206 times.
|
618 | if (!this->volVarVectorDataInfo().empty()) |
336 | { | ||
337 | ✗ | volVarVectorData.resize(volVarVectorDataInfo.size(), VectorDataContainer(numCells)); | |
338 | ✗ | volVarVectorDataFracture.resize(volVarVectorDataInfo.size(), VectorDataContainer(numFractureCells)); | |
339 | } | ||
340 | |||
341 |
3/6✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 206 times.
|
412 | if (this->velocityOutput().enableOutput()) |
342 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
343 | ✗ | velocity[phaseIdx].resize(numDofs); | |
344 | |||
345 | // maybe allocate space for the process rank | ||
346 |
2/4✓ Branch 0 taken 206 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 206 times.
✗ Branch 4 not taken.
|
206 | if (addProcessRank) rank.resize(numCells); |
347 | |||
348 |
13/16✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 163532 times.
✓ Branch 4 taken 206 times.
✓ Branch 5 taken 163532 times.
✓ Branch 6 taken 103 times.
✓ Branch 7 taken 103 times.
✓ Branch 8 taken 163532 times.
✓ Branch 9 taken 163532 times.
✓ Branch 10 taken 103 times.
✓ Branch 11 taken 327064 times.
✓ Branch 12 taken 103 times.
✓ Branch 14 taken 163532 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 163532 times.
✗ Branch 18 not taken.
|
327270 | for (const auto& element : elements(gridView, Dune::Partitions::interior)) |
349 | { | ||
350 |
3/6✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 327064 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 327064 times.
✗ Branch 8 not taken.
|
981192 | const auto eIdxGlobal = this->gridGeometry().elementMapper().index(element); |
351 |
1/2✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
|
327064 | const auto numCorners = element.subEntities(dim); |
352 | |||
353 | 654128 | auto fvGeometry = localView(this->gridGeometry()); | |
354 |
1/2✓ Branch 0 taken 327064 times.
✗ Branch 1 not taken.
|
1308256 | auto elemVolVars = localView(this->gridVariables().curGridVolVars()); |
355 | |||
356 | // resize element-local data containers (for bulk grid) | ||
357 |
4/4✓ Branch 0 taken 3270640 times.
✓ Branch 1 taken 327064 times.
✓ Branch 2 taken 3270640 times.
✓ Branch 3 taken 327064 times.
|
3597704 | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) |
358 |
3/6✓ Branch 1 taken 3270640 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3270640 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3270640 times.
✗ Branch 8 not taken.
|
9811920 | volVarScalarData[i][eIdxGlobal].resize(numCorners); |
359 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 327064 times.
|
654128 | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) |
360 | ✗ | volVarVectorData[i][eIdxGlobal].resize(numCorners); | |
361 | |||
362 | // If velocity output is enabled we need to bind to the whole stencil | ||
363 | // otherwise element-local data is sufficient | ||
364 |
3/6✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 327064 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 327064 times.
|
654128 | if (this->velocityOutput().enableOutput()) |
365 | { | ||
366 | ✗ | fvGeometry.bind(element); | |
367 | ✗ | elemVolVars.bind(element, fvGeometry, this->sol()); | |
368 | } | ||
369 | else | ||
370 | { | ||
371 |
1/2✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
|
327064 | fvGeometry.bindElement(element); |
372 |
1/2✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
|
327064 | elemVolVars.bindElement(element, fvGeometry, this->sol()); |
373 | } | ||
374 | |||
375 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 327064 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
654128 | if (!volVarScalarDataInfo.empty() || !volVarVectorDataInfo.empty()) |
376 | { | ||
377 |
4/4✓ Branch 0 taken 1129824 times.
✓ Branch 1 taken 327064 times.
✓ Branch 2 taken 1129824 times.
✓ Branch 3 taken 327064 times.
|
1783952 | for (auto&& scv : scvs(fvGeometry)) |
378 | { | ||
379 |
2/2✓ Branch 0 taken 1057616 times.
✓ Branch 1 taken 72208 times.
|
1129824 | const auto& volVars = elemVolVars[scv]; |
380 | |||
381 |
2/2✓ Branch 0 taken 1057616 times.
✓ Branch 1 taken 72208 times.
|
1129824 | if (!scv.isOnFracture()) |
382 | { | ||
383 |
4/4✓ Branch 0 taken 10576160 times.
✓ Branch 1 taken 1057616 times.
✓ Branch 2 taken 10576160 times.
✓ Branch 3 taken 1057616 times.
|
23267552 | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) |
384 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 10576160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10576160 times.
|
63456960 | volVarScalarData[i][eIdxGlobal][scv.localDofIndex()] = volVarScalarDataInfo[i].get(volVars); |
385 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1057616 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1057616 times.
|
2115232 | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) |
386 | ✗ | volVarVectorData[i][eIdxGlobal][scv.localDofIndex()] = volVarVectorDataInfo[i].get(volVars); | |
387 | } | ||
388 | else | ||
389 | { | ||
390 | 72208 | const auto fIdx = scv.facetIndexInElement(); | |
391 | 72208 | const auto& localMap = fractureElementMap_[eIdxGlobal]; | |
392 | 216624 | const auto fracEIdx = std::find_if(localMap.begin(), localMap.end(), [fIdx] (const auto& p) { return p.first == fIdx; })->second; | |
393 |
4/4✓ Branch 0 taken 722080 times.
✓ Branch 1 taken 72208 times.
✓ Branch 2 taken 722080 times.
✓ Branch 3 taken 72208 times.
|
1516368 | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) |
394 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 722080 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 722080 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 722080 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 722080 times.
✓ Branch 9 taken 722080 times.
✗ Branch 10 not taken.
|
3610400 | volVarScalarDataFracture[i][fracEIdx].push_back(volVarScalarDataInfo[i].get(volVars)); |
395 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 72208 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72208 times.
|
144416 | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) |
396 | ✗ | volVarVectorDataFracture[i][fracEIdx].push_back(volVarVectorDataInfo[i].get(volVars)); | |
397 | } | ||
398 | } | ||
399 | } | ||
400 | |||
401 | // velocity output | ||
402 |
3/6✓ Branch 1 taken 327064 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 327064 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 327064 times.
|
654128 | if (this->velocityOutput().enableOutput()) |
403 | { | ||
404 | ✗ | const auto elemFluxVarsCache = localView(this->gridVariables().gridFluxVarsCache()).bind(element, fvGeometry, elemVolVars); | |
405 | |||
406 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
407 | ✗ | this->velocityOutput().calculateVelocity(velocity[phaseIdx], element, fvGeometry, elemVolVars, elemFluxVarsCache, phaseIdx); | |
408 | } | ||
409 | |||
410 | //! the rank | ||
411 |
1/2✓ Branch 0 taken 327064 times.
✗ Branch 1 not taken.
|
327064 | if (addProcessRank) |
412 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 163532 times.
|
327064 | rank[eIdxGlobal] = static_cast<double>(gridView.comm().rank()); |
413 | } | ||
414 | |||
415 | ////////////////////////////////////////////////////////////// | ||
416 | //! (2) Register data fields with the vtk writer | ||
417 | ////////////////////////////////////////////////////////////// | ||
418 | |||
419 | // volume variables if any | ||
420 |
4/4✓ Branch 0 taken 2060 times.
✓ Branch 1 taken 206 times.
✓ Branch 2 taken 2060 times.
✓ Branch 3 taken 206 times.
|
4326 | for (std::size_t i = 0; i < volVarScalarDataInfo.size(); ++i) |
421 | { | ||
422 |
7/18✓ Branch 1 taken 2060 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2060 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2060 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2060 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 2060 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2060 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2060 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
10300 | this->sequenceWriter().addVertexData( Field(gridView, this->gridGeometry().elementMapper(), volVarScalarData[i], |
423 |
2/4✓ Branch 1 taken 2060 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2060 times.
✗ Branch 5 not taken.
|
4120 | volVarScalarDataInfo[i].name, /*numComp*/1, /*codim*/dim, |
424 | /*nonconforming*/this->dataMode()).get() ); | ||
425 |
6/16✓ Branch 1 taken 2060 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2060 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2060 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 2060 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2060 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2060 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
10300 | fractureSequenceWriter_->addVertexData( FractureField(fractureGridView, *fractureElementMapper_, volVarScalarDataFracture[i], |
426 |
2/4✓ Branch 1 taken 2060 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2060 times.
✗ Branch 5 not taken.
|
4120 | volVarScalarDataInfo[i].name, /*numComp*/1, /*codim*/dim-1, |
427 | /*nonconforming*/this->dataMode()).get() ); | ||
428 | } | ||
429 | |||
430 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 206 times.
|
412 | for (std::size_t i = 0; i < volVarVectorDataInfo.size(); ++i) |
431 | { | ||
432 | ✗ | this->sequenceWriter().addVertexData( Field(gridView, this->gridGeometry().elementMapper(), volVarVectorData[i], | |
433 | ✗ | volVarVectorDataInfo[i].name, /*numComp*/dimWorld, /*codim*/dim, | |
434 | /*nonconforming*/this->dataMode()).get() ); | ||
435 | ✗ | fractureSequenceWriter_->addVertexData( FractureField(fractureGridView, *fractureElementMapper_, volVarVectorDataFracture[i], | |
436 | ✗ | volVarVectorDataInfo[i].name, /*numComp*/dimWorld, /*codim*/dim-1, | |
437 | /*nonconforming*/this->dataMode()).get() ); | ||
438 | } | ||
439 | |||
440 | // the velocity field | ||
441 |
3/6✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 206 times.
|
412 | if (this->velocityOutput().enableOutput()) |
442 | { | ||
443 | ✗ | for (int phaseIdx = 0; phaseIdx < this->velocityOutput().numFluidPhases(); ++phaseIdx) | |
444 | ✗ | this->sequenceWriter().addVertexData( Field(gridView, this->gridGeometry().vertexMapper(), velocity[phaseIdx], | |
445 | ✗ | "velocity_" + std::string(this->velocityOutput().phaseName(phaseIdx)) + " (m/s)", | |
446 | /*numComp*/dimWorld, /*codim*/dim).get() ); | ||
447 | } | ||
448 | |||
449 | // the process rank | ||
450 |
1/2✓ Branch 0 taken 206 times.
✗ Branch 1 not taken.
|
206 | if (addProcessRank) |
451 |
10/26✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 206 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 206 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 206 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 206 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 206 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 206 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 206 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 206 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
|
1030 | this->sequenceWriter().addCellData( Field(gridView, this->gridGeometry().elementMapper(), rank, |
452 | "process rank", /*numComp*/1, /*codim*/0).get() ); | ||
453 | |||
454 | // also register additional (non-standardized) user fields if any (only on matrix grid) | ||
455 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 206 times.
|
824 | for (auto&& field : this->fields()) |
456 | { | ||
457 | ✗ | if (field.codim() == 0) | |
458 | ✗ | this->sequenceWriter().addCellData(field.get()); | |
459 | ✗ | else if (field.codim() == dim) | |
460 | ✗ | this->sequenceWriter().addVertexData(field.get()); | |
461 | else | ||
462 | ✗ | DUNE_THROW(Dune::RangeError, "Cannot add wrongly sized vtk scalar field!"); | |
463 | } | ||
464 | } | ||
465 | |||
466 | ////////////////////////////////////////////////////////////// | ||
467 | //! (2) The writer writes the output for us | ||
468 | ////////////////////////////////////////////////////////////// | ||
469 |
2/4✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
|
412 | this->sequenceWriter().write(time, type); |
470 |
2/4✓ Branch 1 taken 206 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 206 times.
✗ Branch 5 not taken.
|
412 | fractureSequenceWriter_->write(time, type); |
471 | |||
472 | ////////////////////////////////////////////////////////////// | ||
473 | //! (3) Clear the writer | ||
474 | ////////////////////////////////////////////////////////////// | ||
475 | 412 | this->writer().clear(); | |
476 | 412 | fractureWriter_->clear(); | |
477 | 206 | } | |
478 | |||
479 | //! Creates the lower-dimensional fracture grid, index maps and writers | ||
480 | template< class FractureGridAdapter > | ||
481 | 6 | void initializeFracture_(const FractureGridAdapter& fractureGridAdapter) | |
482 | { | ||
483 | 6 | const auto& gridGeometry = this->gridGeometry(); | |
484 | 6 | const auto& gridView = gridGeometry.gridView(); | |
485 | 6 | Dune::GridFactory<FractureGrid> gridFactory; | |
486 | |||
487 | // insert fracture vertices | ||
488 | 6 | std::size_t fracVertexCount = 0; | |
489 |
3/5✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
6 | vertexToFractureVertexIdx_.resize(gridView.size(dim)); |
490 |
11/14✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1940 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 1940 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 1940 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 1940 times.
✓ Branch 11 taken 1940 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1940 times.
✗ Branch 17 not taken.
|
3889 | for (const auto& v : vertices(gridView)) |
491 | { | ||
492 |
3/4✓ Branch 1 taken 3880 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 3520 times.
|
3880 | if (fractureGridAdapter.isOnFacetGrid(v)) |
493 | { | ||
494 |
4/7✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 180 times.
✓ Branch 4 taken 180 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 180 times.
✗ Branch 8 not taken.
|
540 | gridFactory.insertVertex(v.geometry().center()); |
495 |
2/4✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 180 times.
✗ Branch 5 not taken.
|
720 | vertexToFractureVertexIdx_[gridGeometry.vertexMapper().index(v)] = fracVertexCount++; |
496 | } | ||
497 | } | ||
498 | |||
499 | // insert fracture elements | ||
500 | 6 | std::size_t fractureElementCount = 0; | |
501 |
3/5✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
6 | fractureElementMap_.resize(gridView.size(0)); |
502 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
12 | std::set< std::pair<GridIndexType, unsigned int> > handledFacets; |
503 |
12/14✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4426 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4426 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 4426 times.
✓ Branch 9 taken 4426 times.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 4426 times.
✓ Branch 12 taken 3 times.
✓ Branch 14 taken 4426 times.
✗ Branch 15 not taken.
|
17710 | for (const auto& element : elements(gridView)) |
504 | { | ||
505 |
2/4✓ Branch 1 taken 8852 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8852 times.
✗ Branch 5 not taken.
|
17704 | const auto eIdxGlobal = gridGeometry.elementMapper().index(element); |
506 |
1/2✓ Branch 1 taken 8852 times.
✗ Branch 2 not taken.
|
8852 | const auto refElement = referenceElement(element); |
507 | |||
508 |
9/15✓ Branch 1 taken 8852 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4426 times.
✓ Branch 5 taken 20202 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4426 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20202 times.
✓ Branch 10 taken 15776 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 4426 times.
✓ Branch 16 taken 4426 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 15776 times.
✗ Branch 19 not taken.
|
89660 | for (const auto& is : intersections(gridView, element)) |
509 | { | ||
510 | // obtain all vertex indices on this intersection | ||
511 |
2/4✓ Branch 1 taken 31552 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 31552 times.
✗ Branch 5 not taken.
|
63104 | const auto& isGeometry = is.geometry(); |
512 |
2/3✓ Branch 0 taken 1296 times.
✓ Branch 1 taken 30256 times.
✗ Branch 2 not taken.
|
31552 | const auto numCorners = isGeometry.corners(); |
513 |
2/3✓ Branch 0 taken 1296 times.
✓ Branch 1 taken 30256 times.
✗ Branch 2 not taken.
|
31552 | const auto indexInInside = is.indexInInside(); |
514 | |||
515 |
4/10✓ Branch 1 taken 31552 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 31552 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 31552 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 15776 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
126208 | std::vector<GridIndexType> isVertexIndices(numCorners); |
516 |
2/2✓ Branch 0 taken 80496 times.
✓ Branch 1 taken 31552 times.
|
112048 | for (unsigned int i = 0; i < numCorners; ++i) |
517 |
1/2✓ Branch 3 taken 80496 times.
✗ Branch 4 not taken.
|
160992 | isVertexIndices[i] = gridGeometry.vertexMapper().subIndex(element, |
518 | refElement.subEntity(indexInInside, 1, i, dim), | ||
519 | dim); | ||
520 | |||
521 | // determine if this is a fracture facet & if it has to be inserted | ||
522 | 31552 | bool insertFacet = false; | |
523 |
3/4✓ Branch 1 taken 31552 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 876 times.
✓ Branch 4 taken 30676 times.
|
31552 | if (fractureGridAdapter.composeFacetElement(isVertexIndices)) |
524 | { | ||
525 | 876 | insertFacet = true; | |
526 |
2/3✓ Branch 0 taken 43 times.
✓ Branch 1 taken 833 times.
✗ Branch 2 not taken.
|
876 | if (!is.boundary()) |
527 | { | ||
528 | // only proceed if facet has not been handled yet | ||
529 |
3/6✓ Branch 1 taken 876 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 876 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 876 times.
✗ Branch 8 not taken.
|
1752 | const auto outsideEIdx = gridGeometry.elementMapper().index(is.outside()); |
530 |
1/2✓ Branch 1 taken 876 times.
✗ Branch 2 not taken.
|
876 | const auto idxInOutside = is.indexInOutside(); |
531 | 1314 | const auto pair = std::make_pair(outsideEIdx, idxInOutside); | |
532 | 2190 | if (handledFacets.count( pair ) != 0) | |
533 | { | ||
534 | 438 | insertFacet = false; | |
535 | |||
536 | // obtain the fracture grid elem idx from outside map and insert to map | ||
537 | 438 | const auto& outsideMap = fractureElementMap_[outsideEIdx]; | |
538 |
3/8✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 435 times.
✗ Branch 7 not taken.
|
1754 | auto it = std::find_if(outsideMap.begin(), outsideMap.end(), [idxInOutside] (const auto& p) { return p.first == idxInOutside; }); |
539 |
4/8✓ Branch 1 taken 438 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 438 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 438 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 438 times.
✗ Branch 11 not taken.
|
1752 | fractureElementMap_[eIdxGlobal].push_back( std::make_pair(indexInInside, it->second) ); |
540 | } | ||
541 | } | ||
542 | } | ||
543 | |||
544 | if (insertFacet) | ||
545 | { | ||
546 | // transform intersection vertex indices to frac grid indices | ||
547 | 1314 | std::for_each( isVertexIndices.begin(), | |
548 | isVertexIndices.end(), | ||
549 | 2192 | [&] (auto& idx) { idx = this->vertexToFractureVertexIdx_[idx]; } ); | |
550 | |||
551 | // insert the element | ||
552 |
3/5✓ Branch 1 taken 219 times.
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
|
657 | gridFactory.insertElement(isGeometry.type(), isVertexIndices); |
553 | |||
554 | // insert to set of handled facets | ||
555 |
2/4✓ Branch 1 taken 438 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 438 times.
✗ Branch 5 not taken.
|
876 | handledFacets.insert( std::make_pair(eIdxGlobal, indexInInside) ); |
556 |
4/10✓ Branch 1 taken 438 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 438 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 438 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 438 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
1752 | fractureElementMap_[eIdxGlobal].push_back( std::make_pair(indexInInside, fractureElementCount) ); |
557 | 438 | fractureElementCount++; | |
558 | } | ||
559 | } | ||
560 | } | ||
561 | |||
562 | // make grid and get grid view | ||
563 |
5/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
6 | fractureGrid_ = std::shared_ptr<FractureGrid>(gridFactory.createGrid()); |
564 | |||
565 | // update fracture mappers | ||
566 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
12 | const auto& fractureGridView = fractureGrid_->leafGridView(); |
567 |
5/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
12 | fractureVertexMapper_ = std::make_unique<FractureMapper>(fractureGridView, Dune::mcmgVertexLayout()); |
568 |
5/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
12 | fractureElementMapper_ = std::make_unique<FractureMapper>(fractureGridView, Dune::mcmgElementLayout()); |
569 | |||
570 | // obtain map fracture insertion indices -> fracture grid indices | ||
571 |
1/2✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
|
18 | std::vector<GridIndexType> insToVertexIdx(fractureGridView.size(FractureGridView::dimension)); |
572 |
2/6✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
18 | std::vector<GridIndexType> insToElemIdx(fractureGridView.size(0)); |
573 |
4/4✓ Branch 1 taken 360 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 6 times.
|
366 | for (const auto& v : vertices(fractureGridView)) insToVertexIdx[ gridFactory.insertionIndex(v) ] = fractureVertexMapper_->index(v); |
574 |
4/4✓ Branch 1 taken 438 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 438 times.
✓ Branch 4 taken 6 times.
|
444 | for (const auto& e : elements(fractureGridView)) insToElemIdx[ gridFactory.insertionIndex(e) ] = fractureElementMapper_->index(e); |
575 | |||
576 | // update vertex index map | ||
577 |
4/4✓ Branch 1 taken 3883 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1940 times.
✓ Branch 4 taken 3 times.
|
3886 | for (GridIndexType dofIdx = 0; dofIdx < gridView.size(GridView::dimension); ++dofIdx) |
578 |
4/4✓ Branch 0 taken 360 times.
✓ Branch 1 taken 3520 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 3520 times.
|
7760 | if (gridGeometry.dofOnFracture(dofIdx)) |
579 | 1080 | vertexToFractureVertexIdx_[dofIdx] = insToVertexIdx[ vertexToFractureVertexIdx_[dofIdx] ]; | |
580 | |||
581 | // update fracture element map | ||
582 |
4/4✓ Branch 0 taken 8852 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8852 times.
✓ Branch 3 taken 6 times.
|
8870 | for (auto& elemLocalMap : fractureElementMap_) |
583 |
4/4✓ Branch 0 taken 876 times.
✓ Branch 1 taken 8852 times.
✓ Branch 2 taken 876 times.
✓ Branch 3 taken 8852 times.
|
28308 | for (auto& dataPair : elemLocalMap) |
584 | 1752 | dataPair.second = insToElemIdx[ dataPair.second ]; | |
585 | |||
586 | // instantiate writers for the fracture | ||
587 |
3/6✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
|
6 | fractureWriter_ = std::make_shared< Dune::VTKWriter<FractureGridView> >(fractureGridView, this->dataMode()); |
588 |
7/18✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
18 | fractureSequenceWriter_ = std::make_unique< Dune::VTKSequenceWriter<FractureGridView> >(fractureWriter_, this->name() + "_fracture"); |
589 | 6 | } | |
590 | |||
591 | std::shared_ptr<FractureGrid> fractureGrid_; | ||
592 | |||
593 | std::unique_ptr<FractureMapper> fractureVertexMapper_; | ||
594 | std::unique_ptr<FractureMapper> fractureElementMapper_; | ||
595 | |||
596 | std::shared_ptr<Dune::VTKWriter<FractureGridView>> fractureWriter_; | ||
597 | std::unique_ptr< Dune::VTKSequenceWriter<FractureGridView> > fractureSequenceWriter_; | ||
598 | |||
599 | // maps to a bulk grid vertex the vertex index within the fracture grid | ||
600 | std::vector<GridIndexType> vertexToFractureVertexIdx_; | ||
601 | |||
602 | // maps to the local facet indices of an element the corresponding fracture element indices | ||
603 | std::vector< std::vector<std::pair<GridIndexType, unsigned int>> > fractureElementMap_; | ||
604 | }; | ||
605 | |||
606 | } // end namespace Dumux | ||
607 | |||
608 | #endif | ||
609 |