@@ -78,12 +78,10 @@ void Gint_k::transfer_pvpR(hamilt::HContainer<std::complex<double>>* hR,
78
78
ModuleBase::TITLE (" Gint_k" , " transfer_pvpR" );
79
79
ModuleBase::timer::tick (" Gint_k" , " transfer_pvpR" );
80
80
81
- // this->hRGintCd->set_zero();
82
-
83
- #ifdef __MPI
84
81
int mg = hR->get_paraV ()->get_global_row_size ()/2 ;
85
82
int ng = hR->get_paraV ()->get_global_col_size ()/2 ;
86
83
int nb = hR->get_paraV ()->get_block_size ()/2 ;
84
+ #ifdef __MPI
87
85
int blacs_ctxt = hR->get_paraV ()->blacs_ctxt ;
88
86
int *iat2iwt = new int [ucell_in->nat ];
89
87
for (int iat = 0 ; iat < ucell_in->nat ; iat++) {
@@ -93,119 +91,64 @@ void Gint_k::transfer_pvpR(hamilt::HContainer<std::complex<double>>* hR,
93
91
pv->set (mg, ng, nb, blacs_ctxt);
94
92
pv->set_atomic_trace (iat2iwt, ucell_in->nat , mg);
95
93
auto ijr_info = hR->get_ijr_info ();
96
-
97
-
98
- hamilt::HContainer<double >* hR_tmp = new hamilt::HContainer<double >(pv, nullptr , &ijr_info);
99
- ModuleBase::Memory::record (" Gint::hRGintCd" , hR_tmp->get_memory_size ());
100
- // std::cout<<"test1"<<std::endl;
101
-
102
- // std::cout<<hRGint_tmp[0]->size_atom_pairs()<<std::endl;
103
- // std::cout<<hR_tmp->size_atom_pairs()<<std::endl;
104
- // for(int i =0; i < hRGint_tmp[0]->size_atom_pairs(); i++){
105
- // std::cout<<"hRGint_tmp"<<hRGint_tmp[0]->get_atom_pair(i).get_row_size()<<' '<<hRGint_tmp[0]->get_atom_pair(i).get_row_size()<<std::endl;
106
- // std::cout<<"hR_tmp"<<hR_tmp->get_atom_pair(i).get_row_size()<<' '<<hR_tmp->get_atom_pair(i).get_row_size()<<std::endl;
107
- // std::cout<<"pv1:" << pv->get_indexes_col(0).size()<< ' '<<pv->get_indexes_row(0).size()<<std::endl;
108
- // std::cout<<"pv2:" << pv->get_indexes_col().size()<< ' '<<pv->get_indexes_row().size()<<std::endl;
109
- // }
110
-
111
94
95
+ this ->hR_tmp = new hamilt::HContainer<std::complex<double >>(pv, nullptr , &ijr_info);
96
+ ModuleBase::Memory::record (" Gint::hRGintCd" , this ->hR_tmp ->get_memory_size ());
112
97
98
+ // 0,3;1,2;1,2;0,3
99
+ std::vector<int > first = {0 , 1 , 1 , 0 };
100
+ std::vector<int > second= {3 , 2 , 2 , 3 };
113
101
for (int is = 0 ; is < 4 ; is++){
114
- hR_tmp->set_zero ();
115
- // std::cout<<"is: "<<is<<std::endl;
116
- hamilt::transferSerials2Parallels ( *(this ->hRGint_tmp [is]), hR_tmp);
117
- for (int iap = 0 ; iap < hR->size_atom_pairs (); iap++)
102
+ this ->hR_tmp ->set_zero ();
103
+ hamilt::HContainer<std::complex<double >>* hRGint_tmpCd = new hamilt::HContainer<std::complex<double >>(this ->ucell ->nat );
104
+ hRGint_tmpCd->insert_ijrs (this ->gridt ->get_ijr_info (), *(this ->ucell ));
105
+ hRGint_tmpCd->allocate (nullptr , true );
106
+ hRGint_tmpCd->set_zero ();
107
+ for (int iap = 0 ; iap < hRGint_tmpCd->size_atom_pairs (); iap++)
118
108
{
119
109
// std::cout<<"iap: "<<iap<<std::endl;
120
- auto * ap = &hR ->get_atom_pair (iap);
110
+ auto * ap = &hRGint_tmpCd ->get_atom_pair (iap);
121
111
const int iat1 = ap->get_atom_i ();
122
112
const int iat2 = ap->get_atom_j ();
123
- const hamilt::AtomPair<double >* ap_nspin = nullptr ;
124
113
if (iat1 <= iat2)
125
114
{
126
115
hamilt::AtomPair<std::complex<double >>* upper_ap = ap;
127
- hamilt::AtomPair<std::complex<double >>* lower_ap = hR->find_pair (iat2, iat1);
128
- switch (is)
129
- {
130
- case 0 :
131
- ap_nspin = hR_tmp->find_pair (iat1, iat2);
132
- break ;
133
- case 3 :
134
- ap_nspin = hR_tmp->find_pair (iat1, iat2);
135
- break ;
136
- }
137
- if (ap_nspin == nullptr ) break ;
138
- // const hamilt::AtomPair<double>* ap_nspin_0 = this->hR_tmp[0]->find_pair(iat1, iat2);
139
- // const hamilt::AtomPair<double>* ap_nspin_3 = this->hRGint_tmp[3]->find_pair(iat1, iat2);
116
+ hamilt::AtomPair<std::complex<double >>* lower_ap = hRGint_tmpCd->find_pair (iat2, iat1);
117
+ const hamilt::AtomPair<double >* ap_nspin1 = this ->hRGint_tmp [first[is]] ->find_pair (iat1, iat2);
118
+ const hamilt::AtomPair<double >* ap_nspin2 = this ->hRGint_tmp [second[is]] ->find_pair (iat1, iat2);
140
119
for (int ir = 0 ; ir < upper_ap->get_R_size (); ir++)
141
120
{
121
+ // std::cout<<"ir"<<ir<<std::endl;
142
122
const auto R_index = upper_ap->get_R_index (ir);
143
123
auto upper_mat = upper_ap->find_matrix (R_index);
144
- // auto mat_nspin_0 = ap_nspin_0->find_matrix(R_index);
145
- // auto mat_nspin_3 = ap_nspin_3->find_matrix(R_index);
146
- auto mat_nspin = ap_nspin->find_matrix (R_index);
147
-
124
+ auto mat_nspin1 = ap_nspin1->find_matrix (R_index);
125
+ auto mat_nspin2 = ap_nspin2->find_matrix (R_index);
148
126
// The row size and the col size of upper_matrix is double that of matrix_nspin_0
149
- for (int irow = 0 ; irow < mat_nspin ->get_row_size (); ++irow)
127
+ for (int irow = 0 ; irow < mat_nspin1 ->get_row_size (); ++irow)
150
128
{
151
- for (int icol = 0 ; icol < mat_nspin ->get_col_size (); ++icol)
129
+ for (int icol = 0 ; icol < mat_nspin1 ->get_col_size (); ++icol)
152
130
{
153
- // upper_mat->get_value(2*irow, 2*icol) = mat_nspin_0->get_value(irow, icol) + mat_nspin_3->get_value(irow, icol);
154
- // upper_mat->get_value(2*irow+1, 2*icol+1) = mat_nspin_0->get_value(irow, icol) - mat_nspin_3->get_value(irow, icol);
155
131
switch (is)
156
132
{
157
133
case 0 :
158
- upper_mat->get_value (2 *irow, 2 *icol) = mat_nspin->get_value (irow, icol);
159
- upper_mat->get_value (2 *irow+1 , 2 *icol+1 ) = mat_nspin->get_value (irow, icol);
134
+ upper_mat->get_value (irow, icol) = mat_nspin1->get_value (irow, icol) + mat_nspin2->get_value (irow, icol);
135
+ break ;
136
+ case 1 :
137
+ upper_mat->get_value (irow, icol) = mat_nspin1->get_value (irow, icol) +
138
+ std::complex<double >(0.0 , 1.0 ) * mat_nspin2->get_value (irow, icol);
139
+ break ;
140
+ case 2 :
141
+ upper_mat->get_value (irow, icol) = mat_nspin1->get_value (irow, icol) -
142
+ std::complex<double >(0.0 , 1.0 ) * mat_nspin2->get_value (irow, icol);
160
143
break ;
161
144
case 3 :
162
- upper_mat->get_value (2 *irow, 2 *icol) += mat_nspin->get_value (irow, icol);
163
- upper_mat->get_value (2 *irow+1 , 2 *icol+1 ) -= mat_nspin->get_value (irow, icol);
145
+ upper_mat->get_value (irow, icol) = mat_nspin1->get_value (irow, icol) - mat_nspin2->get_value (irow, icol);
164
146
break ;
165
147
}
166
148
}
167
149
}
168
-
169
- if (PARAM.globalv .domag )
170
- {
171
- const hamilt::AtomPair<double >* ap_nspin = nullptr ;
172
- switch (is)
173
- {
174
- case 1 :
175
- ap_nspin = hR_tmp->find_pair (iat1, iat2);
176
- break ;
177
- case 2 :
178
- ap_nspin = hR_tmp->find_pair (iat1, iat2);
179
- break ;
180
- }
181
- // const hamilt::AtomPair<double>* ap_nspin_1 = this->hRGint_tmp[1]->find_pair(iat1, iat2);
182
- // const hamilt::AtomPair<double>* ap_nspin_2 = this->hRGint_tmp[2]->find_pair(iat1, iat2);
183
- // const auto mat_nspin_1 = ap_nspin_1->find_matrix(R_index);
184
- // const auto mat_nspin_2 = ap_nspin_2->find_matrix(R_index);
185
- const auto mat_nspin = ap_nspin->find_matrix (R_index);
186
- for (int irow = 0 ; irow < mat_nspin->get_row_size (); ++irow)
187
- {
188
- for (int icol = 0 ; icol < mat_nspin->get_col_size (); ++icol)
189
- {
190
- switch (is)
191
- {
192
- case 1 :
193
- upper_mat->get_value (2 *irow, 2 *icol+1 ) = mat_nspin->get_value (irow, icol);
194
- upper_mat->get_value (2 *irow+1 , 2 *icol) = mat_nspin->get_value (irow, icol);
195
- break ;
196
- case 2 :
197
- upper_mat->get_value (2 *irow, 2 *icol+1 ) += std::complex<double >(0.0 , 1.0 ) * mat_nspin->get_value (irow, icol);
198
- upper_mat->get_value (2 *irow+1 , 2 *icol) -= std::complex<double >(0.0 , 1.0 ) * mat_nspin->get_value (irow, icol);
199
- break ;
200
- }
201
- // upper_mat->get_value(2*irow, 2*icol+1) = mat_nspin->get_value(irow, icol) + std::complex<double>(0.0, 1.0) * mat_nspin_2->get_value(irow, icol);
202
- // upper_mat->get_value(2*irow+1, 2*icol) = mat_nspin->get_value(irow, icol) - std::complex<double>(0.0, 1.0) * mat_nspin_2->get_value(irow, icol);
203
- }
204
- }
205
- }
206
-
207
- // fill the lower triangle matrix
208
- if (is == 3 ){
150
+ // fill the lower triangle matrix
151
+ if (PARAM.globalv .domag ){
209
152
if (iat1 < iat2)
210
153
{
211
154
auto lower_mat = lower_ap->find_matrix (-R_index);
@@ -218,15 +161,52 @@ void Gint_k::transfer_pvpR(hamilt::HContainer<std::complex<double>>* hR,
218
161
}
219
162
}
220
163
}
221
- // std::cout<<"end"<<std::endl;
222
164
}
223
165
}
224
166
}
225
-
167
+
168
+ // std::cout<<"success"<<std::endl;
169
+
170
+ hamilt::transferSerials2Parallels ( *hRGint_tmpCd, this ->hR_tmp );
171
+ for (int iap = 0 ; iap < hR->size_atom_pairs (); iap++)
172
+ {
173
+ // std::cout<<"iap: "<<iap<<std::endl;
174
+ auto * ap = &hR->get_atom_pair (iap);
175
+ const int iat1 = ap->get_atom_i ();
176
+ const int iat2 = ap->get_atom_j ();
177
+ auto * ap_nspin = this ->hR_tmp ->find_pair (iat1, iat2);
178
+ for (int ir = 0 ; ir < ap->get_R_size (); ir++)
179
+ {
180
+ const auto R_index = ap->get_R_index (ir);
181
+ auto upper_mat = ap->find_matrix (R_index);
182
+ auto mat_nspin = ap_nspin->find_matrix (R_index);
183
+
184
+ // The row size and the col size of upper_matrix is double that of matrix_nspin_0
185
+ for (int irow = 0 ; irow < mat_nspin->get_row_size (); ++irow)
186
+ {
187
+ for (int icol = 0 ; icol < mat_nspin->get_col_size (); ++icol)
188
+ {
189
+ switch (is)
190
+ {
191
+ case 0 :
192
+ upper_mat->get_value (2 *irow, 2 *icol) += mat_nspin->get_value (irow, icol);
193
+ break ;
194
+ case 1 :
195
+ upper_mat->get_value (2 *irow, 2 *icol+1 ) += mat_nspin->get_value (irow, icol);
196
+ break ;
197
+ case 2 :
198
+ upper_mat->get_value (2 *irow+1 , 2 *icol) += mat_nspin->get_value (irow, icol);
199
+ break ;
200
+ case 3 :
201
+ upper_mat->get_value (2 *irow+1 , 2 *icol+1 ) += mat_nspin->get_value (irow, icol);
202
+ break ;
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }
226
208
}
227
209
delete[] iat2iwt;
228
- delete pv;
229
- delete hR_tmp;
230
210
#else
231
211
232
212
#endif
@@ -246,7 +226,7 @@ void Gint_k::transfer_pvpR(hamilt::HContainer<std::complex<double>>* hR,
246
226
// hamilt::transferSerials2Parallels<std::complex<double>>(*this->hRGintCd, hR);
247
227
// }
248
228
// #else
249
- // hR->add(*this->hRGintCd);
229
+ // hR->add(*this->hRGintCd);
250
230
// #endif
251
231
ModuleBase::timer::tick (" Gint_k" , " transfer_pvpR" );
252
232
return ;
0 commit comments