Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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 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
4 changes: 2 additions & 2 deletions source/module_lr/hsolver_lrtd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ 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 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