1 #ifndef DUNE_COEFFMATRIX_HH
2 #define DUNE_COEFFMATRIX_HH
6 #include <dune/common/fvector.hh>
20 template <
class Field,
class Field2>
31 template <
class Field,
class Field2,
int dimRange>
32 struct Mult< Field,FieldVector<Field2,dimRange> >
42 template<
class F ,
unsigned int bSize >
65 const unsigned int size ()
const
74 template<
class BasisIterator,
class FF>
75 void mult (
const BasisIterator &x,
79 typedef typename BasisIterator::Derivatives XDerivatives;
80 assert( numLsg*
blockSize <= (
size_t)numRows_ );
82 Field *pos = rows_[ 0 ];
83 unsigned int *skipIt = skip_;
85 for(
size_t i = 0; i < numLsg; ++i)
87 for(
unsigned int r = 0; r <
blockSize; ++r, ++row )
90 BasisIterator itx = x;
91 for( ; pos != rows_[ row+1 ]; ++pos, ++skipIt )
100 template<
class BasisIterator,
class Vector>
101 void mult (
const BasisIterator &x,
104 typedef typename Vector::value_type YDerivatives;
105 typedef typename BasisIterator::Derivatives XDerivatives;
106 size_t numLsg = y.size();
107 assert( numLsg*
blockSize <= (
size_t)numRows_ );
108 unsigned int row = 0;
109 Field *pos = rows_[ 0 ];
110 unsigned int *skipIt = skip_;
112 for(
size_t i = 0; i < numLsg; ++i)
114 for(
unsigned int r = 0; r <
blockSize; ++r, ++row )
117 BasisIterator itx = x;
118 for( ; pos != rows_[ row+1 ]; ++pos, ++skipIt )
127 template <
unsigned int deriv,
class BasisIterator,
class Vector>
128 void mult (
const BasisIterator &x,
131 typedef typename Vector::value_type YDerivatives;
132 typedef typename BasisIterator::Derivatives XDerivatives;
133 typedef FieldVector<typename XDerivatives::Field,YDerivatives::dimension> XLFETensor;
134 size_t numLsg = y.size();
135 assert( numLsg*
blockSize <= (
size_t)numRows_ );
136 unsigned int row = 0;
137 Field *pos = rows_[ 0 ];
138 unsigned int *skipIt = skip_;
139 for(
size_t i = 0; i < numLsg; ++i)
141 XLFETensor val(
typename XDerivatives::Field(0));
142 for(
unsigned int r = 0; r <
blockSize; ++r, ++row )
144 BasisIterator itx = x;
145 for( ; pos != rows_[ row+1 ]; ++pos, ++skipIt )
155 template<
class RowMatrix >
156 void fill (
const RowMatrix &mat,
bool verbose=
false )
158 numRows_ = mat.rows();
159 numCols_ = mat.cols();
160 unsigned int size = numRows_*numCols_;
170 unsigned int *skip =
new unsigned int[ size+1 ];
171 rows_ =
new Field*[ numRows_+1 ];
172 std::vector<Field> row( numCols_ );
176 unsigned int *sit = skip;
177 for(
unsigned int r = 0; r < numRows_; ++r )
181 for(
unsigned int c = 0; c < numCols_; ++c )
183 const Field &val = row[c];
197 assert(
size_t(rows_[numRows_]-rows_[0]) <=
size_t(size) );
198 size = rows_[numRows_]-rows_[0];
200 skip_ =
new unsigned int[
size ];
201 for (
unsigned int i=0;i<
size;++i)
203 coeff_[i] = coeff[i];
206 for (
unsigned int i=0;i<=numRows_;++i)
207 rows_[ i ] = coeff_ + (rows_[ i ] - coeff);
213 std::cout <<
"Entries: " << (rows_[numRows_]-rows_[0])
214 <<
" full: " << numCols_*numRows_
218 template <
class Vector>
223 unsigned int *skipIt = skip_ + (rows_[ k ]-rows_[ 0 ]);
224 for(
Field *pos = rows_[ k ];
229 assert( j < b.size() );
230 b[j] +=
field_cast<
typename Vector::value_type>( (*pos)*a );
235 : numRows_( other.numRows_ ),
236 numCols_( other.numCols_ )
238 const unsigned int size = other.rows_[numRows_]-other.rows_[0];
240 rows_ =
new Field*[ numRows_+1 ];
241 skip_ =
new unsigned int[
size ];
242 for (
unsigned int i=0;i<
size;++i)
244 coeff_[i] = other.coeff_[i];
245 skip_[i] = other.skip_[i];
247 for (
unsigned int i=0;i<=numRows_;++i)
248 rows_[ i ] = coeff_ + (other.rows_[ i ] - other.coeff_);
255 unsigned int numRows_,numCols_;
260 #endif // DUNE_COEFFMATRIX_HH