SundanceLagrange.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_LAGRANGE_H
00043 #define SUNDANCE_LAGRANGE_H
00044 
00045 #include "SundanceDefs.hpp"
00046 #include "Teuchos_RefCountPtr.hpp"
00047 #include "SundanceBasisFamilyBase.hpp"
00048 
00049 namespace Sundance 
00050 {
00051 /** 
00052  * Lagrange basis 
00053  */
00054 class Lagrange : public ScalarBasis
00055 {
00056 public:
00057   /** */
00058   Lagrange(int order);
00059 
00060   /**   
00061    * \brief Inform caller as to whether a given cell type is supported 
00062    */
00063   bool supportsCellTypePair(
00064     const CellType& maximalCellType,
00065     const CellType& cellType
00066     ) const ;
00067 
00068   /** */
00069   void print(std::ostream& os) const ;
00070 
00071   /** */
00072   int order() const {return order_;}
00073 
00074   /** return the number of nodes for this basis on the given cell type */
00075   int nReferenceDOFsWithoutFacets(
00076     const CellType& maximalCellType,
00077     const CellType& cellType
00078     ) const ;
00079 
00080   /** */
00081   void getReferenceDOFs(
00082     const CellType& maximalCellType,
00083     const CellType& cellType,
00084     Array<Array<Array<int> > >& dofs) const ;
00085 
00086   /** */
00087   void refEval(
00088     const CellType& cellType,
00089     const Array<Point>& pts,
00090     const SpatialDerivSpecifier& deriv,
00091     Array<Array<Array<double> > >& result,
00092     int verbosity=0) const ;
00093 
00094   /** constraints for hanging DoFs*/
00095    void getConstrainsForHNDoF(
00096       const int indexInParent,
00097       const int maxCellDim,
00098       const int maxNrChild,
00099       const int facetDim,
00100       const int facetIndex,
00101       const int nodeIndex,
00102       Array<int>& localDoFs,
00103       Array<int>& parentFacetDim,
00104       Array<int>& parentFacetIndex,
00105       Array<int>& parentFacetNode,
00106       Array<double>& coefs
00107       );
00108 
00109   /* Handleable boilerplate */
00110   GET_RCP(BasisFamilyBase);
00111 
00112   /** */
00113   std::string description() const 
00114     {return "Lagrange(" + Teuchos::toString(order()) + ")";}
00115 
00116 private:
00117   int order_;
00118 
00119   static Array<int> makeRange(int low, int high);
00120 
00121   /** evaluate on a line cell  */
00122   void evalOnLine(const Point& pt,
00123     const MultiIndex& deriv,
00124     Array<double>& result) const ;
00125     
00126   /** evaluate on a triangle cell  */
00127   void evalOnTriangle(const Point& pt,
00128     const MultiIndex& deriv,
00129     Array<double>& result) const ;
00130 
00131   /** evaluate on a quad cell  */
00132   void evalOnquad(const Point& pt,
00133     const MultiIndex& deriv,
00134     Array<double>& result) const ;
00135 
00136   /** evaluate on a tet cell  */
00137   void evalOnTet(const Point& pt,
00138     const MultiIndex& deriv,
00139     Array<double>& result) const ;
00140 
00141   /** evaluate on a tet cell  */
00142   void evalOnBrick(const Point& pt,
00143     const MultiIndex& deriv,
00144     Array<double>& result) const ;
00145 
00146   /** get the exact position one DoF on the Ref Element
00147    * this is needed for the treatment of hanging nodes
00148    * @param maxCellDim [in] the MaxCell dim of this element
00149    * @param facetDim   [in] the facet dim which the DoF is on
00150    * @param facetIndex [in] the facet index which the DoF is on
00151    * @param nodeIndex  [in] the node index of the DoF
00152    * @param pos       [out] the position of the DoF
00153    * */
00154   void returnDoFPositionOnRef(
00155   const int maxCellDim,
00156   const int facetDim,
00157   const int facetIndex,
00158   const int nodeIndex,
00159   Point& pos) const;
00160 
00161   /** This method calls the "getReferenceDOFs" method and then for each DoF
00162    * extracts the facet dimension, facet index and node in 3 different array <br>
00163    * This method could be used for general purpose for other basis, where HN is possible
00164    * @param maxCellDim [in]
00165    * @param nrDoF  [in] nr of DoF for this element
00166    * @param facetD [out]
00167    * @param facetI [out]
00168    * @param facetN [out] */
00169   void  getDoFsOrdered(
00170       const CellType maxCellDim,
00171       int nrDoF,
00172       Array<int>& facetD,
00173       Array<int>& facetI,
00174       Array<int>& facetN);
00175 
00176   /** */
00177   bool doFInfromationCalculated_;
00178 
00179   /** For each DoF the dimension of the element which is the DoF on*/
00180   Array<int> facetD_;
00181 
00182   /** For each DoF the facet index of the element*/
00183   Array<int> facetI_;
00184 
00185   /** For each DoF the facet index of the element*/
00186   Array<int> facetN_;
00187 };
00188 }
00189 
00190 #endif

Site Contact