1414// / be calculated:
1515// / gdm_epsl = d/d\epsilon_{ab} *
1616// / sum_{mu,nu} rho_{mu,nu} <chi_mu|alpha_m><alpha_m'|chi_nu>
17- void LCAO_Deepks::cal_gdmx (const std::vector<double >& dm,
17+ template <typename TK>
18+ void LCAO_Deepks::cal_gdmx (const std::vector<std::vector<TK>>& dm,
1819 const UnitCell &ucell,
1920 const LCAO_Orbitals &orb,
2021 Grid_Driver& GridD,
22+ const int nks,
23+ const std::vector<ModuleBase::Vector3<double >>& kvec_d,
2124 const bool isstress)
2225{
2326 ModuleBase::TITLE (" LCAO_Deepks" , " cal_gdmx" );
@@ -70,6 +73,8 @@ void LCAO_Deepks::cal_gdmx(const std::vector<double>& dm,
7073 const int nw1_tot = atom1->nw *PARAM.globalv .npol ;
7174 const double Rcut_AO1 = orb.Phi [T1].getRcut ();
7275
76+ ModuleBase::Vector3<double > dR1 (GridD.getBox (ad1).x , GridD.getBox (ad1).y , GridD.getBox (ad1).z );
77+
7378 for (int ad2=0 ; ad2 < GridD.getAdjacentNum ()+1 ; ad2++)
7479 {
7580 const int T2 = GridD.getType (ad2);
@@ -79,6 +84,7 @@ void LCAO_Deepks::cal_gdmx(const std::vector<double>& dm,
7984 const ModuleBase::Vector3<double > tau2 = GridD.getAdjacentTau (ad2);
8085 const Atom* atom2 = &ucell.atoms [T2];
8186 const int nw2_tot = atom2->nw *PARAM.globalv .npol ;
87+ ModuleBase::Vector3<double > dR2 (GridD.getBox (ad2).x , GridD.getBox (ad2).y , GridD.getBox (ad2).z );
8288
8389 const double Rcut_AO2 = orb.Phi [T2].getRcut ();
8490 const double dist1 = (tau1-tau0).norm () * ucell.lat0 ;
@@ -104,25 +110,68 @@ void LCAO_Deepks::cal_gdmx(const std::vector<double>& dm,
104110 auto row_indexes = pv->get_indexes_row (ibt1);
105111 auto col_indexes = pv->get_indexes_col (ibt2);
106112 if (row_indexes.size () * col_indexes.size () == 0 ) continue ;
107-
108- hamilt::AtomPair< double > dm_pair (ibt1, ibt2, 0 , 0 , 0 , pv) ;
109- dm_pair. allocate ( nullptr , 1 ) ;
110- if ( ModuleBase::GlobalFunc::IS_COLUMN_MAJOR_KS_SOLVER (PARAM. inp . ks_solver ) )
113+
114+ double * dm_current ;
115+ int dRx, dRy, dRz ;
116+ if constexpr (std::is_same<TK, double >::value )
111117 {
112- dm_pair.add_from_matrix (dm.data (), pv->get_row_size (), 1.0 , 1 );
118+ dRx = 0 ;
119+ dRy = 0 ;
120+ dRz = 0 ;
113121 }
114122 else
115123 {
116- dm_pair.add_from_matrix (dm.data (), pv->get_col_size (), 1.0 , 0 );
124+ dRx = (dR2-dR1).x ;
125+ dRy = (dR2-dR1).y ;
126+ dRz = (dR2-dR1).z ;
117127 }
118- const double * dm_current = dm_pair.get_pointer ();
128+ hamilt::AtomPair<double > dm_pair (ibt1, ibt2, dRx, dRy, dRz, pv);
129+ dm_pair.allocate (nullptr , 1 );
130+ for (int ik=0 ;ik<nks;ik++)
131+ {
132+ TK kphase;
133+ if constexpr (std::is_same<TK, double >::value)
134+ {
135+ kphase = 1.0 ;
136+ }
137+ else
138+ {
139+ const double arg = - (kvec_d[ik] * (dR2-dR1) ) * ModuleBase::TWO_PI;
140+ double sinp, cosp;
141+ ModuleBase::libm::sincos (arg, &sinp, &cosp);
142+ kphase = TK (cosp, sinp);
143+ }
144+ if (ModuleBase::GlobalFunc::IS_COLUMN_MAJOR_KS_SOLVER (PARAM.inp .ks_solver ))
145+ {
146+ dm_pair.add_from_matrix (dm[ik].data (), pv->get_row_size (), kphase, 1 );
147+ }
148+ else
149+ {
150+ dm_pair.add_from_matrix (dm[ik].data (), pv->get_col_size (), kphase, 0 );
151+ }
152+ }
153+
154+ dm_current = dm_pair.get_pointer ();
119155
156+ key_tuple key_1 (ibt1,dR1.x ,dR1.y ,dR1.z );
157+ key_tuple key_2 (ibt2,dR2.x ,dR2.y ,dR2.z );
120158 for (int iw1=0 ; iw1<row_indexes.size (); ++iw1)
121159 {
122160 for (int iw2=0 ; iw2<col_indexes.size (); ++iw2)
123161 {
124- std::vector<double > nlm1 = this ->nlm_save [iat][ad1][row_indexes[iw1]][0 ];
125- std::vector<std::vector<double >> nlm2 = this ->nlm_save [iat][ad2][col_indexes[iw2]];
162+ std::vector<double > nlm1;
163+ std::vector<std::vector<double >> nlm2;
164+
165+ if constexpr (std::is_same<TK, double >::value)
166+ {
167+ nlm1 = this ->nlm_save [iat][ad1][row_indexes[iw1]][0 ];
168+ nlm2 = this ->nlm_save [iat][ad2][col_indexes[iw2]];
169+ }
170+ else
171+ {
172+ nlm1 = this ->nlm_save_k [iat][key_1][row_indexes[iw1]][0 ];
173+ nlm2 = this ->nlm_save_k [iat][key_2][col_indexes[iw2]];
174+ }
126175
127176 assert (nlm1.size ()==nlm2[0 ].size ());
128177
@@ -178,8 +227,16 @@ void LCAO_Deepks::cal_gdmx(const std::vector<double>& dm,
178227 assert (ib==nlm1.size ());
179228 if (isstress)
180229 {
181- nlm1 = this ->nlm_save [iat][ad2][col_indexes[iw2]][0 ];
182- nlm2 = this ->nlm_save [iat][ad1][row_indexes[iw1]];
230+ if constexpr (std::is_same<TK, double >::value)
231+ {
232+ nlm1 = this ->nlm_save [iat][ad2][col_indexes[iw2]][0 ];
233+ nlm2 = this ->nlm_save [iat][ad1][row_indexes[iw1]];
234+ }
235+ else
236+ {
237+ nlm1 = this ->nlm_save_k [iat][key_2][col_indexes[iw2]][0 ];
238+ nlm2 = this ->nlm_save_k [iat][key_1][row_indexes[iw1]];
239+ }
183240
184241 assert (nlm1.size ()==nlm2[0 ].size ());
185242 int ib=0 ;
@@ -278,4 +335,20 @@ void LCAO_Deepks::check_gdmx(const int nat)
278335 }
279336}
280337
338+ template void LCAO_Deepks::cal_gdmx<double >(const std::vector<std::vector<double >>& dm,
339+ const UnitCell &ucell,
340+ const LCAO_Orbitals &orb,
341+ Grid_Driver& GridD,
342+ const int nks,
343+ const std::vector<ModuleBase::Vector3<double >>& kvec_d,
344+ const bool isstress);
345+
346+ template void LCAO_Deepks::cal_gdmx<std::complex <double >>(const std::vector<std::vector<std::complex <double >>>& dm,
347+ const UnitCell &ucell,
348+ const LCAO_Orbitals &orb,
349+ Grid_Driver& GridD,
350+ const int nks,
351+ const std::vector<ModuleBase::Vector3<double >>& kvec_d,
352+ const bool isstress);
353+
281354#endif
0 commit comments