Nektar++
NekNonlinSys.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: NekNonlinSys.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: NekNonlinSys definition
33 //
34 ///////////////////////////////////////////////////////////////////////////////
35 
37 
38 using namespace std;
39 
40 namespace Nektar
41 {
42 namespace LibUtilities
43 {
44 /**
45  * @class NekNonlinSys
46  *
47  * Solves a nonlinear system using iterative methods.
48  */
50 {
51  static NekNonlinSysFactory instance;
52  return instance;
53 }
54 
55 NekNonlinSys::NekNonlinSys(const LibUtilities::SessionReaderSharedPtr &pSession,
56  const LibUtilities::CommSharedPtr &vComm,
57  const int nDimen, const NekSysKey &pKey)
58  : NekSys(pSession, vComm, nDimen, pKey)
59 {
60  std::vector<std::string> variables(1);
61  variables[0] = pSession->GetVariable(0);
62  string variable = variables[0];
63 
64  if (pSession->DefinesGlobalSysSolnInfo(variable, "NekNonlinSysTolerance"))
65  {
66  m_tolerance = boost::lexical_cast<NekDouble>(
67  pSession->GetGlobalSysSolnInfo(variable, "NekNonlinSysTolerance")
68  .c_str());
69  }
70  else
71  {
72  pSession->LoadParameter("NekNonlinSysTolerance", m_tolerance,
74  }
75 
76  if (pSession->DefinesGlobalSysSolnInfo(variable,
77  "NekNonlinSysMaxIterations"))
78  {
79  m_maxiter = boost::lexical_cast<int>(
80  pSession
81  ->GetGlobalSysSolnInfo(variable, "NekNonlinSysMaxIterations")
82  .c_str());
83  }
84  else
85  {
86  pSession->LoadParameter("NekNonlinSysMaxIterations", m_maxiter,
88  }
89 
90  if (pSession->DefinesGlobalSysSolnInfo(variable, "NonlinIterTolRelativeL2"))
91  {
92  m_NonlinIterTolRelativeL2 = boost::lexical_cast<int>(
93  pSession->GetGlobalSysSolnInfo(variable, "NonlinIterTolRelativeL2")
94  .c_str());
95  }
96  else
97  {
98  pSession->LoadParameter("NonlinIterTolRelativeL2",
101  }
102 
103  if (pSession->DefinesGlobalSysSolnInfo(variable,
104  "LinSysRelativeTolInNonlin"))
105  {
106  m_LinSysRelativeTolInNonlin = boost::lexical_cast<int>(
107  pSession
108  ->GetGlobalSysSolnInfo(variable, "LinSysRelativeTolInNonlin")
109  .c_str());
110  }
111  else
112  {
113  pSession->LoadParameter("LinSysRelativeTolInNonlin",
116  }
117 
118  // cout << " m_LinSysRelativeTolInNonlin = " << m_LinSysRelativeTolInNonlin
119  // << endl;
120 
122  if (pSession->DefinesGlobalSysSolnInfo(variable,
123  "LinSysIterSolverTypeInNonlin"))
124  {
125  m_LinSysIterSolverType = pSession->GetGlobalSysSolnInfo(
126  variable, "LinSysIterSolverTypeInNonlin");
127  }
128  else
129  {
130  if (pSession->DefinesSolverInfo("LinSysIterSolverTypeInNonlin"))
131  {
133  pSession->GetSolverInfo("LinSysIterSolverTypeInNonlin");
134  }
135  }
136 
139  "NekLinSysIter '" + m_LinSysIterSolverType +
140  "' is not defined.\n");
141 
143  m_LinSysIterSolverType, pSession, m_Comm, m_SysDimen, pKey);
144  m_linsol->SetFlagWarnings(false);
145 }
146 
148 {
150 }
151 
153 {
154 }
155 
156 } // namespace LibUtilities
157 } // namespace Nektar
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
Provides a generic Factory class.
Definition: NekFactory.hpp:105
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
NekLinSysIterSharedPtr m_linsol
Definition: NekNonlinSys.h:132
virtual void v_InitObject()
Definition: NekSys.h:293
NekDouble m_tolerance
Tolerance of iterative solver.
Definition: NekSys.h:278
int m_SysDimen
The dimension of the system.
Definition: NekSys.h:291
LibUtilities::CommSharedPtr m_Comm
Communicate.
Definition: NekSys.h:280
int m_maxiter
Maximum iterations.
Definition: NekSys.h:276
NekDouble m_NonlinIterTolRelativeL2
Definition: NekSys.h:203
NekDouble m_LinSysRelativeTolInNonlin
Definition: NekSys.h:204
std::string m_LinSysIterSolverTypeInNonlin
Definition: NekSys.h:212
NekNonlinSysFactory & GetNekNonlinSysFactory()
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:2