dune-grid 2.9.0
boundarydom.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4// vi: set et ts=4 sw=2 sts=2:
5#ifndef DUNE_DGF_BOUNDARYDOMBLOCK_HH
6#define DUNE_DGF_BOUNDARYDOMBLOCK_HH
7
8#include <iostream>
9#include <string>
10#include <vector>
11
14
15
16namespace Dune
17{
18
19 namespace dgf
20 {
21
23 {
25
27 : id_( 0 ),
28 parameter_( DGFBoundaryParameter::defaultValue() ),
29 defaultData_( false )
30 { }
31
33
34 // constructor
35 DomainData ( int id, BoundaryParameter parameter, bool defaultData = false )
36 : id_( id ),
37 parameter_( parameter ),
38 defaultData_( defaultData )
39 { }
40
41 // return id
42 int id () const
43 {
44 return id_;
45 }
46
47 // return true, if additional parameters given
48 bool hasParameter () const
49 {
50 return (!parameter_.empty());
51 }
52
53 // return additional parameters
55 {
56 return parameter_;
57 }
58
59 // reset data
60 void reset ( int id, BoundaryParameter parameter, bool defaultData = false )
61 {
62 id_ = id;
63 parameter_ = parameter;
64 defaultData_ = defaultData;
65 }
66
67 // returns true if data origins from default boundary domain
68 bool isDefault () const
69 {
70 return defaultData_;
71 }
72
73 friend std::ostream & operator<< ( std :: ostream & os, const DomainData & ddata )
74 {
75 os << "domain data: id = " << ddata.id();
76 if( ddata.hasParameter() )
77 os << ", parameter = " << ddata.parameter();
78 return os;
79 }
80
81 private:
82 int id_;
83 BoundaryParameter parameter_;
84 bool defaultData_;
85
86 }; // end struct DomainData
87
88
89 struct Domain
90 {
91 // dimension of world coordinates
92 const int dimensionworld;
93
95
96 // constructor
97 Domain( std::vector< double > p1, std::vector< double > p2, int id, BoundaryParameter & parameter )
98 : dimensionworld( p1.size() ),
99 left_( p1 ),
100 right_( p2 ),
101 data_( id, parameter )
102 {
103 if( int( p2.size() ) != dimensionworld )
104 {
105 DUNE_THROW(DGFException,
106 "ERROR in " << *this << "!");
107 }
108 }
109
110 // constructor
111 Domain( std::vector< double > p1, std::vector< double > p2, DomainData & data )
112 : dimensionworld( p1.size() ),
113 left_( p1 ),
114 right_( p2 ),
115 data_( data )
116 {
117 if( int( p2.size() ) != dimensionworld )
118 {
119 DUNE_THROW(DGFException,
120 "ERROR in " << *this << "!");
121 }
122 }
123
124 // copy constructor
125 Domain ( const Domain & other )
127 left_( other.left_ ),
128 right_( other.right_ ),
129 data_( other.data_ )
130 {
131 if( dimensionworld != other.dimensionworld )
132 {
133 DUNE_THROW(DGFException,
134 "ERROR in " << *this << "!");
135 }
136 }
137
138 // assignment
139 Domain & operator = ( const Domain & other )
140 {
141 if( dimensionworld != other.dimensionworld )
142 {
143 DUNE_THROW(DGFException,
144 "ERROR in " << *this << "!");
145 }
146
147 left_ = other.left_;
148 right_= other.right_;
149 data_= other.data_;
150 return *this;
151 }
152
153 // return true if point is contained in boundary domain
154 template< class Vector >
155 bool contains ( const Vector & x ) const
156 {
157 bool ret = true;
158 for( int i = 0; i < dimensionworld; ++i )
159 {
160 if( x[ i ] < left_[ i ] || x[ i ] > right_[ i ] )
161 ret = false;
162 }
163 return ret;
164 }
165
166 const DomainData & data () const
167 {
168 return data_;
169 }
170
171 // for error messages
172 friend std::ostream & operator<< ( std :: ostream &os, const Domain & domain )
173 {
174 os << "domain: " << std::endl;
175 os << "left = ";
176 for( int i = 0; i < domain.dimensionworld; ++i )
177 os << domain.left_[ i ] << " ";
178 os << std::endl;
179 os << "right = ";
180 for( int i = 0; i < domain.dimensionworld; ++i )
181 os << domain.right_[ i ] << " ";
182 os << std::endl;
183 os << domain.data();
184 return os;
185 }
186
187 private:
188 std::vector< double > left_, right_;
189 DomainData data_;
190
191 };
192
194 : public BasicBlock
195 {
196 typedef DGFBoundaryParameter::type BoundaryParameter;
197
198 // the dimension of the vertices (is given from user)
199 int dimworld_;
200
201 // internal counter
202 int counter_;
203
204 // default values if given
205 DomainData * default_;
206
207 // storage for all domains;
208 int ndomains_;
209 std::vector< Domain > domains_;
210
211 public:
212 // initialize vertex block and get first vertex
213 BoundaryDomBlock ( std::istream & in, int cdimworld );
214
215 // destructor
217 {
218 if( default_ )
219 delete default_;
220 }
221
222 // go to next domain in block
223 bool next ()
224 {
225 counter_++;
226 return ( counter_ < ndomains_ );
227 }
228
229 // return domain
230 const Domain & domain () const
231 {
232 return domains_.at( counter_ );
233 }
234
235 // return true if default is given
236 bool hasDefaultData () const
237 {
238 return bool( default_ );
239 }
240
241 // return default data
242 const DomainData * defaultData () const
243 {
244 return default_;
245 }
246
247 // return true if any boundary domain block has
248 // additional parameters
249 bool hasParameter () const;
250
251 void reset ()
252 {
254 counter_ = -1;
255 }
256
257 // return true while block is active
258 bool ok ()
259 {
260 return ( counter_ <= ndomains_ );
261 }
262
263 // return data if all vectors in array are contained within
264 // a single domain
265 template< class Vector >
266 const DomainData * contains ( const std::vector< Vector > & v ) const
267 {
268 std::vector< int > index( ndomains_ );
269 for( int i = 0; i < ndomains_; ++i)
270 index[ i ] = i;
271
272 size_t N = v.size();
273 for( size_t i = 0; i < N; ++i )
274 {
275 if( index.empty() )
276 break;
277
278 const int n = index.size();
279 assert( n > 0 );
280 for( int j = n-1; j >= 0; --j )
281 {
282 bool inside = domains_[ index[ j ] ].contains( v[ i ] );
283 if( !inside )
284 index.erase( index.begin() + j );
285 }
286 }
287
288 // check wheter no boundary domain found
289 if( index.empty() )
290 return default_;
291
292 // check for ambiguity
293 if( index.size() > 1 )
294 dwarn << "WARNING: ambiguous boundary domain assignment, use first boundary domain in list" << std::endl;
295
296 return &domains_[ index[ 0 ] ].data();
297 }
298
299 private:
300 void readBlock ();
301 };
302
303 } // end namespace dgf
304
305} // end namespace Dune
306
307#endif
Include standard header files.
Definition: agrid.hh:60
Definition: basic.hh:31
void reset()
Definition: basic.hh:51
Definition: boundarydom.hh:23
void reset(int id, BoundaryParameter parameter, bool defaultData=false)
Definition: boundarydom.hh:60
~DomainData()
Definition: boundarydom.hh:32
DGFBoundaryParameter::type BoundaryParameter
Definition: boundarydom.hh:24
DomainData()
Definition: boundarydom.hh:26
int id() const
Definition: boundarydom.hh:42
const BoundaryParameter & parameter() const
Definition: boundarydom.hh:54
friend std::ostream & operator<<(std ::ostream &os, const DomainData &ddata)
Definition: boundarydom.hh:73
bool hasParameter() const
Definition: boundarydom.hh:48
DomainData(int id, BoundaryParameter parameter, bool defaultData=false)
Definition: boundarydom.hh:35
bool isDefault() const
Definition: boundarydom.hh:68
Definition: boundarydom.hh:90
Domain(std::vector< double > p1, std::vector< double > p2, int id, BoundaryParameter &parameter)
Definition: boundarydom.hh:97
Domain(const Domain &other)
Definition: boundarydom.hh:125
const int dimensionworld
Definition: boundarydom.hh:92
bool contains(const Vector &x) const
Definition: boundarydom.hh:155
DGFBoundaryParameter::type BoundaryParameter
Definition: boundarydom.hh:94
friend std::ostream & operator<<(std ::ostream &os, const Domain &domain)
Definition: boundarydom.hh:172
Domain & operator=(const Domain &other)
Definition: boundarydom.hh:139
const DomainData & data() const
Definition: boundarydom.hh:166
Domain(std::vector< double > p1, std::vector< double > p2, DomainData &data)
Definition: boundarydom.hh:111
Definition: boundarydom.hh:195
~BoundaryDomBlock()
Definition: boundarydom.hh:216
bool hasParameter() const
Definition: boundarydom.cc:138
const Domain & domain() const
Definition: boundarydom.hh:230
const DomainData * contains(const std::vector< Vector > &v) const
Definition: boundarydom.hh:266
bool next()
Definition: boundarydom.hh:223
void reset()
Definition: boundarydom.hh:251
bool ok()
Definition: boundarydom.hh:258
bool hasDefaultData() const
Definition: boundarydom.hh:236
BoundaryDomBlock(std::istream &in, int cdimworld)
Definition: boundarydom.cc:18
const DomainData * defaultData() const
Definition: boundarydom.hh:242
exception class for IO errors in the DGF parser
Definition: dgfexception.hh:16
Contains types for additional features.
Definition: parser.hh:23
std::string type
type of additional boundary parameters
Definition: parser.hh:25