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

#include <NekLinSysIterCG.h>

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

Public Member Functions

 NekLinSysIterCG (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vRowComm, const int nDimen, const NekSysKey &pKey)
 Constructor for full direct matrix solve. More...
 
 ~NekLinSysIterCG () 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 SetNekLinSysTolerance (const NekDouble in)
 
void SetNekLinSysMaxIterations (const unsigned int in)
 
int GetNekLinSysTolerance ()
 
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 ()
 
int SolveSystem (const int nGlobal, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const int nDir=0)
 
const NekSysOperatorsGetSysOperators ()
 
void SetSysOperators (const NekSysOperators &in)
 
void SetFlagWarnings (bool in)
 
void SetRhsMagnitude (const NekDouble mag)
 

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) override
 
- Protected Member Functions inherited from Nektar::LibUtilities::NekLinSysIter
void v_InitObject () override
 
void SetUniversalUniqueMap ()
 
void Set_Rhs_Magnitude (const Array< OneD, NekDouble > &pIn)
 
void ConvergenceCheck (const Array< OneD, const NekDouble > &Residual)
 
- 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)
 

Private Member Functions

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

Friends

class MemoryManager< NekLinSysIterCG >
 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_NekLinSysTolerance
 
int m_NekLinSysMaxIterations
 
int m_totalIterations = 0
 
bool m_isLocal
 
- Protected Attributes inherited from Nektar::LibUtilities::NekSys
LibUtilities::CommSharedPtr m_rowComm
 
bool m_converged
 
bool m_root
 
bool m_verbose
 
bool m_FlagWarnings
 
int m_SysDimen
 
NekSysOperators m_operator
 
NekDouble m_rhs_magnitude = NekConstants::kNekUnsetDouble
 

Detailed Description

Solves a linear system using iterative methods.

Definition at line 48 of file NekLinSysIterCG.h.

Constructor & Destructor Documentation

◆ NekLinSysIterCG()

