added options to compute bond/local

This commit is contained in:
Steve Plimpton 2016-09-13 17:03:37 -06:00
parent fe2fca4e9b
commit 25e518a4f4
8 changed files with 350 additions and 72 deletions

View File

@ -128,9 +128,9 @@
<span id="index-0"></span><h1>comm_modify command</h1>
<div class="section" id="syntax">
<h2>Syntax</h2>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">comm_modify</span> <span class="n">keyword</span> <span class="n">value</span> <span class="o">...</span>
</pre></div>
</div>
<pre class="literal-block">
comm_modify keyword value ...
</pre>
<ul class="simple">
<li>zero or more keyword/value pairs may be appended</li>
<li>keyword = <em>mode</em> or <em>cutoff</em> or <em>cutoff/multi</em> or <em>group</em> or <em>vel</em></li>
@ -147,14 +147,14 @@
</div>
<div class="section" id="examples">
<h2>Examples</h2>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">comm_modify</span> <span class="n">mode</span> <span class="n">multi</span>
<span class="n">comm_modify</span> <span class="n">mode</span> <span class="n">multi</span> <span class="n">group</span> <span class="n">solvent</span>
<span class="n">comm_modift</span> <span class="n">mode</span> <span class="n">multi</span> <span class="n">cutoff</span><span class="o">/</span><span class="n">multi</span> <span class="mi">1</span> <span class="mf">10.0</span> <span class="n">cutoff</span><span class="o">/</span><span class="n">multi</span> <span class="mi">2</span><span class="o">*</span><span class="mi">4</span> <span class="mf">15.0</span>
<span class="n">comm_modify</span> <span class="n">vel</span> <span class="n">yes</span>
<span class="n">comm_modify</span> <span class="n">mode</span> <span class="n">single</span> <span class="n">cutoff</span> <span class="mf">5.0</span> <span class="n">vel</span> <span class="n">yes</span>
<span class="n">comm_modify</span> <span class="n">cutoff</span><span class="o">/</span><span class="n">multi</span> <span class="o">*</span> <span class="mf">0.0</span>
</pre></div>
</div>
<pre class="literal-block">
comm_modify mode multi
comm_modify mode multi group solvent
comm_modift mode multi cutoff/multi 1 10.0 cutoff/multi 2*4 15.0
comm_modify vel yes
comm_modify mode single cutoff 5.0 vel yes
comm_modify cutoff/multi * 0.0
</pre>
</div>
<div class="section" id="description">
<h2>Description</h2>

View File

