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,
58  const NekSysKey &pKey)
59  : NekSys(pSession, vComm, nDimen, pKey)
60 {
61  std::vector<std::string> variables(1);
62  variables[0] = pSession->GetVariable(0);
63  string variable = variables[0];
64 
65  if (pSession->DefinesGlobalSysSolnInfo(variable, "NekNonlinSysTolerance"))
66  {
67  m_tolerance = boost::lexical_cast<NekDouble>(
68  pSession->GetGlobalSysSolnInfo(variable, "NekNonlinSysTolerance")
69  .c_str());
70  }
71  else
72  {
73  pSession->LoadParameter("NekNonlinSysTolerance", m_tolerance,
75  }
76 
77  if (pSession->DefinesGlobalSysSolnInfo(variable,
78  "NekNonlinSysMaxIterations"))
79  {
80  m_maxiter = boost::lexical_cast<int>(
81  pSession
82  ->GetGlobalSysSolnInfo(variable, "NekNonlinSysMaxIterations")
83  .c_str());
84  }
85  else
86  {
87  pSession->LoadParameter("NekNonlinSysMaxIterations", m_maxiter,
89  }
90 
91  if (pSession->DefinesGlobalSysSolnInfo(variable, "NonlinIterTolRelativeL2"))
92  {
93  m_NonlinIterTolRelativeL2 = boost::lexical_cast<int>(
94  pSession->GetGlobalSysSolnInfo(variable, "NonlinIterTolRelativeL2")
95  .c_str());
96  }
97  else
98  {
99  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 << endl;
119 
121  if (pSession->DefinesGlobalSysSolnInfo(variable,
122  "LinSysIterSolverTypeInNonlin"))
123  {
125  pSession->GetGlobalSysSolnInfo(variable,
126  "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 
157  const int nGlobal, const Array<OneD, const NekDouble> &pInput,
158  const Array<OneD, const NekDouble> &pSource,
159  const int nDir)
160 {
161  boost::ignore_unused(nGlobal, pInput, pSource, nDir);
162  NEKERROR(ErrorUtil::efatal, "v_SetupNekNonlinSystem not defined");
163 }
164 
165 } // namespace LibUtilities
166 } // namespace Nektar
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:209
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:145
virtual void v_SetupNekNonlinSystem(const int nGlobal, const Array< OneD, const NekDouble > &pInput, const Array< OneD, const NekDouble > &pSource, const int nDir)
NekLinSysIterSharedPtr m_linsol
Definition: NekNonlinSys.h:143
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
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:1