Final polish of boxrelax. Updated documentation.

This commit is contained in:
Julien Guénolé
2017-08-16 20:01:16 +02:00
parent 6345e6b760
commit 0d901e8535
4 changed files with 83 additions and 38 deletions

View File

@ -13,35 +13,45 @@ min_modify command :h3
min_modify keyword values ... :pre min_modify keyword values ... :pre
one or more keyword/value pairs may be listed :ulb,l one or more keyword/value pairs may be listed :ulb,l
keyword = {dmax} or {line} or {delaystep} or {dt_grow} or {dt_shrink} keyword = {dmax} or {line}
or {alpha0} or {alpha_shrink} or {tmax} or {tmin} or {integrator} or {integrator} or {tmax} or {tmin}
or {delaystep} or {dt_grow} or {dt_shrink} or {alpha0} or {alpha_shrink}
or {relaxbox} or {relaxbox_mod} or {relaxbox_rate} or {ptol}
or {halfstepback}
{dmax} value = max {dmax} value = max
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
{delaystep} value = steps {integrator} value = {eulerimplicit} or {eulerexplicit} or {verlet} or {leapfrog}
steps = number of steps for dynamics temporization, adaptglok only eulerimplicit,eulerexplicit,verlet,leapfrog = integration scheme (adaptglok)
{dtgrow} value = grow
grow = factor increasing the timestep, adaptglok only
{dtshrink} value = shrink
shrink = factor decreasing the timestep, adaptglok only
{alpha0} value = alpha
alpha = coefficient mixing velocities and forces, adaptglok only
{alphashrink} value = shrink
shrink = factor decreasing alpha, adaptglok only
{tmax} value = coef {tmax} value = coef
coef = factor defining the maximum timestep, adaptglok only coef = factor defining the maximum timestep (adaptglok)
{tmin} value = coef {tmin} value = coef
coef = factor defining the minimum timestep, adaptglok only coef = factor defining the minimum timestep (adaptglok)
{integrator} value = {eulerimplicit} or {eulerexplicit} or {verlet} {delaystep} value = steps
or {leapfrog} steps = number of steps for dynamics temporization (adaptglok)
eulerimplicit,eulerexplicit,verlet,leapfrog = integration scheme, adaptglok {dtgrow} value = grow
{halfstepback} value = {yes} or {no}, adaptglok only :pre grow = factor increasing the timestep (adaptglok)
{dtshrink} value = shrink
shrink = factor decreasing the timestep (adaptglok)
{alpha0} value = alpha
alpha = coefficient mixing velocities and forces (adaptglok)
{alphashrink} value = shrink
shrink = factor decreasing alpha (adaptglok)
{relaxbox} value = {no} or {iso} or {axial} or {x} or {y} or {z}
no = no changes in box dimension (default)
iso,aniso,x,y,z = type of box relaxation (adaptglok)
{relaxbox_mod} value = modulus
modulus = bulk modulus of the system, order of magnitude (adaptglok)
{relaxbox_rate} value = rate
rate = scaling factor to relax the box dimensions (adaptglok)
{halfstepback} value = {yes} or {no} (adaptglok) :pre
:ule :ule
[Examples:] [Examples:]
min_modify dmax 0.2 :pre min_modify dmax 0.2
min_modify integrator verlet tmax 0.4 relaxbox y relaxbox_mod 2e7 :pre
[Description:] [Description:]
@ -85,21 +95,34 @@ that difference may be smaller than machine epsilon even if atoms
could move in the gradient direction to reduce forces further. could move in the gradient direction to reduce forces further.
The style {adaptglok} has several parameters that can be tuned in order The style {adaptglok} has several parameters that can be tuned in order
to optimize the relaxation: {integrator}, {delaystep}, {dtgrow}, {dtshrink}, to optimize the relaxation: {integrator}, {tmax}, {tmin}, {delaystep}, {dtgrow}, {dtshrink},
{alpha0}, {alphashrink}, {tmax} and {tmin}. {alpha0}, and {alphashrink}.
Different Newton {integrator} can be selected: explicit Euler, Different Newton {integrator} can be selected: explicit Euler,
semi-implicit Euler (= symplectic Euler), leapfrog, and velocity Verlet. semi-implicit Euler (= symplectic Euler), leapfrog, and velocity Verlet.
The parameters {tmax} and {tmin} define the maximum and minimum timestep The parameters {tmax} and {tmin} define the maximum and minimum timestep
allowed during an adaptglok minimization. Those are not in time unit, but are allowed during an adaptglok minimization. Those are not in time unit, but are
multiplication factor applied to the "timestep"_timestep.html. For example, multiplication factor applied to the "timestep"_timestep.html. Thus
{tmax} = 2.0 means that the maximum value the timestep can reach is twice the {tmax} = 2.0 in metal "units"_units.html means that the maximum value
value defined by "timestep"_timestep.html. the timestep can reached during the relaxation is 2 ps (with the default
"timestep"_timestep.html value).
Note that even with the default parameters being chosen to be reliable in most Note that even with the default parameters being chosen to be reliable in most
cases, adjusting "timestep"_timestep.html, {tmax} and {tmin} should be consider cases, adjusting "timestep"_timestep.html, {tmax} and {tmin} should be consider
to optimize the minimization, in particular for large/complex system. to optimize the minimization, in particular for large/complex system.
For debugging purposes, it is possible to switch off the back step when For debugging purposes, it is possible to switch off the back step when
downhill with {halfstepback} = 0. downhill with {halfstepback} = 0.
The style {adaptglok} performing a damped dynamics, it is not possible to use
"fix box/relax"_fix_box_relax.html to relax the simulation box.
Thus {adaptglok} implements a rudimentary box relaxation procedure that can be
controlled by the keywords {relaxbox}, {relaxbox_mod}, {relaxbox_rate}
and {ptol}.
Note that {relaxbox_mod} doesn't requires the exact value for the bulk modulus,
but rather the order of magnitude (in pressure "units"_units.html).
Ultimately, {relaxbox_mod} and {relaxbox_rate}
control how fast the relaxation of the box is performed: lower values will slow
down the box relaxation but improve the stability of the procedure.
[Restrictions:] none [Restrictions:] none
[Related commands:] [Related commands:]
@ -109,6 +132,7 @@ downhill with {halfstepback} = 0.
[Default:] [Default:]
The option defaults are dmax = 0.1, line = quadratic, The option defaults are dmax = 0.1, line = quadratic,
integrator = eulerimplicit, delaystep = 20, dt_grow = 1.1, dt_shrink = 0.5, integrator = eulerimplicit, tmax = 2.0, tmin = 0.02,
alpha0 = 0.25, alpha_shrink = 0.99, tmax = 2.0, tmin = 0.02, adaptstep = yes delaystep = 20, dt_grow = 1.1, dt_shrink = 0.5, alpha0 = 0.25, alpha_shrink = 0.99,
relaxbox = no, relaxbox_mod = 1e6 and relaxbox_rate = 0.33, ptol = 0.1
and halfstepback = yes. and halfstepback = yes.

