SundanceMixedDOFMap.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 #ifndef SUNDANCE_MIXEDDOFMAP_H
00043 #define SUNDANCE_MIXEDDOFMAP_H
00044 
00045 
00046 #include "SundanceDefs.hpp"
00047 #include "SundanceMesh.hpp"
00048 #include "SundanceCellSet.hpp"
00049 #include "SundanceCellFilter.hpp"
00050 #include "SundanceSpatiallyHomogeneousDOFMapBase.hpp"
00051 
00052 namespace Sundance
00053 {
00054 using namespace Teuchos;
00055 
00056 class BasisDOFTopologyBase;
00057 
00058 /** 
00059  * A MixedDOFMap is a DOF map for the case where 
00060  * every function is defined
00061  * on every cell in the mesh, but where functions may have different bases. 
00062  */
00063 class MixedDOFMap : public SpatiallyHomogeneousDOFMapBase
00064 {
00065 public:
00066   /** */
00067   MixedDOFMap(const Mesh& mesh, 
00068     const Array<RCP<BasisDOFTopologyBase> >& basis,
00069     const CellFilter& maxCells, 
00070     int setupVerb);
00071                         
00072   /** */
00073   virtual ~MixedDOFMap(){;}
00074 
00075   /** */
00076   RCP<const MapStructure> 
00077   getDOFsForCellBatch(int cellDim,
00078     const Array<int>& cellLID,
00079     const Set<int>& requestedFuncSet,
00080     Array<Array<int> >& dofs,
00081     Array<int>& nNodes,
00082     int verbosity) const ;
00083 
00084   /** */
00085   RCP<const MapStructure> mapStruct() const 
00086     {return structure_;}
00087 
00088   /** */
00089   int chunkForFuncID(int funcID) const
00090     {return structure_->chunkForFuncID(funcID);}
00091 
00092   /** */
00093   int indexForFuncID(int funcID) const 
00094     {return structure_->indexForFuncID(funcID);}
00095       
00096   /** */
00097   int nFuncs(int basisChunk) const
00098     {return nFuncs_[basisChunk];}
00099 
00100   /** */
00101   int nBasisChunks() const 
00102     {return nFuncs_.size();}
00103 
00104   /** */
00105   const RCP<BasisDOFTopologyBase>& basis(int basisChunk) const
00106     {return structure_->basis(basisChunk);}
00107 
00108   /** */
00109   const Array<int>& funcID(int basisChunk) const 
00110     {return structure_->funcs(basisChunk);}
00111 
00112 
00113 private:
00114 
00115   /** */
00116   void checkTable() const ;
00117 
00118   /** */
00119   inline int getInitialDOFForCell(int cellDim, int cellLID, int basisChunk) const
00120     {
00121       return dofs_[cellDim][basisChunk][cellLID*nDofsPerCell_[basisChunk][cellDim]];
00122     }
00123 
00124   inline int* getInitialDOFPtrForCell(int cellDim, int cellLID, int basisChunk)
00125     {
00126       return &(dofs_[cellDim][basisChunk][cellLID*nDofsPerCell_[basisChunk][cellDim]]);
00127     }
00128 
00129   inline const int* getInitialDOFPtrForCell(int cellDim, int cellLID, 
00130     int basisChunk) const 
00131     {
00132       return &(dofs_[cellDim][basisChunk][cellLID*nDofsPerCell_[basisChunk][cellDim]]);
00133     }
00134 
00135   /** */
00136   void allocate(const Mesh& mesh);
00137       
00138   /** */
00139   void buildMaximalDofTable() const ;
00140 
00141   bool hasBeenAssigned(int cellDim, int cellLID) const 
00142     {return hasBeenAssigned_[cellDim][cellLID];}
00143 
00144   void markAsAssigned(int cellDim, int cellLID)
00145     {hasBeenAssigned_[cellDim][cellLID] = true;}
00146 
00147   /** */
00148   void initMap();
00149 
00150   /** */
00151   void setDOFs(int basisChunk, int cellDim, int cellLID, 
00152     int& nextDOF, bool isRemote=false);
00153 
00154   /** */
00155   void shareDOFs(int cellDim,
00156     const Array<Array<int> >& outgoingCellRequests);
00157 
00158   /** */
00159   void computeOffsets(int dim, int localCount);
00160 
00161   /** */
00162   static int uninitializedVal() {return -1;}
00163 
00164   /** */
00165   CellFilter maxCells_;
00166 
00167   /** spatial dimension */
00168   int dim_;
00169 
00170   /** Tables of DOFs, indexed by dimension and chunk number.
00171    *
00172    * dof(cellDim, cellLID, chunk, func, node) 
00173    * = dofs_[cellDim][chunk][(cellLID*nFunc + func)*nNode + node]
00174    */
00175   Array<Array<Array<int> > > dofs_;
00176 
00177   /** DOFs for maximal cells, indexed by basis chunk number 
00178    *
00179    * dof(cellLID, chunk, func, node) 
00180    * = maximalDofs_[chunk][(cellLID*nFunc + func)*nNode + node];
00181    */
00182   mutable Array<Array<int> > maximalDofs_;
00183 
00184   /** whether maximal DOFs have been tabulated */
00185   mutable bool haveMaximalDofs_;
00186 
00187   /** 
00188    * localNodePtrs_[basisChunk][cellDim][facetDim][facetNumber][nodeNumber]
00189    */
00190   Array<Array<Array<Array<Array<int> > > > > localNodePtrs_;
00191 
00192   /** The number of nodes per cell, for each basis function type, 
00193    * <i>not</i> including the nodes of the facets of the cell. Indexed as 
00194    * nNodesPerCell_[basis][dimension] */
00195   Array<Array<int> > nNodesPerCell_;
00196 
00197   /** The number of DOFs per cell, for each basis function type, 
00198    * <i>not</i> including the DOFs of the facets of the cell. Indexed as 
00199    * nDofsPerCell_[basis][dimension] */
00200   Array<Array<int> > nDofsPerCell_;
00201 
00202   /** The number of nodes per cell, for each basis function type, including
00203    * the nodes of the facets of the cell. Indexed as 
00204    * nNodesPerCell_[basis][dimension] */
00205   Array<Array<int> > totalNNodesPerCell_;
00206 
00207   /** The number of DOFs per cell, for each basis function type, including
00208    * the DOFs of the facets of the cell. Indexed as 
00209    * nDofsPerCell_[basis][dimension] */
00210   Array<Array<int> > totalNDofsPerCell_;
00211 
00212   /** Indicates whether the cells of each dimension have any DOFs in this
00213    * map, for any chunk. */
00214   Array<int> cellHasAnyDOFs_;
00215 
00216   /** number of facets of dimension facetDim for cells of dimension cellDim.
00217    * Indexed as numFacets_[cellDim][facetDim]
00218    */
00219   Array<Array<int> > numFacets_;
00220 
00221   /** Orientation of each edge or face as seen by the maximal cell
00222    * from which its DOFs were originally assigned. */
00223   Array<Array<int> > originalFacetOrientation_;
00224 
00225   /** */
00226   Array<Array<int> > hasBeenAssigned_;
00227 
00228   /** */
00229   RCP<const MapStructure> structure_;
00230 
00231   /** */
00232   Array<int> nFuncs_;
00233 };
00234 }
00235 
00236                   
00237 #endif

Site Contact