3 #ifndef DUNE_ALBERTA_DOFVECTOR_HH
4 #define DUNE_ALBERTA_DOFVECTOR_HH
33 struct DofVectorProvider;
36 struct DofVectorProvider< int >
42 return ALBERTA get_dof_int_vec( name.c_str(), dofSpace );
47 ALBERTA free_dof_int_vec( dofVector );
52 return ALBERTA read_dof_int_vec_xdr( filename.c_str(), mesh, dofSpace );
55 static bool write (
const DofVector *dofVector,
const std::string &filename )
57 int success =
ALBERTA write_dof_int_vec_xdr( dofVector, filename.c_str() );
58 return (success == 0);
63 struct DofVectorProvider< signed char >
69 return ALBERTA get_dof_schar_vec( name.c_str(), dofSpace );
74 ALBERTA free_dof_schar_vec( dofVector );
79 return ALBERTA read_dof_schar_vec_xdr( filename.c_str(), mesh, dofSpace );
82 static bool write (
const DofVector *dofVector,
const std::string &filename )
84 int success =
ALBERTA write_dof_schar_vec_xdr( dofVector, filename.c_str() );
85 return (success == 0);
90 struct DofVectorProvider< unsigned char >
96 return ALBERTA get_dof_uchar_vec( name.c_str(), dofSpace );
101 ALBERTA free_dof_uchar_vec( dofVector );
106 return ALBERTA read_dof_uchar_vec_xdr( filename.c_str(), mesh, dofSpace );
109 static bool write (
const DofVector *dofVector,
const std::string &filename )
111 int success =
ALBERTA write_dof_uchar_vec_xdr( dofVector, filename.c_str() );
112 return (success == 0);
117 struct DofVectorProvider<
Real >
123 return ALBERTA get_dof_real_vec( name.c_str(), dofSpace );
128 ALBERTA free_dof_real_vec( dofVector );
133 return ALBERTA read_dof_real_vec_xdr( filename.c_str(), mesh, dofSpace );
136 static bool write (
const DofVector *dofVector,
const std::string &filename )
138 int success =
ALBERTA write_dof_real_vec_xdr( dofVector, filename.c_str() );
139 return (success == 0);
150 return ALBERTA get_dof_real_d_vec( name.c_str(), dofSpace );
155 ALBERTA free_dof_real_d_vec( dofVector );
160 return ALBERTA read_dof_real_d_vec_xdr( filename.c_str(), mesh, dofSpace );
163 static bool write (
const DofVector *dofVector,
const std::string &filename )
165 int success =
ALBERTA write_dof_real_d_vec_xdr( dofVector, filename.c_str() );
166 return (success == 0);
175 template<
class Dof >
180 typedef Alberta::DofVectorProvider< Dof > DofVectorProvider;
196 const std::string &
name =
"" )
201 : dofVector_( dofVector )
204 operator bool ()
const
206 return (
bool)dofVector_;
214 operator Dof * ()
const
217 GET_DOF_VEC( ptr, dofVector_ );
223 return dofVector_->fe_space;
229 return dofVector_->name;
231 return std::string();
237 dofVector_ = DofVectorProvider::get( dofSpace,
name );
247 bool write (
const std::string &filename )
const
256 DofVectorProvider::free( dofVector_ );
261 template<
class Functor >
264 Dof *array = (Dof *)(*
this);
265 FOR_ALL_DOFS(
dofSpace()->admin, functor( array[ dof ] ) );
270 Dof *array = (Dof *)(*
this);
271 FOR_ALL_DOFS(
dofSpace()->admin, array[ dof ] = value );
274 template<
class AdaptationData >
277 assert( dofVector_ );
278 #if DUNE_ALBERTA_VERSION >= 0x300
279 assert( dofVector_->user_data );
280 return static_cast< AdaptationData *
>( dofVector_->user_data );
286 template<
class AdaptationData >
289 assert( dofVector_ );
290 #if DUNE_ALBERTA_VERSION >= 0x300
291 dofVector_->user_data = adaptationData;
292 #endif // #if DUNE_ALBERTA_VERSION >= 0x300
295 template<
class Interpolation >
298 assert( dofVector_ );
299 dofVector_->refine_interpol = &refineInterpolate< Interpolation >;
302 template<
class Restriction >
305 assert( dofVector_ );
306 dofVector_->coarse_restrict = &coarsenRestrict< Restriction >;
310 template<
class Interpolation >
311 static void refineInterpolate (
DofVector *dofVector, RC_LIST_EL *list,
int n )
313 const This dofVectorPointer( dofVector );
314 typename Interpolation::Patch patch( list, n );
315 Interpolation::interpolateVector( dofVectorPointer, patch );
318 template<
class Restriction >
319 static void coarsenRestrict (
DofVector *dofVector, RC_LIST_EL *list,
int n )
321 const This dofVectorPointer( dofVector );
322 typename Restriction::Patch patch( list, n );
323 Restriction::restrictVector( dofVectorPointer, patch );
334 assert( !dofVector ==
false );
335 int *array = (
int *)dofVector;
336 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
337 array[ dof ] =
std::abs( array[ dof ] ) );
343 assert( !dofVector ==
false );
344 int *array = (
int *)dofVector;
346 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
347 result =
std::max( result, array[ dof ] ) );
354 assert( !dofVector ==
false );
355 int *array = (
int *)dofVector;
357 FOR_ALL_DOFS( dofVector.
dofSpace()->admin,
358 result =
std::min( result, array[ dof ] ) );
366 #endif // #if HAVE_ALBERTA
368 #endif // #ifndef DUNE_ALBERTA_DOFVECTOR_HH