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 
17 namespace 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 
197  explicit DofVectorPointer ( const DofSpace *dofSpace,
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
#define ALBERTA
Definition: albertaheader.hh:29
provides a wrapper for ALBERTA's el_info structure
provides a wrapper for ALBERTA's refinement patches and the corners for geometryInFather
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
ALBERTA DOF_INT_VEC DofVector
Definition: dofvector.hh:40
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:57
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:42
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 DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:79
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:84
static void free(DofVector *dofVector)
Definition: dofvector.hh:74
ALBERTA DOF_SCHAR_VEC DofVector
Definition: dofvector.hh:67
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:69
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:96
static void free(DofVector *dofVector)
Definition: dofvector.hh:101
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:106
ALBERTA DOF_UCHAR_VEC DofVector
Definition: dofvector.hh:94
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:111
static void free(DofVector *dofVector)
Definition: dofvector.hh:128
static bool write(const DofVector *dofVector, const std::string &filename)
Definition: dofvector.hh:138
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:123
ALBERTA DOF_REAL_VEC DofVector
Definition: dofvector.hh:121
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:133
static DofVector * get(const DofSpace *dofSpace, const std::string &name)
Definition: dofvector.hh:150
static DofVector * read(const std::string &filename, Mesh *mesh, DofSpace *dofSpace)
Definition: dofvector.hh:160
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
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
void setupRestriction()
Definition: dofvector.hh:299
DofVectorPointer()
Definition: dofvector.hh:193
AdaptationData * getAdaptationData() const
Definition: dofvector.hh:277
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
static const bool supportsAdaptationData
Definition: dofvector.hh:187
std::string name() const
Definition: dofvector.hh:228
const DofSpace * dofSpace() const
Definition: dofvector.hh:223
void forEach(Functor &functor) const
Definition: dofvector.hh:264
DofVectorPointer(const DofSpace *dofSpace, const std::string &name="")
Definition: dofvector.hh:197