GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/io/grid/gridmanager_base.hh
Date: 2024-05-04 19:09:25
Exec Total Coverage
Lines: 80 89 89.9%
Functions: 117 158 74.1%
Branches: 143 426 33.6%

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 InputOutput
10 * \brief Provides a grid manager for all supported grid managers with
11 * input file interfaces. Manages data via the grid data member.
12 */
13 #ifndef DUMUX_IO_GRID_MANAGER_BASE_HH
14 #define DUMUX_IO_GRID_MANAGER_BASE_HH
15
16 #include <array>
17 #include <bitset>
18 #include <memory>
19 #include <sstream>
20
21 #include <dune/common/exceptions.hh>
22 #include <dune/common/classname.hh>
23 #include <dune/common/parallel/communication.hh>
24 #include <dune/common/parallel/mpihelper.hh>
25 #include <dune/grid/io/file/dgfparser/dgfparser.hh>
26 #include <dune/grid/io/file/gmshreader.hh>
27 #include <dune/grid/common/gridfactory.hh>
28 #include <dune/grid/utility/structuredgridfactory.hh>
29
30 #include <dumux/common/typetraits/typetraits.hh>
31 #include <dumux/common/parameters.hh>
32 #include <dumux/discretization/method.hh>
33 #include <dumux/io/vtk/vtkreader.hh>
34
35 #include "griddata.hh"
36
37 namespace Dumux {
38
39 /*!
40 * \ingroup InputOutput
41 * \brief The grid manager (this is the class used by the user) for all supported grid managers that constructs a grid
42 * from information in the input file and handles the data.
43 * \note This class is specialised below for all supported grid managers. It inherits the functionality of the base class Dumux::GridManagerBase.
44 */
45 template <class Grid>
46 class GridManager;
47
48 /*!
49 * \ingroup InputOutput
50 * \brief The grid manager base interface (public) and methods common
51 * to most grid manager specializations (protected).
52 */
53 template <class GridType>
54 class GridManagerBase
55 {
56 public:
57 using Grid = GridType;
58 using GridData = Dumux::GridData<Grid>;
59
60 /*!
61 * \brief Make the grid. Implement this method in the specialization of this class for a grid type.
62 */
63 void init(const std::string& modelParamGroup = "")
64 {
65 static_assert(AlwaysFalse<GridType>::value,
66 "The header with the GridManager specialization for your grid type is not included "
67 "or no specialization has been implemented!"
68 " In case of the latter, consider providing your own GridManager."
69 );
70 }
71
72 /*!
73 * \brief Returns a reference to the grid.
74 */
75 81812 Grid& grid()
76 {
77
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 41317 times.
81812 if(enableDgfGridPointer_)
78 163 return *dgfGridPtr();
79 else
80 81649 return *gridPtr();
81 }
82
83 /*!
84 * \brief Returns a const reference to the grid.
85 */
86 const Grid& grid() const
87 {
88 if(enableDgfGridPointer_)
89 return *dgfGridPtr();
90 else
91 return *gridPtr();
92 }
93
94 /*!
95 * \brief Call loadBalance() function of the grid.
96 */
97 658 void loadBalance()
98 {
99
4/4
✓ Branch 1 taken 56 times.
✓ Branch 2 taken 469 times.
✓ Branch 3 taken 56 times.
✓ Branch 4 taken 469 times.
658 if (Dune::MPIHelper::getCommunication().size() > 1)
100 {
101 // if we may have dgf parameters use load balancing of the dgf pointer
102
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 42 times.
58 if(enableDgfGridPointer_)
103 {
104 14 dgfGridPtr().loadBalance();
105 // update the grid data
106
2/4
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
28 gridData_ = std::make_shared<GridData>(dgfGridPtr());
107 }
108
109 // if we have gmsh parameters we have to manually load balance the data
110
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 38 times.
44 else if (enableGmshDomainMarkers_)
111 {
112 // element and face markers are communicated during load balance
113 8 auto dh = gridData_->createGmshDataHandle();
114
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 gridPtr()->loadBalance(dh.interface());
115
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 gridPtr()->communicate(dh.interface(), Dune::InteriorBorder_All_Interface, Dune::ForwardCommunication);
116 }
117 else
118 68 gridPtr()->loadBalance();
119 }
120 658 }
121
122 /*!
123 * \brief Get an owning pointer to grid data associated with the grid
124 * \note Throws if no grid data is available
125 */
126 52 std::shared_ptr<GridData> getGridData() const
127 {
128
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
52 if (!gridData_)
129 DUNE_THROW(Dune::IOError, "No grid data available");
130
131 52 return gridData_;
132 }
133
134 /*!
135 * \brief Check whether there is data associated with the grid
136 */
137 bool hasGridData() const
138 { return static_cast<bool>(gridData_); }
139
140 protected:
141
142 /*!
143 * \brief Returns a reference to the grid pointer (std::shared_ptr<Grid>)
144 */
145 99935 std::shared_ptr<Grid>& gridPtr()
146 {
147
1/2
✓ Branch 0 taken 59417 times.
✗ Branch 1 not taken.
99935 if(!enableDgfGridPointer_)
148 99935 return gridPtr_;
149 else
150 DUNE_THROW(Dune::InvalidStateException, "You are using DGF. To get the grid pointer use method dgfGridPtr()!");
151 }
152
153 /*!
154 * \brief Returns a reference to the DGF grid pointer (Dune::GridPtr<Grid>).
155 */
156 290 Dune::GridPtr<Grid>& dgfGridPtr()
157 {
158
1/2
✓ Branch 0 taken 269 times.
✗ Branch 1 not taken.
290 if(enableDgfGridPointer_)
159 290 return dgfGridPtr_;
160 else
161 DUNE_THROW(Dune::InvalidStateException, "The DGF grid pointer is only available if the grid was constructed with a DGF file!");
162 }
163
164 /*!
165 * \brief Returns the filename extension of a given filename
166 */
167 125 std::string getFileExtension(const std::string& fileName) const
168 {
169
1/2
✓ Branch 0 taken 112 times.
✗ Branch 1 not taken.
125 std::size_t i = fileName.rfind('.', fileName.length());
170
1/2
✓ Branch 0 taken 112 times.
✗ Branch 1 not taken.
125 if (i != std::string::npos)
171 {
172 125 return(fileName.substr(i+1, fileName.length() - i));
173 }
174 else
175 {
176 DUNE_THROW(Dune::IOError, "Please provide and extension for your grid file ('"<< fileName << "')!");
177 }
178 return "";
179 }
180
181 /*!
182 * \brief Makes a grid from a file. We currently support
183 * - dgf (Dune Grid Format)
184 * - msh (Gmsh mesh format)
185 * - vtp/vtu (VTK file formats)
186 */
187 69 void makeGridFromFile(const std::string& fileName,
188 const std::string& modelParamGroup)
189 {
190 // We found a file in the input file...does it have a supported extension?
191
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 68 times.
138 const std::string extension = getFileExtension(fileName);
192
7/8
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 26 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 40 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
69 if (extension != "dgf" && extension != "msh" && extension != "vtu" && extension != "vtp")
193 DUNE_THROW(Dune::IOError, "Grid type " << Dune::className<Grid>() << " doesn't support grid files with extension: *."<< extension);
194
195 // Dune Grid Format (DGF) files
196
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 42 times.
69 if (extension == "dgf")
197 {
198 27 enableDgfGridPointer_ = true;
199
10/20
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 24 times.
✓ Branch 23 taken 2 times.
✓ Branch 25 taken 26 times.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
133 dgfGridPtr() = Dune::GridPtr<Grid>(fileName.c_str(), Dune::MPIHelper::getCommunicator());
200
3/6
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 26 times.
27 gridData_ = std::make_shared<GridData>(dgfGridPtr_);
201 }
202
203 // Gmsh mesh format
204
2/2
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 2 times.
42 else if (extension == "msh")
205 {
206 // get some optional parameters
207
1/2
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
40 const bool verbose = getParamFromGroup<bool>(modelParamGroup, "Grid.Verbosity", false);
208
1/2
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
40 const bool boundarySegments = getParamFromGroup<bool>(modelParamGroup, "Grid.BoundarySegments", false);
209
1/4
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
40 const bool domainMarkers = getParamFromGroup<bool>(modelParamGroup, "Grid.DomainMarkers", false);
210
211
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 31 times.
40 if (domainMarkers)
212 9 enableGmshDomainMarkers_ = true;
213
214 // as default read it on all processes in parallel
215
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 31 times.
40 if(domainMarkers)
216 {
217
4/10
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
32 std::vector<int> boundaryMarkers, elementMarkers;
218
3/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 2 times.
18 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
219
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 Dune::GmshReader<Grid>::read(*gridFactory, fileName, boundaryMarkers, elementMarkers, verbose, boundarySegments);
220
7/20
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 9 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 9 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
18 gridPtr() = std::shared_ptr<Grid>(gridFactory->createGrid());
221
4/8
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
9 gridData_ = std::make_shared<GridData>(gridPtr_, std::move(gridFactory), std::move(elementMarkers), std::move(boundaryMarkers));
222 }
223 else
224 {
225
1/2
✓ Branch 1 taken 31 times.
✗ Branch 2 not taken.
62 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
226
2/4
✓ Branch 1 taken 31 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 31 times.
✗ Branch 5 not taken.
62 Dune::GmshReader<Grid>::read(*gridFactory, fileName, verbose, boundarySegments);
227
8/22
✓ Branch 1 taken 31 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 31 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 31 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 31 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 31 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 31 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 31 times.
✓ Branch 18 taken 31 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
62 gridPtr() = std::shared_ptr<Grid>(gridFactory->createGrid());
228 }
229 }
230
231 // VTK file formats for unstructured grids
232
3/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 else if (extension == "vtu" || extension == "vtp")
233 {
234
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
2 if (Dune::MPIHelper::getCommunication().size() > 1)
235 DUNE_THROW(Dune::NotImplemented, "Reading grids in parallel from VTK file formats is currently not supported!");
236
237
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 VTKReader vtkReader(fileName);
238
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
6 VTKReader::Data cellData, pointData;
239
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
240
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 const bool verbose = getParamFromGroup<bool>(modelParamGroup, "Grid.Verbosity", false);
241
5/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
4 gridPtr() = vtkReader.readGrid(*gridFactory, cellData, pointData, verbose);
242
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
2 gridData_ = std::make_shared<GridData>(gridPtr_, std::move(gridFactory), std::move(cellData), std::move(pointData));
243 }
244 69 }
245
246 /*!
247 * \brief Makes a grid from a DGF file. This is used by grid managers that only support DGF.
248 */
249 6 void makeGridFromDgfFile(const std::string& fileName)
250 {
251 // We found a file in the input file...does it have a supported extension?
252
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
6 const std::string extension = getFileExtension(fileName);
253
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if(extension != "dgf")
254 DUNE_THROW(Dune::IOError, "Grid type " << Dune::className<Grid>() << " only supports DGF (*.dgf) but the specified filename has extension: *."<< extension);
255
256 6 enableDgfGridPointer_ = true;
257
9/20
✓ 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 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 6 times.
✓ Branch 25 taken 6 times.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
24 dgfGridPtr() = Dune::GridPtr<Grid>(fileName.c_str(), Dune::MPIHelper::getCommunicator());
258
4/8
✓ 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.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
6 gridData_ = std::make_shared<GridData>(dgfGridPtr_);
259 6 }
260
261 /*!
262 * \brief The cell types for structured grids
263 */
264 enum CellType {Simplex, Cube};
265
266 /*!
267 * \brief Makes a structured cube grid using the structured grid factory
268 */
269 template <int dim, int dimworld>
270 71 void makeStructuredGrid(CellType cellType,
271 const std::string& modelParamGroup)
272 {
273 using GlobalPosition = Dune::FieldVector<typename Grid::ctype, dimworld>;
274 71 const auto upperRight = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.UpperRight");
275 142 const auto lowerLeft = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.LowerLeft", GlobalPosition(0.0));
276
277 using CellArray = std::array<unsigned int, dim>;
278 71 CellArray cells; cells.fill(1);
279 71 cells = getParamFromGroup<CellArray>(modelParamGroup, "Grid.Cells", cells);
280
281 // make the grid
282
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 11 times.
71 if (cellType == CellType::Cube)
283 {
284
6/10
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 42 times.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 42 times.
✓ Branch 9 taken 18 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
78 gridPtr() = Dune::StructuredGridFactory<Grid>::createCubeGrid(lowerLeft, upperRight, cells);
285 }
286
1/2
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
11 else if (cellType == CellType::Simplex)
287 {
288
6/10
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 9 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
20 gridPtr() = Dune::StructuredGridFactory<Grid>::createSimplexGrid(lowerLeft, upperRight, cells);
289 }
290 else
291 {
292 DUNE_THROW(Dune::GridError, "Unknown cell type for making structured grid! Choose Cube or Simplex.");
293 }
294 71 }
295
296 /*!
297 * \brief Refines a grid after construction if GridParameterGroup.Refinement is set in the input file
298 */
299 741 void maybeRefineGrid(const std::string& modelParamGroup)
300 {
301
8/14
✓ Branch 1 taken 606 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 606 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 606 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 606 times.
✓ Branch 11 taken 135 times.
✓ Branch 12 taken 471 times.
✓ Branch 13 taken 135 times.
✓ Branch 14 taken 471 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2223 if (hasParamInGroup(modelParamGroup, "Grid.Refinement"))
302 184 grid().globalRefine(getParamFromGroup<int>(modelParamGroup, "Grid.Refinement"));
303 741 }
304
305 /*!
306 * \brief A state variable if the DGF Dune::GridPtr has been enabled.
307 * It is always enabled if a DGF grid file was used to create the grid.
308 */
309 bool enableDgfGridPointer_ = false;
310
311 /*!
312 * \brief A state variable if domain markers have been read from a Gmsh file.
313 */
314 bool enableGmshDomainMarkers_ = false;
315
316 std::shared_ptr<Grid> gridPtr_;
317 Dune::GridPtr<Grid> dgfGridPtr_;
318
319 std::shared_ptr<GridData> gridData_;
320 };
321
322 template <class Grid>
323 class GridManager : public GridManagerBase<Grid> {};
324
325 } // end namespace Dumux
326
327 #endif
328