Reference documentation for deal.II version 8.1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
mg_matrix.h
1 // ---------------------------------------------------------------------
2 // @f$Id: mg_matrix.h 30036 2013-07-18 16:55:32Z maier @f$
3 //
4 // Copyright (C) 2003 - 2013 by the deal.II authors
5 //
6 // This file is part of the deal.II library.
7 //
8 // The deal.II library is free software; you can use it, redistribute
9 // it, and/or modify it under the terms of the GNU Lesser General
10 // Public License as published by the Free Software Foundation; either
11 // version 2.1 of the License, or (at your option) any later version.
12 // The full text of the license can be found in the file LICENSE at
13 // the top level of the deal.II distribution.
14 //
15 // ---------------------------------------------------------------------
16 
17 #ifndef __deal2__mg_matrix_h
18 #define __deal2__mg_matrix_h
19 
20 #include <deal.II/lac/vector.h>
21 #include <deal.II/lac/pointer_matrix.h>
22 #include <deal.II/lac/sparse_matrix.h>
23 #include <deal.II/multigrid/mg_base.h>
24 #include <deal.II/base/mg_level_object.h>
25 #include <deal.II/base/std_cxx1x/shared_ptr.h>
26 
27 DEAL_II_NAMESPACE_OPEN
28 
31 
32 namespace mg
33 {
42  template <class VECTOR = Vector<double> >
43  class Matrix
44  : public MGMatrixBase<VECTOR>
45  {
46  public:
51  Matrix();
52 
58  template <class MATRIX>
59  Matrix(const MGLevelObject<MATRIX> &M);
60 
67  template <class MATRIX>
68  void
70 
74  const PointerMatrixBase<VECTOR> &operator[] (unsigned int level) const;
75 
76  virtual void vmult (const unsigned int level, VECTOR &dst, const VECTOR &src) const;
77  virtual void vmult_add (const unsigned int level, VECTOR &dst, const VECTOR &src) const;
78  virtual void Tvmult (const unsigned int level, VECTOR &dst, const VECTOR &src) const;
79  virtual void Tvmult_add (const unsigned int level, VECTOR &dst, const VECTOR &src) const;
80 
84  std::size_t memory_consumption () const;
85  private:
87  };
88 
89 }
90 
95 template <class MATRIX = SparseMatrix<double>, class VECTOR = Vector<double> >
96 class MGMatrix : public MGMatrixBase<VECTOR>
97 {
98 public:
99  MGMatrix (MGLevelObject<MATRIX> *matrix= 0);
100 
101  void set_matrix (MGLevelObject<MATRIX> *M);
102  virtual void vmult (const unsigned int level,
103  VECTOR &dst,
104  const VECTOR &src) const;
105  virtual void vmult_add (const unsigned int level,
106  VECTOR &dst,
107  const VECTOR &src) const;
108  virtual void Tvmult (const unsigned int level,
109  VECTOR &dst,
110  const VECTOR &src) const;
111  virtual void Tvmult_add (const unsigned int level,
112  VECTOR &dst,
113  const VECTOR &src) const;
114  std::size_t memory_consumption () const;
115 private:
118 
119 
131 template <class MATRIX, typename number>
132 class MGMatrixSelect : public MGMatrixBase<Vector<number> >
133 {
134 public:
142  MGMatrixSelect (const unsigned int row = 0,
143  const unsigned int col = 0,
145 
154 
159  void select_block (const unsigned int row,
160  const unsigned int col);
161 
166  virtual void vmult (const unsigned int level,
167  Vector<number> &dst,
168  const Vector<number> &src) const;
169 
174  virtual void vmult_add (const unsigned int level,
175  Vector<number> &dst,
176  const Vector<number> &src) const;
177 
183  virtual void Tvmult (const unsigned int level,
184  Vector<number> &dst,
185  const Vector<number> &src) const;
186 
192  virtual void Tvmult_add (const unsigned int level,
193  Vector<number> &dst,
194  const Vector<number> &src) const;
195 
196 private:
204  unsigned int row;
208  unsigned int col;
209 
210 };
211 
214 /*----------------------------------------------------------------------*/
215 
216 namespace mg
217 {
218  template <class VECTOR>
219  template <class MATRIX>
220  inline
221  void
223  {
224  matrices.resize(p.min_level(), p.max_level());
225  for (unsigned int level=p.min_level(); level <= p.max_level(); ++level)
226  matrices[level] = std_cxx1x::shared_ptr<PointerMatrixBase<VECTOR> > (new_pointer_matrix_base(p[level], VECTOR()));
227  }
228 
229 
230  template <class VECTOR>
231  template <class MATRIX>
232  inline
234  {
235  initialize(p);
236  }
237 
238 
239  template <class VECTOR>
240  inline
242  {}
243 
244 
245  template <class VECTOR>
246  inline
248  Matrix<VECTOR>::operator[] (unsigned int level) const
249  {
250  return *matrices[level];
251  }
252 
253 
254  template <class VECTOR>
255  void
257  const unsigned int level,
258  VECTOR &dst,
259  const VECTOR &src) const
260  {
261  matrices[level]->vmult(dst, src);
262  }
263 
264 
265  template <class VECTOR>
266  void
268  const unsigned int level,
269  VECTOR &dst,
270  const VECTOR &src) const
271  {
272  matrices[level]->vmult_add(dst, src);
273  }
274 
275 
276  template <class VECTOR>
277  void
278  Matrix<VECTOR>::Tvmult (const unsigned int level,
279  VECTOR &dst,
280  const VECTOR &src) const
281  {
282  matrices[level]->Tvmult(dst, src);
283  }
284 
285 
286  template <class VECTOR>
287  void
288  Matrix<VECTOR>::Tvmult_add (const unsigned int level,
289  VECTOR &dst,
290  const VECTOR &src) const
291  {
292  matrices[level]->Tvmult_add(dst, src);
293  }
294 
295 
296  template <class VECTOR>
297  inline
298  std::size_t
300  {
301  return sizeof(*this) + matrices->memory_consumption();
302  }
303 }
304 
305 /*----------------------------------------------------------------------*/
306 
307 template <class MATRIX, class VECTOR>
309  :
310  matrix (p, typeid(*this).name())
311 {}
312 
313 
314 template <class MATRIX, class VECTOR>
315 void
317 {
318  matrix = p;
319 }
320 
321 
322 template <class MATRIX, class VECTOR>
323 void
324 MGMatrix<MATRIX, VECTOR>::vmult (const unsigned int level,
325  VECTOR &dst,
326  const VECTOR &src) const
327 {
328  Assert(matrix != 0, ExcNotInitialized());
329 
330  const MGLevelObject<MATRIX> &m = *matrix;
331  m[level].vmult(dst, src);
332 }
333 
334 
335 template <class MATRIX, class VECTOR>
336 void
337 MGMatrix<MATRIX, VECTOR>::vmult_add (const unsigned int level,
338  VECTOR &dst,
339  const VECTOR &src) const
340 {
341  Assert(matrix != 0, ExcNotInitialized());
342 
343  const MGLevelObject<MATRIX> &m = *matrix;
344  m[level].vmult_add(dst, src);
345 }
346 
347 
348 template <class MATRIX, class VECTOR>
349 void
350 MGMatrix<MATRIX, VECTOR>::Tvmult (const unsigned int level,
351  VECTOR &dst,
352  const VECTOR &src) const
353 {
354  Assert(matrix != 0, ExcNotInitialized());
355 
356  const MGLevelObject<MATRIX> &m = *matrix;
357  m[level].Tvmult(dst, src);
358 }
359 
360 
361 template <class MATRIX, class VECTOR>
362 void
363 MGMatrix<MATRIX, VECTOR>::Tvmult_add (const unsigned int level,
364  VECTOR &dst,
365  const VECTOR &src) const
366 {
367  Assert(matrix != 0, ExcNotInitialized());
368 
369  const MGLevelObject<MATRIX> &m = *matrix;
370  m[level].Tvmult_add(dst, src);
371 }
372 
373 
374 template <class MATRIX, class VECTOR>
375 std::size_t
377 {
378  return sizeof(*this) + matrix->memory_consumption();
379 }
380 
381 /*----------------------------------------------------------------------*/
382 
383 template <class MATRIX, typename number>
385 MGMatrixSelect (const unsigned int row,
386  const unsigned int col,
388  :
389  matrix (p, typeid(*this).name()),
390  row(row),
391  col(col)
392 {}
393 
394 
395 
396 template <class MATRIX, typename number>
397 void
399 {
400  matrix = p;
401 }
402 
403 
404 template <class MATRIX, typename number>
405 void
407 select_block (const unsigned int brow,
408  const unsigned int bcol)
409 {
410  row = brow;
411  col = bcol;
412 }
413 
414 
415 template <class MATRIX, typename number>
416 void
418 vmult (const unsigned int level,
419  Vector<number> &dst,
420  const Vector<number> &src) const
421 {
422  Assert(matrix != 0, ExcNotInitialized());
423 
424  const MGLevelObject<MATRIX> &m = *matrix;
425  m[level].block(row, col).vmult(dst, src);
426 }
427 
428 
429 template <class MATRIX, typename number>
430 void
432 vmult_add (const unsigned int level,
433  Vector<number> &dst,
434  const Vector<number> &src) const
435 {
436  Assert(matrix != 0, ExcNotInitialized());
437 
438  const MGLevelObject<MATRIX> &m = *matrix;
439  m[level].block(row, col).vmult_add(dst, src);
440 }
441 
442 
443 template <class MATRIX, typename number>
444 void
446 Tvmult (const unsigned int level,
447  Vector<number> &dst,
448  const Vector<number> &src) const
449 {
450  Assert(matrix != 0, ExcNotInitialized());
451 
452  const MGLevelObject<MATRIX> &m = *matrix;
453  m[level].block(row, col).Tvmult(dst, src);
454 }
455 
456 
457 template <class MATRIX, typename number>
458 void
460 Tvmult_add (const unsigned int level,
461  Vector<number> &dst,
462  const Vector<number> &src) const
463 {
464  Assert(matrix != 0, ExcNotInitialized());
465 
466  const MGLevelObject<MATRIX> &m = *matrix;
467  m[level].block(row, col).Tvmult_add(dst, src);
468 }
469 
470 DEAL_II_NAMESPACE_CLOSE
471 
472 #endif
void set_matrix(MGLevelObject< MATRIX > *M)
Definition: mg_matrix.h:398
virtual void Tvmult(const unsigned int level, Vector< number > &dst, const Vector< number > &src) const
Definition: mg_matrix.h:446
virtual void Tvmult_add(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:363
virtual void vmult(const unsigned int level, Vector< number > &dst, const Vector< number > &src) const
Definition: mg_matrix.h:418
virtual void Tvmult_add(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:288
unsigned int row
Definition: mg_matrix.h:204
virtual void Tvmult(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:350
MGMatrixSelect(const unsigned int row=0, const unsigned int col=0, MGLevelObject< MATRIX > *matrix=0)
Definition: mg_matrix.h:385
std::size_t memory_consumption() const
Definition: mg_matrix.h:299
virtual void vmult(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:324
void select_block(const unsigned int row, const unsigned int col)
Definition: mg_matrix.h:407
virtual void vmult(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:256
#define Assert(cond, exc)
Definition: exceptions.h:299
virtual void vmult_add(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:337
unsigned int max_level() const
SmartPointer< MGLevelObject< MATRIX >, MGMatrixSelect< MATRIX, number > > matrix
Definition: mg_matrix.h:200
virtual void vmult_add(const unsigned int level, Vector< number > &dst, const Vector< number > &src) const
Definition: mg_matrix.h:432
unsigned int col
Definition: mg_matrix.h:208
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
void initialize(const MGLevelObject< MATRIX > &M)
Definition: mg_matrix.h:222
unsigned int min_level() const
::ExceptionBase & ExcNotInitialized()
virtual void Tvmult_add(const unsigned int level, Vector< number > &dst, const Vector< number > &src) const
Definition: mg_matrix.h:460
virtual void Tvmult(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:278
virtual void vmult_add(const unsigned int level, VECTOR &dst, const VECTOR &src) const
Definition: mg_matrix.h:267
const PointerMatrixBase< VECTOR > & operator[](unsigned int level) const
Definition: mg_matrix.h:248