20 #ifndef JDFTX_CORE_OPERATORS_INTERNAL_H 21 #define JDFTX_CORE_OPERATORS_INTERNAL_H 23 #include <core/matrix3.h> 26 #include <core/LoopMacros.h> 29 #define COMPUTE_fullRefIndices \ 30 vector3<int> iv(iG), ivRef; \ 31 for(int k=0; k<3; k++) \ 32 { if(iv[k]<0) iv[k] += S[k]; \ 33 ivRef[k] = iv[k] ? S[k] - iv[k] : 0; \ 35 int iFull = iv[2] + S[2]*(iv[1] + S[1]*iv[0]); \ 36 int iFullRef = ivRef[2] + S[2]*(ivRef[1] + S[1]*ivRef[0]); 43 COMPUTE_fullRefIndices
44 vHalf[iHalf] = scaleFac*0.5*(vFull[iFull] + vFull[iFullRef].conj());
51 COMPUTE_fullRefIndices
52 vHalf[iHalf] =
complex(0,-scaleFac*0.5)*(vFull[iFull] - vFull[iFullRef].conj());
59 COMPUTE_fullRefIndices
60 complex temp = scaleFac*vHalf[iHalf];
62 vFull[iFullRef] = temp.conj();
68 #define COMPUTE_index(suffix) \ 70 for(int k=0; k<2; k++) \ 71 { if(2*iG[k]<1-S##suffix[k] || 2*iG[k]>S##suffix[k]) return; \ 72 i##suffix = i##suffix * S##suffix[k] + (iG[k]<0 ? (iG[k]+S##suffix[k]) : iG[k]); \ 74 if(2*iG[2]>S##suffix[2]) return; \ 75 else i##suffix = i##suffix*(1+S##suffix[2]/2) + iG[2]; 84 #define COMPUTE_index(suffix) \ 86 for(int k=0; k<3; k++) \ 87 { if(2*iG[k]<1-S##suffix[k] || 2*iG[k]>S##suffix[k]) return; \ 88 i##suffix = i##suffix * S##suffix[k] + (iG[k]<0 ? (iG[k]+S##suffix[k]) : iG[k]); \ 98 {
complex iota(0.0, nyq ? 0.0 : 1.0);
99 storeVector((iG*G) * (iota*Xtilde[i]), gradTilde, i);
104 {
complex iota(0.0, nyq ? 0.0 : 1.0);
114 double Gsq = Gvec.length_squared();
115 gradTilde.xy()[i] = minus_Xtilde*Gvec.x()*Gvec.y();
116 gradTilde.yz()[i] = minus_Xtilde*Gvec.y()*Gvec.z();
117 gradTilde.zx()[i] = minus_Xtilde*Gvec.z()*Gvec.x();
118 gradTilde.
xxr()[i] = minus_Xtilde*(Gvec.x()*Gvec.x() - (1.0/3)*Gsq);
119 gradTilde.
yyr()[i] = minus_Xtilde*(Gvec.y()*Gvec.y() - (1.0/3)*Gsq);
125 complex temp = complex(0,0);
128 temp += Vtilde.xy()[i]*( 2*Gvec.x()*Gvec.y() );
129 temp += Vtilde.yz()[i]*( 2*Gvec.y()*Gvec.z() );
130 temp += Vtilde.zx()[i]*( 2*Gvec.z()*Gvec.x() );
131 temp += Vtilde.
xxr()[i]*( Gvec.x()*Gvec.x() - Gvec.z()*Gvec.z() );
132 temp += Vtilde.
yyr()[i]*( Gvec.y()*Gvec.y() - Gvec.z()*Gvec.z() );
138 #endif //JDFTX_CORE_OPERATORS_INTERNAL_H
complex dot(const Tptr &X, const Tptr &Y)
Definition: Operators.h:196
__hostanddev__ scalar & xxr()
xxr = x^2 - r^2/3
Definition: tensor3.h:42
__hostanddev__ void storeVector(const vector3< scalar > &v, vector3< scalar * > &vArr, int i)
Store vector to a vector field.
Definition: vector3.h:171
__hostanddev__ scalar & yyr()
yyr = y^2-r^2/3
Definition: tensor3.h:43
Symmetric traceless rank-2 tensor in 3D.
Definition: tensor3.h:32
__hostanddev__ vector3< scalar > loadVector(const vector3< const scalar * > &vArr, int i)
Load vector from a constant vector field.
Definition: vector3.h:163
Complex number (need to define our own because we need operators for gpu code as well) ...
Definition: scalar.h:49