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