@@ -201,6 +201,63 @@ TEST_F(ChargeMpiTest, rho_mpi)
201201 charge->rho_mpi ();
202202}
203203
204+ TEST_F (ChargeMpiTest, kin_r_mpi)
205+ {
206+ if (GlobalV::NPROC >= 2 && GlobalV::NPROC % 2 == 0 )
207+ {
208+ const bool ked_flag_old = XC_Functional::ked_flag;
209+ XC_Functional::ked_flag = true ;
210+ PARAM .input .nspin = 1 ;
211+ PARAM .input .bndpar = 1 ;
212+ GlobalV::KPAR = 2 ;
213+
214+ Parallel_Global::divide_pools (GlobalV::NPROC ,
215+ GlobalV::MY_RANK ,
216+ PARAM .input .bndpar ,
217+ GlobalV::KPAR ,
218+ GlobalV::NPROC_IN_BNDGROUP ,
219+ GlobalV::RANK_IN_BPGROUP ,
220+ GlobalV::MY_BNDGROUP ,
221+ GlobalV::NPROC_IN_POOL ,
222+ GlobalV::RANK_IN_POOL ,
223+ GlobalV::MY_POOL );
224+ ModulePW::PW_Basis* rhopw = new ModulePW::PW_Basis ();
225+ rhopw->initmpi (GlobalV::NPROC_IN_POOL , GlobalV::RANK_IN_POOL , POOL_WORLD );
226+ rhopw->initgrids (lat0, latvec, 40 );
227+ rhopw->initparameters (false , 10 );
228+ rhopw->setuptransform ();
229+ charge->rhopw = rhopw;
230+
231+ const int nz = rhopw->nz ;
232+ const int nrxx = rhopw->nrxx ;
233+ const int nxy = rhopw->nxy ;
234+ const int nplane = rhopw->nplane ;
235+ charge->nrxx = nrxx;
236+ charge->kin_r = new double *[1 ];
237+ charge->kin_r [0 ] = new double [nrxx];
238+
239+ for (int ir = 0 ; ir < nxy; ++ir)
240+ {
241+ for (int iz = 0 ; iz < nplane; ++iz)
242+ {
243+ charge->kin_r [0 ][nplane * ir + iz]
244+ = (rhopw->startz_current + iz + ir * nz) / double (nxy * nz);
245+ }
246+ }
247+ const double refsum = sum_array (charge->kin_r [0 ], nrxx);
248+
249+ charge->init_chgmpi ();
250+ charge->kin_r_mpi ();
251+ const double sum = sum_array (charge->kin_r [0 ], nrxx);
252+ EXPECT_EQ (sum, refsum * GlobalV::KPAR );
253+
254+ delete[] charge->kin_r [0 ];
255+ delete[] charge->kin_r ;
256+ delete rhopw;
257+ XC_Functional::ked_flag = ked_flag_old;
258+ }
259+ }
260+
204261int main (int argc, char ** argv)
205262{
206263 MPI_Init (&argc, &argv);
0 commit comments