开源 企业版 高校版 私有云 模力方舟 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
verlet.cpp 5.31 KB
一键复制 编辑 原始数据 按行查看 历史
#include "verlet.h"
#include "md_func.h"
#include "source_base/timer.h"
Verlet::Verlet(const Parameter& param_in, UnitCell& unit_in) : MD_base(param_in, unit_in)
{
}
Verlet::~Verlet()
{
}
void Verlet::setup(ModuleESolver::ESolver* p_esolver, const std::string& global_readin_dir)
{
ModuleBase::TITLE("Verlet", "setup");
ModuleBase::timer::start("Verlet", "setup");
MD_base::setup(p_esolver, global_readin_dir);
ModuleBase::timer::end("Verlet", "setup");
}
void Verlet::first_half(std::ofstream& ofs)
{
ModuleBase::TITLE("Verlet", "first_half");
ModuleBase::timer::start("Verlet", "first_half");
MD_base::update_vel(force);
MD_base::update_pos();
ModuleBase::timer::end("Verlet", "first_half");
}
void Verlet::second_half()
{
ModuleBase::TITLE("Verlet", "second_half");
ModuleBase::timer::start("Verlet", "second_half");
MD_base::update_vel(force);
apply_thermostat();
ModuleBase::timer::end("Verlet", "second_half");
}
void Verlet::apply_thermostat(void)
{
double t_target = 0.0;
t_current = MD_func::current_temp(kinetic, ucell.nat, frozen_freedom_, allmass, vel);
if (mdp.md_type == "nve")
{
}
else if (mdp.md_thermostat == "rescaling")
{
t_target = MD_func::target_temp(step_ + step_rst_, mdp.md_nstep, md_tfirst, md_tlast);
if (std::abs(t_target - t_current) * ModuleBase::Hartree_to_K > mdp.md_tolerance)
{
thermalize(0, t_current, t_target);
}
}
else if (mdp.md_thermostat == "rescale_v")
{
if ((step_ + step_rst_) % mdp.md_nraise == 0)
{
t_target = MD_func::target_temp(step_ + step_rst_, mdp.md_nstep, md_tfirst, md_tlast);
thermalize(0, t_current, t_target);
}
}
else if (mdp.md_thermostat == "anderson")
{
if (my_rank == 0)
{
double deviation = 0.0;
for (int i = 0; i < ucell.nat; ++i)
{
if (static_cast<double>(std::rand()) / RAND_MAX <= 1.0 / mdp.md_nraise)
{
deviation = sqrt(md_tlast / allmass[i]);
for (int k = 0; k < 3; ++k)
{
if (ionmbl[i][k])
{
vel[i][k] = deviation * MD_func::gaussrand();
}
}
}
}
}
#ifdef __MPI
MPI_Bcast(vel, ucell.nat * 3, MPI_DOUBLE, 0, MPI_COMM_WORLD);
#endif
}
else if (mdp.md_thermostat == "berendsen")
{
t_target = MD_func::target_temp(step_ + step_rst_, mdp.md_nstep, md_tfirst, md_tlast);
thermalize(mdp.md_nraise, t_current, t_target);
}
else if (mdp.md_thermostat == "csvr")
{
t_target = MD_func::target_temp(step_ + step_rst_, mdp.md_nstep, md_tfirst, md_tlast);
apply_csvr(t_current, t_target);
}
else
{
ModuleBase::WARNING_QUIT("Verlet", "No such thermostat!");
}
}
void Verlet::thermalize(const int& nraise, const double& current_temp, const double& target_temp)
{
double fac = 0.0;
if (nraise > 0 && current_temp > 0 && target_temp > 0)
{
fac = sqrt(1 + (target_temp / current_temp - 1) / nraise);
}
else if (nraise == 0 && current_temp > 0 && target_temp > 0)
{
fac = sqrt(target_temp / current_temp);
}
for (int i = 0; i < ucell.nat; ++i)
{
vel[i] *= fac;
}
}
void Verlet::apply_csvr(const double& current_temp, const double& target_temp)
{
// CSVR thermostat: Canonical Sampling through Velocity Rescaling
// Reference: G. Bussi, D. Donadio, M. Parrinello, J. Chem. Phys. 126, 014101 (2007)
if (current_temp <= 0.0 || target_temp <= 0.0)
{
return;
}
// Get degrees of freedom (3N - frozen)
int ndeg = 3 * ucell.nat - frozen_freedom_;
// Calculate kinetic energies
double kin_energy = current_temp * ndeg * 0.5; // in Hartree
double kin_target = target_temp * ndeg * 0.5; // in Hartree
// Calculate tau parameter (characteristic time scale / dt)
double taut = mdp.md_csvr_tau / mdp.md_dt;
// Calculate decay factor
double factor = 0.0;
if (taut > 0.1)
{
factor = exp(-1.0 / taut);
}
// Generate Gaussian random numbers using MD_func
double rr = MD_func::gaussrand();
// Calculate sum of squared Gaussian random numbers (ndeg - 1)
double sumnoises = 0.0;
for (int i = 0; i < ndeg - 1; ++i)
{
double r = MD_func::gaussrand();
sumnoises += r * r;
}
// CSVR core formula (simplified)
double factor2 = (1.0 - factor) * kin_target / kin_energy / ndeg;
double resample = factor + factor2 * (rr * rr + sumnoises) + 2.0 * rr * sqrt(factor * factor2);
// Ensure non-negative
resample = std::max(0.0, resample);
// Calculate scaling factor
double scale = sqrt(resample);
// Apply velocity scaling
for (int i = 0; i < ucell.nat; ++i)
{
vel[i] *= scale;
}
}
void Verlet::print_md(std::ofstream& ofs, const bool& cal_stress)
{
MD_base::print_md(ofs, cal_stress);
return;
}
void Verlet::write_restart(const std::string& global_out_dir)
{
MD_base::write_restart(global_out_dir);
return;
}
void Verlet::restart(const std::string& global_readin_dir)
{
MD_base::restart(global_readin_dir);
return;
}
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 によって変換されたページ (->オリジナル) /