GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/io/grid/gridmanager_alu.hh
Date: 2024-09-21 20:52:54
Exec Total Coverage
Lines: 52 79 65.8%
Functions: 14 24 58.3%
Branches: 142 472 30.1%

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 Grid manager specialization for ALUGrid
11 */
12 #ifndef DUMUX_IO_GRID_MANAGER_ALU_HH
13 #define DUMUX_IO_GRID_MANAGER_ALU_HH
14
15 // ALUGrid specific includes
16 #if HAVE_DUNE_ALUGRID
17 #include <dune/alugrid/grid.hh>
18 #include <dune/alugrid/dgf.hh>
19 #endif
20
21 #ifndef DUMUX_IO_GRID_MANAGER_BASE_HH
22 #include <dumux/io/grid/gridmanager_base.hh>
23 #endif
24
25 #include <dumux/common/boundaryflag.hh>
26 #include <dumux/common/gridcapabilities.hh>
27
28 namespace Dumux {
29
30 #if HAVE_DUNE_ALUGRID
31
32 /*!
33 * \ingroup InputOutput
34 * \brief Provides a grid manager for Dune ALUGrids
35 * from information in the input file
36 *
37 * All keys are expected to be in group GridParameterGroup.
38
39 * The following keys are recognized:
40 * - File : A DGF or gmsh file to load from, type detection by file extension
41 * - LowerLeft : lowerLeft corner of a structured grid
42 * - UpperRight : upperright corner of a structured grid
43 * - Cells : number of elements in a structured grid
44 * - Refinement : the number of global refines to perform
45 * - Verbosity : whether the grid construction should output to standard out
46 * - BoundarySegments : whether to insert boundary segments into the grid
47 *
48 */
49 template<int dim, int dimworld, Dune::ALUGridElementType elType, Dune::ALUGridRefinementType refinementType>
50
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
125 class GridManager<Dune::ALUGrid<dim, dimworld, elType, refinementType>>
51 : public GridManagerBase<Dune::ALUGrid<dim, dimworld, elType, refinementType>>
52 {
53 public:
54 using Grid = Dune::ALUGrid<dim, dimworld, elType, refinementType>;
55 using ParentType = GridManagerBase<Grid>;
56
57 /*!
58 * \brief Make the grid. This is implemented by specializations of this method.
59 */
60 63 void init(const std::string& modelParamGroup = "", bool adaptiveRestart = false)
61 {
62 // restarting an adaptive grid using Dune's BackupRestoreFacility
63 // TODO: the part after first || is backward compatibility with old sequential models remove once sequential adaptive restart is replaced
64
14/36
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 63 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 63 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 63 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 63 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 63 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 63 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 63 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 63 times.
✓ Branch 24 taken 63 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 63 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 63 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 63 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 63 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
315 if (adaptiveRestart || hasParam("Restart") || hasParam("TimeManager.Restart"))
65 {
66 auto restartTime = getParamFromGroup<double>(modelParamGroup, "TimeLoop.Restart", 0.0);
67 // TODO: backward compatibility with old sequential models remove once sequential adaptive restart is replaced
68 if (hasParam("Restart") || hasParam("TimeManager.Restart"))
69 {
70 restartTime = getParamFromGroup<double>("TimeManager", "Restart");
71 std::cerr << "Warning: You are using a deprecated restart mechanism. The usage will change in the future.\n";
72 }
73
74 const int rank = Dune::MPIHelper::getCommunication().rank();
75 const std::string name = getParamFromGroup<std::string>(modelParamGroup, "Problem.Name");
76 std::ostringstream oss;
77 oss << name << "_time=" << restartTime << "_rank=" << rank << ".grs";
78 std::cout << "Restoring an ALUGrid from " << oss.str() << std::endl;
79 ParentType::gridPtr() = std::shared_ptr<Grid>(Dune::BackupRestoreFacility<Grid>::restore(oss.str()));
80 ParentType::loadBalance();
81 return;
82 }
83
84 // try to create it from a DGF or msh file in GridParameterGroup.File
85
8/14
✓ Branch 1 taken 63 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 63 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 63 times.
✓ Branch 11 taken 36 times.
✓ Branch 12 taken 27 times.
✓ Branch 13 taken 36 times.
✓ Branch 14 taken 27 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
189 else if (hasParamInGroup(modelParamGroup, "Grid.File"))
86 {
87
3/6
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 31 times.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
36 makeGridFromFile(getParamFromGroup<std::string>(modelParamGroup, "Grid.File"), modelParamGroup);
88 36 ParentType::maybeRefineGrid(modelParamGroup);
89 36 ParentType::loadBalance();
90 36 return;
91 }
92
93 // Then look for the necessary keys to construct from the input file
94
6/14
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
81 else if (hasParamInGroup(modelParamGroup, "Grid.UpperRight"))
95 {
96 if (elType == Dune::cube)
97 36 makeStructuredGrid<dim, dimworld>(ParentType::CellType::Cube, modelParamGroup);
98 else if (elType == Dune::simplex)
99 18 makeStructuredGrid<dim, dimworld>(ParentType::CellType::Simplex, modelParamGroup);
100 else
101 DUNE_THROW(Dune::IOError, "ALUGrid only supports Dune::cube or Dune::simplex as cell type!");
102
103 27 ParentType::maybeRefineGrid(modelParamGroup);
104 27 ParentType::loadBalance();
105 }
106
107 // Didn't find a way to construct the grid
108 else
109 {
110 const auto prefix = modelParamGroup.empty() ? modelParamGroup : modelParamGroup + ".";
111 DUNE_THROW(ParameterException, "Please supply one of the parameters "
112 << prefix + "Grid.UpperRight"
113 << ", or a grid file in " << prefix + "Grid.File");
114
115 }
116 }
117
118 /*!
119 * \brief Makes a grid from a file. We currently support *.dgf (Dune Grid Format) and *.msh (Gmsh mesh format).
120 */
121 36 void makeGridFromFile(const std::string& fileName,
122 const std::string& modelParamGroup)
123 {
124 // We found a file in the input file...does it have a supported extension?
125
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
72 const std::string extension = ParentType::getFileExtension(fileName);
126
3/6
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 24 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
36 if (extension != "dgf" && extension != "msh" && extension != "vtu")
127 DUNE_THROW(Dune::IOError, "Grid type " << Dune::className<Grid>() << " doesn't support grid files with extension: *."<< extension);
128
129 // Dune Grid Format (DGF) files
130
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
36 if (extension == "dgf")
131 {
132 24 ParentType::enableDgfGridPointer_ = true;
133
10/20
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 24 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 24 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 24 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 24 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 22 times.
✓ Branch 23 taken 2 times.
✓ Branch 25 taken 24 times.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
118 ParentType::dgfGridPtr() = Dune::GridPtr<Grid>(fileName.c_str(), Dune::MPIHelper::getCommunicator());
134
4/8
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 24 times.
24 ParentType::gridData_ = std::make_shared<typename ParentType::GridData>(ParentType::dgfGridPtr());
135 }
136
137 // Gmsh mesh format
138
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 else if (extension == "msh")
139 {
140 // get some optional parameters
141
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 const bool verbose = getParamFromGroup<bool>(modelParamGroup, "Grid.Verbosity", false);
142
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 const bool boundarySegments = getParamFromGroup<bool>(modelParamGroup, "Grid.BoundarySegments", false);
143
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 const bool domainMarkers = getParamFromGroup<bool>(modelParamGroup, "Grid.DomainMarkers", false);
144
145
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
12 if (domainMarkers)
146 {
147 8 ParentType::enableGmshDomainMarkers_ = true;
148
10/22
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 6 times.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 4 times.
✓ Branch 17 taken 4 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.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
56 std::vector<int> boundaryMarkersInsertionIndex, boundaryMarkers, faceMarkers, elementMarkers;
149
3/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
16 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
150
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
16 Dune::GmshReader<Grid>::read(*gridFactory, fileName, boundaryMarkersInsertionIndex, elementMarkers, verbose, boundarySegments);
151
7/18
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
16 ParentType::gridPtr() = std::shared_ptr<Grid>(gridFactory->createGrid());
152
153 // reorder boundary markers according to boundarySegmentIndex
154
4/8
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
8 boundaryMarkers.resize(ParentType::gridPtr()->numBoundarySegments(), 0);
155
5/10
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
8 faceMarkers.resize(ParentType::gridPtr()->leafGridView().size(1), 0);
156
4/8
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
8 const auto& indexSet = ParentType::gridPtr()->leafGridView().indexSet();
157
11/20
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 17410 times.
✓ Branch 19 taken 8 times.
✓ Branch 20 taken 17410 times.
✓ Branch 21 taken 8 times.
✓ Branch 23 taken 17410 times.
✗ Branch 24 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
34828 for (const auto& element : elements(ParentType::gridPtr()->leafGridView()))
158 {
159
7/16
✓ Branch 1 taken 17410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 17410 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 17410 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 75614 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 20 taken 58204 times.
✗ Branch 21 not taken.
✓ Branch 26 taken 17410 times.
✗ Branch 27 not taken.
168638 for (const auto& intersection : intersections(ParentType::gridPtr()->leafGridView(), element))
160 {
161
6/8
✓ Branch 1 taken 2692 times.
✓ Branch 2 taken 55512 times.
✓ Branch 4 taken 2692 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2692 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2612 times.
✓ Branch 10 taken 80 times.
58204 if (intersection.boundary() && gridFactory->wasInserted(intersection))
162 {
163
3/6
✓ Branch 1 taken 2612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2612 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2612 times.
✗ Branch 8 not taken.
5224 auto marker = boundaryMarkersInsertionIndex[gridFactory->insertionIndex(intersection)];
164
2/4
✓ Branch 1 taken 2612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2612 times.
✗ Branch 5 not taken.
2612 boundaryMarkers[intersection.boundarySegmentIndex()] = marker;
165
2/4
✓ Branch 1 taken 2612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2612 times.
✗ Branch 5 not taken.
2612 faceMarkers[indexSet.index(element.template subEntity<1>(intersection.indexInInside()))] = marker;
166 }
167 }
168 }
169
170
4/8
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 8 times.
8 ParentType::gridData_ = std::make_shared<typename ParentType::GridData>(ParentType::gridPtr(), std::move(gridFactory),
171
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 std::move(elementMarkers), std::move(boundaryMarkers), std::move(faceMarkers));
172 }
173 else
174 {
175
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
176
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
8 Dune::GmshReader<Grid>::read(*gridFactory, fileName, verbose, boundarySegments);
177
8/22
✓ 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.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✓ Branch 18 taken 4 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.
8 ParentType::gridPtr() = std::shared_ptr<Grid>(gridFactory->createGrid());
178 }
179 }
180
181 // VTK file formats for unstructured grids
182 else if (extension == "vtu")
183 {
184 VTKReader vtkReader(fileName);
185 VTKReader::Data cellData, pointData;
186 auto gridFactory = std::make_unique<Dune::GridFactory<Grid>>();
187 const bool verbose = getParamFromGroup<bool>(modelParamGroup, "Grid.Verbosity", false);
188 ParentType::gridPtr() = vtkReader.readGrid(*gridFactory, cellData, pointData, verbose);
189 ParentType::gridData_ = std::make_shared<typename ParentType::GridData>(ParentType::gridPtr(), std::move(gridFactory), std::move(cellData), std::move(pointData));
190 ParentType::enableVtkData_ = true;
191 }
192 36 }
193
194 /*!
195 * \brief Makes a structured cube grid using the structured grid factory
196 */
197 template <int dimension, int dimensionworld, std::enable_if_t<dimension != dimensionworld, int> = 0>
198 void makeStructuredGrid(typename ParentType::CellType cellType,
199 const std::string& modelParamGroup)
200 {
201 DUNE_THROW(Dune::IOError, "ALUGrid currently only supports the creation of structured grids with dimension == dimensionworld. Consider reading in a grid file instead.");
202 }
203
204 /*!
205 * \brief Makes a structured cube grid using the structured grid factory
206 */
207 template <int dimension, int dimensionworld, std::enable_if_t<dimension == dimensionworld, int> = 0>
208 void makeStructuredGrid(typename ParentType::CellType cellType,
209 const std::string& modelParamGroup)
210 {
211 // make a structured grid
212 if (elType == Dune::cube)
213 18 ParentType::template makeStructuredGrid<dimension, dimensionworld>(ParentType::CellType::Cube, modelParamGroup);
214 else if (elType == Dune::simplex)
215 9 ParentType::template makeStructuredGrid<dimension, dimensionworld>(ParentType::CellType::Simplex, modelParamGroup);
216 else
217 DUNE_THROW(Dune::IOError, "ALUGrid only supports Dune::cube or Dune::simplex as cell type!");
218 }
219 };
220
221 /*!
222 * \ingroup InputOutput
223 * \brief Boundary flag
224 */
225 //! alu uses boundary id
226 template<int dim, int dimworld, Dune::ALUGridElementType elType, Dune::ALUGridRefinementType refinementType>
227 class BoundaryFlag<Dune::ALUGrid<dim, dimworld, elType, refinementType>>
228 {
229 public:
230 18639142 BoundaryFlag() : flag_(-1) {}
231
232 template<class Intersection>
233 24252614 BoundaryFlag(const Intersection& i) : flag_(-1)
234 {
235
2/2
✓ Branch 1 taken 681892 times.
✓ Branch 2 taken 23570722 times.
24252614 if (i.boundary())
236 681892 flag_ = i.impl().boundaryId();
237 24252614 }
238
239 using value_type = int;
240
241 value_type get() const { return flag_; }
242
243 private:
244 int flag_;
245 };
246
247 namespace Grid::Capabilities {
248
249 // To the best of our knowledge ALUGrid is view thread-safe
250 // This specialization can be removed after we depend on Dune release 2.9 in which this is guaranteed by ALUGrid itself
251 template<int dim, int dimworld, Dune::ALUGridElementType elType, Dune::ALUGridRefinementType refinementType>
252 struct MultithreadingSupported<Dune::ALUGrid<dim, dimworld, elType, refinementType>>
253 {
254 template<class GV>
255 static bool eval(const GV&) // default is independent of the grid view
256 { return true; }
257 };
258
259 } // end namespace Grid::Capabilities
260
261 #endif // HAVE_DUNE_ALUGRID
262
263 } // end namespace Dumux
264
265 #endif
266