Difference between revisions of "Bi-Conjugate Gradient Stabilized"

From Gw-qcd-wiki
Jump to: navigation, search
(Usage)
(Usage)
Line 26: Line 26:
 
#  The example explains in more detail how to correctly use BICGStabM through an example.
 
#  The example explains in more detail how to correctly use BICGStabM through an example.
  
You can find the example [[Media:BICGStabM-example.pdf|here]]
+
You can find the example [[Media:BICGStabM-example.pdf|here]] <br>
 
You can find a copy of the test code "control_test_bicgstabm_device.cu" located in the inverters directory example [[Media:BICGStabM-example_code.pdf|here]]
 
You can find a copy of the test code "control_test_bicgstabm_device.cu" located in the inverters directory example [[Media:BICGStabM-example_code.pdf|here]]

Revision as of 17:14, 21 April 2010

The bi-conjugate gradient stabilized method (BICGStab), returns the solution to a set of shifted linear systems of the form

\((M+\sigma_i) \textbf{x} =\textbf{b} \quad i=1,2,... ,N \)

where \( \sigma_i\) are the shift values.

Definitions:
\( \text{residue} = || ( M+\sigma_i) - \textbf{b} || \)

\( \text{error} = || ( M+\sigma_i) - \textbf{b} || / ||\textbf{b}|| \)

Usage

int qcd::bicgstabm_device(device_wilson_field &src, int noshifts, double shifts[],device_wilson_field* sol[], double dError, int maxiters, matmult<device_wilson_field>& pfncMatMult, device_random_field& rnd);

  1. src = b.
  2. noShifts = (N-1) the number of shifts minus one.
  3. shifts[] = a pointer to all shift values except the most singular value
  4. sol = a pointer to an array of N pointers pointing to the solutions.
  5. dError = the maximum error in the solution (see definition).
  6. maxiters = the maximum number of iterations allowed.
  7. pfncMatMult = pointer to the matrix multiplication.
  8. rnd = a random vector used to start the algorithm.
  9. the function returns the number of iterations required for convergence.

NOTES:

  1. The BICGStabM only guarantees the convergence of the linear system associated with the pfncMatMult you give it. You need to check this in your code. In fact, you should have a segment of your code check for this. If one or more shifts fails, for example, you could restart them using a single shift inverter. They should converge quickly since they probably already have almost converged to the desired accuracy.
  2. The example explains in more detail how to correctly use BICGStabM through an example.

You can find the example here
You can find a copy of the test code "control_test_bicgstabm_device.cu" located in the inverters directory example here