Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion python/pyabacus/src/py_diago_david.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ class PyDiagoDavid
const std::complex<double> *psi_in,
std::complex<double> *spsi_out,
const int nrow,
const int npw,
const int nbands
) {
syncmem_op()(this->ctx, this->ctx, spsi_out, psi_in, static_cast<size_t>(nbands * nrow));
Expand Down
8 changes: 4 additions & 4 deletions source/module_hsolver/diago_david.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ int DiagoDavid<T, Device>::diag_once(const HPsiFunc& hpsi_func,
else
{
// phm_in->sPsi(psi_in + m*ld_psi, &this->spsi[m * dim], dim, dim, 1);
spsi_func(psi_in + m*ld_psi,&this->spsi[m*dim],dim,dim,1);
spsi_func(psi_in + m*ld_psi,&this->spsi[m*dim],dim, 1);
}
}
// begin SchmidtOrth
Expand All @@ -223,7 +223,7 @@ int DiagoDavid<T, Device>::diag_once(const HPsiFunc& hpsi_func,
else
{
// phm_in->sPsi(basis + dim*m, &this->spsi[m * dim], dim, dim, 1);
spsi_func(basis + dim*m, &this->spsi[m * dim], dim, dim, 1);
spsi_func(basis + dim*m, &this->spsi[m * dim], dim, 1);
}
}

Expand Down Expand Up @@ -554,7 +554,7 @@ void DiagoDavid<T, Device>::cal_grad(const HPsiFunc& hpsi_func,
else
{
// phm_in->sPsi(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, dim, 1);
spsi_func(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, dim, 1);
spsi_func(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, 1);
}
}
// first nbase bands psi* dot notconv bands spsi to prepare lagrange_matrix
Expand Down Expand Up @@ -595,7 +595,7 @@ void DiagoDavid<T, Device>::cal_grad(const HPsiFunc& hpsi_func,
else
{
// phm_in->sPsi(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, dim, 1);
spsi_func(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, dim, 1);
spsi_func(basis + dim*(nbase + m), &spsi[(nbase + m) * dim], dim, 1);
}
}
// calculate H|psi> for not convergence bands
Expand Down
9 changes: 3 additions & 6 deletions source/module_hsolver/diago_david.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,10 @@ class DiagoDavid : public DiagH<T, Device>
*
* @param[in] X Pointer to the input blockvector.
* @param[out] SX Pointer to the output blockvector.
* @param[in] ld_spsi Leading dimension of spsi. Dimension of SX: nbands * nrow.
* @param[in] ld_psi Leading dimension of psi. Number of plane waves.
* @param[in] nbands Number of vectors.
*
* @note called like spsi(in, out, dim, dim, 1)
* @param[in] ld_psi Leading dimension of psi and spsi. Dimension of X&SX: ld * nvec.
* @param[in] nvec Number of vectors.
*/
using SPsiFunc = std::function<void(T*, T*, const int, const int, const int)>;
using SPsiFunc = std::function<void(T*, T*, const int, const int)>;

int diag(
const HPsiFunc& hpsi_func, // function void hpsi(T*, T*, const int, const int)
Expand Down
9 changes: 4 additions & 5 deletions source/module_hsolver/hsolver_pw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -511,17 +511,16 @@ void HSolverPW<T, Device>::hamiltSolvePsiK(hamilt::Hamilt<T, Device>* hm,
};

/// wrap spsi into lambda function, Matrix \times blockvector
/// spsi(X, SX, nrow, npw, nbands)
/// nrow is leading dimension of spsi, npw is leading dimension of psi, nbands is number of vecs
/// spsi(X, SX, ld, nvec)
/// ld is leading dimension of psi and spsi
auto spsi_func = [hm](const T* psi_in, T* spsi_out,
const int ld_spsi, // Leading dimension of spsi. Dimension of SX: nbands * nrow.
const int ld_psi, // Leading dimension of psi. Number of plane waves.
const int ld_psi, // Leading dimension of psi and spsi.
const int nvec // Number of vectors(bands)
){
ModuleBase::timer::tick("David", "spsi_func");
// sPsi determines S=I or not by PARAM.globalv.use_uspp inside
// sPsi(psi, spsi, nrow, npw, nbands)
hm->sPsi(psi_in, spsi_out, ld_spsi, ld_psi, nvec);
hm->sPsi(psi_in, spsi_out, ld_psi, ld_psi, nvec);
ModuleBase::timer::tick("David", "spsi_func");
};

Expand Down
24 changes: 15 additions & 9 deletions source/module_hsolver/test/diago_david_float_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,10 @@ void lapackEigen(int &npw, std::vector<std::complex<float>> &hm, float * e, bool
char tmp_c1 = 'V', tmp_c2 = 'U';
cheev_(&tmp_c1, &tmp_c2, &npw, tmp.data(), &npw, e, work2, &lwork, rwork, &info);
end = clock();
if(info) std::cout << "ERROR: Lapack solver, info=" << info <<std::endl;
if (outtime) std::cout<<"Lapack Run time: "<<(float)(end - start) / CLOCKS_PER_SEC<<" S"<<std::endl;
if(info) { std::cout << "ERROR: Lapack solver, info=" << info <<std::endl;
}
if (outtime) { std::cout<<"Lapack Run time: "<<(float)(end - start) / CLOCKS_PER_SEC<<" S"<<std::endl;
}

delete [] rwork;
delete [] work2;
Expand All @@ -74,7 +76,8 @@ class DiagoDavPrepare
//calculate eigenvalues by LAPACK;
float* e_lapack = new float[npw];
float* ev;
if(mypnum == 0) lapackEigen(npw, DIAGOTEST::hmatrix_f, e_lapack,DETAILINFO);
if(mypnum == 0) { lapackEigen(npw, DIAGOTEST::hmatrix_f, e_lapack,DETAILINFO);
}

//do Diago_David::diag()
float* en = new float[npw];
Expand Down Expand Up @@ -111,13 +114,13 @@ class DiagoDavPrepare
const int ld_psi, const int nvec)
{
auto psi_iter_wrapper = psi::Psi<std::complex<float>>(psi_in, 1, nvec, ld_psi, nullptr);
psi::Range bands_range(1, 0, 0, nvec-1);
psi::Range bands_range(true, 0, 0, nvec-1);
using hpsi_info = typename hamilt::Operator<std::complex<float>>::hpsi_info;
hpsi_info info(&psi_iter_wrapper, bands_range, hpsi_out);
phm->ops->hPsi(info);
};
auto spsi_func = [phm](const std::complex<float>* psi_in, std::complex<float>* spsi_out,const int nrow, const int npw, const int nbands){
phm->sPsi(psi_in, spsi_out, nrow, npw, nbands);
auto spsi_func = [phm](const std::complex<float>* psi_in, std::complex<float>* spsi_out,const int ld_psi, const int nbands){
phm->sPsi(psi_in, spsi_out, ld_psi, ld_psi, nbands);
};
dav.diag(hpsi_func,spsi_func, ld_psi, phi.get_pointer(), en, eps, maxiter);

Expand All @@ -131,7 +134,8 @@ class DiagoDavPrepare

if(mypnum == 0)
{
if (DETAILINFO) std::cout<<"diag Run time: "<< use_time << std::endl;
if (DETAILINFO) { std::cout<<"diag Run time: "<< use_time << std::endl;
}
for(int i=0;i<nband;i++)
{
EXPECT_NEAR(en[i],e_lapack[i],CONVTHRESHOLD);
Expand All @@ -148,8 +152,9 @@ class DiagoDavTest : public ::testing::TestWithParam<DiagoDavPrepare> {};
TEST_P(DiagoDavTest,RandomHamilt)
{
DiagoDavPrepare ddp = GetParam();
if (DETAILINFO&&ddp.mypnum==0) std::cout << "npw=" << ddp.npw << ", nband=" << ddp.nband << ", sparsity="
if (DETAILINFO&&ddp.mypnum==0) { std::cout << "npw=" << ddp.npw << ", nband=" << ddp.nband << ", sparsity="
<< ddp.sparsity << ", eps=" << ddp.eps << std::endl;
}

HPsi<std::complex<float>> hpsi(ddp.nband, ddp.npw, ddp.sparsity);
DIAGOTEST::hmatrix_f = hpsi.hamilt();
Expand Down Expand Up @@ -236,7 +241,8 @@ int main(int argc, char **argv)

testing::InitGoogleTest(&argc, argv);
::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
if (myrank != 0) delete listeners.Release(listeners.default_result_printer());
if (myrank != 0) { delete listeners.Release(listeners.default_result_printer());
}

int result = RUN_ALL_TESTS();
if (myrank == 0 && result != 0)
Expand Down
4 changes: 2 additions & 2 deletions source/module_hsolver/test/diago_david_real_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ class DiagoDavPrepare
hpsi_info info(&psi_iter_wrapper, bands_range, hpsi_out);
phm->ops->hPsi(info);
};
auto spsi_func = [phm](const double* psi_in, double* spsi_out,const int nrow, const int npw, const int nbands){
phm->sPsi(psi_in, spsi_out, nrow, npw, nbands);
auto spsi_func = [phm](const double* psi_in, double* spsi_out,const int ld_psi, const int nbands){
phm->sPsi(psi_in, spsi_out, ld_psi, ld_psi, nbands);
};
dav.diag(hpsi_func,spsi_func, ld_psi, phi.get_pointer(), en, eps, maxiter);

Expand Down
4 changes: 2 additions & 2 deletions source/module_hsolver/test/diago_david_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ class DiagoDavPrepare
hpsi_info info(&psi_iter_wrapper, bands_range, hpsi_out);
phm->ops->hPsi(info);
};
auto spsi_func = [phm](const std::complex<double>* psi_in, std::complex<double>* spsi_out,const int nrow, const int npw, const int nbands){
phm->sPsi(psi_in, spsi_out, nrow, npw, nbands);
auto spsi_func = [phm](const std::complex<double>* psi_in, std::complex<double>* spsi_out,const int ld_psi, const int nbands){
phm->sPsi(psi_in, spsi_out, ld_psi, ld_psi, nbands);
};
dav.diag(hpsi_func,spsi_func, ld_psi, phi.get_pointer(), en, eps, maxiter);

Expand Down
2 changes: 1 addition & 1 deletion source/module_hsolver/test/hsolver_pw_sup.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ DiagoDavid<T, Device>::~DiagoDavid() {

template <typename T, typename Device>
int DiagoDavid<T, Device>::diag(const std::function<void(T*, T*, const int, const int)>& hpsi_func,
const std::function<void(T*, T*, const int, const int, const int)>& spsi_func,
const std::function<void(T*, T*, const int, const int)>& spsi_func,
const int ld_psi,
T *psi_in,
Real* eigenvalue_in,
Expand Down
5 changes: 3 additions & 2 deletions source/module_lr/hsolver_lrtd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ namespace LR
pHamilt->ops->hPsi(info);
};
auto spsi_func = [pHamilt](const T* psi_in, T* spsi_out,
const int nrow, const int npw, const int nbands){
const int ld_psi, const int nbands)
{
// sPsi determines S=I or not by PARAM.globalv.use_uspp inside
pHamilt->sPsi(psi_in, spsi_out, nrow, npw, nbands);
pHamilt->sPsi(psi_in, spsi_out, ld_psi, ld_psi, nbands);
};

const int& dim = psi_k1_dav.get_nbasis(); //equals to leading dimension here
Expand Down
Loading