@ -135,18 +135,25 @@
<li>ID, group-ID are documented in <a class="reference internal" href="compute.html"><span class="doc">compute</span></a> command</li>
<li>bond/local = style name of this compute command</li>
<li>one or more values may be appended</li>
<li>value = <em>dist</em> or <em>eng</em> or <em>force</em></li>
<li>value = <em>dist</em> or <em>engpot</em> or <em>force</em> or <em>engvib</em> or <em>engrot</em> or <em>engtrans</em> or <em>omega</em> or <em>velvib</em></li>
</ul>
<pre class="literal-block">
<em>dist</em> = bond distance
<em>eng</em> = bond energy
<em>engpot</em> = bond potential energy
<em>force</em> = bond force
</pre>
<pre class="literal-block">
<em>engvib</em> = bond kinetic energy of vibration
<em>engrot</em> = bond kinetic energy of rotation
<em>engtrans</em> = bond kinetic energy of translation
<em>omega</em> = magnitude of bond angular velocity
<em>velvib</em> = vibrational velocity along the bond length
</pre>
</div>
<div class="section" id="examples">
<h2>Examples</h2>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">compute</span> <span class="mi">1</span> <span class="nb">all</span> <span class="n">bond</span><span class="o">/</span><span class="n">local</span> <span class="n">eng</span>
<span class="n">compute</span> <span class="mi">1</span> <span class="nb">all</span> <span class="n">bond</span><span class="o">/</span><span class="n">local</span> <span class="n">dist</span> <span class="n">eng</span> <span class="n">force</span>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">compute</span> <span class="mi">1</span> <span class="nb">all</span> <span class="n">bond</span><span class="o">/</span><span class="n">local</span> <span class="n">engpot</span>
<span class="n">compute</span> <span class="mi">1</span> <span class="nb">all</span> <span class="n">bond</span><span class="o">/</span><span class="n">local</span> <span class="n">dist</span> <span class="n">engpot</span> <span class="n">force</span>
</pre></div>
</div>
</div>
@ -154,12 +161,42 @@
<h2>Description</h2>
<p>Define a computation that calculates properties of individual bond
interactions. The number of datums generated, aggregated across all
processors, equals the number of bonds in the system, modified
by the group parameter as explained below.</p>
<p>The value <em>dist</em> is the length of the bond.</p>
<p>The value <em>eng</em> is the interaction energy for the bond.</p>
<p>The value <em>force</em> is the force acting between the pair of atoms in the
processors, equals the number of bonds in the system, modified by the
group parameter as explained below.</p>
<p>The value <em>dist</em> is the current length of the bond.</p>
<p>The value <em>engpot</em> is the potential energy for the bond,
based on the current separation of the pair of atoms in the bond.</p>
<p>The value <em>force</em> is the magnitude of the force acting between the
pair of atoms in the bond.</p>
<p>The remaining properties are all computed for motion of the two atoms
relative to the center of mass (COM) velocity of the 2 atoms in the
bond.</p>
<p>The value <em>engvib</em> is the vibrational kinetic energy of the two atoms
in the bond, which is simply 1/2 m1 v1^2 + 1/2 m1 v2^2, where v1 and
v2 are the magnitude of the velocity of the 2 atoms along the bond
direction, after the COM velocity has been subtracted from each.</p>
<p>The value <em>engrot</em> is the rotationsl kinetic energy of the two atoms
in the bond, which is simply 1/2 m1 v1^2 + 1/2 m1 v2^2, where v1 and
v2 are the magnitude of the velocity of the 2 atoms perpendicular to
the bond direction, after the COM velocity has been subtracted from
each.</p>
<p>The value <em>engtrans</em> is the translational kinetic energy associated
with the motion of the COM of the system itself, namely 1/2 (m1+m2)
Vcm^2 where Vcm = magnitude of the velocity of the COM.</p>
<p>Note that these 3 kinetic energy terms are simply a partitioning of
the summed kinetic energy of the 2 atoms themselves. I.e. total KE =
1/2 m1 v1^2 + 1/2 m2 v3^2 = engvib + engrot + engtrans, where v1,v2
are the magnitude of the velocities of the 2 atoms, without any
adjustment for the COM velocity.</p>
<p>The value <em>omega</em> is the magnitude of the angular velocity of the
two atoms around their COM position.</p>
<p>The value <em>velvib</em> is the magnitude of the relative velocity of the
two atoms in the bond towards each other. A negative value means the
2 atoms are moving toward each other; a positive value means they are
moving apart.</p>
<p>Note that all these properties are computed for the pair of atoms in a
bond, whether the 2 atoms represent a simple diatomic molecule, or are
part of some larger molecule.</p>
<p>The local data stored by this command is generated by looping over all
the atoms owned on a processor and their bonds. A bond will only be
included if both atoms in the bond are in the specified compute group.
@ -179,8 +216,8 @@ command in a consistent way.</p>
<p>Here is an example of how to do this:</p>
<pre class="literal-block">
compute 1 all property/local btype batom1 batom2
compute 2 all bond/local dist eng
dump 1 all local 1000 tmp.dump index c_1[1] c_1[2] c_1[3] c_2[1] c_2[2]
compute 2 all bond/local dist engpot
dump 1 all local 1000 tmp.dump index c_1[*] c_2[*]
</pre>
<p><strong>Output info:</strong></p>
<p>This compute calculates a local vector or local array depending on the
@ -191,9 +228,12 @@ local array is produced where the number of columns = the number of
keywords. The vector or array can be accessed by any command that
uses local values from a compute as input. See <a class="reference internal" href="Section_howto.html#howto-15"><span class="std std-ref">this section</span></a> for an overview of LAMMPS output
options.</p>
<p>The output for <em>dist</em> will be in distance <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The
output for <em>eng</em> will be in energy <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The output for
<em>force</em> will be in force <a class="reference internal" href="units.html"><span class="doc">units</span></a>.</p>
<p>The output for <em>dist</em> will be in distance <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The
output for <em>velvib</em> will be in velocity <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The output
for <em>omega</em> will be in velocity/distance <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The
output for <em>engtrans</em>, <em>engvib</em>, <em>engrot</em>, and <em>engpot</em> will be in
energy <a class="reference internal" href="units.html"><span class="doc">units</span></a>. The output for <em>force</em> will be in force
<a class="reference internal" href="units.html"><span class="doc">units</span></a>.</p>
</div>
<div class="section" id="restrictions">
<h2>Restrictions</h2>

