141 {
145 double theta;
146
148 for(trans1 = 0;trans1 < periodicity[idx]; ++trans1) {
149 Id1 = transSpin(representatives[idx],trans1,dloc,n);
150 for(trans2 = 0;trans2 < periodicity[idy]; ++trans2) {
151 Id2 = transSpin(representatives[idy],trans2,dloc,n);
152 theta = 2.0*M_PI*momentum*(trans2-trans1)/(
Real_t)n;
153 Ndiff = 0;
154 for(pos = 1;pos<n && Ndiff<2; ++pos) {
155 if( Bit(Id1,pos,dloc,n)!=Bit(Id2,pos,dloc,n) ) { Ndiff+=1; diff=pos; }
156 }
157 switch(Ndiff){
158 case 0:
159 for(diff = 1;diff < n; ++diff) {
160 locId1 = Bit(Id1,0,dloc,n) + dloc*Bit(Id1,diff,dloc,n);
161 locId2 = Bit(Id2,0,dloc,n) + dloc*Bit(Id2,diff,dloc,n);
162 if(locId1+LDL*locId2 >= 16) printf("# Case0: locId1+LDL*locId2 = %lld+%lld*%lld = %lld\n", locId1, LDL, locId2, locId1+LDL*locId2);
163 res += dfactor[diff]*dmatLoc[locId1+LDL*locId2]*
MAGMA_CEXP(theta);
164 }
165 break;
166 case 1:
167 locId1 = Bit(Id1,0,dloc,n) + dloc*Bit(Id1,diff,dloc,n);
168 locId2 = Bit(Id2,0,dloc,n) + dloc*Bit(Id2,diff,dloc,n);
169 if(locId1+LDL*locId2 >= 16) printf("# Case1: locId1+LDL*locId2 = %lld+%lld*%lld = %lld\n", locId1, LDL, locId2, locId1+LDL*locId2);
170 res += dfactor[diff]*dmatLoc[locId1+LDL*locId2]*
MAGMA_CEXP(theta);
171 break;
172 default:
173 continue;
174 }
175 }
176 }
177 res /= sqrt( (
Real_t)periodicity[idx]*periodicity[idy] );
178
179
180 return res;
181}
__device__ Complex_t< double > MAGMA_CEXP(Real_t theta)
Definition generateRM.cuh:132
double Real_t
Definition mytypes.hpp:37