/****************************************************************************** * * AMDiS - Adaptive multidimensional simulations * * Copyright (C) 2013 Dresden University of Technology. All Rights Reserved. * Web: https://fusionforge.zih.tu-dresden.de/projects/amdis * * Authors: * Simon Vey, Thomas Witkowski, Andreas Naumann, Simon Praetorius, et al. * * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * * This file is part of AMDiS * * See also license.opensource.txt in the distribution. * ******************************************************************************/ /** \file DOFAdmin.h */ /** \defgroup DOFAdministration DOF adaministration module * @{ @} * \brief * Contains all classes used for the DOF administration. */ #ifndef AMDIS_DOFADMIN_H #define AMDIS_DOFADMIN_H #include #include #include #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 &newDofIndex); /// Returns an iterator to the begin of \ref dofIndexedList std::list::iterator beginDOFIndexed() { return dofIndexedList.begin(); } /// Returns an iterator to the end of \ref dofIndexedList std::list::iterator endDOFIndexed() { return dofIndexedList.end(); } /** \name getting methods * \{ */ /// Returns \ref sizeUsed. inline DofIndex::size_type getUsedSize() const { return sizeUsed; } /// Returns \ref size inline DofIndex::size_type getSize() const { return size; } /// Returns \ref usedCount inline DofIndex::size_type getUsedDofs() const { return usedCount; } /// Returns \ref holeCount inline DofIndex::size_type 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 int getNumberOfDofs(int i) const { return nDof[i]; } /// Returns \ref nDof inline const DimVec& getNumberOfDofs() const { return nDof; } /// Returns \ref nPreDof[i] inline int getNumberOfPreDofs(int i) const { return nPreDof[i]; } /// Returns \ref nPreDof inline const DimVec& getNumberOfPreDofs() const { return nPreDof; } /// Returns \ref mesh inline const Mesh* getMesh() const { return mesh; } /// Returns \ref mesh inline Mesh* getMesh() { return mesh; } /// Returns \ref dofFree, the array denoting DOFs to be either free or used. inline const std::vector& getDofFree() const { return dofFree; } /// Returns if the given DOF is free. inline bool isDofFree(DofIndex::size_type i) const { return dofFree[i]; } /// Sets a DOF to be free or not. inline void setDofFree(DofIndex::size_type i, bool b) { dofFree[i] = b; } /// Sets \ref usedSize. inline void setUsedSize(DofIndex::size_type i) { sizeUsed = i; } /// Sets \ref usedCount. inline void setUsedCount(DofIndex::size_type i) { usedCount = i; } /// Sets \ref firstHole inline void setFirstHole(DofIndex::size_type 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 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(); void reset() { init(); } /** \} */ 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 */ DegreeOfFreedom getDOFIndex(); /// Frees index DOF. Used by Mesh::getDof() void freeDofIndex(DegreeOfFreedom 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 dofFree; /// index of the first free value in \ref dofFree DegreeOfFreedom firstHole; /// allocated size of managed vectors and matrices DofIndex::size_type size; /// number of used DOF indices DofIndex::size_type usedCount; /// number of FREED DOF indices (NOT size - sizeUsed) DofIndex::size_type holeCount; /// > max. index of a used entry DofIndex::size_type sizeUsed; /** \brief * Number of dofs for each position, i.e., vertex, edge, ..., center, * for this DOFAdmin. */ DimVec nDof; /// DOFs from previous DOFAdmins DimVec nPreDof; /// List of all managed DOFIndexed objects. std::list dofIndexedList; /// List of all managed DOFContainer objects std::list dofContainerList; /// Size increment used by \ref enlargeDOFLists. static const int sizeIncrement; friend class DOFIteratorBase; friend class Mesh; }; } #endif // AMDIS_DOFADMIN_H