dune-grid 2.9.0
dofvector.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_ALBERTA_DOFVECTOR_HH
6#define DUNE_ALBERTA_DOFVECTOR_HH
7
8#include <cstdlib>
9#include <limits>
10
14
15#if HAVE_ALBERTA
16
17namespace Dune
18{
19
20 namespace Alberta
21 {
22
23 // External Forward Declarations
24 // -----------------------------
25
26 template< int dim >
27 class MeshPointer;
28
29
30
31 // DofVectorProvider
32 // -----------------
33
34 template< class Dof >
36
37 template<>
38 struct DofVectorProvider< int >
39 {
40 typedef ALBERTA DOF_INT_VEC DofVector;
41
42 static DofVector *get ( const DofSpace *dofSpace, const std::string &name )
43 {
44 return ALBERTA get_dof_int_vec( name.c_str(), dofSpace );
45 }
46
47 static void free ( DofVector *dofVector )
48 {
49 ALBERTA free_dof_int_vec( dofVector );
50 }
51
52 static DofVector *read ( const std::string &filename, Mesh *mesh, DofSpace *dofSpace )
53 {
54 return ALBERTA read_dof_int_vec_xdr( filename.c_str(), mesh, dofSpace );
55 }
56
57 static bool write ( const DofVector *dofVector, const std::string &filename )
58 {
59 int success = ALBERTA write_dof_int_vec_xdr( dofVector, filename.c_str() );
60 return (success == 0);
61 }
62 };
63
64 template<>
65 struct DofVectorProvider< signed char >
66 {
67 typedef ALBERTA DOF_SCHAR_VEC DofVector;
68
69 static DofVector *get ( const DofSpace *dofSpace, const std::string &name )
70 {
71 return ALBERTA get_dof_schar_vec( name.c_str(), dofSpace );
72 }
73
74 static void free ( DofVector *dofVector )
75 {
76 ALBERTA free_dof_schar_vec( dofVector );
77 }
78
79 static DofVector *read ( const std::string &filename, Mesh *mesh, DofSpace *dofSpace )
80 {
81 return ALBERTA read_dof_schar_vec_xdr( filename.c_str(), mesh, dofSpace );
82 }
83
84 static bool write ( const DofVector *dofVector, const std::string &filename )
85 {
86 int success = ALBERTA write_dof_schar_vec_xdr( dofVector, filename.c_str() );
87 return (success == 0);
88 }
89 };
90
91 template<>
92 struct DofVectorProvider< unsigned char >
93 {
94 typedef ALBERTA DOF_UCHAR_VEC DofVector;
95
96 static DofVector *get ( const DofSpace *dofSpace, const std::string &name )
97 {
98 return ALBERTA get_dof_uchar_vec( name.c_str(), dofSpace );
99 }
100
101 static void free ( DofVector *dofVector )
102 {
103 ALBERTA free_dof_uchar_vec( dofVector );
104 }
105
106 static DofVector *read ( const std::string &filename, Mesh *mesh, DofSpace *dofSpace )
107 {
108 return ALBERTA read_dof_uchar_vec_xdr( filename.c_str(), mesh, dofSpace );
109 }
110
111 static bool write ( const DofVector *dofVector, const std::string &filename )
112 {
113 int success = ALBERTA write_dof_uchar_vec_xdr( dofVector, filename.c_str() );
114 return (success == 0);
115 }
116 };
117
118 template<>
120 {
121 typedef ALBERTA DOF_REAL_VEC DofVector;
122
123 static DofVector *get ( const DofSpace *dofSpace, const std::string &name )
124 {
125 return ALBERTA get_dof_real_vec( name.c_str(), dofSpace );
126 }
127
128 static void free ( DofVector *dofVector )
129 {
130 ALBERTA free_dof_real_vec( dofVector );
131 }
132
133 static DofVector *read ( const std::string &filename, Mesh *mesh, DofSpace *dofSpace )
134 {
135 return ALBERTA read_dof_real_vec_xdr( filename.c_str(), mesh, dofSpace );
136 }
137
138 static bool write ( const DofVector *dofVector, const std::string &filename )
139 {
140 int success = ALBERTA write_dof_real_vec_xdr( dofVector, filename.c_str() );
141 return (success == 0);
142 }
143 };
144
145 template<>
147 {
148 typedef ALBERTA DOF_REAL_D_VEC DofVector;
149
150 static DofVector *get ( const DofSpace *dofSpace, const std::string &name )
151 {
152 return ALBERTA get_dof_real_d_vec( name.c_str(), dofSpace );
153 }
154
155 static void free ( DofVector *dofVector )
156 {
157 ALBERTA free_dof_real_d_vec( dofVector );
158 }
159
160 static DofVector *read ( const std::string &filename, Mesh *mesh, DofSpace *dofSpace )
161 {
162 return ALBERTA read_dof_real_d_vec_xdr( filename.c_str(), mesh, dofSpace );
163 }
164
165 static bool write ( const DofVector *dofVector, const std::string &filename )
166 {
167 int success = ALBERTA write_dof_real_d_vec_xdr( dofVector, filename.c_str() );
168 return (success == 0);
169 }
170 };
171
172
173
174 // DofVectorPointer
175 // ----------------
176
177 template< class Dof >
179 {
181
183
184 public:
185 typedef typename DofVectorProvider::DofVector DofVector;
186
187 static const bool supportsAdaptationData = true;
188
189 private:
190 DofVector *dofVector_;
191
192 public:
194 : dofVector_( NULL )
195 {}
196
198 const std::string &name = "" )
199 : dofVector_ ( DofVectorProvider::get( dofSpace, name ) )
200 {}
201
202 explicit DofVectorPointer ( DofVector *dofVector )
203 : dofVector_( dofVector )
204 {}
205
206 explicit operator bool () const
207 {
208 return (bool)dofVector_;
209 }
210
211 operator DofVector * () const
212 {
213 return dofVector_;
214 }
215
216 operator Dof * () const
217 {
218 Dof *ptr = NULL;
219 GET_DOF_VEC( ptr, dofVector_ );
220 return ptr;
221 }
222
223 const DofSpace *dofSpace () const
224 {
225 return dofVector_->fe_space;
226 }
227
228 std::string name () const
229 {
230 if( dofVector_ )
231 return dofVector_->name;
232 else
233 return std::string();
234 }
235
236 void create ( const DofSpace *dofSpace, const std::string &name = "" )
237 {
238 release();
239 dofVector_ = DofVectorProvider::get( dofSpace, name );
240 }
241
242 template< int dim >
243 void read ( const std::string &filename, const MeshPointer< dim > &meshPointer )
244 {
245 release();
246 dofVector_ = DofVectorProvider::read( filename, meshPointer, NULL );
247 }
248
249 bool write ( const std::string &filename ) const
250 {
251 return DofVectorProvider::write( dofVector_, filename );
252 }
253
254 void release ()
255 {
256 if( dofVector_ )
257 {
258 DofVectorProvider::free( dofVector_ );
259 dofVector_ = NULL;
260 }
261 }
262
263 template< class Functor >
264 void forEach ( Functor &functor ) const
265 {
266 Dof *array = (Dof *)(*this);
267 FOR_ALL_DOFS( dofSpace()->admin, functor( array[ dof ] ) );
268 }
269
270 void initialize ( const Dof &value )
271 {
272 Dof *array = (Dof *)(*this);
273 FOR_ALL_DOFS( dofSpace()->admin, array[ dof ] = value );
274 }
275
276 template< class AdaptationData >
277 AdaptationData *getAdaptationData () const
278 {
279 assert( dofVector_ );
280 assert( dofVector_->user_data );
281 return static_cast< AdaptationData * >( dofVector_->user_data );
282 }
283
284 template< class AdaptationData >
285 void setAdaptationData ( AdaptationData *adaptationData )
286 {
287 assert( dofVector_ );
288 dofVector_->user_data = adaptationData;
289 }
290
291 template< class Interpolation >
293 {
294 assert( dofVector_ );
295 dofVector_->refine_interpol = &refineInterpolate< Interpolation >;
296 }
297
298 template< class Restriction >
300 {
301 assert( dofVector_ );
302 dofVector_->coarse_restrict = &coarsenRestrict< Restriction >;
303 }
304
305 private:
306 template< class Interpolation >
307 static void refineInterpolate ( DofVector *dofVector, RC_LIST_EL *list, int n )
308 {
309 const This dofVectorPointer( dofVector );
310 typename Interpolation::Patch patch( list, n );
311 Interpolation::interpolateVector( dofVectorPointer, patch );
312 }
313
314 template< class Restriction >
315 static void coarsenRestrict ( DofVector *dofVector, RC_LIST_EL *list, int n )
316 {
317 const This dofVectorPointer( dofVector );
318 typename Restriction::Patch patch( list, n );
319 Restriction::restrictVector( dofVectorPointer, patch );
320 }
321 };
322
323
324
325 // Auxiliary Functions
326 // --------------------
327
328 inline void abs ( const DofVectorPointer< int > &dofVector )
329 {
330 assert( !dofVector == false );
331 int *array = (int *)dofVector;
332 FOR_ALL_DOFS( dofVector.dofSpace()->admin,
333 array[ dof ] = std::abs( array[ dof ] ) );
334 }
335
336
337 inline int max ( const DofVectorPointer< int > &dofVector )
338 {
339 assert( !dofVector == false );
340 int *array = (int *)dofVector;
341 int result = std::numeric_limits< int >::min();
342 FOR_ALL_DOFS( dofVector.dofSpace()->admin,
343 result = std::max( result, array[ dof ] ) );
344 return result;
345 }
346
347
348 inline int min ( const DofVectorPointer< int > &dofVector )
349 {
350 assert( !dofVector == false );
351 int *array = (int *)dofVector;
352 int result = std::numeric_limits< int >::max();
353 FOR_ALL_DOFS( dofVector.dofSpace()->admin,
354 result = std::min( result, array[ dof ] ) );
355 return result;
356 }
357
358 } // namespace Alberta
359
360} // namespace Dune
361
362#endif // #if HAVE_ALBERTA
363
364#endif // #ifndef DUNE_ALBERTA_DOFVECTOR_HH
provides a wrapper for ALBERTA's refinement patches and the corners for geometryInFather
provides a wrapper for ALBERTA's el_info structure
#define ALBERTA
Definition: albertaheader.hh:29
Include standard header files.
Definition: agrid.hh:60
ALBERTA MESH Mesh
Definition: misc.hh:53
void abs(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:328
ALBERTA REAL Real
Definition: misc.hh:48
ALBERTA FE_SPACE DofSpace
Definition: misc.hh:65
int min(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:348
int max(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:337
ALBERTA REAL_D GlobalVector
Definition: misc.hh:50
Definition: meshpointer.hh:40
Definition: dofvector.hh:35
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:42
ALBERTA DOF_INT_VEC DofVector
Definition: dofvector.hh:40
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:57
static void free(DofVector *dofVector)
Definition: dofvector.hh:47
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:52
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:84
static void free(DofVector *dofVector)
Definition: dofvector.hh:74
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:69
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:79
ALBERTA DOF_SCHAR_VEC DofVector
Definition: dofvector.hh:67
static void free(DofVector *dofVector)
Definition: dofvector.hh:101
ALBERTA DOF_UCHAR_VEC DofVector
Definition: dofvector.hh:94
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:106
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:96
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:111
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:123
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:133
static void free(DofVector *dofVector)
Definition: dofvector.hh:128
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:138
ALBERTA DOF_REAL_VEC DofVector
Definition: dofvector.hh:121
ALBERTA DOF_REAL_D_VEC DofVector
Definition: dofvector.hh:148
static void free(DofVector *dofVector)
Definition: dofvector.hh:155
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:165
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:160
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:150
Definition: dofvector.hh:179
DofVectorProvider::DofVector DofVector
Definition: dofvector.hh:185
void setupInterpolation()
Definition: dofvector.hh:292
void initialize(const Dof &value)
Definition: dofvector.hh:270
void read(const std::string &filename, const MeshPointer< dim > &meshPointer)
Definition: dofvector.hh:243
void create(const DofSpace *dofSpace, const std::string &name="")
Definition: dofvector.hh:236
void release()
Definition: dofvector.hh:254
AdaptationData * getAdaptationData() const
Definition: dofvector.hh:277
void setupRestriction()
Definition: dofvector.hh:299
DofVectorPointer()
Definition: dofvector.hh:193
void setAdaptationData(AdaptationData *adaptationData)
Definition: dofvector.hh:285
bool write(const std::string &filename) const
Definition: dofvector.hh:249
DofVectorPointer(DofVector *dofVector)
Definition: dofvector.hh:202
const DofSpace * dofSpace() const
Definition: dofvector.hh:223
static const bool supportsAdaptationData
Definition: dofvector.hh:187
std::string name() const
Definition: dofvector.hh:228
void forEach(Functor &functor) const
Definition: dofvector.hh:264
DofVectorPointer(const DofSpace *dofSpace, const std::string &name="")
Definition: dofvector.hh:197