View File

@ -78,6 +78,8 @@ would normally use for dynamics simulations.
NOTE: The {quickmin}, {fire}, {adaptglok}, and {hftn} styles do not yet support the NOTE: The {quickmin}, {fire}, {adaptglok}, and {hftn} styles do not yet support the
use of the "fix box/relax"_fix_box_relax.html command or minimizations use of the "fix box/relax"_fix_box_relax.html command or minimizations
involving the electron radius in "eFF"_pair_eff.html models. involving the electron radius in "eFF"_pair_eff.html models.
The {adaptglok} style actually support box relaxation by the implementation of
a basic relaxation scheme, see "min_modify"_min_modify.html.
[Restrictions:] none [Restrictions:] none

View File

@ -67,7 +67,7 @@ Min::Min(LAMMPS *lmp) : Pointers(lmp)
relaxbox_mod = 1000000; relaxbox_mod = 1000000;
relaxbox_rate = 0.33; relaxbox_rate = 0.33;
relaxbox_flag = 0; relaxbox_flag = 0;
ptol = 1e-5; ptol = 0.1;
p_flag[0] = p_flag[1] = p_flag[2] = 0; p_flag[0] = p_flag[1] = p_flag[2] = 0;
elist_global = elist_atom = NULL; elist_global = elist_atom = NULL;

