Dune Core Modules (2.5.0)

dgfparser.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_ALBERTA_DGFPARSER_HH
4#define DUNE_ALBERTA_DGFPARSER_HH
5
6#include <vector>
7
8#include <dune/grid/albertagrid.hh>
10
11#include <dune/grid/io/file/dgfparser/dgfparser.hh>
12#include <dune/grid/io/file/dgfparser/blocks/projection.hh>
13
14#include <dune/grid/common/intersection.hh>
15#include <dune/grid/io/file/dgfparser/parser.hh>
16
17#if HAVE_ALBERTA
18
19namespace Dune
20{
21
22 // External Forward Declarations
23 // -----------------------------
24
25 template< class GridImp, class IntersectionImp >
26 class Intersection;
27
28
29
30 // DGFGridFactory for AlbertaGrid
31 // ------------------------------
32
33 template< int dim, int dimworld >
34 struct DGFGridFactory< AlbertaGrid< dim, dimworld > >
35 {
36 typedef AlbertaGrid<dim,dimworld> Grid;
37 const static int dimension = Grid::dimension;
38 typedef MPIHelper::MPICommunicator MPICommunicatorType;
39 typedef typename Grid::template Codim<0>::Entity Element;
40 typedef typename Grid::template Codim<dimension>::Entity Vertex;
41 typedef Dune::GridFactory<Grid> GridFactory;
42
43 explicit DGFGridFactory ( std::istream &input,
44 MPICommunicatorType comm = MPIHelper::getCommunicator() );
45 explicit DGFGridFactory ( const std::string &filename,
46 MPICommunicatorType comm = MPIHelper::getCommunicator() );
47
48 Grid *grid () const
49 {
50 return grid_;
51 }
52
53 template< class Intersection >
54 bool wasInserted ( const Intersection &intersection ) const
55 {
56 return factory_.wasInserted( intersection );
57 }
58
59 template< class Intersection >
60 int boundaryId ( const Intersection &intersection ) const
61 {
62 return Grid::getRealImplementation( intersection ).boundaryId();
63 }
64
65 // return true if boundary parameters found
66 bool haveBoundaryParameters () const
67 {
68 return dgf_.haveBndParameters;
69 }
70
71 template < class GG, class II >
73 boundaryParameter ( const Intersection< GG, II > & intersection ) const
74 {
75 typedef Dune::Intersection< GG, II > Intersection;
76 typename Intersection::Entity entity = intersection.inside();
77 const int face = intersection.indexInInside();
78
79 const ReferenceElement< double, dimension > & refElem =
81 int corners = refElem.size( face, 1, dimension );
82 std :: vector< unsigned int > bound( corners );
83 for( int i=0; i < corners; ++i )
84 {
85 const int k = refElem.subEntity( face, 1, i, dimension );
86 bound[ i ] = factory_.insertionIndex( entity.template subEntity< dimension >( k ) );
87 }
88
89 DuneGridFormatParser::facemap_t::key_type key( bound, false );
90 const DuneGridFormatParser::facemap_t::const_iterator pos = dgf_.facemap.find( key );
91 if( pos != dgf_.facemap.end() )
92 return dgf_.facemap.find( key )->second.second;
93 else
95 }
96
97 template< int codim >
98 int numParameters () const
99 {
100 if( codim == 0 )
101 return dgf_.nofelparams;
102 else if( codim == dimension )
103 return dgf_.nofvtxparams;
104 else
105 return 0;
106 }
107
108 std::vector< double > &parameter ( const Element &element )
109 {
110 if( numParameters< 0 >() <= 0 )
111 {
112 DUNE_THROW( InvalidStateException,
113 "Calling DGFGridFactory::parameter is only allowed if there are parameters." );
114 }
115 return dgf_.elParams[ factory_.insertionIndex( element ) ];
116 }
117
118 std::vector< double > &parameter ( const Vertex &vertex )
119 {
120 if( numParameters< dimension >() <= 0 )
121 {
122 DUNE_THROW( InvalidStateException,
123 "Calling DGFGridFactory::parameter is only allowed if there are parameters." );
124 }
125 return dgf_.vtxParams[ factory_.insertionIndex( vertex ) ];
126 }
127
128 private:
129 bool generate( std::istream &input );
130
131 Grid *grid_;
132 GridFactory factory_;
133 DuneGridFormatParser dgf_;
134 };
135
136
137
138 // DGFGridInfo for AlbertaGrid
139 // ---------------------------
140
141 template< int dim, int dimworld >
142 struct DGFGridInfo< AlbertaGrid< dim, dimworld > >
143 {
144 static int refineStepsForHalf ()
145 {
146 return dim;
147 }
148
149 static double refineWeight ()
150 {
151 return 0.5;
152 }
153 };
154
155
156
157 // Implementation of DGFGridFactory for AlbertaGrid
158 // ------------------------------------------------
159
160 template< int dim, int dimworld >
161 inline DGFGridFactory< AlbertaGrid< dim, dimworld > >
162 ::DGFGridFactory ( std::istream &input, MPICommunicatorType comm )
163 : dgf_( 0, 1 )
164 {
165 input.clear();
166 input.seekg( 0 );
167 if( !input )
168 DUNE_THROW(DGFException, "Error resetting input stream." );
169 generate( input );
170 }
171
172
173 template< int dim, int dimworld >
174 inline DGFGridFactory< AlbertaGrid< dim, dimworld > >
175 ::DGFGridFactory ( const std::string &filename, MPICommunicatorType comm )
176 : dgf_( 0, 1 )
177 {
178 std::ifstream input( filename.c_str() );
179 if( !input )
180 DUNE_THROW( DGFException, "Macrofile " << filename << " not found." );
181 if( !generate( input ) )
182 grid_ = new AlbertaGrid< dim, dimworld >( filename.c_str() );
183 input.close();
184 }
185
186}
187
188#endif // #if HAVE_ALBERTA
189
190#endif // #ifndef DUNE_ALBERTA_DGFPARSER_HH
specialization of the generic GridFactory for AlbertaGrid
@ dimension
The dimension of the grid.
Definition: grid.hh:387
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: intersection.hh:162
GridImp::template Codim< 0 >::Entity Entity
Type of entity that this Intersection belongs to.
Definition: intersection.hh:186
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:173
static MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:181
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Dune namespace.
Definition: alignment.hh:11
static const type & defaultValue()
default constructor
Definition: parser.hh:26
std::string type
type of additional boundary parameters
Definition: parser.hh:23
static double refineWeight()
static int refineStepsForHalf()
number of globalRefine steps needed to refuce h by 0.5
static const ReferenceElement< ctype, dim > & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:757
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 23, 23:29, 2024)