Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Private Member Functions | Friends | List of all members
Nektar::LibUtilities::NekLinSysIterCGLoc Class Reference

#include <NekLinSysIterCGLoc.h>

Inheritance diagram for Nektar::LibUtilities::NekLinSysIterCGLoc:
[legend]

Public Member Functions

 NekLinSysIterCGLoc (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 Constructor for full direct matrix solve. More...
 
 ~NekLinSysIterCGLoc () override=default
 
- Public Member Functions inherited from Nektar::LibUtilities::NekLinSysIter
 NekLinSysIter (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 
 ~NekLinSysIter () override=default
 
void SetUniversalUniqueMap (const Array< OneD, const int > &map)
 
void setRhsMagnitude (const NekDouble mag)
 
void SetNekLinSysMaxIterations (const unsigned int in)
 
void SetLinSysMaxStorage (const unsigned int in)
 
bool IsLocal ()
 
- Public Member Functions inherited from Nektar::LibUtilities::NekSys
 NekSys (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 
virtual ~NekSys ()=default
 
void InitObject ()
 
void SetSysOperators (const NekSysOperators &in)
 
const NekSysOperatorsGetSysOperators ()
 
int SolveSystem (const int nGlobal, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const int nDir, const NekDouble tol=1.0E-7, const NekDouble factor=1.0)
 
bool ConvergenceCheck (const int nIteration, const Array< OneD, const NekDouble > &Residual, const NekDouble tol=1.0E-7)
 
void SetFlagWarnings (bool in)
 

Static Public Member Functions

static NekLinSysIterSharedPtr create (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 
- Static Public Member Functions inherited from Nektar::LibUtilities::NekLinSysIter
static NekLinSysIterSharedPtr CreateInstance (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 
- Static Public Member Functions inherited from Nektar::LibUtilities::NekSys
static NekSysSharedPtr CreateInstance (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 

Static Public Attributes

static std::string className
 

Protected Member Functions

void v_InitObject () override
 
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) override
 
- Protected Member Functions inherited from Nektar::LibUtilities::NekLinSysIter
void Set_Rhs_Magnitude (const NekVector< NekDouble > &pIn)
 
void Set_Rhs_Magnitude (const Array< OneD, NekDouble > &pIn)
 
void SetUniversalUniqueMap ()
 
void v_InitObject () override
 
- Protected Member Functions inherited from Nektar::LibUtilities::NekSys
virtual void v_InitObject ()
 
virtual void v_SetSysOperators (const NekSysOperators &in)
 
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)
 
virtual bool v_ConvergenceCheck (const int nIteration, const Array< OneD, const NekDouble > &Residual, const NekDouble tol)
 
virtual void v_NekSysInitialGuess (const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pguess)
 

Private Member Functions

void DoConjugateGradient (const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput)
 Actual iterative solve. More...
 

Friends

class MemoryManager< NekLinSysIterCGLoc >
 Support creation through MemoryManager. More...
 

Additional Inherited Members

- Protected Attributes inherited from Nektar::LibUtilities::NekLinSysIter
Array< OneD, int > m_map
 Global to universal unique map. More...
 
NekDouble m_rhs_magnitude = NekConstants::kNekUnsetDouble
 Dot product of rhs to normalise stopping criterion. More...
 
int m_totalIterations = 0
 
NekDouble m_prec_factor = 1.0
 
int m_LinSysMaxStorage
 
bool m_isLocal
 
- Protected Attributes inherited from Nektar::LibUtilities::NekSys
int m_maxiter
 Maximum iterations. More...
 
NekDouble m_tolerance
 Tolerance of iterative solver. More...
 
LibUtilities::CommSharedPtr m_rowComm
 Communicate. More...
 
bool m_converged
 Whether the iteration has been converged. More...
 
bool m_root
 Root if parallel. More...
 
bool m_verbose
 Verbose. More...
 
bool m_FlagWarnings
 
NekSysOperators m_operator
 Operators. More...
 
int m_SysDimen
 The dimension of the system. More...
 

Detailed Description

Solves a linear system using iterative methods.

Definition at line 48 of file NekLinSysIterCGLoc.h.

Constructor & Destructor Documentation

◆ NekLinSysIterCGLoc()

Nektar::LibUtilities::NekLinSysIterCGLoc::NekLinSysIterCGLoc ( const LibUtilities::SessionReaderSharedPtr pSession,
const LibUtilities::CommSharedPtr vRowComm,
const int  nDimen,
const NekSysKey pKey 
)

Constructor for full direct matrix solve.

Definition at line 52 of file NekLinSysIterCGLoc.cpp.

56 : NekLinSysIter(pSession, vRowComm, nDimen, pKey)
57{
58 m_isLocal = true;
59}
NekLinSysIter(const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)

References Nektar::LibUtilities::NekLinSysIter::m_isLocal.

◆ ~NekLinSysIterCGLoc()

Nektar::LibUtilities::NekLinSysIterCGLoc::~NekLinSysIterCGLoc ( )
overridedefault

Member Function Documentation

◆ create()

static NekLinSysIterSharedPtr Nektar::LibUtilities::NekLinSysIterCGLoc::create ( const LibUtilities::SessionReaderSharedPtr pSession,
const LibUtilities::CommSharedPtr vRowComm,
const int  nDimen,
const NekSysKey pKey 
)
inlinestatic

Definition at line 54 of file NekLinSysIterCGLoc.h.

58 {
61 pSession, vRowComm, nDimen, pKey);
62 p->InitObject();
63 return p;
64 }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< NekLinSysIterCGLoc > NekLinSysIterCGLocSharedPtr

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and CellMLToNektar.cellml_metadata::p.

◆ DoConjugateGradient()

void Nektar::LibUtilities::NekLinSysIterCGLoc::DoConjugateGradient ( const int  nLocal,
const Array< OneD, const NekDouble > &  pInput,
Array< OneD, NekDouble > &  pOutput 
)
private

Actual iterative solve.

  Solve a global linear system using the conjugate gradient method.   We solve only for the non-Dirichlet modes. The operator is evaluated   using an auxiliary function m_operator.DoNekSysLhsEval defined by the   specific solver. Distributed math routines are used to support   parallel execution of the solver.     The implemented algorithm uses a reduced-communication reordering of   the standard PCG method (Demmel, Heath and Vorst, 1993)    

Parameters
pInputInput residual of all DOFs.  
pOutputSolution vector of all DOFs.  

Definition at line 94 of file NekLinSysIterCGLoc.cpp.

97{
98 // Allocate array storage
99 Array<OneD, NekDouble> w_A(nLocal, 0.0);
100 Array<OneD, NekDouble> s_A(nLocal, 0.0);
101 Array<OneD, NekDouble> p_A(nLocal, 0.0);
102 Array<OneD, NekDouble> r_A(nLocal, 0.0);
103 Array<OneD, NekDouble> q_A(nLocal, 0.0);
104 Array<OneD, NekDouble> wk(nLocal, 0.0);
105
106 NekDouble alpha;
108 NekDouble rho;
109 NekDouble rho_new;
110 NekDouble mu;
111 NekDouble eps;
112 Array<OneD, NekDouble> vExchange(3, 0.0);
113
114 // Copy initial residual from input
115 Vmath::Vcopy(nLocal, pInput, 1, r_A, 1);
116
117 // zero homogeneous out array ready for solution updates
118 // Should not be earlier in case input vector is same as
119 // output and above copy has been peformed
120 Vmath::Zero(nLocal, pOutput, 1);
121
122 // evaluate initial residual error for exit check
123 m_operator.DoAssembleLoc(r_A, wk, true);
124 vExchange[2] = Vmath::Dot(nLocal, wk, r_A);
125
126 m_rowComm->AllReduce(vExchange, Nektar::LibUtilities::ReduceSum);
127
128 eps = vExchange[2];
129
131 {
132 Set_Rhs_Magnitude(pInput);
133 }
134
136
137 // If input residual is less than tolerance skip solve.
139 {
140 if (m_verbose && m_root)
141 {
142 cout << "CG iterations made = " << m_totalIterations
143 << " using tolerance of " << m_tolerance
144 << " (error = " << sqrt(eps / m_rhs_magnitude)
145 << ", rhs_mag = " << sqrt(m_rhs_magnitude) << ")" << endl;
146 }
147 return;
148 }
149
150 m_operator.DoNekSysPrecon(r_A, w_A, true);
151 m_operator.DoNekSysLhsEval(w_A, s_A);
152
153 vExchange[0] = Vmath::Dot(nLocal, r_A, w_A);
154 vExchange[1] = Vmath::Dot(nLocal, s_A, w_A);
155
156 m_rowComm->AllReduce(vExchange, Nektar::LibUtilities::ReduceSum);
157
158 rho = vExchange[0];
159 mu = vExchange[1];
160 beta = 0.0;
161 alpha = rho / mu;
163
164 // Continue until convergence
165 while (true)
166 {
168 {
169 if (m_root)
170 {
171 cout << "CG iterations made = " << m_totalIterations
172 << " using tolerance of " << m_tolerance
173 << " (error = " << sqrt(eps / m_rhs_magnitude)
174 << ", rhs_mag = " << sqrt(m_rhs_magnitude) << ")" << endl;
175 }
177 "Exceeded maximum number of iterations");
178 }
179
180 // Compute new search direction p_k, q_k
181 Vmath::Svtvp(nLocal, beta, p_A, 1, w_A, 1, p_A, 1);
182 Vmath::Svtvp(nLocal, beta, q_A, 1, s_A, 1, q_A, 1);
183
184 // Update solution x_{k+1}
185 Vmath::Svtvp(nLocal, alpha, p_A, 1, pOutput, 1, pOutput, 1);
186
187 // Update residual vector r_{k+1}
188 Vmath::Svtvp(nLocal, -alpha, q_A, 1, r_A, 1, r_A, 1);
189
190 // Apply preconditioner
191 m_operator.DoNekSysPrecon(r_A, w_A, true);
192
193 // Perform the method-specific matrix-vector multiply operation.
194 m_operator.DoNekSysLhsEval(w_A, s_A);
195
196 // <r_{k+1}, w_{k+1}>
197 vExchange[0] = Vmath::Dot(nLocal, r_A, w_A);
198
199 // <s_{k+1}, w_{k+1}>
200 vExchange[1] = Vmath::Dot(nLocal, s_A, w_A);
201
202 // <r_{k+1}, r_{k+1}>
203 m_operator.DoAssembleLoc(r_A, wk, true);
204 vExchange[2] = Vmath::Dot(nLocal, wk, r_A);
205
206 // Perform inner-product exchanges
207 m_rowComm->AllReduce(vExchange, Nektar::LibUtilities::ReduceSum);
208
209 rho_new = vExchange[0];
210 mu = vExchange[1];
211 eps = vExchange[2];
212
214
215 // Test if norm is within tolerance
217 {
218 if (m_verbose && m_root)
219 {
220 cout << "CG iterations made = " << m_totalIterations
221 << " using tolerance of " << m_tolerance
222 << " (error = " << sqrt(eps / m_rhs_magnitude)
223 << ", rhs_mag = " << sqrt(m_rhs_magnitude) << ")" << endl;
224 }
225 break;
226 }
227
228 // Compute search direction and solution coefficients
229 beta = rho_new / rho;
230 alpha = rho_new / (mu - rho_new * beta / alpha);
231 rho = rho_new;
232 }
233}
#define ROOTONLY_NEKERROR(type, msg)
Definition: ErrorUtil.hpp:205
NekDouble m_rhs_magnitude
Dot product of rhs to normalise stopping criterion.
void Set_Rhs_Magnitude(const NekVector< NekDouble > &pIn)
bool m_root
Root if parallel.
Definition: NekSys.h:297
LibUtilities::CommSharedPtr m_rowComm
Communicate.
Definition: NekSys.h:293
bool m_verbose
Verbose.
Definition: NekSys.h:299
NekDouble m_tolerance
Tolerance of iterative solver.
Definition: NekSys.h:291
NekSysOperators m_operator
Operators.
Definition: NekSys.h:302
int m_maxiter
Maximum iterations.
Definition: NekSys.h:289
void DoAssembleLoc(InArrayType &xn, OutArrayType &xn1, const bool &flag=false) const
Definition: NekSys.h:161
void DoNekSysPrecon(InArrayType &inarray, OutArrayType &outarray, const bool &flag=false) const
Definition: NekSys.h:148
void DoNekSysLhsEval(InArrayType &inarray, OutArrayType &outarray, const bool &flag=false) const
Definition: NekSys.h:141
@ beta
Gauss Radau pinned at x=-1,.
Definition: PointsType.h:59
static const NekDouble kNekUnsetDouble
double NekDouble
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
Definition: Vmath.hpp:396
T Dot(int n, const T *w, const T *x)
dot product
Definition: Vmath.hpp:761
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.hpp:273
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294

References Nektar::LibUtilities::beta, Nektar::LibUtilities::NekSysOperators::DoAssembleLoc(), Nektar::LibUtilities::NekSysOperators::DoNekSysLhsEval(), Nektar::LibUtilities::NekSysOperators::DoNekSysPrecon(), Vmath::Dot(), Nektar::ErrorUtil::efatal, Nektar::NekConstants::kNekUnsetDouble, Nektar::LibUtilities::NekSys::m_maxiter, Nektar::LibUtilities::NekSys::m_operator, Nektar::LibUtilities::NekLinSysIter::m_rhs_magnitude, Nektar::LibUtilities::NekSys::m_root, Nektar::LibUtilities::NekSys::m_rowComm, Nektar::LibUtilities::NekSys::m_tolerance, Nektar::LibUtilities::NekLinSysIter::m_totalIterations, Nektar::LibUtilities::NekSys::m_verbose, Nektar::LibUtilities::ReduceSum, ROOTONLY_NEKERROR, Nektar::LibUtilities::NekLinSysIter::Set_Rhs_Magnitude(), tinysimd::sqrt(), Vmath::Svtvp(), Vmath::Vcopy(), and Vmath::Zero().

Referenced by v_SolveSystem().

◆ v_InitObject()

void Nektar::LibUtilities::NekLinSysIterCGLoc::v_InitObject ( )
overrideprotectedvirtual

◆ v_SolveSystem()

int Nektar::LibUtilities::NekLinSysIterCGLoc::v_SolveSystem ( const int  nGlobal,
const Array< OneD, const NekDouble > &  pInput,
Array< OneD, NekDouble > &  pOutput,
const int  nDir,
const NekDouble  tol,
const NekDouble  factor 
)
overrideprotectedvirtual

Reimplemented from Nektar::LibUtilities::NekSys.

Definition at line 69 of file NekLinSysIterCGLoc.cpp.

73{
74 m_tolerance = max(tol, 1.0E-16);
75
76 DoConjugateGradient(nLocal, pInput, pOutput);
77
78 return m_totalIterations;
79}
void DoConjugateGradient(const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput)
Actual iterative solve.

References DoConjugateGradient(), Nektar::LibUtilities::NekSys::m_tolerance, and Nektar::LibUtilities::NekLinSysIter::m_totalIterations.

Friends And Related Function Documentation

◆ MemoryManager< NekLinSysIterCGLoc >

friend class MemoryManager< NekLinSysIterCGLoc >
friend

Support creation through MemoryManager.

Definition at line 46 of file NekLinSysIterCGLoc.h.

Member Data Documentation

◆ className

string Nektar::LibUtilities::NekLinSysIterCGLoc::className
static
Initial value:
=
"ConjugateGradientLoc", NekLinSysIterCGLoc::create,
"NekLinSysIterCG solver in Local Space.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:197
static NekLinSysIterSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
NekLinSysIterFactory & GetNekLinSysIterFactory()

Definition at line 66 of file NekLinSysIterCGLoc.h.