Nektar++
NekLinSysIter.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: NekLinSysIter.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: NekLinSysIter definition
33 //
34 ///////////////////////////////////////////////////////////////////////////////
35 
38 
39 using namespace std;
40 
41 namespace Nektar
42 {
43 namespace LibUtilities
44 {
45 /**
46  * @class NekLinSysIter
47  *
48  * Solves a linear system using iterative methods.
49  */
51 {
52  static NekLinSysIterFactory instance;
53  return instance;
54 }
55 
56 NekLinSysIter::NekLinSysIter(
58  const LibUtilities::CommSharedPtr &vComm, const int nDimen,
59  const NekSysKey &pKey)
60  : NekSys(pSession, vComm, nDimen, pKey)
61 {
62  std::vector<std::string> variables(1);
63  variables[0] = pSession->GetVariable(0);
64  string variable = variables[0];
65 
66  if (pSession->DefinesGlobalSysSolnInfo(variable, "NekLinSysTolerance"))
67  {
68  m_tolerance = boost::lexical_cast<NekDouble>(
69  pSession->GetGlobalSysSolnInfo(variable, "NekLinSysTolerance")
70  .c_str());
71  }
72  else
73  {
74  pSession->LoadParameter("NekLinSysTolerance", m_tolerance,
76  }
77 
78  if (pSession->DefinesGlobalSysSolnInfo(variable, "NekLinSysMaxIterations"))
79  {
80  m_maxiter = boost::lexical_cast<int>(
81  pSession->GetGlobalSysSolnInfo(variable, "NekLinSysMaxIterations").c_str());
82  }
83  else
84  {
85  pSession->LoadParameter("NekLinSysMaxIterations", m_maxiter,
87  }
88 
89  if (pSession->DefinesGlobalSysSolnInfo(variable, "LinSysMaxStorage"))
90  {
91  m_LinSysMaxStorage = boost::lexical_cast<int>(
92  pSession->GetGlobalSysSolnInfo(variable, "LinSysMaxStorage")
93  .c_str());
94  }
95  else
96  {
97  pSession->LoadParameter("LinSysMaxStorage", m_LinSysMaxStorage,
98  pKey.m_LinSysMaxStorage);
99  }
100 
101 }
102 
104 {
107 }
108 
110 {
111 }
112 
114 {
115  int nmap = map.size();
116  if (m_map.size() != nmap)
117  {
118  m_map = Array<OneD, int>(nmap, 0);
119  }
120  Vmath::Vcopy(nmap, map, 1, m_map, 1);
121 }
122 
124 {
126 }
127 
129 {
130  Array<OneD, NekDouble> vExchange(1, 0.0);
131  if (m_map.size() > 0)
132  {
133  vExchange[0] =
134  Vmath::Dot2(pIn.GetDimension(), &pIn[0], &pIn[0], &m_map[0]);
135  }
136  m_Comm->AllReduce(vExchange, LibUtilities::ReduceSum);
137 
138  // To ensure that very different rhs values are not being
139  // used in subsequent solvers such as the velocit solve in
140  // INC NS. If this works we then need to work out a better
141  // way to control this.
142  NekDouble new_rhs_mag = (vExchange[0] > 1e-6) ? vExchange[0] : 1.0;
143 
145  {
146  m_rhs_magnitude = new_rhs_mag;
147  }
148  else
149  {
151  (1.0 - m_rhs_mag_sm) * new_rhs_mag);
152  }
153 }
154 } // namespace LibUtilities
155 } // namespace Nektar
Provides a generic Factory class.
Definition: NekFactory.hpp:105
NekDouble m_rhs_magnitude
Dot product of rhs to normalise stopping criterion.
void Set_Rhs_Magnitude(const NekVector< NekDouble > &pIn)
Array< OneD, int > m_map
Global to universal unique map.
virtual void v_InitObject()
Definition: NekSys.h:298
NekDouble m_tolerance
Tolerance of iterative solver.
Definition: NekSys.h:283
int m_SysDimen
The dimension of the system.
Definition: NekSys.h:296
LibUtilities::CommSharedPtr m_Comm
Communicate.
Definition: NekSys.h:285
int m_maxiter
Maximum iterations.
Definition: NekSys.h:281
unsigned int GetDimension() const
Returns the number of dimensions for the point.
Definition: NekVector.cpp:209
std::shared_ptr< SessionReader > SessionReaderSharedPtr
NekLinSysIterFactory & GetNekLinSysIterFactory()
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:54
static const NekDouble kNekUnsetDouble
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
double NekDouble
T Dot2(int n, const T *w, const T *x, const int *y)
vvtvp (vector times vector times vector): z = w*x*y
Definition: Vmath.cpp:1084
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199