72 std::cout <<
GridLogMessage <<
"MixedPrecisionConjugateGradient: Starting mixed precision CG with outer tolerance " <<
Tolerance <<
" and inner tolerance " <<
InnerTolerance << std::endl;
78 int cb = src_d_in.Checkerboard();
79 sol_d.Checkerboard() = cb;
84 GridBase* DoublePrecGrid = src_d_in.Grid();
85 FieldD tmp_d(DoublePrecGrid);
86 tmp_d.Checkerboard() = cb;
88 FieldD tmp2_d(DoublePrecGrid);
89 tmp2_d.Checkerboard() = cb;
91 FieldD src_d(DoublePrecGrid);
97 src_f.Checkerboard() = cb;
100 sol_f.Checkerboard() = cb;
102 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Starting initial inner CG with tolerance " << inner_tol << std::endl;
120 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Outer iteration " <<outer_iter<<
" residual "<< norm<<
" target "<< stop<<std::endl;
123 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Outer iteration converged on iteration " <<outer_iter <<std::endl;
126 while(norm * inner_tol * inner_tol < stop*1.01) inner_tol *= 2;
128 PrecChangeTimer.
Start();
130 PrecChangeTimer.
Stop();
136 (*guesser)(src_f, sol_f);
139 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Outer iteration " << outer_iter <<
" starting inner CG with tolerance " << inner_tol << std::endl;
141 InnerCGtimer.
Start();
147 PrecChangeTimer.
Start();
149 PrecChangeTimer.
Stop();
151 axpy(sol_d, 1.0, tmp_d, sol_d);
155 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Starting final patch-up double-precision solve"<<std::endl;
158 CG_d(
Linop_d, src_d_in, sol_d);
164 std::cout<<
GridLogMessage<<
"MixedPrecisionConjugateGradient: Total time " << TotalTimer.
Elapsed() <<
" Precision change " << PrecChangeTimer.
Elapsed() <<
" Inner CG total " << InnerCGtimer.
Elapsed() << std::endl;