View File

@ -344,7 +344,7 @@
</dt>
<dt><a href="comm_modify.html#index-0">comm_modify</a>
<dt><a href="comm_modify.html#index-0">comm\_modify</a>
</dt>
@ -1768,6 +1768,10 @@
</dt>
<dt><a href="pair_vashishta.html#index-0">pair\_style vashishta</a>
</dt>
<dt><a href="pair_coeff.html#index-0">pair_coeff</a>
</dt>
@ -1939,12 +1943,12 @@
<dt><a href="pair_lj_sf.html#index-0">pair_style lj/sf</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="pair_lj_smooth.html#index-0">pair_style lj/smooth</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="pair_lj_smooth_linear.html#index-0">pair_style lj/smooth/linear</a>
</dt>
@ -2102,10 +2106,6 @@
</dt>
<dt><a href="pair_vashishta.html#index-0">pair_style vashishta</a>
</dt>
<dt><a href="pair_yukawa.html#index-0">pair_style yukawa</a>
</dt>

View File

@ -15,31 +15,74 @@ compute ID group-ID bond/local value1 value2 ... :pre
ID, group-ID are documented in "compute"_compute.html command :ulb,l
bond/local = style name of this compute command :l
one or more values may be appended :l
value = {dist} or {eng} or {force} :l
value = {dist} or {engpot} or {force} or {engvib} or {engrot} or {engtrans} or {omega} or {velvib} :l
{dist} = bond distance
{eng} = bond energy
{engpot} = bond potential energy
{force} = bond force :pre
{engvib} = bond kinetic energy of vibration
{engrot} = bond kinetic energy of rotation
{engtrans} = bond kinetic energy of translation
{omega} = magnitude of bond angular velocity
{velvib} = vibrational velocity along the bond length :pre
:ule
[Examples:]
compute 1 all bond/local eng
compute 1 all bond/local dist eng force :pre
compute 1 all bond/local engpot
compute 1 all bond/local dist engpot force :pre
[Description:]
Define a computation that calculates properties of individual bond
interactions. The number of datums generated, aggregated across all
processors, equals the number of bonds in the system, modified
by the group parameter as explained below.
processors, equals the number of bonds in the system, modified by the
group parameter as explained below.
The value {dist} is the length of the bond.
The value {dist} is the current length of the bond.
The value {eng} is the interaction energy for the bond.
The value {engpot} is the potential energy for the bond,
based on the current separation of the pair of atoms in the bond.
The value {force} is the force acting between the pair of atoms in the
The value {force} is the magnitude of the force acting between the
pair of atoms in the bond.
The remaining properties are all computed for motion of the two atoms
relative to the center of mass (COM) velocity of the 2 atoms in the
bond.
The value {engvib} is the vibrational kinetic energy of the two atoms
in the bond, which is simply 1/2 m1 v1^2 + 1/2 m1 v2^2, where v1 and
v2 are the magnitude of the velocity of the 2 atoms along the bond
direction, after the COM velocity has been subtracted from each.
The value {engrot} is the rotationsl kinetic energy of the two atoms
in the bond, which is simply 1/2 m1 v1^2 + 1/2 m1 v2^2, where v1 and
v2 are the magnitude of the velocity of the 2 atoms perpendicular to
the bond direction, after the COM velocity has been subtracted from
each.
The value {engtrans} is the translational kinetic energy associated
with the motion of the COM of the system itself, namely 1/2 (m1+m2)
Vcm^2 where Vcm = magnitude of the velocity of the COM.
Note that these 3 kinetic energy terms are simply a partitioning of
the summed kinetic energy of the 2 atoms themselves. I.e. total KE =
1/2 m1 v1^2 + 1/2 m2 v3^2 = engvib + engrot + engtrans, where v1,v2
are the magnitude of the velocities of the 2 atoms, without any
adjustment for the COM velocity.
The value {omega} is the magnitude of the angular velocity of the
two atoms around their COM position.
The value {velvib} is the magnitude of the relative velocity of the
two atoms in the bond towards each other. A negative value means the
2 atoms are moving toward each other; a positive value means they are
moving apart.
Note that all these properties are computed for the pair of atoms in a
bond, whether the 2 atoms represent a simple diatomic molecule, or are
part of some larger molecule.
The local data stored by this command is generated by looping over all
the atoms owned on a processor and their bonds. A bond will only be
included if both atoms in the bond are in the specified compute group.
@ -62,8 +105,8 @@ command in a consistent way.
Here is an example of how to do this:
compute 1 all property/local btype batom1 batom2
compute 2 all bond/local dist eng
dump 1 all local 1000 tmp.dump index c_1\[1\] c_1\[2\] c_1\[3\] c_2\[1\] c_2\[2\] :pre
compute 2 all bond/local dist engpot
dump 1 all local 1000 tmp.dump index c_1\[*\] c_2\[*\] :pre
[Output info:]
@ -77,9 +120,12 @@ uses local values from a compute as input. See "this
section"_Section_howto.html#howto_15 for an overview of LAMMPS output
options.
The output for {dist} will be in distance "units"_units.html. The
output for {eng} will be in energy "units"_units.html. The output for
{force} will be in force "units"_units.html.
The output for {dist} will be in distance "units"_units.html. The
output for {velvib} will be in velocity "units"_units.html. The output
for {omega} will be in velocity/distance "units"_units.html. The
output for {engtrans}, {engvib}, {engrot}, and {engpot} will be in
energy "units"_units.html. The output for {force} will be in force
"units"_units.html.
[Restrictions:] none

