3#ifndef DUNE_RAVIARTTHOMASPREBASIS_HH
4#define DUNE_RAVIARTTHOMASPREBASIS_HH
11#include <dune/localfunctions/utility/polynomialbasis.hh>
15 template <
class Topology,
class Field >
18 template <
unsigned int dim,
class Field>
19 struct RTPreBasisFactory
21 typedef MonomialBasisProvider<dim,Field> MBasisFactory;
22 typedef typename MBasisFactory::Object MBasis;
23 typedef StandardEvaluator<MBasis> EvalMBasis;
24 typedef PolynomialBasisWithMatrix<EvalMBasis,SparseCoeffMatrix<Field,dim> > Basis;
26 typedef const Basis Object;
27 typedef std::size_t Key;
29 template <
unsigned int dd,
class FF>
30 struct EvaluationBasisFactory
32 typedef MonomialBasisProvider<dd,FF> Type;
34 template<
class Topology >
35 static Object *create (
const Key &order )
37 RTVecMatrix<Topology,Field> vecMatrix(order);
38 MBasis *mbasis = MBasisFactory::template create<Topology>(order+1);
39 typename std::remove_const<Object>::type *tmBasis =
40 new typename std::remove_const<Object>::type(*mbasis);
41 tmBasis->fill(vecMatrix);
44 static void release( Object *
object ) {
delete object; }
46 template <
class Topology,
class Field>
49 static const unsigned int dim = Topology::dimension;
50 typedef MultiIndex<dim,Field> MI;
51 typedef MonomialBasis<Topology,MI> MIBasis;
52 RTVecMatrix(std::size_t order)
54 MIBasis basis(order+1);
55 FieldVector< MI, dim > x;
56 for(
unsigned int i = 0; i < dim; ++i )
58 std::vector< MI > val( basis.size() );
59 basis.evaluate( x, val );
62 unsigned int notHomogen = 0;
64 notHomogen = basis.sizes()[order-1];
65 unsigned int homogen = basis.sizes()[order]-notHomogen;
66 row_ = (notHomogen*dim+homogen*(dim+1))*dim;
67 row1_ = basis.sizes()[order]*dim*dim;
68 mat_ =
new Field*[row_];
70 for (
unsigned int i=0; i<notHomogen+homogen; ++i)
72 for (
unsigned int r=0; r<dim; ++r)
74 for (
unsigned int rr=0; rr<dim; ++rr)
76 mat_[row] =
new Field[col_];
77 for (
unsigned int j=0; j<col_; ++j)
87 for (
unsigned int i=0; i<homogen; ++i)
89 for (
unsigned int r=0; r<dim; ++r)
91 mat_[row] =
new Field[col_];
92 for (
unsigned int j=0; j<col_; ++j)
97 MI xval = val[notHomogen+i];
99 for (w=homogen+notHomogen; w<val.size(); ++w)
107 assert(w<val.size());
114 for (
unsigned int i=0; i<rows(); ++i) {
119 unsigned int cols()
const {
122 unsigned int rows()
const {
125 template <
class Vector>
126 void row(
const unsigned int row, Vector &vec )
const
128 const unsigned int N = cols();
129 assert( vec.size() == N );
130 for (
unsigned int i=0; i<N; ++i)
133 unsigned int row_,col_,row1_;
Dune namespace.
Definition: alignedallocator.hh:14
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
A unique label for each type of element that can occur in a grid.