@@ -68,24 +68,27 @@ void DiagoDavid::diag_mock(hamilt::Hamilt* phm_in, psi::Psi<std::complex<double>
6868 for (int m = 0 ; m < nband; m++)
6969 {
7070 // psi_m = psi(m)
71- for (int ig = 0 ; ig < dim; ig++)
71+ ModuleBase::GlobalFunc::COPYARRAY (&psi (m, 0 ), psi_m.data (), dim);
72+ /* for (int ig = 0; ig < dim; ig++)
7273 {
7374 psi_m[ig] = psi(m, ig);
74- }
75+ }*/
7576
7677 phm_in->sPsi (psi_m.data (), spsi.data (), (size_t )dim);
7778 this ->SchmitOrth (dim, nband, m, basis, psi_m.data (), spsi.data ());
7879 phm_in->sPsi (psi_m.data (), spsi.data (), (size_t )dim);
7980
8081 // basis(m) = psi_m, hp(m) = H |psi_m>, sp(m) = S |psi_m>
81- std::complex <double >* sp_p = &sp (m, 0 );
82+ ModuleBase::GlobalFunc::COPYARRAY (psi_m.data (), &basis (m, 0 ), dim);
83+ ModuleBase::GlobalFunc::COPYARRAY (spsi.data (), &sp (m, 0 ), dim);
84+ /* std::complex<double>* sp_p = &sp(m, 0);
8285 std::complex<double>* basis_p = &basis(m, 0);
8386 for (int ig = 0; ig < dim; ig++)
8487 {
8588 basis_p[ig] = psi_m[ig];
8689 //hp(m, ig) = hpsi[ig];
8790 sp_p[ig] = spsi[ig];
88- }
91+ }*/
8992 }
9093 hp_info dav_hpsi_in (&basis, psi::Range (1 , 0 , 0 , nband-1 ));
9194 auto hp_psi = std::get<0 >(phm_in->ops ->hPsi (dav_hpsi_in));
@@ -150,7 +153,22 @@ void DiagoDavid::diag_mock(hamilt::Hamilt* phm_in, psi::Psi<std::complex<double>
150153
151154 // updata eigenvectors of Hamiltonian
152155 ModuleBase::GlobalFunc::ZEROS (psi.get_pointer (), psi.get_nbands () * psi.get_nbasis ());
153- for (int m = 0 ; m < nband; m++)
156+ char transa = ' N' ;
157+ char transb = ' T' ;
158+ zgemm_ (&transa,
159+ &transb,
160+ &dim, // m: row of A,C
161+ &nband, // n: col of B,C
162+ &nbase, // k: col of A, row of B
163+ &ModuleBase::ONE, // alpha
164+ basis.get_pointer (), // A
165+ &basis.get_nbasis (), // LDA: if(N) max(1,m) if(T) max(1,k)
166+ vc.c , // B
167+ &nbase_x, // LDB: if(N) max(1,k) if(T) max(1,n)
168+ &ModuleBase::ZERO, // belta
169+ psi.get_pointer (), // C
170+ &psi.get_nbasis ()); // LDC: if(N) max(1, m)
171+ /* for (int m = 0; m < nband; m++)
154172 {
155173 for (int j = 0; j < nbase; j++)
156174 {
@@ -159,7 +177,7 @@ void DiagoDavid::diag_mock(hamilt::Hamilt* phm_in, psi::Psi<std::complex<double>
159177 psi(m, ig) += vc(j, m) * basis(j, ig);
160178 }
161179 }
162- }
180+ }*/
163181
164182 if (!this ->notconv || (dav_iter == DiagoIterAssist::PW_DIAG_NMAX))
165183 {
@@ -594,18 +612,31 @@ void DiagoDavid::SchmitOrth(const int &npw,
594612 std::complex <double > *lagrange = new std::complex <double >[m + 1 ];
595613 ModuleBase::GlobalFunc::ZEROS (lagrange, m + 1 );
596614
597- const int one = 1 ;
598- for (int j = 0 ; j < m; j++)
615+ int inc = 1 ;
616+ int mp = m;
617+ char trans = ' C' ;
618+ zgemv_ (&trans,
619+ &npw,
620+ &mp,
621+ &ModuleBase::ONE,
622+ psi.get_pointer (),
623+ &psi.get_nbasis (),
624+ spsi,
625+ &inc,
626+ &ModuleBase::ZERO,
627+ lagrange,
628+ &inc);
629+ /* for (int j = 0; j < m; j++)
599630 {
600631 const std::complex<double>* psi_p = &(psi(j, 0));
601632 zdotc_(&lagrange[j], &npw, psi_p, &one, spsi, &one);
602- /* for (int ig = 0; ig < npw; ig++)
633+ for (int ig = 0; ig < npw; ig++)
603634 {
604635 lagrange[j] += conj(psi(j, ig)) * spsi[ig];
605- }*/
636+ }
606637 // lagrange[j] = Diago_CG::ddot( npw, psi, j, spsi );
607- }
608- zdotc_ (&lagrange[m], &npw, psi_m, &one , spsi, &one );
638+ }*/
639+ zdotc_ (&lagrange[m], &npw, psi_m, &inc , spsi, &inc );
609640 /* for (int ig = 0; ig < npw; ig++)
610641 {
611642 lagrange[m] += conj(psi_m[ig]) * spsi[ig];
@@ -623,7 +654,7 @@ void DiagoDavid::SchmitOrth(const int &npw,
623654 for (int j = 0 ; j < m; j++)
624655 {
625656 const std::complex <double > alpha = -1 * lagrange[j];
626- zaxpy_ (&npw, &alpha, &psi (j,0 ), &one , psi_m, &one );
657+ zaxpy_ (&npw, &alpha, &psi (j,0 ), &inc , psi_m, &inc );
627658 /* for (int ig = 0; ig < npw; ig++)
628659 {
629660 psi_m[ig] -= lagrange[j] * psi(j, ig);
0 commit comments