dgfvanguard.hh
Go to the documentation of this file.
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 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
27#ifndef EWOMS_DGF_GRID_VANGUARD_HH
28#define EWOMS_DGF_GRID_VANGUARD_HH
29
30#include <dune/grid/io/file/dgfparser/dgfparser.hh>
31#include <dune/grid/common/mcmgmapper.hh>
33
37
38
39#include <type_traits>
40#include <string>
41
42namespace Opm {
43
48template <class TypeTag>
49class DgfVanguard : public BaseVanguard<TypeTag>
50{
56
57 using GridPointer = std::unique_ptr< Grid >;
58
59public:
63 static void registerParameters()
64 {
65 Parameters::Register<Parameters::GridFile>
66 ("The file name of the DGF file to load");
67 Parameters::Register<Parameters::GridGlobalRefinements>
68 ("The number of global refinements of the grid "
69 "executed after it was loaded");
70 }
71
75 DgfVanguard(Simulator& simulator)
76 : ParentType(simulator)
77 {
78 const std::string dgfFileName = Parameters::Get<Parameters::GridFile>();
79 unsigned numRefinments = Parameters::Get<Parameters::GridGlobalRefinements>();
80
81 {
82 // create DGF GridPtr from a dgf file
83 Dune::GridPtr< Grid > dgfPointer( dgfFileName );
84
85 // this is only implemented for 2d currently
86 addFractures_( dgfPointer );
87
88 // store pointer to dune grid
89 gridPtr_.reset( dgfPointer.release() );
90 }
91
92 if (numRefinments > 0)
93 gridPtr_->globalRefine(static_cast<int>(numRefinments));
94
95 this->finalizeInit_();
96 }
97
101 Grid& grid()
102 { return *gridPtr_; }
103
107 const Grid& grid() const
108 { return *gridPtr_; }
109
118 { gridPtr_->loadBalance(); }
119
126 { return fractureMapper_; }
127
134 { return fractureMapper_; }
135
136protected:
137 void addFractures_(Dune::GridPtr<Grid>& dgfPointer)
138 {
139 using LevelGridView = typename Grid::LevelGridView;
140
141 // check if fractures are available (only 2d currently)
142 if (dgfPointer.nofParameters(static_cast<int>(Grid::dimension)) == 0)
143 return;
144
145 LevelGridView gridView = dgfPointer->levelGridView(/*level=*/0);
146 const unsigned edgeCodim = Grid::dimension - 1;
147
148 using VertexMapper = Dune::MultipleCodimMultipleGeomTypeMapper<LevelGridView>;
149 VertexMapper vertexMapper(gridView, Dune::mcmgVertexLayout());
150
151 // first create a map of the dune to ART vertex indices
152 auto eIt = gridView.template begin</*codim=*/0>();
153 const auto eEndIt = gridView.template end</*codim=*/0>();
154 for (; eIt != eEndIt; ++eIt) {
155 const auto& element = *eIt;
156 const auto& refElem =
157 Dune::ReferenceElements<Scalar, Grid::dimension>::general(element.type());
158
159 const int edges = refElem.size( edgeCodim );
160 for (int edge = 0; edge < edges; ++edge) {
161 const int vertices = refElem.size(edge, edgeCodim, Grid::dimension);
162 std::vector<unsigned> vertexIndices;
163 vertexIndices.reserve(Grid::dimension);
164 for (int vx = 0; vx < vertices; ++vx) {
165 // get local vertex number from edge
166 const int localVx = refElem.subEntity(edge, edgeCodim, vx, Grid::dimension);
167
168 // get vertex
169 const auto vertex = element.template subEntity<Grid::dimension>(localVx);
170
171 // if vertex has parameter 1 insert as a fracture vertex
172 if (dgfPointer.parameters( vertex )[ 0 ] > 0)
173 vertexIndices.push_back(
174 static_cast<unsigned>(vertexMapper.subIndex(element,
175 static_cast<int>(localVx),
176 Grid::dimension)));
177 }
178 // if 2 vertices have been found with flag 1 insert a fracture edge
179 if (static_cast<int>(vertexIndices.size()) == Grid::dimension)
180 fractureMapper_.addFractureEdge(vertexIndices[0], vertexIndices[1]);
181 }
182 }
183 }
184
185private:
186 GridPointer gridPtr_;
187 FractureMapper fractureMapper_;
188};
189
190} // namespace Opm
191
192#endif
Provides the base class for most (all?) simulator vanguards.
Definition: basevanguard.hh:49
const GridView & gridView() const
Returns a reference to the grid view to be used.
Definition: basevanguard.hh:69
void finalizeInit_()
Definition: basevanguard.hh:115
Provides a simulator vanguard which creates a grid by parsing a Dune Grid Format (DGF) file.
Definition: dgfvanguard.hh:50
static void registerParameters()
Register all run-time parameters for the DGF simulator vanguard.
Definition: dgfvanguard.hh:63
FractureMapper & fractureMapper()
Returns the fracture mapper.
Definition: dgfvanguard.hh:125
const FractureMapper & fractureMapper() const
Returns the fracture mapper.
Definition: dgfvanguard.hh:133
DgfVanguard(Simulator &simulator)
Load the grid from the file.
Definition: dgfvanguard.hh:75
void loadBalance()
Distributes the grid on all processes of a parallel computation.
Definition: dgfvanguard.hh:117
const Grid & grid() const
Returns a reference to the grid.
Definition: dgfvanguard.hh:107
Grid & grid()
Returns a reference to the grid.
Definition: dgfvanguard.hh:101
void addFractures_(Dune::GridPtr< Grid > &dgfPointer)
Definition: dgfvanguard.hh:137
Stores the topology of fractures.
Definition: fracturemapper.hh:43
void addFractureEdge(unsigned vertexIdx1, unsigned vertexIdx2)
Marks an edge as having a fracture.
Definition: fracturemapper.hh:74
Definition: blackoilboundaryratevector.hh:37
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:235
This file provides the infrastructure to retrieve run-time parameters.
The Opm property system, traits with inheritance.