QUDA v0.4.0
A library for QCD on GPUs
|
00001 #ifndef _INVERT_QUDA_H 00002 #define _INVERT_QUDA_H 00003 00004 #include <quda.h> 00005 #include <quda_internal.h> 00006 #include <dirac_quda.h> 00007 #include <color_spinor_field.h> 00008 00009 class Solver { 00010 00011 protected: 00012 QudaInvertParam &invParam; 00013 00014 public: 00015 Solver(QudaInvertParam &invParam) : invParam(invParam) { ; } 00016 virtual ~Solver() { ; } 00017 00018 virtual void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in) = 0; 00019 }; 00020 00021 class CG : public Solver { 00022 00023 private: 00024 const DiracMatrix &mat; 00025 const DiracMatrix &matSloppy; 00026 00027 public: 00028 CG(DiracMatrix &mat, DiracMatrix &matSloppy, QudaInvertParam &invParam); 00029 virtual ~CG(); 00030 00031 void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in); 00032 }; 00033 00034 class BiCGstab : public Solver { 00035 00036 private: 00037 DiracMatrix &mat; 00038 const DiracMatrix &matSloppy; 00039 const DiracMatrix &matPrecon; 00040 00041 // pointers to fields to avoid multiple creation overhead 00042 cudaColorSpinorField *yp, *rp, *pp, *vp, *tmpp, *tp, *wp, *zp; 00043 bool init; 00044 00045 public: 00046 BiCGstab(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, 00047 QudaInvertParam &invParam); 00048 virtual ~BiCGstab(); 00049 00050 void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in); 00051 }; 00052 00053 class GCR : public Solver { 00054 00055 private: 00056 const DiracMatrix &mat; 00057 const DiracMatrix &matSloppy; 00058 const DiracMatrix &matPrecon; 00059 00060 Solver *K; 00061 QudaInvertParam Kparam; // parameters for preconditioner solve 00062 00063 public: 00064 GCR(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, 00065 QudaInvertParam &invParam); 00066 virtual ~GCR(); 00067 00068 void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in); 00069 }; 00070 00071 class MR : public Solver { 00072 00073 private: 00074 const DiracMatrix &mat; 00075 cudaColorSpinorField *rp; 00076 cudaColorSpinorField *Arp; 00077 cudaColorSpinorField *tmpp; 00078 bool init; 00079 00080 public: 00081 MR(DiracMatrix &mat, QudaInvertParam &invParam); 00082 virtual ~MR(); 00083 00084 void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in); 00085 }; 00086 00087 // multigrid solver 00088 class alphaSA : public Solver { 00089 00090 protected: 00091 const DiracMatrix &mat; 00092 00093 public: 00094 alphaSA(DiracMatrix &mat, QudaInvertParam &invParam); 00095 virtual ~alphaSA() { ; } 00096 00097 void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in); 00098 }; 00099 00100 class MultiShiftSolver { 00101 00102 protected: 00103 QudaInvertParam &invParam; 00104 00105 public: 00106 MultiShiftSolver(QudaInvertParam &invParam) : invParam(invParam) { ; } 00107 virtual ~MultiShiftSolver() { ; } 00108 00109 virtual void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in) = 0; 00110 }; 00111 00112 class MultiShiftCG : public MultiShiftSolver { 00113 00114 protected: 00115 const DiracMatrix &mat; 00116 const DiracMatrix &matSloppy; 00117 00118 public: 00119 MultiShiftCG(DiracMatrix &mat, DiracMatrix &matSloppy, QudaInvertParam &invParam); 00120 virtual ~MultiShiftCG(); 00121 00122 void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in); 00123 }; 00124 00125 #endif // _INVERT_QUDA_H