开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
develop
分支 (8)
标签 (98)
develop
dashboard
copilot/fix-test-github-actions-job
feature/openmp-hsolver
LTS
feat/tests-17-ds-dftu
ZhouXY-KML
feat/dftu-pw-port-v2
v3.11.0-beta5
v3.11.0-beta4
v3.11.0-beta.3
v3.11.0-beta.2
3.11.0-beta.1
v3.9.0.27
v3.9.0.26
v3.9.0.25
v3.9.0.24
v3.9.0.23
v3.9.0.22
v3.9.0.21
v3.9.0.20
v3.9.0.19
v3.10.1
v3.9.0.18
v3.9.0.17
v3.9.0.16
v3.9.0.15
v3.9.0.14
develop
分支 (8)
标签 (98)
develop
dashboard
copilot/fix-test-github-actions-job
feature/openmp-hsolver
LTS
feat/tests-17-ds-dftu
ZhouXY-KML
feat/dftu-pw-port-v2
v3.11.0-beta5
v3.11.0-beta4
v3.11.0-beta.3
v3.11.0-beta.2
3.11.0-beta.1
v3.9.0.27
v3.9.0.26
v3.9.0.25
v3.9.0.24
v3.9.0.23
v3.9.0.22
v3.9.0.21
v3.9.0.20
v3.9.0.19
v3.10.1
v3.9.0.18
v3.9.0.17
v3.9.0.16
v3.9.0.15
v3.9.0.14
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
develop
分支 (8)
标签 (98)
develop
dashboard
copilot/fix-test-github-actions-job
feature/openmp-hsolver
LTS
feat/tests-17-ds-dftu
ZhouXY-KML
feat/dftu-pw-port-v2
v3.11.0-beta5
v3.11.0-beta4
v3.11.0-beta.3
v3.11.0-beta.2
3.11.0-beta.1
v3.9.0.27
v3.9.0.26
v3.9.0.25
v3.9.0.24
v3.9.0.23
v3.9.0.22
v3.9.0.21
v3.9.0.20
v3.9.0.19
v3.10.1
v3.9.0.18
v3.9.0.17
v3.9.0.16
v3.9.0.15
v3.9.0.14
operator.cpp 6.99 KB
一键复制 编辑 原始数据 按行查看 历史
linpeize 提交于 2026年05月05日 11:55 +08:00 . Refactor: update \#include in all files (#7289)
#include "operator.h"
#include "source_base/timer.h"
#include "source_base/tool_quit.h"
using namespace hamilt;
template <typename T, typename Device>
Operator<T, Device>::Operator()
{
}
template <typename T, typename Device>
Operator<T, Device>::~Operator()
{
if (this->hpsi != nullptr)
{
delete this->hpsi;
}
Operator* last = this->next_op;
Operator* last_sub = this->next_sub_op;
while (last != nullptr || last_sub != nullptr)
{
if (last_sub != nullptr)
{ // delete sub_chain first
Operator* node_delete = last_sub;
last_sub = last_sub->next_sub_op;
node_delete->next_sub_op = nullptr;
delete node_delete;
}
else
{ // delete main chain if sub_chain is deleted
Operator* node_delete = last;
last_sub = last->next_sub_op;
node_delete->next_sub_op = nullptr;
last = last->next_op;
node_delete->next_op = nullptr;
delete node_delete;
}
}
}
template <typename T, typename Device>
typename Operator<T, Device>::hpsi_info Operator<T, Device>::hPsi(hpsi_info& input) const
{
using syncmem_op = base_device::memory::synchronize_memory_op<T, Device, Device>;
auto psi_input = std::get<0>(input);
std::tuple<const T*, int> psi_info = psi_input->to_range(std::get<1>(input));
int nbands = std::get<1>(psi_info);
T* tmhpsi = this->get_hpsi(input);
const T* tmpsi_in = std::get<0>(psi_info);
// if range in hpsi_info is illegal, the first return of to_range() would be nullptr
if (tmpsi_in == nullptr)
{
ModuleBase::WARNING_QUIT("Operator", "please choose correct range of psi for hPsi()!");
}
// if in_place, copy temporary hpsi to target hpsi_pointer, then delete hpsi and new a wrapper for return
T* hpsi_pointer = std::get<2>(input);
if (this->in_place)
{
syncmem_op()(hpsi_pointer, this->hpsi->get_pointer(), this->hpsi->size());
delete this->hpsi;
this->hpsi = new psi::Psi<T, Device>(hpsi_pointer,
1,
nbands / psi_input->get_npol(),
psi_input->get_nbasis(),
psi_input->get_nbasis(),
true);
}
auto call_act = [&, this](const Operator* op, const bool& is_first_node) -> void {
// a "psi" with the bands of needed range
psi::Psi<T, Device> psi_wrapper(const_cast<T*>(tmpsi_in),
1,
nbands,
psi_input->get_nbasis(),
psi_input->get_nbasis(),
true);
switch (op->get_act_type())
{
case 2:
op->act(psi_wrapper, *this->hpsi, nbands);
break;
default:
op->act(nbands,
psi_input->get_nbasis(),
psi_input->get_npol(),
tmpsi_in,
this->hpsi->get_pointer(),
psi_input->get_current_nbas(),
is_first_node);
break;
}
};
ModuleBase::timer::start("Operator", "hPsi");
call_act(this, true); // first node
Operator* node((Operator*)this->next_op);
while (node != nullptr)
{
call_act(node, false); // other nodes
node = (Operator*)(node->next_op);
}
ModuleBase::timer::end("Operator", "hPsi");
return hpsi_info(this->hpsi, psi::Range(1, 0, 0, nbands / psi_input->get_npol()), hpsi_pointer);
}
template <typename T, typename Device>
void Operator<T, Device>::init(const int ik_in)
{
this->ik = ik_in;
if (this->next_op != nullptr)
{
this->next_op->init(ik_in);
}
}
template <typename T, typename Device>
void Operator<T, Device>::add(Operator* next)
{
if (next == nullptr)
{
return;
}
next->is_first_node = false;
if (next->next_op != nullptr)
{
this->add(next->next_op);
}
Operator* last = this;
// loop to end of the chain
while (last->next_op != nullptr)
{
if (next->cal_type == last->cal_type)
{
break;
}
last = last->next_op;
}
if (next->cal_type == last->cal_type)
{
// insert next to sub chain of current node
Operator* sub_last = last;
while (sub_last->next_sub_op != nullptr)
{
sub_last = sub_last->next_sub_op;
}
sub_last->next_sub_op = next;
return;
}
else
{
last->next_op = next;
}
}
template <typename T, typename Device>
T* Operator<T, Device>::get_hpsi(const hpsi_info& info) const
{
const int nbands_range = (std::get<1>(info).range_2 - std::get<1>(info).range_1 + 1);
// in_place call of hPsi, hpsi inputs as new psi,
// create a new hpsi and delete old hpsi later
T* hpsi_pointer = std::get<2>(info);
const T* psi_pointer = std::get<0>(info)->get_pointer();
if (this->hpsi != nullptr)
{
delete this->hpsi;
this->hpsi = nullptr;
}
if (!hpsi_pointer)
{
ModuleBase::WARNING_QUIT("Operator::hPsi", "hpsi_pointer can not be nullptr");
}
else if (hpsi_pointer == psi_pointer)
{
this->in_place = true;
// this->hpsi = new psi::Psi<T, Device>(std::get<0>(info)[0], 1, nbands_range);
this->hpsi = new psi::Psi<T, Device>(1,
nbands_range,
std::get<0>(info)->get_nbasis(),
std::get<0>(info)->get_nbasis(),
true);
}
else
{
this->in_place = false;
this->hpsi = new psi::Psi<T, Device>(hpsi_pointer,
1,
nbands_range,
std::get<0>(info)->get_nbasis(),
std::get<0>(info)->get_nbasis(),
true);
}
hpsi_pointer = this->hpsi->get_pointer();
size_t total_hpsi_size = nbands_range * this->hpsi->get_nbasis();
// ModuleBase::GlobalFunc::ZEROS(hpsi_pointer, total_hpsi_size);
// denghui replaced at 20221104
// set_memory_op()(this->ctx, hpsi_pointer, 0, total_hpsi_size);
return hpsi_pointer;
}
namespace hamilt
{
template class Operator<float, base_device::DEVICE_CPU>;
template class Operator<std::complex<float>, base_device::DEVICE_CPU>;
template class Operator<double, base_device::DEVICE_CPU>;
template class Operator<std::complex<double>, base_device::DEVICE_CPU>;
#if ((defined __CUDA) || (defined __ROCM))
template class Operator<float, base_device::DEVICE_GPU>;
template class Operator<std::complex<float>, base_device::DEVICE_GPU>;
template class Operator<double, base_device::DEVICE_GPU>;
template class Operator<std::complex<double>, base_device::DEVICE_GPU>;
#endif
} // namespace hamilt
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

An electronic structure software based on either plane wave basis or numerical atomic orbitals. (https://github.com/deepmodeling/abacus-develop)
取消

发行版 (40)

全部

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/deepmodeling/abacus-develop.git
git@gitee.com:deepmodeling/abacus-develop.git
deepmodeling
abacus-develop
abacus-develop
develop
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /