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
39using namespace std;
40
41namespace Nektar
42{
43namespace 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
58 const LibUtilities::CommSharedPtr &vRowComm, const int nDimen,
59 const NekSysKey &pKey)
60 : NekSys(pSession, vRowComm, 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")
82 .c_str());
83 }
84 else
85 {
86 pSession->LoadParameter("NekLinSysMaxIterations", m_maxiter,
88 }
89
90 if (pSession->DefinesGlobalSysSolnInfo(variable, "LinSysMaxStorage"))
91 {
92 m_LinSysMaxStorage = boost::lexical_cast<int>(
93 pSession->GetGlobalSysSolnInfo(variable, "LinSysMaxStorage")
94 .c_str());
95 }
96 else
97 {
98 pSession->LoadParameter("LinSysMaxStorage", m_LinSysMaxStorage,
100 }
101
102 m_isLocal = false;
103}
104
106{
109}
110
112{
113}
114
116{
117 int nmap = map.size();
118 if (m_map.size() != nmap)
119 {
120 m_map = Array<OneD, int>(nmap, 0);
121 }
122 Vmath::Vcopy(nmap, map, 1, m_map, 1);
123}
124
126{
128}
129
131{
132 NekDouble vExchange(0.0);
133 if (m_map.size() > 0)
134 {
135 vExchange =
136 Vmath::Dot2(pIn.GetDimension(), &pIn[0], &pIn[0], &m_map[0]);
137 }
138 m_rowComm->AllReduce(vExchange, LibUtilities::ReduceSum);
139
140 // To ensure that very different rhs values are not being
141 // used in subsequent solvers such as the velocit solve in
142 // INC NS. If this works we then need to work out a better
143 // way to control this.
144 NekDouble new_rhs_mag = (vExchange > 1.0e-6) ? vExchange : 1.0;
145
147 {
148 m_rhs_magnitude = new_rhs_mag;
149 }
150 else
151 {
153 (1.0 - m_rhs_mag_sm) * new_rhs_mag);
154 }
155}
156
158{
159 Array<OneD, NekDouble> vExchange(1, 0.0);
160
161 Array<OneD, NekDouble> wk(pIn.size());
162 m_operator.DoAssembleLoc(pIn, wk);
163 vExchange[0] = Vmath::Dot(pIn.size(), wk, pIn);
164 m_rowComm->AllReduce(vExchange, LibUtilities::ReduceSum);
165
166 // To ensure that very different rhs values are not being
167 // used in subsequent solvers such as the velocit solve in
168 // INC NS. If this works we then need to work out a better
169 // way to control this.
170 NekDouble new_rhs_mag = (vExchange[0] > 1e-6) ? vExchange[0] : 1.0;
171
173 {
174 m_rhs_magnitude = new_rhs_mag;
175 }
176 else
177 {
179 (1.0 - m_rhs_mag_sm) * new_rhs_mag);
180 }
181}
182
183} // namespace LibUtilities
184} // namespace Nektar
Provides a generic Factory class.
Definition: NekFactory.hpp:105
virtual void v_InitObject() override
NekDouble m_rhs_magnitude
Dot product of rhs to normalise stopping criterion.
void Set_Rhs_Magnitude(const NekVector< NekDouble > &pIn)
NekLinSysIter(const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
Array< OneD, int > m_map
Global to universal unique map.
LibUtilities::CommSharedPtr m_rowComm
Communicate.
Definition: NekSys.h:302
virtual void v_InitObject()
Definition: NekSys.h:315
NekDouble m_tolerance
Tolerance of iterative solver.
Definition: NekSys.h:300
NekSysOperators m_operator
Operators.
Definition: NekSys.h:311
int m_SysDimen
The dimension of the system.
Definition: NekSys.h:313
int m_maxiter
Maximum iterations.
Definition: NekSys.h:298
void DoAssembleLoc(InArrayType &xn, OutArrayType &xn1, const bool &flag=false) const
Definition: NekSys.h:163
unsigned int GetDimension() const
Returns the number of dimensions for the point.
Definition: NekVector.cpp:201
std::shared_ptr< SessionReader > SessionReaderSharedPtr
NekLinSysIterFactory & GetNekLinSysIterFactory()
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:57
static const NekDouble kNekUnsetDouble
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
double NekDouble
T Dot2(int n, const T *w, const T *x, const int *y)
dot2 (vector times vector times vector): z = w*x*y
Definition: Vmath.cpp:1142
T Dot(int n, const T *w, const T *x)
dot (vector times vector): z = w*x
Definition: Vmath.cpp:1095
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1191