00001 #include <util/wfm.h> 00002 #include "wfm_internal.h" 00003 CPS_START_NAMESPACE 00004 00005 /*--------------------------------------------------------------------------*/ 00006 /* wilson_m: */ 00007 /*--------------------------------------------------------------------------*/ 00008 00009 void wfm::m(Float *chi, 00010 Float *u, 00011 Float *psi, 00012 Float kappa) 00013 { 00014 /*--------------------------------------------------------------------------*/ 00015 /* Initializations */ 00016 /*--------------------------------------------------------------------------*/ 00017 int len = vol * ND; 00018 Float mkappasq = -kappa*kappa; 00019 00020 /*--------------------------------------------------------------------------*/ 00021 /* Dslash_E0 */ 00022 /*--------------------------------------------------------------------------*/ 00023 dslash(spinor_tmp, u, psi, 1, 0); 00024 00025 /*--------------------------------------------------------------------------*/ 00026 /* Dslash_0E */ 00027 /*--------------------------------------------------------------------------*/ 00028 dslash(chi, u, spinor_tmp, 0, 0); 00029 00030 /*--------------------------------------------------------------------------*/ 00031 /* 1_OO - kappa^2 * Dslash_0E * Dslash_E0 */ 00032 /*--------------------------------------------------------------------------*/ 00033 xaxpy(&mkappasq,chi,psi,len); 00034 DiracOp::CGflops += vol*24*2; 00035 } 00036 00037 00038 /*--------------------------------------------------------------------------*/ 00039 /* wfm::mdag: */ 00040 /*--------------------------------------------------------------------------*/ 00041 void wfm::mdag(Float *chi, 00042 Float *u, 00043 Float *psi, 00044 Float kappa) 00045 { 00046 00047 /*--------------------------------------------------------------------------*/ 00048 /* Initializations */ 00049 /*--------------------------------------------------------------------------*/ 00050 int len = vol * ND; 00051 Float mkappasq = -kappa*kappa; 00052 00053 /*--------------------------------------------------------------------------*/ 00054 /* DslashDag_E0 */ 00055 /*--------------------------------------------------------------------------*/ 00056 dslash(spinor_tmp, u, psi, 1, 1); 00057 00058 /*--------------------------------------------------------------------------*/ 00059 /* DslashDag_0E */ 00060 /*--------------------------------------------------------------------------*/ 00061 dslash(chi, u, spinor_tmp, 0, 1); 00062 00063 /*--------------------------------------------------------------------------*/ 00064 /* [1_OO - kappa * DslashDag_0E * DslashDag_E0] ] */ 00065 /*--------------------------------------------------------------------------*/ 00066 xaxpy(&mkappasq,chi,psi,len); 00067 #if 0 00068 for(int i=0;i<len*6;i++){ 00069 printf("chi[%d]=%e psi[%d]=%e\n",i,chi[i],i,psi[i]); 00070 chi[i] = psi[i] -kappa*kappa*chi[i]; 00071 } 00072 #endif 00073 DiracOp::CGflops += vol*24*2; 00074 } 00075 00076 void wfm::mdagm(Float *chi, 00077 Float *u, 00078 Float *psi, 00079 Float *mp_sq_p, 00080 Float kappa) 00081 { 00082 00083 /*--------------------------------------------------------------------------*/ 00084 /* Initializations */ 00085 /*--------------------------------------------------------------------------*/ 00086 int len = vol *ND; 00087 Float *tmp1 = spinor_tmp; 00088 Float *tmp2 = tmp1 + SPINOR_SIZE * vol ; 00089 Float sum; 00090 Float mkappasq = -kappa*kappa; 00091 00092 /*--------------------------------------------------------------------------*/ 00093 /* Dslash_E0 */ 00094 /*--------------------------------------------------------------------------*/ 00095 dslash(tmp1, u, psi, 1, 0); 00096 00097 /*--------------------------------------------------------------------------*/ 00098 /* Dslash_0E */ 00099 /*--------------------------------------------------------------------------*/ 00100 dslash(tmp2, u, tmp1, 0, 0); 00101 00102 /*--------------------------------------------------------------------------*/ 00103 /* 1_OO - kappa^2 * Dslash_0E * Dslash_E0 */ 00104 /*--------------------------------------------------------------------------*/ 00105 if(mp_sq_p != 0) { 00106 xaxpy_norm(&mkappasq,tmp2,psi,len,mp_sq_p); 00107 DiracOp::CGflops += vol*24*4; 00108 } else { 00109 xaxpy(&mkappasq,tmp2,psi,len); 00110 DiracOp::CGflops += vol*24*2; 00111 } 00112 00113 /*--------------------------------------------------------------------------*/ 00114 /* DslashDag_E0 */ 00115 /*--------------------------------------------------------------------------*/ 00116 dslash(tmp1, u, tmp2, 1, 1); 00117 00118 /*--------------------------------------------------------------------------*/ 00119 /* DslashDag_0E */ 00120 /*--------------------------------------------------------------------------*/ 00121 dslash(chi, u, tmp1, 0, 1); 00122 00123 /*--------------------------------------------------------------------------*/ 00124 /* [1_OO - kappa * DslashDag_0E * DslashDag_E0] * */ 00125 /* [1_OO - kappa^2 * Dslash_0E * Dslash_E0] */ 00126 /*--------------------------------------------------------------------------*/ 00127 xaxpy(&mkappasq,chi,tmp2,len); 00128 DiracOp::CGflops += vol*24*2; 00129 } 00130 00131 00132 CPS_END_NAMESPACE 00133 00134