@@ -204,50 +204,44 @@ void Force_Stress_LCAO<T>::getForceStress(UnitCell& ucell,
204204 nullptr , kv.kvec_d , nullptr , &ucell, orb.cutoffs (), &gd,
205205 two_center_bundle.overlap_orb_beta .get ());
206206 tmp_nonlocal.cal_force_stress (isforce, isstress, dmR, fvnl_dbeta, svnl_dbeta);
207+
208+ // Switch back to spin channel 0
209+ if (PARAM .inp .nspin == 2 )
210+ {
211+ dmat.dm ->switch_dmr (0 );
212+ }
207213
208214 // Calculate local potential force/stress (vl_dphi)
209215 // This uses grid integration, not operator-based method
210216 flk.ParaV = dmat.dm ->get_paraV_pointer ();
211217 PulayForceStress::cal_pulay_fs (fvl_dphi, svl_dphi, *dmat.dm , ucell, pelec->pot ,
212218 isforce, isstress, false /* reset dm to gint*/ );
213-
214- // Switch back to spin channel 0
215- if (PARAM .inp .nspin == 2 )
216- {
217- dmat.dm ->switch_dmr (0 );
218- }
219219 }
220220 else if (PARAM .inp .nspin == 4 )
221221 {
222- // For nspin=4 (non-collinear), need complex DMR
223- // Create temporary complex DMR for DM
224- hamilt::HContainer<std::complex <double >> tmp_dmr (dmat.dm ->get_DMR_pointer (1 )->get_paraV ());
225- std::vector<int > ijrs = dmat.dm ->get_DMR_pointer (1 )->get_ijr_info ();
226- tmp_dmr.insert_ijrs (&ijrs);
227- tmp_dmr.allocate ();
228- dmat.dm ->cal_DMR_full (&tmp_dmr);
229-
230- // Create temporary complex DMR for EDM
231- hamilt::HContainer<std::complex <double >> tmp_edmr (edm.get_DMR_pointer (1 )->get_paraV ());
232- tmp_edmr.insert_ijrs (&ijrs);
233- tmp_edmr.allocate ();
234- edm.cal_DMR_full (&tmp_edmr);
235222
236223 // Calculate kinetic force/stress (uses DM)
237224 if (PARAM .inp .t_in_h )
238225 {
239226 hamilt::EkineticNew<hamilt::OperatorLCAO<std::complex <double >, std::complex <double >>> tmp_ekinetic (
240227 nullptr , kv.kvec_d , nullptr , &ucell, orb.cutoffs (), &gd,
241228 two_center_bundle.kinetic_orb .get ());
242- tmp_ekinetic.cal_force_stress (isforce, isstress, &tmp_dmr , ftvnl_dphi, stvnl_dphi);
229+ tmp_ekinetic.cal_force_stress (isforce, isstress, dmat. dm -> get_DMR_pointer ( 1 ) , ftvnl_dphi, stvnl_dphi);
243230 }
244231
245232 // Calculate overlap force/stress (uses EDM)
246233 hamilt::OverlapNew<hamilt::OperatorLCAO<std::complex <double >, std::complex <double >>> tmp_overlap (
247234 nullptr , kv.kvec_d , nullptr , nullptr , &ucell, orb.cutoffs (), &gd,
248235 two_center_bundle.overlap_orb .get ());
249- tmp_overlap.cal_force_stress (isforce, isstress, &tmp_edmr , foverlap, soverlap);
236+ tmp_overlap.cal_force_stress (isforce, isstress, edm. get_DMR_pointer ( 1 ) , foverlap, soverlap);
250237
238+ // For nspin=4 (non-collinear), need complex DMR
239+ // Create temporary complex DMR for DM
240+ hamilt::HContainer<std::complex <double >> tmp_dmr (dmat.dm ->get_DMR_pointer (1 )->get_paraV ());
241+ std::vector<int > ijrs = dmat.dm ->get_DMR_pointer (1 )->get_ijr_info ();
242+ tmp_dmr.insert_ijrs (&ijrs);
243+ tmp_dmr.allocate ();
244+ dmat.dm ->cal_DMR_full (&tmp_dmr);
251245 // Calculate nonlocal force/stress (uses DM)
252246 hamilt::NonlocalNew<hamilt::OperatorLCAO<std::complex <double >, std::complex <double >>> tmp_nonlocal (
253247 nullptr , kv.kvec_d , nullptr , &ucell, orb.cutoffs (), &gd,
@@ -263,18 +257,12 @@ void Force_Stress_LCAO<T>::getForceStress(UnitCell& ucell,
263257 // MPI reduction for forces
264258 if (isforce)
265259 {
266- Parallel_Reduce::reduce_pool (foverlap.c , foverlap.nr * foverlap.nc );
267- Parallel_Reduce::reduce_pool (ftvnl_dphi.c , ftvnl_dphi.nr * ftvnl_dphi.nc );
268- Parallel_Reduce::reduce_pool (fvnl_dbeta.c , fvnl_dbeta.nr * fvnl_dbeta.nc );
269260 Parallel_Reduce::reduce_pool (fvl_dphi.c , fvl_dphi.nr * fvl_dphi.nc );
270261 }
271262
272263 // MPI reduction for stresses
273264 if (isstress)
274265 {
275- Parallel_Reduce::reduce_pool (soverlap.c , soverlap.nr * soverlap.nc );
276- Parallel_Reduce::reduce_pool (stvnl_dphi.c , stvnl_dphi.nr * stvnl_dphi.nc );
277- Parallel_Reduce::reduce_pool (svnl_dbeta.c , svnl_dbeta.nr * svnl_dbeta.nc );
278266 Parallel_Reduce::reduce_pool (svl_dphi.c , svl_dphi.nr * svl_dphi.nc );
279267 }
280268
@@ -599,8 +587,8 @@ void Force_Stress_LCAO<T>::getForceStress(UnitCell& ucell,
599587 // -----------------------------
600588 // this->print_force("OVERLAP FORCE",foverlap,1,ry);
601589 ModuleIO::print_force (GlobalV::ofs_running, ucell, " OVERLAP FORCE" , foverlap, false );
602- // this-> print_force("TVNL_DPHI force",ftvnl_dphi,PARAM.inp.test_force );
603- // this-> print_force("VNL_DBETA force",fvnl_dbeta,PARAM.inp.test_force );
590+ ModuleIO:: print_force (GlobalV::ofs_running, ucell, " TVNL_DPHI force" ,ftvnl_dphi,false );
591+ ModuleIO:: print_force (GlobalV::ofs_running, ucell, " VNL_DBETA force" ,fvnl_dbeta,false );
604592 // this->print_force("T_VNL FORCE",ftvnl,1,ry);
605593 ModuleIO::print_force (GlobalV::ofs_running, ucell, " T_VNL FORCE" , ftvnl, false );
606594 ModuleIO::print_force (GlobalV::ofs_running, ucell, " VL_dPHI FORCE" , fvl_dphi, false );
0 commit comments