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_BASISFAMILY_H
00032 #define SUNDANCE_BASISFAMILY_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceBasisFamilyBase.hpp"
00036 #include "SundanceOrderedHandle.hpp"
00037 #include "Teuchos_Array.hpp"
00038 
00039 namespace Sundance
00040 {
00041 using Teuchos::XMLObject;
00042 using Teuchos::tuple;
00043 using Teuchos::Array;
00044 
00045 class CommonFuncDataStub;
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 class BasisFamily : public OrderedHandle<BasisFamilyBase>
00057 {
00058 public:
00059   
00060   ORDERED_HANDLE_CTORS(BasisFamily, BasisFamilyBase);
00061 
00062 
00063   XMLObject toXML() const ;
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079   int order() const ;
00080 
00081 
00082 
00083 
00084 
00085   int nReferenceDOFsWithFacets(const CellType& maximalCellType,
00086     const CellType& cellType) const ;
00087 
00088 
00089 
00090 
00091 
00092   int nReferenceDOFsWithoutFacets(const CellType& maximalCellType,
00093     const CellType& cellType) const ;
00094 
00095 
00096 
00097 
00098 
00099 
00100   int dim() const ;
00101 
00102 
00103 
00104 
00105 
00106   int tensorOrder() const {return ptr()->tensorOrder();}
00107 
00108 
00109   bool operator==(const BasisFamily& other) const ;
00110 
00111   
00112 
00113 
00114   bool isScalarBasis() const {return ptr()->isScalarBasis();}
00115 
00116 
00117   bool isHDivBasis() const {return ptr()->isHDivBasis();}
00118 
00119 
00120   bool isHCurlBasis() const {return ptr()->isHCurlBasis();}
00121 
00122 
00123   static int size(const Array<BasisFamily>& b) ;
00124 
00125 
00126   static BasisFamily getBasis(const RCP<const CommonFuncDataStub>& funcData);
00127 
00128 
00129   static RCP<BasisDOFTopologyBase> getBasisTopology(const RCP<const CommonFuncDataStub>& funcData);
00130 
00131 
00132   void refEval(
00133     const CellType& cellType,
00134     const Array<Point>& pts,
00135     const SpatialDerivSpecifier& deriv,
00136     Array<Array<Array<double> > >& result,
00137     int verbosity) const ;
00138 
00139 
00140   void getConstrainsForHNDoF( const int indexInParent,
00141             const int maxCellDim,
00142             const int maxNrChild,
00143             const int facetDim,
00144             const int facetIndex,
00145             const int nodeIndex,
00146             Array<int>& localDoFs,
00147             Array<int>& parentFacetDim,
00148             Array<int>& parentFacetIndex,
00149             Array<int>& parentFacetNode,
00150             Array<double>& coefs
00151             ) const;
00152 
00153 
00154 
00155 
00156   bool requiresBasisTransformation() const { return ptr()->requiresBasisTransformation(); }
00157 
00158 
00159 
00160   virtual void preApplyTransformation( const CellType &maxCellType ,
00161                const Mesh &mesh,
00162                const Array<int> &cellLIDs,
00163                const CellJacobianBatch& JVol,
00164                RCP<Array<double> >& A
00165                ) const 
00166   { 
00167     ptr()->preApplyTransformation( maxCellType ,
00168            mesh,
00169            cellLIDs,
00170            JVol,
00171            A);
00172   }
00173 
00174   virtual void postApplyTransformation( const CellType &maxCellType ,
00175           const Mesh &mesh,
00176           const Array<int> &cellLIDs,
00177           const CellJacobianBatch& JVol,
00178           RCP<Array<double> >& A ) const
00179   {
00180     ptr()->postApplyTransformation( maxCellType ,
00181             mesh ,
00182             cellLIDs ,
00183             JVol,
00184             A);
00185   }
00186   
00187   virtual void preApplyTransformationTranspose( const CellType &maxCellType ,
00188             const Mesh &mesh,
00189             const Array<int> &cellLIDs,
00190             const CellJacobianBatch& JVol,
00191             Array<double>& A ) const
00192   {
00193     ptr()->preApplyTransformationTranspose( maxCellType ,
00194               mesh ,
00195               cellLIDs ,
00196               JVol ,
00197               A );
00198   }
00199 
00200 };
00201 
00202 
00203 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b)
00204 {
00205   return Array<BasisFamily>(tuple(a,b));
00206 }
00207 
00208 
00209 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00210   const BasisFamily& c)
00211 {
00212   return tuple(a,b,c);
00213 }
00214 
00215 
00216 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00217   const BasisFamily& c, const BasisFamily& d)
00218 {
00219   return tuple(a,b,c,d);
00220 }
00221 
00222 
00223 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00224   const BasisFamily& c, const BasisFamily& d, 
00225   const BasisFamily& e)
00226 {
00227   return tuple(a,b,c,d,e);
00228 }
00229 
00230 
00231 
00232 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00233   const BasisFamily& c, const BasisFamily& d, 
00234   const BasisFamily& e, const BasisFamily& f)
00235 {
00236   return tuple(a,b,c,d,e,f);
00237 }
00238 
00239 
00240 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00241   const BasisFamily& c, const BasisFamily& d, 
00242   const BasisFamily& e, const BasisFamily& f, 
00243   const BasisFamily& g)
00244 {
00245   return tuple(a,b,c,d,e,f,g);
00246 }
00247 
00248 
00249 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00250   const BasisFamily& c, const BasisFamily& d, 
00251   const BasisFamily& e, const BasisFamily& f, 
00252   const BasisFamily& g, const BasisFamily& h)
00253 {
00254   return tuple(a,b,c,d,e,f,g,h);
00255 }
00256 
00257 
00258 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00259   const BasisFamily& c, const BasisFamily& d, 
00260   const BasisFamily& e, const BasisFamily& f, 
00261   const BasisFamily& g, const BasisFamily& h, 
00262   const BasisFamily& i)
00263 {
00264   return tuple(a,b,c,d,e,f,g,h,i);
00265 }
00266 
00267 
00268 inline Array<BasisFamily> List(const BasisFamily& a, const BasisFamily& b,
00269   const BasisFamily& c, const BasisFamily& d, 
00270   const BasisFamily& e, const BasisFamily& f, 
00271   const BasisFamily& g, const BasisFamily& h, 
00272   const BasisFamily& i, const BasisFamily& j)
00273 {
00274   return tuple(a,b,c,d,e,f,g,h,i,j);
00275 }
00276 
00277 
00278 inline Array<BasisFamily> replicate(const BasisFamily& b, int n)
00279 {
00280   Array<BasisFamily> rtn(n);
00281   for (int i=0; i<n; i++) rtn[i] = b;
00282   return rtn;
00283 }
00284 
00285 
00286 
00287 inline Array<BasisFamily> replicate(const Array<BasisFamily>& b, int n)
00288 {
00289   Array<BasisFamily> rtn(n*b.size());
00290   for (int i=0; i<n*b.size(); i++) rtn[i] = b[0];
00291   return rtn;
00292 }
00293 
00294 class BasisArray : public Array<BasisFamily>
00295 {
00296 public:
00297   BasisArray() : Array<BasisFamily>() {;}
00298 
00299   BasisArray(int n) : Array<BasisFamily>(n) {;}
00300 
00301   BasisArray(const Array<BasisFamily>& a) 
00302     : Array<BasisFamily>(a) 
00303     {;}
00304 
00305 };
00306 
00307 
00308 
00309 Array<std::pair<int, int> > vectorDimStructure(const Array<BasisFamily>& basis);
00310 
00311 
00312 
00313 Array<std::pair<int, int> > vectorDimStructure(const BasisFamily& basis);
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 bool basisRestrictableToBoundary(const BasisFamily& b);
00324 
00325 
00326 }
00327 
00328 #endif