17 phi += atom->get_nw();
35 scratch.assign(size, Tin(0));
36 return scratch.data();
44 for (
int k = 0; k < size; ++k)
46 phi_dm[k] =
static_cast<double>(scratch[k]);
56 double*
const phi_dm)
const
58 std::vector<Tin> scratch;
62 for(
int i = 0;
i < biggrid_->get_atoms_num(); ++
i)
64 const auto atom_i = biggrid_->get_atom(
i);
65 const auto r_i = atom_i->get_R();
69 const auto dm_mat = dm.find_matrix(atom_i->get_iat(), atom_i->get_iat(), 0, 0, 0);
70 constexpr Tin alpha = 1.0;
71 constexpr Tin beta = 1.0;
74 atoms_phi_len_[
i], rows_,
75 alpha, dm_mat->get_pointer(), atoms_phi_len_[
i],
76 &phi[0 * cols_ + atoms_startidx_[
i]], cols_,
77 beta, &target[0 * cols_ + atoms_startidx_[
i]], cols_);
80 const int start = is_symm ?
i + 1 : 0;
82 for(
int j =
start; j < biggrid_->get_atoms_num(); ++j)
84 const auto atom_j = biggrid_->get_atom(j);
85 const auto r_j = atom_j->get_R();
87 const auto dm_mat = dm.find_matrix(atom_i->get_iat(), atom_j->get_iat(), r_i-r_j);
95 const int start_idx = get_atom_pair_start_end_idx_(
i, j).first;
96 const int end_idx = get_atom_pair_start_end_idx_(
i, j).second;
97 const int len = end_idx - start_idx + 1;
105 const Tin alpha = is_symm ? 2.0 : 1.0;
106 constexpr Tin beta = 1.0;
109 len, atoms_phi_len_[j], atoms_phi_len_[
i],
110 alpha, &phi[start_idx * cols_ + atoms_startidx_[
i]], cols_,
111 dm_mat->get_pointer(), atoms_phi_len_[j],
112 beta, &target[start_idx * cols_ + atoms_startidx_[j]], cols_);
125 T*
const result)
const
128 for(
int i = 0;
i < biggrid_->get_mgrids_num();
i++)
130 T vldr3_mgrid = vl[mgrid_lidx_[
i]] * dr3;
131 for(
int j = 0; j < cols_; j++)
133 result[idx] = phi[idx] * vldr3_mgrid;
143template<
typename Tin>
145 const Tin*
const phi_i,
146 const Tin*
const phi_j,
150 std::vector<Tin> tmp_hr;
153 const auto atom_i =
biggrid_->get_atom(
i);
154 const auto& r_i = atom_i->get_R();
155 const int iat_i = atom_i->get_iat();
158 for(
int j = 0; j <
biggrid_->get_atoms_num(); ++j)
160 const auto atom_j =
biggrid_->get_atom(j);
161 const auto& r_j = atom_j->get_R();
162 const int iat_j = atom_j->get_iat();
177 const auto result = hr.
find_matrix(iat_i, iat_j, r_i-r_j);
179 if(result ==
nullptr)
186 const int len = end_idx - start_idx + 1;
193 tmp_hr.resize(n_i * n_j);
196 constexpr Tin alpha=1, beta=1;
198 'T',
'N', n_i, n_j, len,
201 beta, tmp_hr.data(), n_j,
204 result->add_array_ts(tmp_hr.data());
213inline double dotc_mixed(
int n,
const double* x,
const double* y,
214 std::vector<double>& )
219inline double dotc_mixed(
int n,
const double* x,
const float* y,
220 std::vector<double>& buf)
222 if (
static_cast<int>(buf.size()) < n) { buf.resize(n); }
223 for (
int k = 0; k < n; ++k) { buf[k] =
static_cast<double>(y[k]); }
230template<
typename Tin>
232 const Tin*
const phi_i,
233 const double*
const phi_j,
234 double*
const rho)
const
236 std::vector<double> buf;
237 for(
int i = 0;
i < biggrid_->get_mgrids_num(); ++
i)
240 cols_, phi_j +
i * cols_, phi_i +
i * cols_, buf);
const std::complex< double > i
Definition cal_pLpR.cpp:46
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)
Definition blas_connector_vector.cpp:224
static void gemm(const char transa, const char transb, const int m, const int n, const int k, 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)
Definition blas_connector_matrix.cpp:26
static void symm_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)
Definition blas_connector_matrix.cpp:375
void phi_mul_vldr3(const T *const vl, const T dr3, const T *const phi, T *const result) const
Definition phi_operator.hpp:121
std::shared_ptr< const BigGrid > biggrid_
Definition phi_operator.h:153
void phi_dot_phi(const Tin *const phi_i, const double *const phi_j, double *const rho) const
Definition phi_operator.hpp:231
const std::pair< int, int > & get_atom_pair_start_end_idx_(int a, int b) const
Definition phi_operator.h:129
void phi_mul_phi(const Tin *const phi_i, const Tin *const phi_j, HContainer< double > &hr, const TriPart part) const
Definition phi_operator.hpp:144
std::vector< std::vector< Vec3d > > atom_rcoords_
Definition phi_operator.h:157
TriPart
Definition phi_operator.h:22
std::vector< int > atoms_phi_len_
Definition phi_operator.h:169
void phi_mul_dm(const Tin *const phi, const HContainer< Tin > &dm, const bool is_symm, double *const phi_dm) const
Definition phi_operator.hpp:52
std::vector< int > atoms_startidx_
Definition phi_operator.h:164
void set_phi(T *phi) const
Definition phi_operator.hpp:11
int cols_
Definition phi_operator.h:147
Definition hcontainer.h:144
BaseMatrix< T > * find_matrix(int i, int j, int rx, int ry, int rz)
find BaseMatrix with atom index atom_i and atom_j and R index (rx, ry, rz) This interface can be used...
Definition hcontainer.cpp:286
#define T
Definition exp.cpp:237
void ZEROS(std::complex< T > *u, const TI n)
Definition global_function.h:109
Definition batch_biggrid.cpp:4
void phi_mul_dm_finalize_(double *, const std::vector< double > &, int)
Definition phi_operator.hpp:39
double * phi_mul_dm_scratch_(double *phi_dm, std::vector< double > &, int)
Definition phi_operator.hpp:27
double dotc_mixed(int n, const double *x, const double *y, std::vector< double > &)
Definition phi_operator.hpp:213
@ CpuDevice
Definition types.h:14
iclock::time_point start
Definition test_partition.cpp:22