Nektar++
NekLinSysIterFixedpointJacobi.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: NekLinSysIterFixedpointJacobi.cpp
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // License for the specific language governing rights and limitations under
14 // Permission is hereby granted, free of charge, to any person obtaining a
15 // copy of this software and associated documentation files (the "Software"),
16 // to deal in the Software without restriction, including without limitation
17 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 // and/or sell copies of the Software, and to permit persons to whom the
19 // Software is furnished to do so, subject to the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be included
22 // in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 // DEALINGS IN THE SOFTWARE.
31 //
32 // Description: NekLinSysIterFixedpointJacobi definition
33 //
34 ///////////////////////////////////////////////////////////////////////////////
35 
38 
39 using namespace std;
40 
41 namespace Nektar
42 {
43 namespace LibUtilities
44 {
45 /**
46  * @class NekLinSysIterFixedpointJacobi
47  *
48  * Solves a linear system using iterative methods.
49  */
50 string NekLinSysIterFixedpointJacobi::className =
52  "FixedpointJacobi", NekLinSysIterFixedpointJacobi::create,
53  "NekLinSysIterFixedpointJacobi solver.");
54 
55 NekLinSysIterFixedpointJacobi::NekLinSysIterFixedpointJacobi(
57  const LibUtilities::CommSharedPtr &vComm, const int nDimen,
58  const NekSysKey &pKey)
59  : NekLinSysIter(pSession, vComm, nDimen, pKey)
60 {
61 }
62 
64 {
66 }
67 
69 {
70 }
71 
72 /**
73  *
74  */
76  const int nGlobal, const Array<OneD, const NekDouble> &pRhs,
77  Array<OneD, NekDouble> &pSolution, const int nDir, const NekDouble tol,
78  const NekDouble factor)
79 {
80  boost::ignore_unused(tol, nDir);
81 
82  int niterations = 0;
83  m_tolerance = max(tol, 1.0E-16);
84  m_prec_factor = factor;
85 
86  Array<OneD, NekDouble> pSol0(nGlobal);
87  Vmath::Vcopy(nGlobal, pSolution, 1, pSol0, 1);
88  for (int i = 0; i < m_maxiter; ++i)
89  {
90  m_operator.DoNekSysFixPointIte(pRhs, pSol0, pSolution);
91  Vmath::Vsub(nGlobal, pSolution, 1, pSol0, 1, pSol0, 1);
92  Vmath::Vcopy(nGlobal, pSolution, 1, pSol0, 1);
93  niterations++;
95  if (m_converged)
96  {
97  break;
98  }
99  }
100 
101  return niterations;
102 }
103 } // namespace LibUtilities
104 } // namespace Nektar
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:200
virtual int v_SolveSystem(const int nGlobal, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const int nDir, const NekDouble tol, const NekDouble factor)
bool ConvergenceCheck(const int nIteration, const Array< OneD, const NekDouble > &Residual, const NekDouble tol=1.0E-7)
Definition: NekSys.h:263
NekDouble m_tolerance
Tolerance of iterative solver.
Definition: NekSys.h:283
NekSysOperators m_operator
Operators.
Definition: NekSys.h:294
bool m_converged
Whether the iteration has been converged.
Definition: NekSys.h:287
int m_maxiter
Maximum iterations.
Definition: NekSys.h:281
void DoNekSysFixPointIte(InArrayType &rhs, InArrayType &xn, OutArrayType &xn1, const bool &flag=false) const
Definition: NekSys.h:155
std::shared_ptr< SessionReader > SessionReaderSharedPtr
NekLinSysIterFactory & GetNekLinSysIterFactory()
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:54
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
double NekDouble
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:372