Skip to content

Update namespace ModuleGint #6169

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 25, 2025
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
308 changes: 264 additions & 44 deletions source/module_base/blas_connector.cpp

Large diffs are not rendered by default.

49 changes: 44 additions & 5 deletions source/module_base/blas_connector.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ extern "C"
void cgemv_(const char *trans, const int *m, const int *n, const std::complex<float> *alpha,
const std::complex<float> *a, const int *lda, const std::complex<float> *x, const int *incx,
const std::complex<float> *beta, std::complex<float> *y, const int *incy);

void zgemv_(const char *trans, const int *m, const int *n, const std::complex<double> *alpha,
const std::complex<double> *a, const int *lda, const std::complex<double> *x, const int *incx,
const std::complex<double> *beta, std::complex<double> *y, const int *incy);
Expand Down Expand Up @@ -180,11 +180,36 @@ class BlasConnector
// Peize Lin add 2017-10-27
// d=x*y
static
float dot( const int n, const float *X, const int incX, const float *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
float dot( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
double dot( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// d=x*y
static
float dotu( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
double dotu( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
std::complex<float> dotu( const int n, const std::complex<float>*const X, const int incX, const std::complex<float>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
std::complex<double> dotu( const int n, const std::complex<double>*const X, const int incX, const std::complex<double>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// d=x.conj()*y
static
float dotc( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
double dotc( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
double dot( const int n, const double *X, const int incX, const double *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
std::complex<float> dotc( const int n, const std::complex<float>*const X, const int incX, const std::complex<float>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
std::complex<double> dotc( const int n, const std::complex<double>*const X, const int incX, const std::complex<double>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// Peize Lin add 2017-10-27, fix bug trans 2019-01-17
// C = a * A.? * B.? + b * C
Expand Down Expand Up @@ -231,6 +256,9 @@ class BlasConnector
const std::complex<double> alpha, const std::complex<double> *a, const int lda, const std::complex<double> *b, const int ldb,
const std::complex<double> beta, std::complex<double> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// side=='L': C = a * A * B + b * C.
// side=='R': C = a * B * A + b * C.
// A == A^T
// Because you cannot pack symm or hemm into a row-major kernel by exchanging parameters, so only col-major functions are provided.
static
void symm_cm(const char side, const char uplo, const int m, const int n,
Expand All @@ -252,6 +280,19 @@ class BlasConnector
const std::complex<double> alpha, const std::complex<double> *a, const int lda, const std::complex<double> *b, const int ldb,
const std::complex<double> beta, std::complex<double> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// side=='L': C = a * A * B + b * C.
// side=='R': C = a * B * A + b * C.
// A == A^H
static
void hemm_cm(const char side, const char uplo, const int m, const int n,
const float alpha, const float *a, const int lda, const float *b, const int ldb,
const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
void hemm_cm(const char side, const char uplo, const int m, const int n,
const double alpha, const double *a, const int lda, const double *b, const int ldb,
const double beta, double *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

static
void hemm_cm(char side, char uplo, int m, int n,
std::complex<float> alpha, std::complex<float> *a, int lda, std::complex<float> *b, int ldb,
Expand All @@ -263,7 +304,6 @@ class BlasConnector
std::complex<double> beta, std::complex<double> *c, int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);

// y = A*x + beta*y

static
void gemv(const char trans, const int m, const int n,
const float alpha, const float* A, const int lda, const float* X, const int incx,
Expand All @@ -283,7 +323,6 @@ class BlasConnector
void gemv(const char trans, const int m, const int n,
const std::complex<double> alpha, const std::complex<double> *A, const int lda, const std::complex<double> *X, const int incx,
const std::complex<double> beta, std::complex<double> *Y, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);


// Peize Lin add 2018-06-12
// out = ||x||_2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,5 +203,6 @@ void GintAtom::set_phi_dphi(

// explicit instantiation
template void GintAtom::set_phi(const std::vector<Vec3d>& coords, const int stride, double* phi) const;
template void GintAtom::set_phi(const std::vector<Vec3d>& coords, const int stride, std::complex<double>* phi) const;
template void GintAtom::set_phi_dphi(const std::vector<Vec3d>& coords, const int stride, double* phi, double* dphi_x, double* dphi_y, double* dphi_z) const;
}
37 changes: 25 additions & 12 deletions source/module_hamilt_lcao/module_gint/temp_gint/gint_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ void compose_hr_gint(std::shared_ptr<HContainer<double>> hr_gint)
assert(upper_ap != nullptr);
#endif
for (int ir = 0; ir < ap.get_R_size(); ir++)
{
{
auto R_index = ap.get_R_index(ir);
auto upper_mat = upper_ap->find_matrix(-R_index);
auto lower_mat = lower_ap->find_matrix(R_index);
Expand All @@ -36,7 +36,7 @@ void compose_hr_gint(std::shared_ptr<HContainer<double>> hr_gint)
}
}
}
}
}
}

void compose_hr_gint(std::vector<std::shared_ptr<HContainer<double>>> hr_gint_part,
Expand All @@ -54,7 +54,7 @@ void compose_hr_gint(std::vector<std::shared_ptr<HContainer<double>>> hr_gint_pa
const hamilt::AtomPair<double>* ap_nspin_0 = hr_gint_part[0]->find_pair(iat1, iat2);
const hamilt::AtomPair<double>* ap_nspin_3 = hr_gint_part[3]->find_pair(iat1, iat2);
for (int ir = 0; ir < upper_ap->get_R_size(); ir++)
{
{
const auto R_index = upper_ap->get_R_index(ir);
auto upper_mat = upper_ap->find_matrix(R_index);
auto mat_nspin_0 = ap_nspin_0->find_matrix(R_index);
Expand Down Expand Up @@ -124,10 +124,11 @@ void transfer_hr_gint_to_hR(std::shared_ptr<const HContainer<T>> hr_gint, HConta

// gint_info should not have been a parameter, but it was added to initialize dm_gint_full
// In the future, we might try to remove the gint_info parameter
template<typename T>
void transfer_dm_2d_to_gint(
std::shared_ptr<const GintInfo> gint_info,
std::vector<HContainer<double>*> dm,
std::vector<std::shared_ptr<HContainer<double>>> dm_gint)
std::vector<HContainer<T>*> dm,
std::vector<std::shared_ptr<HContainer<T>>> dm_gint)
{
// To check whether input parameter dm_2d has been initialized
#ifdef __DEBUG
Expand All @@ -150,12 +151,12 @@ void transfer_dm_2d_to_gint(
{
#ifdef __MPI
const int npol = 2;
std::shared_ptr<HContainer<double>> dm_full = gint_info->get_hr<double>(npol);
std::shared_ptr<HContainer<T>> dm_full = gint_info->get_hr<T>(npol);
hamilt::transferParallels2Serials(*dm[0], dm_full.get());
#else
HContainer<double>* dm_full = dm[0];
HContainer<T>* dm_full = dm[0];
#endif
std::vector<double*> tmp_pointer(4, nullptr);
std::vector<T*> tmp_pointer(4, nullptr);
for (int iap = 0; iap < dm_full->size_atom_pairs(); iap++)
{
auto& ap = dm_full->get_atom_pair(iap);
Expand All @@ -166,10 +167,10 @@ void transfer_dm_2d_to_gint(
const ModuleBase::Vector3<int> r_index = ap.get_R_index(ir);
for (int is = 0; is < 4; is++)
{
tmp_pointer[is] =
tmp_pointer[is] =
dm_gint[is]->find_matrix(iat1, iat2, r_index)->get_pointer();
}
double* data_full = ap.get_pointer(ir);
T* data_full = ap.get_pointer(ir);
for (int irow = 0; irow < ap.get_row_size(); irow += 2)
{
for (int icol = 0; icol < ap.get_col_size(); icol += 2)
Expand All @@ -191,6 +192,18 @@ void transfer_dm_2d_to_gint(
}


template void transfer_hr_gint_to_hR(std::shared_ptr<const HContainer<double>> hr_gint, HContainer<double>* hR);
template void transfer_hr_gint_to_hR(std::shared_ptr<const HContainer<std::complex<double>>> hr_gint, HContainer<std::complex<double>>* hR);
template void transfer_hr_gint_to_hR(
std::shared_ptr<const HContainer<double>> hr_gint,
HContainer<double>* hR);
template void transfer_hr_gint_to_hR(
std::shared_ptr<const HContainer<std::complex<double>>> hr_gint,
HContainer<std::complex<double>>* hR);
template void transfer_dm_2d_to_gint(
std::shared_ptr<const GintInfo> gint_info,
std::vector<HContainer<double>*> dm,
std::vector<std::shared_ptr<HContainer<double>>> dm_gint);
template void transfer_dm_2d_to_gint(
std::shared_ptr<const GintInfo> gint_info,
std::vector<HContainer<std::complex<double>>*> dm,
std::vector<std::shared_ptr<HContainer<std::complex<double>>>> dm_gint);
}
5 changes: 3 additions & 2 deletions source/module_hamilt_lcao/module_gint/temp_gint/gint_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ namespace ModuleGint
template <typename T>
void transfer_hr_gint_to_hR(std::shared_ptr<const HContainer<T>> hr_gint, HContainer<T>* hR);

template<typename T>
void transfer_dm_2d_to_gint(
std::shared_ptr<const GintInfo> gint_info,
std::vector<HContainer<double>*> dm,
std::vector<std::shared_ptr<HContainer<double>>> dm_gint);
std::vector<HContainer<T>*> dm,
std::vector<std::shared_ptr<HContainer<T>>> dm_gint);

}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void Gint_rho::cal_rho_()
for (int is = 0; is < nspin_; is++)
{
phi_op.phi_mul_dm(phi.data(), *dm_gint_vec_[is], true, phi_dm.data());
phi_op.phi_dot_phi_dm(phi.data(), phi_dm.data(), rho_[is]);
phi_op.phi_dot_phi(phi.data(), phi_dm.data(), rho_[is]);
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions source/module_hamilt_lcao/module_gint/temp_gint/gint_tau.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ void Gint_tau::cal_tau_()
phi_op.phi_mul_dm(dphi_x.data(), *dm_gint_vec_[is], true, dphi_x_dm.data());
phi_op.phi_mul_dm(dphi_y.data(), *dm_gint_vec_[is], true, dphi_y_dm.data());
phi_op.phi_mul_dm(dphi_z.data(), *dm_gint_vec_[is], true, dphi_z_dm.data());
phi_op.phi_dot_phi_dm(dphi_x.data(), dphi_x_dm.data(), kin_[is]);
phi_op.phi_dot_phi_dm(dphi_y.data(), dphi_y_dm.data(), kin_[is]);
phi_op.phi_dot_phi_dm(dphi_z.data(), dphi_z_dm.data(), kin_[is]);
phi_op.phi_dot_phi(dphi_x.data(), dphi_x_dm.data(), kin_[is]);
phi_op.phi_dot_phi(dphi_y.data(), dphi_y_dm.data(), kin_[is]);
phi_op.phi_dot_phi(dphi_z.data(), dphi_z_dm.data(), kin_[is]);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions source/module_hamilt_lcao/module_gint/temp_gint/gint_vl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ void Gint_vl::cal_hr_gint_()
#pragma omp for schedule(dynamic)
for(const auto& biggrid: gint_info_->get_biggrids())
{
if(biggrid->get_atoms().size() == 0)
if(biggrid->get_atoms().empty())
{
continue;
}
Expand All @@ -46,7 +46,7 @@ void Gint_vl::cal_hr_gint_()
phi_vldr3.resize(phi_len);
phi_op.set_phi(phi.data());
phi_op.phi_mul_vldr3(vr_eff_, dr3_, phi.data(), phi_vldr3.data());
phi_op.phi_mul_phi_vldr3(phi.data(), phi_vldr3.data(), *hr_gint_);
phi_op.phi_mul_phi(phi.data(), phi_vldr3.data(), *hr_gint_, PhiOperator::Triangular_Matrix::Upper);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ void Gint_vl_metagga::cal_hr_gint_()
phi_op.phi_mul_vldr3(vofk_, dr3_, dphi_x.data(), dphi_x_vldr3.data());
phi_op.phi_mul_vldr3(vofk_, dr3_, dphi_y.data(), dphi_y_vldr3.data());
phi_op.phi_mul_vldr3(vofk_, dr3_, dphi_z.data(), dphi_z_vldr3.data());
phi_op.phi_mul_phi_vldr3(phi.data(), phi_vldr3.data(), *hr_gint_);
phi_op.phi_mul_phi_vldr3(dphi_x.data(), dphi_x_vldr3.data(), *hr_gint_);
phi_op.phi_mul_phi_vldr3(dphi_y.data(), dphi_y_vldr3.data(), *hr_gint_);
phi_op.phi_mul_phi_vldr3(dphi_z.data(), dphi_z_vldr3.data(), *hr_gint_);
phi_op.phi_mul_phi(phi.data(), phi_vldr3.data(), *hr_gint_, PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_x.data(), dphi_x_vldr3.data(), *hr_gint_, PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_y.data(), dphi_y_vldr3.data(), *hr_gint_, PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_z.data(), dphi_z_vldr3.data(), *hr_gint_, PhiOperator::Triangular_Matrix::Upper);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ void Gint_vl_metagga_nspin4::cal_hr_gint_()
phi_op.phi_mul_vldr3(vofk_[is], dr3_, dphi_x.data(), dphi_x_vldr3.data());
phi_op.phi_mul_vldr3(vofk_[is], dr3_, dphi_y.data(), dphi_y_vldr3.data());
phi_op.phi_mul_vldr3(vofk_[is], dr3_, dphi_z.data(), dphi_z_vldr3.data());
phi_op.phi_mul_phi_vldr3(phi.data(), phi_vldr3.data(), *hr_gint_part_[is]);
phi_op.phi_mul_phi_vldr3(dphi_x.data(), dphi_x_vldr3.data(), *hr_gint_part_[is]);
phi_op.phi_mul_phi_vldr3(dphi_y.data(), dphi_y_vldr3.data(), *hr_gint_part_[is]);
phi_op.phi_mul_phi_vldr3(dphi_z.data(), dphi_z_vldr3.data(), *hr_gint_part_[is]);
phi_op.phi_mul_phi(phi.data(), phi_vldr3.data(), *hr_gint_part_[is], PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_x.data(), dphi_x_vldr3.data(), *hr_gint_part_[is], PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_y.data(), dphi_y_vldr3.data(), *hr_gint_part_[is], PhiOperator::Triangular_Matrix::Upper);
phi_op.phi_mul_phi(dphi_z.data(), dphi_z_vldr3.data(), *hr_gint_part_[is], PhiOperator::Triangular_Matrix::Upper);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void Gint_vl_nspin4::cal_hr_gint_()
for(int is = 0; is < nspin_; is++)
{
phi_op.phi_mul_vldr3(vr_eff_[is], dr3_, phi.data(), phi_vldr3.data());
phi_op.phi_mul_phi_vldr3(phi.data(), phi_vldr3.data(), *hr_gint_part_[is]);
phi_op.phi_mul_phi(phi.data(), phi_vldr3.data(), *hr_gint_part_[is], PhiOperator::Triangular_Matrix::Upper);
}
}
}
Expand Down
Loading
Loading