DUNE PDELab (2.7)

raviartthomassimplexprebasis.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_RAVIARTTHOMASPREBASIS_HH
4#define DUNE_RAVIARTTHOMASPREBASIS_HH
5
6#include <fstream>
7#include <utility>
8
10
11#include <dune/localfunctions/utility/polynomialbasis.hh>
12
13namespace Dune
14{
15 template < class Topology, class Field >
16 struct RTVecMatrix;
17
18 template <unsigned int dim, class Field>
19 struct RTPreBasisFactory
20 {
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;
25
26 typedef const Basis Object;
27 typedef std::size_t Key;
28
29 template <unsigned int dd, class FF>
30 struct EvaluationBasisFactory
31 {
32 typedef MonomialBasisProvider<dd,FF> Type;
33 };
34 template< class Topology >
35 static Object *create ( const Key &order )
36 {
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);
42 return tmBasis;
43 }
44 static void release( Object *object ) { delete object; }
45 };
46 template <class Topology, class Field>
47 struct RTVecMatrix
48 {
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)
53 {
54 MIBasis basis(order+1);
55 FieldVector< MI, dim > x;
56 for( unsigned int i = 0; i < dim; ++i )
57 x[ i ].set( i, 1 );
58 std::vector< MI > val( basis.size() );
59 basis.evaluate( x, val );
60
61 col_ = basis.size();
62 unsigned int notHomogen = 0;
63 if (order>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_];
69 int row = 0;
70 for (unsigned int i=0; i<notHomogen+homogen; ++i)
71 {
72 for (unsigned int r=0; r<dim; ++r)
73 {
74 for (unsigned int rr=0; rr<dim; ++rr)
75 {
76 mat_[row] = new Field[col_];
77 for (unsigned int j=0; j<col_; ++j)
78 {
79 mat_[row][j] = 0.;
80 }
81 if (r==rr)
82 mat_[row][i] = 1.;
83 ++row;
84 }
85 }
86 }
87 for (unsigned int i=0; i<homogen; ++i)
88 {
89 for (unsigned int r=0; r<dim; ++r)
90 {
91 mat_[row] = new Field[col_];
92 for (unsigned int j=0; j<col_; ++j)
93 {
94 mat_[row][j] = 0.;
95 }
96 unsigned int w;
97 MI xval = val[notHomogen+i];
98 xval *= x[r];
99 for (w=homogen+notHomogen; w<val.size(); ++w)
100 {
101 if (val[w] == xval)
102 {
103 mat_[row][w] = 1.;
104 break;
105 }
106 }
107 assert(w<val.size());
108 ++row;
109 }
110 }
111 }
112 ~RTVecMatrix()
113 {
114 for (unsigned int i=0; i<rows(); ++i) {
115 delete [] mat_[i];
116 }
117 delete [] mat_;
118 }
119 unsigned int cols() const {
120 return col_;
121 }
122 unsigned int rows() const {
123 return row_;
124 }
125 template <class Vector>
126 void row( const unsigned int row, Vector &vec ) const
127 {
128 const unsigned int N = cols();
129 assert( vec.size() == N );
130 for (unsigned int i=0; i<N; ++i)
131 field_cast(mat_[row][i],vec[i]);
132 }
133 unsigned int row_,col_,row1_;
134 Field **mat_;
135 };
136
137
138}
139#endif // DUNE_RAVIARTTHOMASPREBASIS_HH
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.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)