#include "fire.h"
#include "md_func.h"
#ifdef __MPI
#include "mpi.h"
#endif
#include "source_base/timer.h"
FIRE::FIRE(const Parameter& param_in, UnitCell& unit_in) : MD_base(param_in, unit_in)
{
force_thr = param_in.inp.force_thr;
dt_max = -1.0;
alpha_start = 0.10;
alpha = alpha_start;
finc = 1.1;
fdec = 0.5;
f_alpha = 0.99;
n_min = 4;
negative_count = 0;
max = 0.0;
force_thr = 1e-3;
}
FIRE::~FIRE()
{
}
void FIRE::setup(ModuleESolver::ESolver* p_esolver, const std::string& global_readin_dir)
{
ModuleBase::TITLE("FIRE", "setup");
ModuleBase::timer::tick("FIRE", "setup");
MD_base::setup(p_esolver, global_readin_dir);
check_force();
ModuleBase::timer::tick("FIRE", "setup");
return;
}
void FIRE::first_half(std::ofstream& ofs)
{
ModuleBase::TITLE("FIRE", "first_half");
ModuleBase::timer::tick("FIRE", "first_half");
MD_base::update_vel(force);
check_fire();
MD_base::update_pos();
ModuleBase::timer::tick("FIRE", "first_half");
return;
}
void FIRE::second_half(void)
{
ModuleBase::TITLE("FIRE", "second_half");
ModuleBase::timer::tick("FIRE", "second_half");
MD_base::update_vel(force);
check_force();
ModuleBase::timer::tick("FIRE", "second_half");
return;
}
void FIRE::print_md(std::ofstream& ofs, const bool& cal_stress)
{
MD_base::print_md(ofs, cal_stress);
const double max_force = max * ModuleBase::Hartree_to_eV * ModuleBase::ANGSTROM_AU;
ofs