diff --git a/src/QMCWaveFunctions/EinsplineSet.cpp b/src/QMCWaveFunctions/EinsplineSet.cpp index b0cd052d3..f1e3f1df1 100644 --- a/src/QMCWaveFunctions/EinsplineSet.cpp +++ b/src/QMCWaveFunctions/EinsplineSet.cpp @@ -288,11 +288,6 @@ namespace qmcplusplus { EinsplineSetExtended::setOrbitalSetSize(int norbs) { OrbitalSetSize = norbs; - eikr.resize(norbs); - phase.resize(norbs); - StorageValueVector.resize(norbs); - StorageGradVector.resize(norbs); - StorageHessVector.resize(norbs); } template void @@ -304,14 +299,23 @@ namespace qmcplusplus { for (int i=0; i e_mikr (c,s); - convert (e_mikr*StorageValueVector[i], psi[i]); + complex psi_val = e_mikr*StorageValueVector[i]; + psi[psiIndex] = real(psi_val); + psiIndex++; + if (MakeTwoCopies[i]) { + psi[psiIndex] = imag(psi_val); + psiIndex++; + } + //convert (e_mikr*StorageValueVector[i], psi[i]); } } @@ -325,7 +329,7 @@ namespace qmcplusplus { for (int i=0; i eye (0.0, 1.0); for (int j=0; j u, laplu; @@ -397,7 +401,7 @@ namespace qmcplusplus { ru[i] -= std::floor (ru[i]); EinsplineMultiEval (MultiSpline, ru, StorageValueVector, StorageGradVector, StorageHessVector); - computePhaseFactors(r); + //computePhaseFactors(r); complex eye (0.0, 1.0); for (int j=0; j u, laplu; @@ -451,9 +455,11 @@ namespace qmcplusplus { ru[n] -= std::floor (ru[n]); EinsplineMultiEval (MultiSpline, ru, StorageValueVector, StorageGradVector, StorageHessVector); - computePhaseFactors(r); + //computePhaseFactors(r); complex eye (0.0, 1.0); - for (int j=0; j u, laplu; TinyVector, OHMMS_DIM> gradu; u = StorageValueVector[j]; @@ -467,14 +473,35 @@ namespace qmcplusplus { double phase = -dot(r, k); sincos (phase, &s, &c); complex e_mikr (c,s); - psi(j,i) = real(e_mikr*u); + + complex psi_val = e_mikr*u; + TinyVector,OHMMS_DIM> psi_grad = + e_mikr*(-eye*u*ck + gradu); + complex psi_lapl = e_mikr*(-dot(k,k)*u - 2.0*eye*dot(ck,gradu) + laplu); + + psi(psiIndex,i) = real(psi_val); for (int n=0; n<3; n++) - dpsi(i,j) = real(e_mikr*(-eye*u*ck + gradu)); - d2psi(i,j) = real(e_mikr*(-dot(k,k)*u - 2.0*eye*dot(ck,gradu) + laplu)); + dpsi(i,psiIndex)[n] = real(psi_grad[n]); + d2psi(i,psiIndex) = real(psi_lapl); + psiIndex++; + + if (MakeTwoCopies[j]) { + psi(psiIndex,i) = imag(psi_val); + for (int n=0; n<3; n++) + dpsi(i,psiIndex)[n] = imag(psi_grad[n]); + d2psi(i,psiIndex) = imag(psi_lapl); + psiIndex++; + } + + // psi(j,i) = real(e_mikr*u); + // for (int n=0; n<3; n++) + // dpsi(i,j)[n] = real(e_mikr*(-eye*u*ck + gradu)); + // d2psi(i,j) = real(e_mikr*(-dot(k,k)*u - 2.0*eye*dot(ck,gradu) + laplu)); //convert(e_mikr * u, psi(j,i)); //convertVec(e_mikr*(-eye*u*ck + gradu), dpsi(i,j)); //convert(e_mikr*(-dot(k,k)*u - 2.0*eye*dot(ck,gradu) + laplu), d2psi(i,j)); } + //cerr << "VGH psiIndex = " << psiIndex << endl; } } @@ -492,7 +519,7 @@ namespace qmcplusplus { ru[n] -= std::floor (ru[n]); EinsplineMultiEval (MultiSpline, ru, StorageValueVector, StorageGradVector, StorageHessVector); - computePhaseFactors(r); + //computePhaseFactors(r); complex eye (0.0, 1.0); for (int j=0; j u, laplu; diff --git a/src/QMCWaveFunctions/EinsplineSet.h b/src/QMCWaveFunctions/EinsplineSet.h index bf659fff7..0b426e92e 100644 --- a/src/QMCWaveFunctions/EinsplineSet.h +++ b/src/QMCWaveFunctions/EinsplineSet.h @@ -179,7 +179,7 @@ namespace qmcplusplus { StorageGradVector_t StorageGradVector; StorageHessVector_t StorageHessVector; // True if we should unpack this orbital into two copies - Vector MakeTwoCopies; + vector MakeTwoCopies; // k-points for each orbital Vector > kPoints; @@ -221,12 +221,12 @@ namespace qmcplusplus { inline void EinsplineSetExtended::computePhaseFactors(TinyVector r) { #ifdef HAVE_MKL - for (int i=0; i(c,s); diff --git a/src/QMCWaveFunctions/EinsplineSetBuilder.cpp b/src/QMCWaveFunctions/EinsplineSetBuilder.cpp index 4138d2a58..270c6fdea 100644 --- a/src/QMCWaveFunctions/EinsplineSetBuilder.cpp +++ b/src/QMCWaveFunctions/EinsplineSetBuilder.cpp @@ -464,8 +464,10 @@ namespace qmcplusplus { for (int i=0; i copyTwists; // Now, find out which twists are distinct + DistinctTwists.clear(); +#ifndef QMC_COMPLEX + vector copyTwists; for (int i=0; igetOrbitalSetSize()) { + if (SortBands[orbIndex].MakeTwoCopies) + numOrbs += 2; + else + numOrbs++; + orbIndex++; + } + NumDistinctOrbitals = orbIndex; + cerr << "We will read " << NumDistinctOrbitals << " distinct orbitals.\n"; } @@ -749,13 +770,21 @@ namespace qmcplusplus { EinsplineSetBuilder::ReadBands (int spin, EinsplineSetExtended* orbitalSet) { - int N = orbitalSet->getOrbitalSetSize(); + //int N = orbitalSet->getOrbitalSetSize(); + int N = NumDistinctOrbitals; + orbitalSet->kPoints.resize(N); + orbitalSet->MakeTwoCopies.resize(N); + orbitalSet->StorageValueVector.resize(N); + orbitalSet->StorageGradVector.resize(N); + orbitalSet->StorageHessVector.resize(N); + orbitalSet->phase.resize(N); + orbitalSet->eikr.resize(N); // Read in k-points - orbitalSet->kPoints.resize(orbitalSet->getOrbitalSetSize()); for (int iorb=0; iorbkPoints[iorb] = orbitalSet->PrimLattice.k_cart(twist); + orbitalSet->MakeTwoCopies[iorb] = SortBands[iorb].MakeTwoCopies; } // First, check to see if we have already read this in @@ -876,13 +905,22 @@ namespace qmcplusplus { EinsplineSetBuilder::ReadBands (int spin, EinsplineSetExtended >* orbitalSet) { - int N = orbitalSet->getOrbitalSetSize(); + // int N = orbitalSet->getOrbitalSetSize(); + int N = NumDistinctOrbitals; + cerr << "NumDistinctOrbitals = " << N << endl; + orbitalSet->kPoints.resize(N); + orbitalSet->MakeTwoCopies.resize(N); + orbitalSet->StorageValueVector.resize(N); + orbitalSet->StorageGradVector.resize(N); + orbitalSet->StorageHessVector.resize(N); + orbitalSet->phase.resize(N); + orbitalSet->eikr.resize(N); // Read in k-points - orbitalSet->kPoints.resize(orbitalSet->getOrbitalSetSize()); for (int iorb=0; iorbkPoints[iorb] = orbitalSet->PrimLattice.k_cart(twist); + orbitalSet->MakeTwoCopies[iorb] = SortBands[iorb].MakeTwoCopies; } // First, check to see if we have already read this in diff --git a/src/QMCWaveFunctions/EinsplineSetBuilder.h b/src/QMCWaveFunctions/EinsplineSetBuilder.h index 51dce8f12..18a83135b 100644 --- a/src/QMCWaveFunctions/EinsplineSetBuilder.h +++ b/src/QMCWaveFunctions/EinsplineSetBuilder.h @@ -80,6 +80,9 @@ namespace qmcplusplus { struct BandInfo { int TwistIndex, BandIndex, Spin; double Energy; + // This is true if we should make distinct copies + // represeninting a +k, -k pair + bool MakeTwoCopies; inline bool operator<(BandInfo other) const { return Energy < other.Energy; } }; @@ -142,6 +145,7 @@ namespace qmcplusplus { // clone vector > UseTwists; vector IncludeTwists, DistinctTwists; + int NumDistinctOrbitals; // This is true if the corresponding twist in DistinctTwists should // should be used to generate two distinct orbitals from the real and // imaginary parts.