Skip to content
Snippets Groups Projects
DOFAdmin.h 7.51 KiB
Newer Older
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
// ==                                                                        ==
// ============================================================================
//
// 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
    /// Constructor
    DOFAdmin(Mesh* m, std::string aName);
    /// Copy constructor
    DOFAdmin(const DOFAdmin&);

    /// Destructor

    /** \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();
    /// Returns \ref sizeUsed.
    inline const int getUsedSize() const 
    { 
      return sizeUsed; 
    /// Returns \ref size
    inline const int getSize() const
    { 
    /// Returns \ref usedCount
    inline const int getUsedDofs() const 
      return usedCount; 
    /// Returns \ref holeCount
    inline const int getHoleCount() const 
    { 
      return holeCount; 
    /// Returns \ref name
Thomas Witkowski's avatar
Thomas Witkowski committed
    inline std::string getName() const 
    /// 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 
    /// 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 
    { 
    /// Returns \ref dofFree, the array denoting DOFs to be either free or used.
    inline const std::vector<bool>& getDofFree() const 
    /// 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)
    
    /// 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);
    /// Sets all values of \ref nDof
    void setNumberOfDofs(DimVec<int> v)
    /// Sets \ref nPreDof[i] = v
    void setNumberOfPreDofs(int i, int v);
    /// Sets \ref name = n
Thomas Witkowski's avatar
Thomas Witkowski committed
    inline void setName(std::string n) 
    /// Sets \ref mesh = m
    inline void setMesh(Mesh* m) 
    { 
    /// Initializes this DOFAdmin
     * 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);
    /// name of this DOFAdmin
    std::string name;
    /// the mesh this DOFAdmin belongs to
    /// 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
    /// allocated size of managed vectors and matrices
    /// number of used DOF indices
    /// number of FREED DOF indices (NOT size - sizeUsed)
    /// > max. index of a used entry
     * 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