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