From 8f6039646bbe68c757f2491e404c8e0eeda99996 Mon Sep 17 00:00:00 2001 From: Chulwoo Jung Date: Thu, 24 May 2018 02:56:53 -0400 Subject: [PATCH] Added Hermition check in BlockCG --- .../iterative/BlockConjugateGradient.h | 61 ++++++++++++++++--- tests/solver/Test_dwf_mrhs_cg_mpi.cc | 10 +-- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/lib/algorithms/iterative/BlockConjugateGradient.h b/lib/algorithms/iterative/BlockConjugateGradient.h index 4e012493..171f3b8d 100644 --- a/lib/algorithms/iterative/BlockConjugateGradient.h +++ b/lib/algorithms/iterative/BlockConjugateGradient.h @@ -54,9 +54,10 @@ class BlockConjugateGradient : public OperatorFunction { RealD Tolerance; Integer MaxIterations; Integer IterationsToComplete; //Number of iterations the CG took to finish. Filled in upon completion + Integer PrintInterval; //GridLogMessages or Iterative BlockConjugateGradient(BlockCGtype cgtype,int _Orthog,RealD tol, Integer maxit, bool err_on_no_conv = true) - : Tolerance(tol), CGtype(cgtype), blockDim(_Orthog), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv) + : Tolerance(tol), CGtype(cgtype), blockDim(_Orthog), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv),PrintInterval(100) {}; //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -608,6 +609,28 @@ void CGmultiRHSsolve(LinearOperatorBase &Linop, const Field &Src, Field & IterationsToComplete = k; } +void InnerProductMatrix(Eigen::MatrixXcd &m , const std::vector &X, std::vector &Y){ + for(int b=0;b &Linop, const std::vector &Src, std::vector &Psi) { // int Orthog = blockDim; // First dimension is block dim; this is an assumption @@ -680,11 +703,16 @@ void BlockCGVecsolve(LinearOperatorBase &Linop, const std::vector P[b] = R[b]; // P_1 } // sliceInnerProductMatrix(m_rr,R,R,Orthog); + InnerProductMatrix(m_rr,R,R); + HermCheck(m_rr, "R_0 R_0",1,1); + HermCheck(m_rr, "R_0 R_0",0,1); +#if 0 for(int b=0;b &Linop, const std::vector SolverTimer.Start(); int k; + int if_print =0; for (k = 1; k <= MaxIterations; k++) { RealD rrsum=0; for(int b=0;b &Linop, const std::vector // Alpha sliceInnerTimer.Start(); // sliceInnerProductMatrix(m_pAp,P,AP,Orthog); + InnerProductMatrix(m_pAp,P,AP); + HermCheck(m_pAp, "P AP",1,if_print); + if(if_print) HermCheck(m_pAp, "P AP",0,if_print); +#if 0 for(int b=0;b &Linop, const std::vector R[b] -= m_alpha(bp,b)*AP[bp]; // R_k+1 = R_k - AP_k+1 alpha_k+1 } sliceMaddTimer.Stop(); +if(if_print) { //check for(int b=0;b &Linop, const std::vector // Beta m_rr_inv = m_rr.inverse(); //m_rr_inv = (R_k^t R_k)^-1 + HermCheck(m_rr_inv,"m_rr_inv",1,if_print); + if(if_print) HermCheck(m_rr_inv,"m_rr_inv",0,if_print); sliceInnerTimer.Start(); // sliceInnerProductMatrix(m_rr,R,R,Orthog); - for(int b=0;b &Linop, const std::vector AP[b] += m_beta(bp,b)*P[bp]; //AP = R_k+1 + P_k+1 beta_k+1 } } +if(if_print) { //check for(int b=0;b CG(stp,10000); - int blockDim = 0; -// BlockConjugateGradient BCGrQ(BlockCGrQ,blockDim,stp,10000); - BlockConjugateGradient BCG (BlockCG,blockDim,stp,10000); -// BlockConjugateGradient mCG (CGmultiRHS,blockDim,stp,10000); + int blockDim = 0;//not used for BlockCGVec BlockConjugateGradient BCGV (BlockCGVec,blockDim,stp,10000); + BCGV.PrintInterval=10; { -// BCG(HermOpCk,src[0],result[0]); BCGV(HermOpCk,src,result); }