Newer
Older
// ============================================================================
// == ==
// == AMDiS - Adaptive multidimensional simulations ==
// == ==

Thomas Witkowski
committed
// == http://www.amdis-fem.org ==
// == ==
// ============================================================================

Thomas Witkowski
committed
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.
/** \file DOFAdmin.h */
/** \defgroup DOFAdministration DOF adaministration module
* @{ <img src="dof.png"> @}
* \brief
* Contains all classes used for the DOF administration.
*/
#ifndef AMDIS_DOFADMIN_H
#define AMDIS_DOFADMIN_H
#include <vector>
#include <memory>
#include <list>
#include "Global.h"
#include "FixVec.h"
#include "Serializable.h"
namespace AMDiS {
/** \ingroup DOFAdministration
* \brief
* Holds all data about one set of DOFs. It includes information about used and
* unused DOF indices, as well as lists of DOFIndexed objects and DOFContainer
* objects, that are automatically resized and resorted during mesh changes.
*/
class DOFAdmin : public Serializable
{
public:
DOFAdmin();
DOFAdmin(Mesh* m, std::string aName);
DOFAdmin(const DOFAdmin&);
/** \brief
* Enlarges the number of DOFs that can be managed at least to minsize by
* a step size of \ref sizeIncrement.
*/
void enlargeDofLists(int minsize = 0);
DOFAdmin& operator=(const DOFAdmin&);
/// Compares two DOFAdmins by their names.
bool operator==(const DOFAdmin&) const;
/// Compares two DOFAdmins by their names.
inline bool operator!=(const DOFAdmin& ad) const
{
/** \brief
* Adds a DOFIndexedBase object to the DOFAdmin. This object will be
* managed by DOFAdmin from now on.
*/
void addDOFIndexed(DOFIndexedBase* dofIndexed);
/// Adds a DOFContainer object to the DOFAdmin.
void addDOFContainer(DOFContainer* dofContainer);
/// Removes the given DOFIndexedBase object from DOFAdmin.
void removeDOFIndexed(DOFIndexedBase* dofIndexed);
/// Removes the given DOFContainer object from DOFAdmin.
void removeDOFContainer(DOFContainer* dofContainer);
/** \brief
* Removes all holes of unused DOF indices by compressing the used range of
* indices (it does not resize the vectors). While the global index of a DOF
* may change, the relative order of DOF indices remains unchanged during
* compression. This method is usually called after mesh adaption involving
* higher order elements or coarsening.
*/

Thomas Witkowski
committed
void compress(std::vector<DegreeOfFreedom> &newDofIndex);
/// Returns an iterator to the begin of \ref dofIndexedList
std::list<DOFIndexedBase*>::iterator beginDOFIndexed()
{
return dofIndexedList.begin();
/// Returns an iterator to the end of \ref dofIndexedList
std::list<DOFIndexedBase*>::iterator endDOFIndexed()
{
return dofIndexedList.end();
/** \name getting methods
* \{
*/
inline const int getUsedSize() const
{
inline const int getSize() const
{
inline const int getUsedDofs() const
inline const int getHoleCount() const
{

Thomas Witkowski
committed
/// Returns \ref nDof[i], i.e., the number of DOFs for the position i.
inline const int getNumberOfDofs(int i) const
inline const DimVec<int>& getNumberOfDofs() const
/// Returns \ref nPreDof[i]
inline const int getNumberOfPreDofs(int i) const
/// Returns \ref nPreDof
inline const DimVec<int>& getNumberOfPreDofs() const
inline const Mesh* getMesh() const
{
/// Returns \ref dofFree, the array denoting DOFs to be either free or used.
inline const std::vector<bool>& getDofFree() const
inline const bool isDofFree(int i) const
/// Sets a DOF to be free or not.
inline void setDofFree(int i, bool b)
/// Sets \ref usedSize.
inline void setUsedSize(int i)
{
sizeUsed = i;
}
/// Sets \ref usedCount.
inline void setUsedCount(int i)
{
usedCount = i;
}
/// Sets \ref firstHole
inline void setFirstHole(int i)
{
TEST_EXIT_DBG(dofFree[i])("There is no hole!\n");
/** \} */
/** \name setting methods
* \{
*/
/// Sets \ref nDof[i] = v
void setNumberOfDofs(int i, int v);

Thomas Witkowski
committed
/// Sets all values of \ref nDof
void setNumberOfDofs(DimVec<int> v)

Thomas Witkowski
committed
{

Thomas Witkowski
committed
}
/// Sets \ref nPreDof[i] = v
void setNumberOfPreDofs(int i, int v);
inline void setMesh(Mesh* m)
{
int calcMemoryUsage();
/** \} */
protected:
void init();
/** \brief
* Adds one index to all DOF lists. Used by Mesh::getDof() to provide
* DOFS for a specific position
*/
int getDOFIndex();
/// Frees index DOF. Used by Mesh::getDof()
/// The dofFree vector stores for each index whether it is used or not
/// index of the first free value in \ref dofFree
/// allocated size of managed vectors and matrices
/// number of FREED DOF indices (NOT size - sizeUsed)
int sizeUsed;
/** \brief
* Number of dofs for each position, i.e., vertex, edge, ..., center,
* for this DOFAdmin.
/// List of all managed DOFIndexed objects.
std::list<DOFIndexedBase*> dofIndexedList;
/// List of all managed DOFContainer objects
std::list<DOFContainer*> dofContainerList;
/// Size increment used by \ref enlargeDOFLists.