View File

@ -21,14 +21,17 @@
#include "domain.h"
#include "force.h"
#include "bond.h"
#include "math_extra.h"
#include "comm.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define EPSILON 1.0e-12
enum{DIST,ENG,FORCE};
enum{DIST,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE};
/* ---------------------------------------------------------------------- */
@ -42,6 +45,8 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) :
error->all(FLERR,"Compute bond/local used when bonds are not allowed");
local_flag = 1;
comm_forward = 3;
nvalues = narg - 3;
if (nvalues == 1) size_local_cols = 0;
else size_local_cols = nvalues;
@ -51,16 +56,26 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) :
nvalues = 0;
for (int iarg = 3; iarg < narg; iarg++) {
if (strcmp(arg[iarg],"dist") == 0) bstyle[nvalues++] = DIST;
else if (strcmp(arg[iarg],"eng") == 0) bstyle[nvalues++] = ENG;
else if (strcmp(arg[iarg],"engpot") == 0) bstyle[nvalues++] = ENGPOT;
else if (strcmp(arg[iarg],"force") == 0) bstyle[nvalues++] = FORCE;
else if (strcmp(arg[iarg],"engvib") == 0) bstyle[nvalues++] = ENGVIB;
else if (strcmp(arg[iarg],"engrot") == 0) bstyle[nvalues++] = ENGROT;
else if (strcmp(arg[iarg],"engtrans") == 0) bstyle[nvalues++] = ENGTRANS;
else if (strcmp(arg[iarg],"omega") == 0) bstyle[nvalues++] = OMEGA;
else if (strcmp(arg[iarg],"velvib") == 0) bstyle[nvalues++] = VELVIB;
else error->all(FLERR,"Invalid keyword in compute bond/local command");
}
// set singleflag if need to call bond->single()
// set velflag if compute any quantities based on velocities
singleflag = 0;
for (int i = 0; i < nvalues; i++)
if (bstyle[i] != DIST) singleflag = 1;
ghostvelflag = 0;
for (int i = 0; i < nvalues; i++) {
if (bstyle[i] == ENGPOT || bstyle[i] == FORCE) singleflag = 1;
if (bstyle[i] == VELVIB || bstyle[i] == OMEGA || bstyle[i] == ENGTRANS ||
bstyle[i] == ENGVIB || bstyle[i] == ENGROT) velflag = 1;
}
nmax = 0;
}
@ -81,9 +96,17 @@ void ComputeBondLocal::init()
if (force->bond == NULL)
error->all(FLERR,"No bond style is defined for compute bond/local");
// set ghostvelflag if need to acquire ghost atom velocities
if (velflag && !comm->ghost_velocity) ghostvelflag = 1;
else ghostvelflag = 0;
// do initial memory allocation so that memory_usage() is correct
initflag = 1;
ncount = compute_bonds(0);
initflag = 0;
if (ncount > nmax) reallocate(ncount);
size_local_rows = ncount;
}
@ -117,10 +140,22 @@ int ComputeBondLocal::compute_bonds(int flag)
{
int i,m,n,nb,atom1,atom2,imol,iatom,btype;
tagint tagprev;
double delx,dely,delz,rsq;
double dx,dy,dz,rsq;
double mass1,mass2,masstotal,invmasstotal;
double xcm[3],vcm[3];
double delr1[3],delr2[3],delv1[3],delv2[3];
double r12[3],vpar1,vpar2;
double vvib,vrotsq;
double inertia,omegasq;
double mvv2e;
double engpot,engtrans,engvib,engrot,engtot,fbond;
double *ptr;
double **x = atom->x;
double **v = atom->v;
int *type = atom->type;
double *mass = atom->mass;
double *rmass = atom->rmass;
tagint *tag = atom->tag;
int *num_bond = atom->num_bond;
tagint **bond_atom = atom->bond_atom;
@ -136,7 +171,12 @@ int ComputeBondLocal::compute_bonds(int flag)
int molecular = atom->molecular;
Bond *bond = force->bond;
double eng,fbond;
// communicate ghost velocities if needed
if (ghostvelflag && !initflag) comm->forward_comm_compute(this);
// loop over all atoms and their bonds
m = n = 0;
for (atom1 = 0; atom1 < nlocal; atom1++) {
@ -164,16 +204,93 @@ int ComputeBondLocal::compute_bonds(int flag)
if (newton_bond == 0 && tag[atom1] > tag[atom2]) continue;
if (btype == 0) continue;
if (flag) {
delx = x[atom1][0] - x[atom2][0];
dely = x[atom1][1] - x[atom2][1];
delz = x[atom1][2] - x[atom2][2];
domain->minimum_image(delx,dely,delz);
rsq = delx*delx + dely*dely + delz*delz;
if (!flag) {
m++;
continue;
}
if (singleflag && (btype > 0))
eng = bond->single(btype,rsq,atom1,atom2,fbond);
else eng = fbond = 0.0;
dx = x[atom1][0] - x[atom2][0];
dy = x[atom1][1] - x[atom2][1];
dz = x[atom1][2] - x[atom2][2];
domain->minimum_image(dx,dy,dz);
rsq = dx*dx + dy*dy + dz*dz;
if (btype == 0) {
engpot = fbond = 0.0;
engvib = engrot = engtrans = omegasq = vvib = 0.0;
} else {
if (singleflag) engpot = bond->single(btype,rsq,atom1,atom2,fbond);
if (velflag) {
if (rmass) {
mass1 = rmass[atom1];
mass2 = rmass[atom2];
}
else {
mass1 = mass[type[atom1]];
mass2 = mass[type[atom2]];
}
masstotal = mass1+mass2;
invmasstotal = 1.0 / (masstotal);
xcm[0] = (mass1*x[atom1][0] + mass2*x[atom2][0]) * invmasstotal;
xcm[1] = (mass1*x[atom1][1] + mass2*x[atom2][1]) * invmasstotal;
xcm[2] = (mass1*x[atom1][2] + mass2*x[atom2][2]) * invmasstotal;
vcm[0] = (mass1*v[atom1][0] + mass2*v[atom2][0]) * invmasstotal;
vcm[1] = (mass1*v[atom1][1] + mass2*v[atom2][1]) * invmasstotal;
vcm[2] = (mass1*v[atom1][2] + mass2*v[atom2][2]) * invmasstotal;
engtrans = 0.5 * masstotal * MathExtra::lensq3(vcm);
// r12 = unit bond vector from atom1 to atom2
MathExtra::sub3(x[atom2],x[atom1],r12);
MathExtra::norm3(r12);
// delr = vector from COM to each atom
// delv = velocity of each atom relative to COM
MathExtra::sub3(x[atom1],xcm,delr1);
MathExtra::sub3(x[atom2],xcm,delr2);
MathExtra::sub3(v[atom1],vcm,delv1);
MathExtra::sub3(v[atom2],vcm,delv2);
// vpar = component of delv parallel to bond vector
vpar1 = MathExtra::dot3(delv1,r12);
vpar2 = MathExtra::dot3(delv2,r12);
engvib = 0.5 * (mass1*vpar1*vpar1 + mass2*vpar2*vpar2);
// vvib = relative velocity of 2 atoms along bond direction
// vvib < 0 for 2 atoms moving towards each other
// vvib > 0 for 2 atoms moving apart
vvib = vpar2 - vpar1;
// vrotsq = tangential speed squared of atom1 only
// omegasq = omega squared, and is the same for atom1 and atom2
inertia = mass1*MathExtra::lensq3(delr1) +
mass2*MathExtra::lensq3(delr2);
vrotsq = MathExtra::lensq3(delv1) - vpar1*vpar1;
omegasq = vrotsq / MathExtra::lensq3(delr1);
engrot = 0.5 * inertia * omegasq;
// sanity check: engtotal = engtrans + engvib + engrot
//engtot = 0.5 * (mass1*MathExtra::lensq3(v[atom1]) +
// mass2*MathExtra::lensq3(v[atom2]));
//if (fabs(engtot-engtrans-engvib-engrot) > EPSILON)
// error->one(FLERR,"Sanity check on 3 energy components failed");
// scale energies by units
mvv2e = force->mvv2e;
engtrans *= mvv2e;
engvib *= mvv2e;
engrot *= mvv2e;
}
if (nvalues == 1) ptr = &vector[m];
else ptr = array[m];
@ -183,12 +300,27 @@ int ComputeBondLocal::compute_bonds(int flag)
case DIST:
ptr[n] = sqrt(rsq);
break;
case ENG:
ptr[n] = eng;
case ENGPOT:
ptr[n] = engpot;
break;
case FORCE:
ptr[n] = sqrt(rsq)*fbond;
break;
case ENGVIB:
ptr[n] = engvib;
break;
case ENGROT:
ptr[n] = engrot;
break;
case ENGTRANS:
ptr[n] = engtrans;
break;
case OMEGA:
ptr[n] = sqrt(omegasq);
break;
case VELVIB:
ptr[n] = vvib;
break;
}
}
}
@ -202,6 +334,43 @@ int ComputeBondLocal::compute_bonds(int flag)
/* ---------------------------------------------------------------------- */
int ComputeBondLocal::pack_forward_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double **v = atom->v;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
}
return m;
}
/* ---------------------------------------------------------------------- */
void ComputeBondLocal::unpack_forward_comm(int n, int first, double *buf)
{
int i,m,last;
double **v = atom->v;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
void ComputeBondLocal::reallocate(int n)
{
// grow vector or array and indices array

View File

@ -30,13 +30,15 @@ class ComputeBondLocal : public Compute {
~ComputeBondLocal();
void init();
void compute_local();
int pack_forward_comm(int, int *, double *, int, int *);
void unpack_forward_comm(int, int, double *);
double memory_usage();
private:
int nvalues;
int ncount;
int *bstyle;
int singleflag;
int singleflag,velflag,ghostvelflag,initflag;
int nmax;

View File

@ -21,6 +21,7 @@
#include "compute.h"
#include "domain.h"
#include "update.h"
#include "input.h"
#include "memory.h"
#include "error.h"
#include "force.h"
@ -45,7 +46,18 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) :
nevery = force->inumeric(FLERR,arg[3]);
if (nevery <= 0) error->all(FLERR,"Illegal dump local command");
size_one = nfield = narg-5;
nfield = narg - 5;
// expand args if any have wildcard character "*"
int expand = 0;
char **earg;
nfield = input->expand_args(nfield,&arg[5],1,earg);
if (earg != &arg[5]) expand = 1;
// allocate field vectors
pack_choice = new FnPtrPack[nfield];
vtype = new int[nfield];
@ -67,7 +79,8 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) :
// process attributes
parse_fields(narg,arg);
parse_fields(nfield,earg);
size_one = nfield;
// setup format strings
@ -88,11 +101,11 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) :
// setup column string
int n = 0;
for (int iarg = 5; iarg < narg; iarg++) n += strlen(arg[iarg]) + 2;
for (int iarg = 0; iarg < nfield; iarg++) n += strlen(earg[iarg]) + 2;
columns = new char[n];
columns[0] = '\0';
for (int iarg = 5; iarg < narg; iarg++) {
strcat(columns,arg[iarg]);
for (int iarg = 0; iarg < nfield; iarg++) {
strcat(columns,earg[iarg]);
strcat(columns," ");
}
@ -102,6 +115,13 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) :
n = strlen(str) + 1;
label = new char[n];
strcpy(label,str);
// if wildcard expansion occurred, free earg memory from exapnd_args()
if (expand) {
for (int i = 0; i < nfield; i++) delete [] earg[i];
memory->sfree(earg);
}
}
/* ---------------------------------------------------------------------- */
@ -376,8 +396,8 @@ void DumpLocal::parse_fields(int narg, char **arg)
// customize by adding to if statement
int i;
for (int iarg = 5; iarg < narg; iarg++) {
i = iarg-5;
for (int iarg = 0; iarg < narg; iarg++) {
i = iarg;
if (strcmp(arg[iarg],"index") == 0) {
pack_choice[i] = &DumpLocal::pack_index;

View File

@ -36,7 +36,8 @@ enum{X,V,F,COMPUTE,FIX,VARIABLE};
FixAveAtom::FixAveAtom(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg),
nvalues(0), which(NULL), argindex(NULL), value2index(NULL), ids(NULL), array(NULL)
nvalues(0), which(NULL), argindex(NULL), value2index(NULL),
ids(NULL), array(NULL)
{
if (narg < 7) error->all(FLERR,"Illegal fix ave/atom command");