00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef SUNDANCE_CUBICHERMITE_H
00032 #define SUNDANCE_CUBICHERMITE_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "Teuchos_RefCountPtr.hpp"
00036 #include "SundanceBasisFamilyBase.hpp"
00037
00038 namespace Sundance
00039 {
00040
00041
00042
00043 class CubicHermite : public ScalarBasis
00044 {
00045 public:
00046
00047 CubicHermite() {;}
00048
00049
00050
00051
00052 bool supportsCellTypePair(
00053 const CellType& maximalCellType,
00054 const CellType& cellType
00055 ) const ;
00056
00057
00058 void print(std::ostream& os) const ;
00059
00060
00061 int order() const {return 3;}
00062
00063
00064 int nReferenceDOFsWithoutFacets(
00065 const CellType& maximalCellType,
00066 const CellType& cellType
00067 ) const ;
00068
00069
00070 void getReferenceDOFs(
00071 const CellType& maximalCellType,
00072 const CellType& cellType,
00073 Array<Array<Array<int> > >& dofs) const ;
00074
00075
00076 void refEval(
00077 const CellType& cellType,
00078 const Array<Point>& pts,
00079 const SpatialDerivSpecifier& deriv,
00080 Array<Array<Array<double> > >& result,
00081 int verbosity=0) const ;
00082
00083 virtual bool requiresBasisTransformation() const { return true; }
00084
00085 void preApplyTransformation( const CellType &maxCellType ,
00086 const Mesh &mesh,
00087 const Array<int> &cellLIDs,
00088 const CellJacobianBatch& JVol,
00089 RCP<Array<double> >& A ) const;
00090
00091 void postApplyTransformation( const CellType &maxCellType ,
00092 const Mesh &mesh,
00093 const Array<int> &cellLIDs,
00094 const CellJacobianBatch& JVol,
00095 RCP<Array<double> >& A ) const;
00096
00097 void preApplyTransformationTranspose( const CellType &maxCellType ,
00098 const Mesh &mesh,
00099 const Array<int> &cellLIDs,
00100 const CellJacobianBatch& JVol,
00101 Array<double>& A ) const;
00102
00103
00104
00105
00106
00107
00108 GET_RCP(BasisFamilyBase);
00109
00110 private:
00111 static Array<int> makeRange(int low, int high);
00112
00113
00114 void evalOnLine(const Point& pt,
00115 const MultiIndex& deriv,
00116 Array<double>& result) const ;
00117
00118
00119 void evalOnTriangle(const Point& pt,
00120 const MultiIndex& deriv,
00121 Array<double>& result) const ;
00122
00123
00124 void evalOnTet(const Point& pt,
00125 const MultiIndex& deriv,
00126 Array<double>& result) const ;
00127
00128 void preApplyTransformationTriangle( const Mesh &mesh,
00129 const Array<int> &cellLIDs,
00130 const CellJacobianBatch& JVol,
00131 RCP<Array<double> >& A ) const;
00132
00133 void postApplyTransformationTriangle( const Mesh &mesh,
00134 const Array<int> &cellLIDs,
00135 const CellJacobianBatch& JVol,
00136 RCP<Array<double> >& A ) const;
00137
00138 void preApplyTransformationTransposeTriangle( const Mesh &mesh,
00139 const Array<int> &cellLIDs,
00140 const CellJacobianBatch& JVol,
00141 Array<double> & A ) const;
00142
00143
00144 void getVertexH( const Mesh &mesh,
00145 const Array<int> &cellLIDs,
00146 Array<double> &cellVertexH ) const;
00147
00148 };
00149 }
00150
00151 #endif