Commit 1e9778b8 authored by mkanski's avatar mkanski
Browse files

Extend compute pair to handle multiple instances of a given pair style

parent cdea8968
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -10,17 +10,22 @@ compute pair command :h3

[Syntax:]

compute ID group-ID pair pstyle evalue :pre
compute ID group-ID pair pstyle keyword value :pre

ID, group-ID are documented in "compute"_compute.html command
pair = style name of this compute command
pstyle = style name of a pair style that calculates additional values
evalue = {epair} or {evdwl} or {ecoul} or blank (optional setting) :ul
ID, group-ID are documented in "compute"_compute.html command :ulb,l
pair = style name of this compute command :l
pstyle = style name of a pair style that calculates additional values :l
zero or more keyword/value pairs may be appended :l
keyword = {evalue} or {nsub}
  {evalue} arg = {epair} or {evdwl} or {ecoul}
  {nsub} n = use {n}-th instance of a sub-style in a pair_style hybrid or hybrid/overlay command :pre
:ule

[Examples:]

compute 1 all pair gauss
compute 1 all pair lj/cut/coul/cut ecoul
compute 1 all pair lj/cut/coul/cut evalue ecoul
compute 1 all pair tersoff nsub 2
compute 1 all pair reax :pre

[Description:]
@@ -33,15 +38,23 @@ NOTE: The group specified for this command is [ignored].

The specified {pstyle} must be a pair style used in your simulation
either by itself or as a sub-style in a "pair_style hybrid or
hybrid/overlay"_pair_hybrid.html command.
hybrid/overlay"_pair_hybrid.html command. If the sub-style is
used more than once, additional keyword {nsub} has to be specified in
order to choose a single instance.

The {evalue} setting is optional; it may be left off the command.  All
NOTE: The {nsub} keyword should be used only if the sub-style occurs
multiple times. Its value must be an integer from 1 to M, where M is
the number of times the sub-style is listed in the "pair_style hybrid
or hybrid/overlay"_pair_hybrid.html" command. If the pair style is
used once, {nsub} must remain zero.

The {evalue} setting is optional.  All
pair styles tally a potential energy {epair} which may be broken into
two parts: {evdwl} and {ecoul} such that {epair} = {evdwl} + {ecoul}.
If the pair style calculates Coulombic interactions, their energy will
be tallied in {ecoul}.  Everything else (whether it is a Lennard-Jones
style van der Waals interaction or not) is tallied in {evdwl}.  If
{evalue} is specified as {epair} or left out, then {epair} is stored
{evalue} is specified as {epair}, then {epair} is stored
as a global scalar by this compute.  This is useful when using
"pair_style hybrid"_pair_hybrid.html if you want to know the portion
of the total energy contributed by one sub-style.  If {evalue} is
@@ -82,4 +95,4 @@ the doc page for the pair style for details.

[Default:]

The default for {evalue} is {epair}.
The keyword defaults are {evalue} = {epair}, nsub = 0.
+23 −9
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ ComputePair::ComputePair(LAMMPS *lmp, int narg, char **arg) :
  Compute(lmp, narg, arg),
  pstyle(NULL), pair(NULL), one(NULL)
{
  if (narg < 4 || narg > 5) error->all(FLERR,"Illegal compute pair command");
  if (narg < 4) error->all(FLERR,"Illegal compute pair command");

  scalar_flag = 1;
  extscalar = 1;
@@ -41,19 +41,33 @@ ComputePair::ComputePair(LAMMPS *lmp, int narg, char **arg) :
  pstyle = new char[n];
  strcpy(pstyle,arg[3]);

  if (narg == 5) {
    if (strcmp(arg[4],"epair") == 0) evalue = EPAIR;
    if (strcmp(arg[4],"evdwl") == 0) evalue = EVDWL;
    if (strcmp(arg[4],"ecoul") == 0) evalue = ECOUL;
  } else evalue = EPAIR;
  int iarg = 4;
  nsub = 0;

  while (iarg < narg) {
    if (strcmp(arg[iarg],"evalue") == 0) {
      if (iarg+2 > narg) error->all(FLERR,"Illegal compute pair command");
      if (strcmp(arg[iarg+1],"epair") == 0) evalue = EPAIR;
      else if (strcmp(arg[iarg+1],"evdwl") == 0) evalue = EVDWL;
      else if (strcmp(arg[iarg+1],"ecoul") == 0) evalue = ECOUL;
      else error->all(FLERR, "Unrecognized energy type");
      iarg += 2;
    } else if (strcmp(arg[iarg],"nsub") == 0) {
      if (iarg+2 > narg) error->all(FLERR,"Illegal compute pair command");
      nsub = force->inumeric(FLERR,arg[iarg+1]);
      iarg += 2;
    } else error->all(FLERR,"Illegal compute pair command");
    
  }
  

  // check if pair style with and without suffix exists

  pair = force->pair_match(pstyle,1);
  pair = force->pair_match(pstyle,1,nsub);
  if (!pair && lmp->suffix) {
    strcat(pstyle,"/");
    strcat(pstyle,lmp->suffix);
    pair = force->pair_match(pstyle,1);
    pair = force->pair_match(pstyle,1,nsub);
  }

  if (!pair)
@@ -84,7 +98,7 @@ void ComputePair::init()
{
  // recheck for pair style in case it has been deleted

  pair = force->pair_match(pstyle,1);
  pair = force->pair_match(pstyle,1,nsub);
  if (!pair)
    error->all(FLERR,"Unrecognized pair style in compute pair command");
}
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ class ComputePair : public Compute {
  void compute_vector();

 private:
  int evalue,npair;
  int evalue,npair,nsub;
  char *pstyle;
  class Pair *pair;
  double *one;