DiagonalPreconditioner.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2015 OpenFOAM Foundation
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "DiagonalPreconditioner.H"
29 
30 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
31 
32 template<class Type, class DType, class LUType>
34 (
35  const typename LduMatrix<Type, DType, LUType>::solver& sol,
36  const dictionary&
37 )
38 :
40  rD(sol.matrix().diag().size())
41 {
42  DType* __restrict__ rDPtr = rD.begin();
43  const DType* __restrict__ DPtr = this->solver_.matrix().diag().begin();
44 
45  label nCells = rD.size();
46 
47  // Generate inverse (reciprocal for scalar) diagonal
48  for (label cell=0; cell<nCells; cell++)
49  {
50  rDPtr[cell] = inv(DPtr[cell]);
51  }
52 }
53 
54 
55 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
56 
57 template<class Type, class DType, class LUType>
59 {}
60 
61 
62 template<class Type, class DType, class LUType>
64 (
65  Field<Type>& wA,
66  const Field<Type>& rA
67 ) const
68 {
69  Type* __restrict__ wAPtr = wA.begin();
70  const Type* __restrict__ rAPtr = rA.begin();
71  const DType* __restrict__ rDPtr = rD.begin();
72 
73  label nCells = wA.size();
74 
75  for (label cell=0; cell<nCells; cell++)
76  {
77  wAPtr[cell] = dot(rDPtr[cell], rAPtr[cell]);
78  }
79 }
80 
81 
82 // ************************************************************************* //
Foam::DiagonalPreconditioner
Diagonal preconditioner for both symmetric and asymmetric matrices.
Definition: DiagonalPreconditioner.H:55
Foam::dot
void dot(FieldField< Field1, typename innerProduct< Type1, Type2 >::type > &f, const FieldField< Field1, Type1 > &f1, const FieldField< Field2, Type2 > &f2)
Definition: FieldFieldFunctions.C:944
Foam::LduMatrix::solver
Abstract base-class for LduMatrix solvers.
Definition: LduMatrix.H:115
Foam::DiagonalPreconditioner::read
virtual void read(const dictionary &preconditionerDict)
Read and reset the preconditioner parameters from the given.
Definition: DiagonalPreconditioner.C:58
Foam::Field
Generic templated field type.
Definition: Field.H:63
Foam::inv
dimensionedSphericalTensor inv(const dimensionedSphericalTensor &dt)
Definition: dimensionedSphericalTensor.C:73
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:121
Foam::LduMatrix::solver::matrix
const LduMatrix< Type, DType, LUType > & matrix() const
Definition: LduMatrix.H:237
Foam::LduMatrix::preconditioner
Abstract base-class for LduMatrix preconditioners.
Definition: LduMatrix.H:362
Foam::DiagonalPreconditioner::precondition
virtual void precondition(Field< Type > &wA, const Field< Type > &rA) const
Return wA the preconditioned form of residual rA.
Definition: DiagonalPreconditioner.C:64
DiagonalPreconditioner.H
Foam::cell
A cell is defined as a list of faces with extra functionality.
Definition: cell.H:54