22// This file is distributed under the University of Illinois/NCSA Open Source License.
33// See LICENSE file in top directory for details.
44//
5- // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
5+ // Copyright (c) 2020 QMCPACK developers.
66//
77// File developed by: Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
88// Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
@@ -78,8 +78,8 @@ void EwaldHandler::fillFk(KContainer& KList)
7878 else
7979 {
8080#if OHMMS_DIM == 2
81- mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
82- mRealType knorm = 2 * M_PI / Volume;
81+ mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
82+ mRealType knorm = 2 * M_PI / Volume;
8383 for (int ks = 0 , ki = 0 ; ks < Fk_symm.size (); ks++)
8484 {
8585 mRealType t2e = KList.ksq [ki] * kgauss;
@@ -90,8 +90,8 @@ void EwaldHandler::fillFk(KContainer& KList)
9090 }
9191 PreFactors[3 ] = 0.0 ;
9292#elif OHMMS_DIM == 3
93- mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
94- mRealType knorm = 4 * M_PI / Volume;
93+ mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
94+ mRealType knorm = 4 * M_PI / Volume;
9595 for (int ks = 0 , ki = 0 ; ks < Fk_symm.size (); ks++)
9696 {
9797 mRealType t2e = KList.ksq [ki] * kgauss;
@@ -100,27 +100,51 @@ void EwaldHandler::fillFk(KContainer& KList)
100100 while (ki < KList.kshell [ks + 1 ] && ki < Fk.size ())
101101 Fk[ki++] = uk;
102102 }
103- PreFactors[3 ] = 0.0 ;
103+ PreFactors[3 ] = 0.0 ;
104104#endif
105105 }
106106 app_log ().flush ();
107107}
108108
109- EwaldHandler::mRealType EwaldHandler::evaluate_slab (mRealType z,
110- const std::vector<int >& kshell,
111- const pComplexType* restrict eikr_i,
112- const pComplexType* restrict eikr_j)
109+ EwaldHandler::mRealType EwaldHandler::evaluate_vlr_k (mRealType k)
113110{
114- mRealType zp = z * Sigma;
115- mRealType vk = -SlabFunc0 (z, zp);
116- // cout << "### SLAB " << z << " " << zp << std::endl;
117- for (int ks = 0 , ki = 0 ; ks < MaxKshell; ks++)
111+ mRealType uk = 0.0 ;
112+ if (SuperCellEnum == SUPERCELL_SLAB )
118113 {
119- mRealType u = 0 ; // \sum Real (e^ikr_i e^(-ikr_j))
120- for (; ki < kshell[ks + 1 ]; ki++, eikr_i++, eikr_j++)
121- u += ((*eikr_i).real () * (*eikr_j).real () + (*eikr_i).imag () * (*eikr_j).imag ());
122- vk += u * Fk_symm[ks] * SlabFuncK (ks, z, zp);
114+ mRealType knorm = M_PI / Area;
115+ uk = knorm / k; // pi/(A*k)
116+ }
117+ else
118+ {
119+ #if OHMMS_DIM == 2
120+ mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
121+ mRealType knorm = 2 * M_PI / Volume;
122+ mRealType k2 = k * k;
123+ uk = knorm * std::exp (-k2 * kgauss) / k2;
124+ #elif OHMMS_DIM == 3
125+ mRealType kgauss = 1.0 / (4 * Sigma * Sigma);
126+ mRealType knorm = 4 * M_PI / Volume;
127+ mRealType k2 = k * k;
128+ uk = knorm * std::exp (-k2 * kgauss) / k2;
129+ }
130+ #endif
131+ return uk;
132+ }
133+
134+ EwaldHandler::mRealType EwaldHandler::evaluate_slab (mRealType z, const std::vector<int >& kshell,
135+ const pComplexType* restrict eikr_i,
136+ const pComplexType* restrict eikr_j)
137+ {
138+ mRealType zp = z * Sigma;
139+ mRealType vk = -SlabFunc0 (z, zp);
140+ // cout << "### SLAB " << z << " " << zp << std::endl;
141+ for (int ks = 0 , ki = 0 ; ks < MaxKshell; ks++)
142+ {
143+ mRealType u = 0 ; // \sum Real (e^ikr_i e^(-ikr_j))
144+ for (; ki < kshell[ks + 1 ]; ki++, eikr_i++, eikr_j++)
145+ u += ((*eikr_i).real () * (*eikr_j).real () + (*eikr_i).imag () * (*eikr_j).imag ());
146+ vk += u * Fk_symm[ks] * SlabFuncK (ks, z, zp);
147+ }
148+ return vk;
123149 }
124- return vk;
125- }
126150} // namespace qmcplusplus
0 commit comments