Merge remote-tracking branch 'lammps-ro/master' into lammps-icms

This commit is contained in:
Axel Kohlmeyer
2015-10-14 09:15:36 -04:00
4 changed files with 127 additions and 49 deletions

View File

@ -23,7 +23,7 @@ T = temperature of the ideal gas reservoir (temperature units) :l
mu = chemical potential of the ideal gas reservoir (energy units) :l
translate = maximum Monte Carlo translation distance (length units) :l
zero or more keyword/value pairs may be appended to args :l
keyword = {mol}, {region}, {maxangle}, {pressure}, {fugacity_coeff}, {full_energy}, {charge}, {group}, {grouptype}, or {intra_energy}
keyword = {mol}, {region}, {maxangle}, {pressure}, {fugacity_coeff}, {full_energy}, {charge}, {group}, {grouptype}, {intra_energy}, or {tfac_insert}
{mol} value = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command
{shake} value = fix-ID
@ -40,7 +40,8 @@ keyword = {mol}, {region}, {maxangle}, {pressure}, {fugacity_coeff}, {full_energ
{grouptype} values = type group-ID
type = atom type (int)
group-ID = group-ID for inserted atoms (string)
{intra_energy} value = intramolecular energy (energy units) :pre
{intra_energy} value = intramolecular energy (energy units)
{tfac_insert} value = scale up/down temperature of inserted atoms (unitless) :pre
:ule
[Examples:]
@ -119,7 +120,14 @@ until the atom or molecule center-of-mass is inside the specified region.
If used with "fix_nvt"_fix_nvt.html, the temperature of the imaginary
reservoir, T, should be set to be equivalent to the target temperature
used in "fix_nvt"_fix_nvt.html. Otherwise, the imaginary reservoir
will not be in thermal equilibrium with the simulation cell.
will not be in thermal equilibrium with the simulation cell. Also,
it is important that the temperature used by fix nvt be dynamic,
which can be achieved as follows:
compute mdtemp mdatoms temp
compute_modify mdtemp dynamic yes
fix mdnvt mdatoms nvt temp 300.0 300.0 10.0
fix_modify mdnvt temp mdtemp :pre
Note that neighbor lists are re-built every timestep that this fix is
invoked, so you should not set N to be too small. However, periodic
@ -131,7 +139,9 @@ distance. See the "neighbor"_neighbor.html command for details.
When an atom or molecule is to be inserted, its
coordinates are chosen at a random position within the current
simulation cell or region, and new atom velocities are randomly chosen from
the specified temperature distribution given by T. Relative
the specified temperature distribution given by T. The effective
temperature for new atom velocities can be increased or decreased
using the optional keyword {tfac_insert} (see below). Relative
coordinates for atoms in a molecule are taken from the template
molecule provided by the user. The center of mass of the molecule
is placed at the insertion point. The orientation of the molecule
@ -217,6 +227,19 @@ deleted. For molecules that have a non-zero intramolecular energy, this
will ensure roughly the same behavior whether or not the {full_energy}
option is used.
Inserted atoms and molecules are assigned random velocities based on the
specified temperature T. Because the relative velocity of
all atoms in the molecule is zero, this may result in inserted molecules
that are systematically too cold. In addition, the intramolecular potential
energy of the inserted molecule may casue the kinetic energy
of the molecule to quickly increase or decrease after insertion.
The {tfac_insert} keyword allows the user to counteract these effects
by changing the temperature used to assign velocities to
inserted atoms and molecules by a constant factor. For a
particular application, some experimentation may be required
to find a value of {tfac_insert} that results in inserted molecules that
equilibrate quickly to the correct temperature.
Some fixes have an associated potential energy. Examples of such fixes
include: "efield"_fix_efield.html, "gravity"_fix_gravity.html,
"addforce"_fix_addforce.html, "langevin"_fix_langevin.html,

View File

@ -240,6 +240,7 @@ void FixGCMC::options(int narg, char **arg)
grouptypes = NULL;
grouptypebits = NULL;
energy_intra = 0.0;
tfac_insert = 1.0;
int iarg = 0;
while (iarg < narg) {
@ -330,6 +331,10 @@ void FixGCMC::options(int narg, char **arg)
if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command");
energy_intra = force->numeric(FLERR,arg[iarg+1]);
iarg += 2;
} else if (strcmp(arg[iarg],"tfac_insert") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command");
tfac_insert = force->numeric(FLERR,arg[iarg+1]);
iarg += 2;
} else error->all(FLERR,"Illegal fix gcmc command");
}
}
@ -530,7 +535,6 @@ void FixGCMC::init()
onemols[imol]->compute_mass();
onemols[imol]->compute_com();
gas_mass = onemols[imol]->masstotal;
printf("gas_mass = %g\n",gas_mass);
for (int i = 0; i < onemols[imol]->natoms; i++) {
onemols[imol]->x[i][0] -= onemols[imol]->com[0];
onemols[imol]->x[i][1] -= onemols[imol]->com[1];
@ -566,7 +570,7 @@ void FixGCMC::init()
double lambda = sqrt(force->hplanck*force->hplanck/
(2.0*MY_PI*gas_mass*force->mvv2e*
force->boltz*reservoir_temperature));
sigma = sqrt(force->boltz*reservoir_temperature/gas_mass/force->mvv2e);
sigma = sqrt(force->boltz*reservoir_temperature*tfac_insert/gas_mass/force->mvv2e);
zz = exp(beta*chemical_potential)/(pow(lambda,3.0));
if (pressure_flag) zz = pressure*fugacity_coeff*beta/force->nktv2p;
@ -1272,9 +1276,9 @@ void FixGCMC::attempt_molecule_insertion()
int nlocalprev = atom->nlocal;
double vnew[3];
vnew[0] = random_unequal->gaussian()*sigma;
vnew[1] = random_unequal->gaussian()*sigma;
vnew[2] = random_unequal->gaussian()*sigma;
vnew[0] = random_equal->gaussian()*sigma;
vnew[1] = random_equal->gaussian()*sigma;
vnew[2] = random_equal->gaussian()*sigma;
for (int i = 0; i < natoms_per_molecule; i++) {
if (procflag[i]) {
@ -1897,9 +1901,9 @@ void FixGCMC::attempt_molecule_insertion_full()
MathExtra::quat_to_mat(quat,rotmat);
double vnew[3];
vnew[0] = random_unequal->gaussian()*sigma;
vnew[1] = random_unequal->gaussian()*sigma;
vnew[2] = random_unequal->gaussian()*sigma;
vnew[0] = random_equal->gaussian()*sigma;
vnew[1] = random_equal->gaussian()*sigma;
vnew[2] = random_equal->gaussian()*sigma;
for (int i = 0; i < natoms_per_molecule; i++) {
double xtmp[3];

View File

@ -97,6 +97,7 @@ class FixGCMC : public Fix {
int max_region_attempts;
double gas_mass;
double reservoir_temperature;
double tfac_insert;
double chemical_potential;
double displace;
double max_rotation_angle;

View File

@ -5,7 +5,7 @@
# Syntax: Make.py -h (for help)
# Notes: needs python 2.7 (not Python 3)
import sys,os,commands,re,copy
import sys,os,commands,re,copy,subprocess
# switch abbrevs
# switch classes = created class for each switch
@ -332,11 +332,11 @@ class Actions:
make.addvar("CCFLAGS","-restrict")
if final["user-omp"]:
if compile_check(compiler,"-fopenmp",1):
make.addvar("CCFLAGS","-fopenmp")
make.addvar("LINKFLAGS","-fopenmp")
if compile_check(compiler,"-restrict",0):
make.addvar("CCFLAGS","-restrict")
if compile_check(compiler,"-fopenmp",1):
make.addvar("CCFLAGS","-fopenmp")
make.addvar("LINKFLAGS","-fopenmp")
if final["user-intel"]:
if intel.mode == "cpu":
@ -496,7 +496,7 @@ class Actions:
def clean(self):
str = "cd %s; make clean-auto" % dir.src
commands.getoutput(str)
if verbose: print "Performed make clean-auto"
print "Performed make clean-auto"
# build LAMMPS using Makefile.auto and -j setting
# invoke self.file() first, to test makefile compile/link
@ -516,10 +516,15 @@ class Actions:
print "Created src/STUBS/libmpi_stubs.a"
if jmake: str = "cd %s; make -j %d auto" % (dir.src,jmake.n)
else: str = "cd %s; make auto" % dir.src
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/lmp_auto" % dir.src):
if not verbose: print txt
error('Unsuccessful "make auto"')
elif not output: print "Created src/lmp_auto"
@ -968,11 +973,16 @@ class ATC:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libatc.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/atc library")
else: print "Created lib/atc library"
@ -1015,11 +1025,16 @@ class AWPMD:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libawpmd.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/awpmd library")
else: print "Created lib/awpmd library"
@ -1062,11 +1077,16 @@ class COLVARS:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libcolvars.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/colvars library")
else: print "Created lib/colvars library"
@ -1115,11 +1135,16 @@ class CUDA:
(libdir,jmake.n,n,self.arch)
else: str = str = "cd %s; make precision=%d arch=%s" % \
(libdir,n,self.arch)
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/liblammpscuda.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/cuda library")
else: print "Created lib/cuda library"
@ -1185,11 +1210,16 @@ class GPU:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libgpu.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/gpu library")
else: print "Created lib/gpu library"
@ -1232,11 +1262,16 @@ class MEAM:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
# do not use -j for MEAM build, parallel build does not work
str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libmeam.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/meam library")
else: print "Created lib/meam library"
@ -1279,11 +1314,16 @@ class POEMS:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libpoems.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/poems library")
else: print "Created lib/poems library"
@ -1326,11 +1366,16 @@ class QMMM:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libqmmm.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/qmmm library")
else: print "Created lib/qmmm library"
@ -1373,11 +1418,16 @@ class REAX:
commands.getoutput("cd %s; make -f Makefile.auto clean" % libdir)
if jmake: str = "cd %s; make -j %d -f Makefile.auto" % (libdir,jmake.n)
else: str = "cd %s; make -f Makefile.auto" % libdir
txt = commands.getoutput(str)
if verbose: print txt
# if verbose, print output as build proceeds, else only print if fails
if verbose: subprocess.call(str,shell=True)
else:
try: subprocess.check_output(str,stderr=subprocess.STDOUT,shell=True)
except Exception as e: print e.output
if not os.path.isfile("%s/libreax.a" % libdir) or \
not os.path.isfile("%s/Makefile.lammps" % libdir):
if not verbose: print txt
error("Unsuccessful build of lib/reax library")
else: print "Created lib/reax library"
@ -1573,10 +1623,10 @@ class Fft:
change FFT settings in makefile
mode is required, all other args are optional
removes all current FFT variable settings
mode = none or fftw or fftw3 of ...
mode = none or fftw or fftw3 or ...
adds -DFFT_MODE setting
lib = name of FFT library to link with (def is libname = mode)
adds -lliblib setting, e.g. -llibfftw3
adds -llib{libname} setting, e.g. -llibfftw3
dir = home dir for include and library files (def = none)
adds -Idir/include and -Ldir/lib settings
if set, overrides idir and ldir args