From 1e9778b81e2e3f58bcd06414a8097b9e33af028f Mon Sep 17 00:00:00 2001
From: mkanski <michal.kanski@live.com>
Date: Fri, 5 Oct 2018 20:34:12 +0200
Subject: [PATCH] Extend compute pair to handle multiple instances of a given
 pair style

---
 doc/src/compute_pair.txt | 33 +++++++++++++++++++++++----------
 src/compute_pair.cpp     | 32 +++++++++++++++++++++++---------
 src/compute_pair.h       |  2 +-
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/doc/src/compute_pair.txt b/doc/src/compute_pair.txt
index b309019e30..751ea2c340 100644
--- a/doc/src/compute_pair.txt
+++ b/doc/src/compute_pair.txt
@@ -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.
diff --git a/src/compute_pair.cpp b/src/compute_pair.cpp
index 444395bae5..6129f192e2 100644
--- a/src/compute_pair.cpp
+++ b/src/compute_pair.cpp
@@ -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");
 }
diff --git a/src/compute_pair.h b/src/compute_pair.h
index 9f2678aaab..57d52a5bab 100644
--- a/src/compute_pair.h
+++ b/src/compute_pair.h
@@ -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;
-- 
GitLab