View File

@ -24,6 +24,8 @@
#include "modify.h" #include "modify.h"
#include "compute.h" #include "compute.h"
#include "domain.h" #include "domain.h"
#include "neighbor.h"
#include "comm.h"
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
@ -46,8 +48,7 @@ void MinAdaptGlok::init()
if (tmax < tmin) error->all(FLERR,"tmax has to be larger than tmin"); if (tmax < tmin) error->all(FLERR,"tmax has to be larger than tmin");
if (dtgrow < 1.0) error->all(FLERR,"dtgrow has to be larger than 1.0"); if (dtgrow < 1.0) error->all(FLERR,"dtgrow has to be larger than 1.0");
if (dtshrink > 1.0) error->all(FLERR,"dtshrink has to be smaller than 1.0"); if (dtshrink > 1.0) error->all(FLERR,"dtshrink has to be smaller than 1.0");
if (relaxbox_mod < 0.0) if (relaxbox_mod < 0.0) error->all(FLERR,"relaxbox_mod has to be positif");
error->all(FLERR,"relaxbox_mod has to be positif");
// require periodicity in boxrelax dimensions // require periodicity in boxrelax dimensions
@ -65,9 +66,7 @@ void MinAdaptGlok::init()
last_negative = ntimestep_start = update->ntimestep; last_negative = ntimestep_start = update->ntimestep;
if (relaxbox_flag){ if (relaxbox_flag){
int icompute = modify->find_compute("thermo_temp"); int icompute = modify->find_compute("thermo_press");
temperature = modify->compute[icompute];
icompute = modify->find_compute("thermo_press");
pressure = modify->compute[icompute]; pressure = modify->compute[icompute];
} }
} }
@ -79,6 +78,24 @@ void MinAdaptGlok::setup_style()
double **v = atom->v; double **v = atom->v;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
// print the parameters used within adaptglok into the log
const char *s1[] = {"eulerimplicit","verlet","leapfrog","eulerexplicit"};
const char *s2[] = {"no","yes"};
const char *s3[] = {"no","iso","aniso"};
if (comm->me == 0 && logfile) {
fprintf(logfile," Parameters for adaptglok: \n"
" dmax delaystep dtgrow dtshrink alpha0 alphashrink tmax tmin "
" integrator halfstepback relaxbox relaxbox_mod relaxbox_rate ptol \n"
" %4g %9i %6g %8g %6g %11g %4g %4g %13s %12s %8s %12g %13g %4g \n",
dmax, delaystep, dtgrow, dtshrink, alpha0, alphashrink, tmax, tmin,
s1[integrator], s2[halfstepback_flag], s3[relaxbox_flag], relaxbox_mod,
relaxbox_rate, ptol);
}
// initialize the velocities
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;
} }
@ -122,7 +139,7 @@ void MinAdaptGlok::relax_box()
// rescale simulation box and scale atom coords for all atoms // rescale simulation box and scale atom coords for all atoms
double **x = atom->x; double **x = atom->x;
double epsilon; double epsilon,disp;
double *current_pressure_v; double *current_pressure_v;
int *mask = atom->mask; int *mask = atom->mask;
n = atom->nlocal + atom->nghost; n = atom->nlocal + atom->nghost;
@ -144,7 +161,9 @@ void MinAdaptGlok::relax_box()
epsilon = pressure->scalar / relaxbox_mod; epsilon = pressure->scalar / relaxbox_mod;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
if (relaxbox_flag == 2) epsilon = pressure->vector[i] / relaxbox_mod; if (relaxbox_flag == 2) epsilon = pressure->vector[i] / relaxbox_mod;
domain->boxhi[i] += p_flag[i] * domain->boxhi[i] * epsilon * relaxbox_rate; disp = domain->boxhi[i] * epsilon * relaxbox_rate;
if (fabs(disp) > dmax) disp > 0.0 ? disp = dmax : disp = -1 * dmax;
domain->boxhi[i] += p_flag[i] * disp;
} }
// reset global and local box to new size/shape // reset global and local box to new size/shape