// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // == http://www.amdis-fem.org == // == == // ============================================================================ // // 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" #include "AMDiS_fwd.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(); /// Constructor DOFAdmin(Mesh* m); /// Constructor DOFAdmin(Mesh* m, std::string aName); /// Copy constructor DOFAdmin(const DOFAdmin&); /// Destructor ~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); /// assignment operator 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 { return !(ad == *this); } /** \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. */ 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 * \{ */ /// Returns \ref sizeUsed. inline const int getUsedSize() const { return sizeUsed; } /// Returns \ref size inline const int getSize() const { return size; } /// Returns \ref usedCount inline const int getUsedDofs() const { return usedCount; } /// Returns \ref holeCount inline const int getHoleCount() const { return holeCount; } /// Returns \ref name inline std::string getName() const { return name; } /// Returns \ref nDof[i], i.e., the number of DOFs for the position i. inline const int getNumberOfDofs(int i) const { return nDof[i]; } /// Returns \ref nDof inline const DimVec<int>& getNumberOfDofs() const { return nDof; } /// Returns \ref nPreDof[i] inline const int getNumberOfPreDofs(int i) const { return nPreDof[i]; } /// Returns \ref nPreDof inline const DimVec<int>& getNumberOfPreDofs() const { return nPreDof; } /// Returns \ref mesh inline const Mesh* getMesh() const { return mesh; } /// Returns \ref dofFree, the array denoting DOFs to be either free or used. inline const std::vector<bool>& getDofFree() const { return dofFree; } /// Returns if the given DOF is free. inline const bool isDofFree(int i) const { return dofFree[i]; } /// Sets a DOF to be free or not. inline void setDofFree(int i, bool b) { dofFree[i] = 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"); firstHole = i; } /** \} */ /** \name setting methods * \{ */ /// Sets \ref nDof[i] = v void setNumberOfDofs(int i, int v); /// Sets all values of \ref nDof void setNumberOfDofs(DimVec<int> v) { nDof = v; } /// Sets \ref nPreDof[i] = v void setNumberOfPreDofs(int i, int v); /// Sets \ref name = n inline void setName(std::string n) { name = n; } /// Sets \ref mesh = m inline void setMesh(Mesh* m) { mesh = m; } int calcMemoryUsage(); /** \} */ protected: /// Initializes this DOFAdmin 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() void freeDofIndex(int dof); /// void serialize(std::ostream &out); /// void deserialize(std::istream &in); protected: /// name of this DOFAdmin std::string name; /// the mesh this DOFAdmin belongs to Mesh *mesh; /// The dofFree vector stores for each index whether it is used or not std::vector<bool> dofFree; /// index of the first free value in \ref dofFree int firstHole; /// allocated size of managed vectors and matrices int size; /// number of used DOF indices int usedCount; /// number of FREED DOF indices (NOT size - sizeUsed) int holeCount; /// > max. index of a used entry int sizeUsed; /** \brief * Number of dofs for each position, i.e., vertex, edge, ..., center, * for this DOFAdmin. */ DimVec<int> nDof; /// DOFs from previous DOFAdmins DimVec<int> nPreDof; /// 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. static const int sizeIncrement; friend class DOFIteratorBase; friend class Mesh; }; } #endif // AMDIS_DOFADMIN_H