Nektar::LibUtilities::NekLinSysIterCG::NekLinSysIterCG ( 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 NekLinSysIterCG.cpp.

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

◆ ~NekLinSysIterCG()

Nektar::LibUtilities::NekLinSysIterCG::~NekLinSysIterCG ( )
overridedefault

Member Function Documentation

◆ create()

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

Definition at line 54 of file NekLinSysIterCG.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< NekLinSysIterCG > NekLinSysIterCGSharedPtr

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

◆ DoConjugateGradient()

void Nektar::LibUtilities::NekLinSysIterCG::DoConjugateGradient ( const int  nGlobal,
const Array< OneD, const NekDouble > &  pInput,
Array< OneD, NekDouble > &  pOutput,
const int  nDir 
)
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 91 of file NekLinSysIterCG.cpp.

94{
95 // Get vector sizes
96 int nNonDir = nGlobal - nDir;
97
98 // Allocate array storage
99 Array<OneD, NekDouble> w_A(nGlobal, 0.0);
100 Array<OneD, NekDouble> s_A(nGlobal, 0.0);
101 Array<OneD, NekDouble> p_A(nNonDir, 0.0);
102 Array<OneD, NekDouble> r_A(nNonDir, 0.0);
103 Array<OneD, NekDouble> q_A(nNonDir, 0.0);
104 Array<OneD, NekDouble> tmp;
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(nNonDir, pInput + nDir, 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(nNonDir, tmp = pOutput + nDir, 1);
121
122 // Evaluate initial residual error for exit check
123 vExchange[2] = Vmath::Dot2(nNonDir, r_A, r_A, m_map + nDir);
124
125 m_rowComm->AllReduce(vExchange[2], Nektar::LibUtilities::ReduceSum);
126
127 eps = vExchange[2];
128
130 {
131 Set_Rhs_Magnitude(pInput);
132 }
133
135
136 // If input residual is less than tolerance skip solve.
138 {
139 if (m_verbose && m_root)
140 {
141 cout << "CG iterations made = " << m_totalIterations
142 << " using tolerance of " << m_NekLinSysTolerance
143 << " (error = " << sqrt(eps / m_rhs_magnitude)
144 << ", rhs_mag = " << sqrt(m_rhs_magnitude) << ")" << endl;
145 }
146 return;
147 }
148
149 m_operator.DoNekSysPrecon(r_A, tmp = w_A + nDir);
150 m_operator.DoNekSysLhsEval(w_A, s_A);
151
152 vExchange[0] = Vmath::Dot2(nNonDir, r_A, w_A + nDir, m_map + nDir);
153 vExchange[1] = Vmath::Dot2(nNonDir, s_A + nDir, w_A + nDir, m_map + nDir);
154
155 m_rowComm->AllReduce(vExchange, Nektar::LibUtilities::ReduceSum);
156
157 rho = vExchange[0];
158 mu = vExchange[1];
159 beta = 0.0;
160 alpha = rho / mu;
162
163 // Continue until convergence
164 while (true)
165 {
167 {
168 if (m_root)
169 {
170 cout << "CG iterations made = " << m_totalIterations
171 << " using tolerance of " << m_NekLinSysTolerance
172 << " (error = " << sqrt(eps / m_rhs_magnitude)
173 << ", rhs_mag = " << sqrt(m_rhs_magnitude) << ")" << endl;
174 }
176 "Exceeded maximum number of iterations");
177 }
178
179 // Compute new search direction p_k, q_k
180 Vmath::Svtvp(nNonDir, beta, &p_A[0], 1, &w_A[nDir], 1, &p_A[0], 1);
181 Vmath::Svtvp(nNonDir, beta, &q_A[0], 1, &s_A[nDir], 1, &q_A[0], 1);
182
183 // Update solution x_{k+1}
184 Vmath::Svtvp(nNonDir, alpha, &p_A[0], 1, &pOutput[nDir], 1,
185 &pOutput[nDir], 1);
186
187 // Update residual vector r_{k+1}
188 Vmath::Svtvp(nNonDir, -alpha, &q_A[0], 1, &r_A[0], 1, &r_A[0], 1);
189
190 // Apply preconditioner
191 m_operator.DoNekSysPrecon(r_A, tmp = w_A + nDir);
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::Dot2(nNonDir, r_A, w_A + nDir, m_map + nDir);
198
199 // <s_{k+1}, w_{k+1}>
200 vExchange[1] =
201 Vmath::Dot2(nNonDir, s_A + nDir, w_A + nDir, m_map + nDir);
202
203 // <r_{k+1}, r_{k+1}>
204 vExchange[2] = Vmath::Dot2(nNonDir, r_A, r_A, m_map + nDir);
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_NekLinSysTolerance
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
void Set_Rhs_Magnitude(const Array< OneD, NekDouble > &pIn)
Array< OneD, int > m_map
Global to universal unique map.
LibUtilities::CommSharedPtr m_rowComm
Definition: NekSys.h:291
NekSysOperators m_operator
Definition: NekSys.h:298
void DoNekSysPrecon(InArrayType &inarray, OutArrayType &outarray, const bool &flag=false) const
Definition: NekSys.h:149
void DoNekSysLhsEval(InArrayType &inarray, OutArrayType &outarray, const bool &flag=false) const
Definition: NekSys.h:142
@ 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 Dot2(int n, const T *w, const T *x, const int *y)
dot product
Definition: Vmath.hpp:790
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:285

References Nektar::LibUtilities::beta, Nektar::LibUtilities::NekSysOperators::DoNekSysLhsEval(), Nektar::LibUtilities::NekSysOperators::DoNekSysPrecon(), Vmath::Dot2(), Nektar::ErrorUtil::efatal, Nektar::NekConstants::kNekUnsetDouble, Nektar::LibUtilities::NekLinSysIter::m_map, Nektar::LibUtilities::NekLinSysIter::m_NekLinSysMaxIterations, Nektar::LibUtilities::NekLinSysIter::m_NekLinSysTolerance, Nektar::LibUtilities::NekSys::m_operator, Nektar::LibUtilities::NekSys::m_rhs_magnitude, Nektar::LibUtilities::NekSys::m_root, Nektar::LibUtilities::NekSys::m_rowComm, 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::NekLinSysIterCG::v_InitObject ( )
overrideprotectedvirtual

◆ v_SolveSystem()

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

Reimplemented from Nektar::LibUtilities::NekSys.

Definition at line 68 of file NekLinSysIterCG.cpp.

72{
73 DoConjugateGradient(nGlobal, pInput, pOutput, nDir);
74
75 return m_totalIterations;
76}
void DoConjugateGradient(const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const int pNumDir)
Actual iterative solve.

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

Friends And Related Function Documentation

◆ MemoryManager< NekLinSysIterCG >

friend class MemoryManager< NekLinSysIterCG >
friend

Support creation through MemoryManager.

Definition at line 46 of file NekLinSysIterCG.h.

Member Data Documentation

◆ className

string Nektar::LibUtilities::NekLinSysIterCG::className
static
Initial value:
=
"ConjugateGradient", NekLinSysIterCG::create,
"NekLinSysIterCG solver.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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 NekLinSysIterCG.h.