1 #ifndef DUNE_ALBERTA_DOFVECTOR_HH
2 #define DUNE_ALBERTA_DOFVECTOR_HH
40 return ALBERTA get_dof_int_vec( name.c_str(), dofSpace );
45 ALBERTA free_dof_int_vec( dofVector );
50 return ALBERTA read_dof_int_vec_xdr( filename.c_str(), mesh, dofSpace );
53 static bool write (
const DofVector *dofVector,
const std::string &filename )
55 int success =
ALBERTA write_dof_int_vec_xdr( dofVector, filename.c_str() );
56 return (success == 0);
67 return ALBERTA get_dof_schar_vec( name.c_str(), dofSpace );
72 ALBERTA free_dof_schar_vec( dofVector );
77 return ALBERTA read_dof_schar_vec_xdr( filename.c_str(), mesh, dofSpace );
80 static bool write (
const DofVector *dofVector,
const std::string &filename )
82 int success =
ALBERTA write_dof_schar_vec_xdr( dofVector, filename.c_str() );
83 return (success == 0);
94 return ALBERTA get_dof_uchar_vec( name.c_str(), dofSpace );
99 ALBERTA free_dof_uchar_vec( dofVector );
104 return ALBERTA read_dof_uchar_vec_xdr( filename.c_str(), mesh, dofSpace );
107 static bool write (
const DofVector *dofVector,
const std::string &filename )
109 int success =
ALBERTA write_dof_uchar_vec_xdr( dofVector, filename.c_str() );
110 return (success == 0);
121 return ALBERTA get_dof_real_vec( name.c_str(), dofSpace );
126 ALBERTA free_dof_real_vec( dofVector );
131 return ALBERTA read_dof_real_vec_xdr( filename.c_str(), mesh, dofSpace );
134 static bool write (
const DofVector *dofVector,
const std::string &filename )
136 int success =
ALBERTA write_dof_real_vec_xdr( dofVector, filename.c_str() );
137 return (success == 0);
148 return ALBERTA get_dof_real_d_vec( name.c_str(), dofSpace );
153 ALBERTA free_dof_real_d_vec( dofVector );
158 return ALBERTA read_dof_real_d_vec_xdr( filename.c_str(), mesh, dofSpace );
161 static bool write (
const DofVector *dofVector,
const std::string &filename )
163 int success =
ALBERTA write_dof_real_d_vec_xdr( dofVector, filename.c_str() );
164 return (success == 0);
173 template<
class Dof >
194 const std::string &
name =
"" )
199 : dofVector_( dofVector )
202 operator bool ()
const
204 return (
bool)dofVector_;
212 operator Dof * ()
const
215 GET_DOF_VEC( ptr, dofVector_ );
221 return dofVector_->fe_space;
227 return dofVector_->name;
229 return std::string();
235 dofVector_ = DofVectorProvider::get( dofSpace,
name );
242 dofVector_ = DofVectorProvider::read( filename, meshPointer, NULL );
245 bool write (
const std::string &filename )
const
247 return DofVectorProvider::write( dofVector_, filename );
254 DofVectorProvider::free( dofVector_ );
259 template<
class Functor >
262 Dof *array = (Dof *)(*
this);
263 FOR_ALL_DOFS(
dofSpace()->admin, functor( array[ dof ] ) );
268 Dof *array = (Dof *)(*
this);
269 FOR_ALL_DOFS(
dofSpace()->admin, array[ dof ] = value );
272 template<
class AdaptationData >
275 assert( dofVector_ );
276 #if DUNE_ALBERTA_VERSION >= 0x300
277 assert( dofVector_->user_data );
278 return static_cast< AdaptationData *
>( dofVector_->user_data );
284 template<
class AdaptationData >
287 assert( dofVector_ );
288 #if DUNE_ALBERTA_VERSION >= 0x300
289 dofVector_->user_data = adaptationData;
290 #endif // #if DUNE_ALBERTA_VERSION >= 0x300
293 template<
class Interpolation >
296 assert( dofVector_ );
297 dofVector_->refine_interpol = &refineInterpolate< Interpolation >;
300 template<
class Restriction >
303 assert( dofVector_ );
304 dofVector_->coarse_restrict = &coarsenRestrict< Restriction >;
308 template<
class Interpolation >
309 static void refineInterpolate (
DofVector *dofVector, RC_LIST_EL *list,
int n )
311 const This dofVectorPointer( dofVector );
312 typename Interpolation::Patch patch( list, n );
313 Interpolation::interpolateVector( dofVectorPointer, patch );
316 template<
class Restriction >
317 static void coarsenRestrict (
DofVector *dofVector, RC_LIST_EL *list,
int n )
319 const This dofVectorPointer( dofVector );
320 typename Restriction::Patch patch( list, n );
321 Restriction::restrictVector( dofVectorPointer, patch );
332 assert( !dofVector ==
false );
333 int *array = (
int *)dofVector;
334 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
335 array[ dof ] =
std::abs( array[ dof ] ) );
341 assert( !dofVector ==
false );
342 int *array = (
int *)dofVector;
344 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
345 result =
std::max( result, array[ dof ] ) );
352 assert( !dofVector ==
false );
353 int *array = (
int *)dofVector;
355 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
356 result =
std::min( result, array[ dof ] ) );
364 #endif // #if HAVE_ALBERTA
366 #endif // #ifndef DUNE_ALBERTA_DOFVECTOR_HH