New options adaptstep and halfstepback in adaptglok. Adapted documentation.
This commit is contained in:
@ -19,14 +19,17 @@ keyword = {dmax} or {line} or {delaystep} or {dt_grow} or {dt_shrink}
|
|||||||
max = maximum distance for line search to move (distance units)
|
max = maximum distance for line search to move (distance units)
|
||||||
{line} value = {backtrack} or {quadratic} or {forcezero}
|
{line} value = {backtrack} or {quadratic} or {forcezero}
|
||||||
backtrack,quadratic,forcezero = style of linesearch to use
|
backtrack,quadratic,forcezero = style of linesearch to use
|
||||||
{integrator} value = {eulerimplicit} or {eulerexplicit} or {verlet} or {leapfrog} for adaptglok :pre
|
|
||||||
{delaystep} value = {int} for adaptglok
|
{delaystep} value = {int} for adaptglok
|
||||||
{dt_grow} value = {float} for adaptglok
|
{dt_grow} value = {float} for adaptglok
|
||||||
{dt_shrink} value = {float} for adaptglok
|
{dt_shrink} value = {float} for adaptglok
|
||||||
{alpha0} value = {float} for adaptglok
|
{alpha0} value = {float} for adaptglok
|
||||||
{alpha_shrink} value = {float} for adaptglok
|
{alpha_shrink} value = {float} for adaptglok
|
||||||
{tmax} value = {float} for adaptglok
|
{tmax} value = {float} for adaptglok
|
||||||
{tmin} value = {float} for adaptglok :pre
|
{tmin} value = {float} for adaptglok
|
||||||
|
{integrator} value = {eulerimplicit} or {eulerexplicit} or {verlet}
|
||||||
|
or {leapfrog} for adaptglok
|
||||||
|
{adaptstep} arg = {yes} or {no} for adaptglok
|
||||||
|
{halfstepback} value = {yes} or {no} for adaptglok :pre
|
||||||
:ule
|
:ule
|
||||||
|
|
||||||
[Examples:]
|
[Examples:]
|
||||||
@ -79,6 +82,9 @@ to optimize the relaxation: {integrator}, {delaystep}, {dt_grow}, {dt_shrink},
|
|||||||
{alpha0}, {alpha_shrink}, {tmax} and {tmin}. The default values have
|
{alpha0}, {alpha_shrink}, {tmax} and {tmin}. The default values have
|
||||||
been chosen to be reliable in most cases, but one could be willing
|
been chosen to be reliable in most cases, but one could be willing
|
||||||
to adapt them for particular cases.
|
to adapt them for particular cases.
|
||||||
|
In particular for debugging purpose, it is possible to switch off the
|
||||||
|
variable timestep and the backstep when downhill, by using {adaptstep}
|
||||||
|
and {halfstepback}.
|
||||||
|
|
||||||
[Restrictions:] none
|
[Restrictions:] none
|
||||||
|
|
||||||
@ -90,4 +96,4 @@ to adapt them for particular cases.
|
|||||||
|
|
||||||
The option defaults are dmax = 0.1, line = quadratic, integrator = eulerimplicit, delaystep = 20,
|
The option defaults are dmax = 0.1, line = quadratic, integrator = eulerimplicit, delaystep = 20,
|
||||||
dt_grow = 1.1, dt_shrink = 0.5, alpha0 = 0.25, alpha_shrink = 0.99,
|
dt_grow = 1.1, dt_shrink = 0.5, alpha0 = 0.25, alpha_shrink = 0.99,
|
||||||
tmax = 2.0 and tmin = 0.02.
|
tmax = 2.0, tmin = 0.02, adaptstep = yes and halfstepback = yes.
|
||||||
|
|||||||
@ -64,8 +64,8 @@ a minimization.
|
|||||||
Style {adaptglok} is a re-implementation of the style {fire} to better
|
Style {adaptglok} is a re-implementation of the style {fire} to better
|
||||||
fit the published and unpublished optimizations of the method described
|
fit the published and unpublished optimizations of the method described
|
||||||
in "(Bitzek)"_#Bitzek. It includes a temporization of the variable
|
in "(Bitzek)"_#Bitzek. It includes a temporization of the variable
|
||||||
timestep, a backstep when uphill and different integration
|
timestep, a backstep when downhill and different integration
|
||||||
schemes (Euler, Leap Frog, Velocity-Verlet).
|
schemes.
|
||||||
|
|
||||||
Either the {quickmin} and {fire} styles are useful in the context of
|
Either the {quickmin} and {fire} styles are useful in the context of
|
||||||
nudged elastic band (NEB) calculations via the "neb"_neb.html command.
|
nudged elastic band (NEB) calculations via the "neb"_neb.html command.
|
||||||
|
|||||||
14
src/min.cpp
14
src/min.cpp
@ -63,6 +63,8 @@ Min::Min(LAMMPS *lmp) : Pointers(lmp)
|
|||||||
tmax = 2.0;
|
tmax = 2.0;
|
||||||
tmin = 0.02;
|
tmin = 0.02;
|
||||||
integrator = 0;
|
integrator = 0;
|
||||||
|
halfstepback_flag = 1;
|
||||||
|
adaptstep_flag = 1;
|
||||||
|
|
||||||
elist_global = elist_atom = NULL;
|
elist_global = elist_atom = NULL;
|
||||||
vlist_global = vlist_atom = NULL;
|
vlist_global = vlist_atom = NULL;
|
||||||
@ -680,6 +682,18 @@ void Min::modify_params(int narg, char **arg)
|
|||||||
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
||||||
tmin = force->numeric(FLERR,arg[iarg+1]);
|
tmin = force->numeric(FLERR,arg[iarg+1]);
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"halfstepback") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
||||||
|
if (strcmp(arg[iarg+1],"yes") == 0) halfstepback_flag = 1;
|
||||||
|
else if (strcmp(arg[iarg+1],"no") == 0) halfstepback_flag = 0;
|
||||||
|
else error->all(FLERR,"Illegal min_modify command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"adaptstep") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
||||||
|
if (strcmp(arg[iarg+1],"yes") == 0) adaptstep_flag = 1;
|
||||||
|
else if (strcmp(arg[iarg+1],"no") == 0) adaptstep_flag = 0;
|
||||||
|
else error->all(FLERR,"Illegal min_modify command");
|
||||||
|
iarg += 2;
|
||||||
} else if (strcmp(arg[iarg],"integrator") == 0) {
|
} else if (strcmp(arg[iarg],"integrator") == 0) {
|
||||||
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command");
|
||||||
if (strcmp(arg[iarg+1],"eulerimplicit") == 0) integrator = 0;
|
if (strcmp(arg[iarg+1],"eulerimplicit") == 0) integrator = 0;
|
||||||
|
|||||||
@ -63,6 +63,8 @@ class Min : protected Pointers {
|
|||||||
double alpha0,alpha_shrink; // mixing velocities+forces coefficient (adaptglok)
|
double alpha0,alpha_shrink; // mixing velocities+forces coefficient (adaptglok)
|
||||||
double tmax,tmin; // timestep max, min (adaptglok)
|
double tmax,tmin; // timestep max, min (adaptglok)
|
||||||
int integrator; // choose the style of time integrator (adaptglok)
|
int integrator; // choose the style of time integrator (adaptglok)
|
||||||
|
int halfstepback_flag; // 1: half step backward when v.f <= 0.0 (adaptglok)
|
||||||
|
int adaptstep_flag; // 1: variable timestep, 0: constant (adaptglok)
|
||||||
|
|
||||||
int nelist_global,nelist_atom; // # of PE,virial computes to check
|
int nelist_global,nelist_atom; // # of PE,virial computes to check
|
||||||
int nvlist_global,nvlist_atom;
|
int nvlist_global,nvlist_atom;
|
||||||
|
|||||||
@ -184,7 +184,7 @@ int MinAdaptGlok::iterate(int maxiter)
|
|||||||
if (fdotfall <= 1e-20) scale2 = 0.0;
|
if (fdotfall <= 1e-20) scale2 = 0.0;
|
||||||
else scale2 = alpha * sqrt(vdotvall/fdotfall);
|
else scale2 = alpha * sqrt(vdotvall/fdotfall);
|
||||||
|
|
||||||
if (ntimestep - last_negative > delaystep) {
|
if (ntimestep - last_negative > delaystep && adaptstep_flag) {
|
||||||
dt = MIN(dt*dt_grow,dtmax);
|
dt = MIN(dt*dt_grow,dtmax);
|
||||||
update->dt = dt;
|
update->dt = dt;
|
||||||
alpha *= alpha_shrink;
|
alpha *= alpha_shrink;
|
||||||
@ -201,7 +201,7 @@ int MinAdaptGlok::iterate(int maxiter)
|
|||||||
} else {
|
} else {
|
||||||
last_negative = ntimestep;
|
last_negative = ntimestep;
|
||||||
// Limit decrease of timestep
|
// Limit decrease of timestep
|
||||||
if (ntimestep - ntimestep_fire > delaystep) {
|
if (ntimestep - ntimestep_fire > delaystep && adaptstep_flag) {
|
||||||
alpha = alpha0;
|
alpha = alpha0;
|
||||||
if (dt > dtmin) {
|
if (dt > dtmin) {
|
||||||
dt *= dt_shrink;
|
dt *= dt_shrink;
|
||||||
@ -209,11 +209,13 @@ int MinAdaptGlok::iterate(int maxiter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
double **x = atom->x;
|
double **x = atom->x;
|
||||||
|
if (halfstepback_flag) {
|
||||||
for (int i = 0; i < nlocal; i++) {
|
for (int i = 0; i < nlocal; i++) {
|
||||||
x[i][0] -= 0.5 * dtv * v[i][0];
|
x[i][0] -= 0.5 * dtv * v[i][0];
|
||||||
x[i][1] -= 0.5 * dtv * v[i][1];
|
x[i][1] -= 0.5 * dtv * v[i][1];
|
||||||
x[i][2] -= 0.5 * dtv * v[i][2];
|
x[i][2] -= 0.5 * dtv * v[i][2];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
v[i][0] = v[i][1] = v[i][2] = 0.0;
|
v[i][0] = v[i][1] = v[i][2] = 0.0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user