forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@10310 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
4b21fc7c81
commit
cb7f385d43
|
@ -71,7 +71,7 @@ if (test $1 = "style") then
|
|||
style INTEGRATE_CLASS "" integrate update
|
||||
style KSPACE_CLASS "" kspace force
|
||||
style MINIMIZE_CLASS min_ minimize update
|
||||
style PAIR_CLASS pair_ pair force pair_hybrid
|
||||
style PAIR_CLASS pair_ pair force
|
||||
style READER_CLASS reader_ reader read_dump
|
||||
style REGION_CLASS region_ region domain
|
||||
|
||||
|
|
|
@ -73,6 +73,17 @@ Force::Force(LAMMPS *lmp) : Pointers(lmp)
|
|||
strcpy(improper_style,str);
|
||||
kspace_style = new char[n];
|
||||
strcpy(kspace_style,str);
|
||||
|
||||
// fill pair map with fixes listed in style_pair.h
|
||||
|
||||
pair_map = new std::map<std::string,PairCreator>();
|
||||
|
||||
#define PAIR_CLASS
|
||||
#define PairStyle(key,Class) \
|
||||
(*pair_map)[#key] = &pair_creator<Class>;
|
||||
#include "style_pair.h"
|
||||
#undef PairStyle
|
||||
#undef PAIR_CLASS
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
@ -134,7 +145,8 @@ void Force::create_pair(const char *style, const char *suffix)
|
|||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
generate a pair class, first with suffix appended
|
||||
generate a pair class
|
||||
try first with suffix appended
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
Pair *Force::new_pair(const char *style, const char *suffix, int &sflag)
|
||||
|
@ -144,31 +156,34 @@ Pair *Force::new_pair(const char *style, const char *suffix, int &sflag)
|
|||
char estyle[256];
|
||||
sprintf(estyle,"%s/%s",style,suffix);
|
||||
|
||||
if (0) return NULL;
|
||||
|
||||
#define PAIR_CLASS
|
||||
#define PairStyle(key,Class) \
|
||||
else if (strcmp(estyle,#key) == 0) return new Class(lmp);
|
||||
#include "style_pair.h"
|
||||
#undef PairStyle
|
||||
#undef PAIR_CLASS
|
||||
|
||||
if (pair_map->find(estyle) != pair_map->end()) {
|
||||
PairCreator pair_creator = (*pair_map)[estyle];
|
||||
return pair_creator(lmp);
|
||||
}
|
||||
}
|
||||
|
||||
sflag = 0;
|
||||
|
||||
if (strcmp(style,"none") == 0) return NULL;
|
||||
if (pair_map->find(style) != pair_map->end()) {
|
||||
PairCreator pair_creator = (*pair_map)[style];
|
||||
return pair_creator(lmp);
|
||||
}
|
||||
|
||||
#define PAIR_CLASS
|
||||
#define PairStyle(key,Class) \
|
||||
else if (strcmp(style,#key) == 0) return new Class(lmp);
|
||||
#include "style_pair.h"
|
||||
#undef PAIR_CLASS
|
||||
|
||||
else error->all(FLERR,"Invalid pair style");
|
||||
error->all(FLERR,"Invalid pair style");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
one instance per pair style in style_pair.h
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
template <typename T>
|
||||
Pair *Force::pair_creator(LAMMPS *lmp)
|
||||
{
|
||||
return new T(lmp);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
return ptr to Pair class if matches word or matches hybrid sub-style
|
||||
if exact, then style name must be exact match to word
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#define LMP_FORCE_H
|
||||
|
||||
#include "pointers.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
namespace LAMMPS_NS {
|
||||
|
||||
|
@ -45,6 +47,9 @@ class Force : protected Pointers {
|
|||
class Pair *pair;
|
||||
char *pair_style;
|
||||
|
||||
typedef Pair *(*PairCreator)(LAMMPS *);
|
||||
std::map<std::string,PairCreator> *pair_map;
|
||||
|
||||
class Bond *bond;
|
||||
char *bond_style;
|
||||
|
||||
|
@ -98,6 +103,9 @@ class Force : protected Pointers {
|
|||
double numeric(const char *, int, char *);
|
||||
int inumeric(const char *, int, char *);
|
||||
bigint memory_usage();
|
||||
|
||||
private:
|
||||
template <typename T> static Pair *pair_creator(LAMMPS *);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
216
src/input.cpp
216
src/input.cpp
|
@ -82,6 +82,17 @@ Input::Input(LAMMPS *lmp, int argc, char **argv) : Pointers(lmp)
|
|||
|
||||
variable = new Variable(lmp);
|
||||
|
||||
// fill map with commands listed in style_command.h
|
||||
|
||||
command_map = new std::map<std::string,CommandCreator>();
|
||||
|
||||
#define COMMAND_CLASS
|
||||
#define CommandStyle(key,Class) \
|
||||
(*command_map)[#key] = &command_creator<Class>;
|
||||
#include "style_command.h"
|
||||
#undef CommandStyle
|
||||
#undef COMMAND_CLASS
|
||||
|
||||
// process command-line args
|
||||
// check for args "-var" and "-echo"
|
||||
// caller has already checked that sufficient arguments exist
|
||||
|
@ -101,7 +112,7 @@ Input::Input(LAMMPS *lmp, int argc, char **argv) : Pointers(lmp)
|
|||
echo();
|
||||
arg = tmp;
|
||||
iarg += 2;
|
||||
} else iarg++;
|
||||
} else iarg++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,13 +140,13 @@ Input::~Input()
|
|||
void Input::file()
|
||||
{
|
||||
int m,n;
|
||||
|
||||
|
||||
while (1) {
|
||||
|
||||
|
||||
// read a line from input script
|
||||
// n = length of line including str terminator, 0 if end of file
|
||||
// if line ends in continuation char '&', concatenate next line
|
||||
|
||||
|
||||
if (me == 0) {
|
||||
m = 0;
|
||||
while (1) {
|
||||
|
@ -147,7 +158,7 @@ void Input::file()
|
|||
}
|
||||
m = strlen(line);
|
||||
if (line[m-1] != '\n') continue;
|
||||
|
||||
|
||||
m--;
|
||||
while (m >= 0 && isspace(line[m])) m--;
|
||||
if (m < 0 || line[m] != '&') {
|
||||
|
@ -157,13 +168,13 @@ void Input::file()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// bcast the line
|
||||
// if n = 0, end-of-file
|
||||
// error if label_active is set, since label wasn't encountered
|
||||
// if original input file, code is done
|
||||
// else go back to previous input file
|
||||
|
||||
|
||||
MPI_Bcast(&n,1,MPI_INT,0,world);
|
||||
if (n == 0) {
|
||||
if (label_active) error->all(FLERR,"Label wasn't found in input script");
|
||||
|
@ -176,29 +187,29 @@ void Input::file()
|
|||
if (me == 0) infile = infiles[nfile-1];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (n > maxline) reallocate(line,maxline,n);
|
||||
MPI_Bcast(line,n,MPI_CHAR,0,world);
|
||||
|
||||
|
||||
// echo the command unless scanning for label
|
||||
|
||||
|
||||
if (me == 0 && label_active == 0) {
|
||||
if (echo_screen && screen) fprintf(screen,"%s\n",line);
|
||||
if (echo_log && logfile) fprintf(logfile,"%s\n",line);
|
||||
}
|
||||
|
||||
|
||||
// parse the line
|
||||
// if no command, skip to next line in input script
|
||||
|
||||
|
||||
parse();
|
||||
if (command == NULL) continue;
|
||||
|
||||
|
||||
// if scanning for label, skip command unless it's a label command
|
||||
|
||||
|
||||
if (label_active && strcmp(command,"label") != 0) continue;
|
||||
|
||||
|
||||
// execute the command
|
||||
|
||||
|
||||
if (execute_command()) {
|
||||
char *str = new char[maxline+32];
|
||||
sprintf(str,"Unknown command: %s",line);
|
||||
|
@ -210,18 +221,18 @@ void Input::file()
|
|||
/* ----------------------------------------------------------------------
|
||||
process all input from filename
|
||||
called from library interface
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Input::file(const char *filename)
|
||||
{
|
||||
// error if another nested file still open, should not be possible
|
||||
// open new filename and set infile, infiles[0], nfile
|
||||
// call to file() will close filename and decrement nfile
|
||||
|
||||
|
||||
if (me == 0) {
|
||||
if (nfile > 1)
|
||||
error->one(FLERR,"Invalid use of library file() function");
|
||||
|
||||
|
||||
infile = fopen(filename,"r");
|
||||
if (infile == NULL) {
|
||||
char str[128];
|
||||
|
@ -231,46 +242,46 @@ void Input::file(const char *filename)
|
|||
infiles[0] = infile;
|
||||
nfile = 1;
|
||||
}
|
||||
|
||||
|
||||
file();
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
copy command in single to line, parse and execute it
|
||||
return command name to caller
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
char *Input::one(const char *single)
|
||||
{
|
||||
int n = strlen(single) + 1;
|
||||
if (n > maxline) reallocate(line,maxline,n);
|
||||
strcpy(line,single);
|
||||
|
||||
|
||||
// echo the command unless scanning for label
|
||||
|
||||
|
||||
if (me == 0 && label_active == 0) {
|
||||
if (echo_screen && screen) fprintf(screen,"%s\n",line);
|
||||
if (echo_log && logfile) fprintf(logfile,"%s\n",line);
|
||||
}
|
||||
|
||||
|
||||
// parse the line
|
||||
// if no command, just return NULL
|
||||
|
||||
|
||||
parse();
|
||||
if (command == NULL) return NULL;
|
||||
|
||||
|
||||
// if scanning for label, skip command unless it's a label command
|
||||
|
||||
|
||||
if (label_active && strcmp(command,"label") != 0) return NULL;
|
||||
|
||||
|
||||
// execute the command and return its name
|
||||
|
||||
|
||||
if (execute_command()) {
|
||||
char *str = new char[maxline+32];
|
||||
sprintf(str,"Unknown command: %s",line);
|
||||
error->all(FLERR,str);
|
||||
}
|
||||
|
||||
|
||||
return command;
|
||||
}
|
||||
|
||||
|
@ -282,19 +293,19 @@ char *Input::one(const char *single)
|
|||
narg = # of args
|
||||
arg[] = individual args
|
||||
treat text between single/double quotes as one arg
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Input::parse()
|
||||
{
|
||||
// duplicate line into copy string to break into words
|
||||
|
||||
|
||||
int n = strlen(line) + 1;
|
||||
if (n > maxcopy) reallocate(copy,maxcopy,n);
|
||||
strcpy(copy,line);
|
||||
|
||||
|
||||
// strip any # comment by replacing it with 0
|
||||
// do not strip # inside single/double quotes
|
||||
|
||||
|
||||
char quote = '\0';
|
||||
char *ptr = copy;
|
||||
while (*ptr) {
|
||||
|
@ -306,22 +317,22 @@ void Input::parse()
|
|||
else if (*ptr == '"' || *ptr == '\'') quote = *ptr;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
|
||||
// perform $ variable substitution (print changes)
|
||||
// except if searching for a label since earlier variable may not be defined
|
||||
|
||||
|
||||
if (!label_active) substitute(copy,work,maxcopy,maxwork,1);
|
||||
|
||||
|
||||
// command = 1st arg in copy string
|
||||
|
||||
|
||||
char *next;
|
||||
command = nextword(copy,&next);
|
||||
if (command == NULL) return;
|
||||
|
||||
|
||||
// point arg[] at each subsequent arg in copy string
|
||||
// nextword() inserts string terminators into copy string to delimit args
|
||||
// nextword() treats text between single/double quotes as one arg
|
||||
|
||||
|
||||
narg = 0;
|
||||
ptr = next;
|
||||
while (ptr) {
|
||||
|
@ -341,20 +352,20 @@ void Input::parse()
|
|||
insert 0 at end of word
|
||||
ignore leading whitespace
|
||||
treat text between single/double quotes as one arg
|
||||
matching quote must be followed by whitespace char if not end of string
|
||||
strip quotes from returned word
|
||||
matching quote must be followed by whitespace char if not end of string
|
||||
strip quotes from returned word
|
||||
return ptr to start of word
|
||||
return next = ptr after word or NULL if word ended with 0
|
||||
return NULL if no word in string
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
char *Input::nextword(char *str, char **next)
|
||||
{
|
||||
char *start,*stop;
|
||||
|
||||
|
||||
start = &str[strspn(str," \t\n\v\f\r")];
|
||||
if (*start == '\0') return NULL;
|
||||
|
||||
|
||||
if (*start == '"' || *start == '\'') {
|
||||
stop = strchr(&start[1],*start);
|
||||
if (!stop) error->all(FLERR,"Unbalanced quotes in input line");
|
||||
|
@ -362,7 +373,7 @@ char *Input::nextword(char *str, char **next)
|
|||
error->all(FLERR,"Input line quote not followed by whitespace");
|
||||
start++;
|
||||
} else stop = &start[strcspn(start," \t\n\v\f\r")];
|
||||
|
||||
|
||||
if (*stop == '\0') *next = NULL;
|
||||
else *next = stop+1;
|
||||
*stop = '\0';
|
||||
|
@ -374,7 +385,7 @@ char *Input::nextword(char *str, char **next)
|
|||
reallocate str/str2 to hold expanded version if necessary & reset max/max2
|
||||
print updated string if flag is set and not searching for label
|
||||
label_active will be 0 if called from external class
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag)
|
||||
{
|
||||
|
@ -385,61 +396,61 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag)
|
|||
// if $ is followed by '{', trailing '}' becomes NULL
|
||||
// else $x becomes x followed by NULL
|
||||
// beyond = points to text following variable
|
||||
|
||||
|
||||
int i,n,paren_count;
|
||||
char immediate[256];
|
||||
char *var,*value,*beyond;
|
||||
char quote = '\0';
|
||||
char *ptr = str;
|
||||
|
||||
|
||||
n = strlen(str) + 1;
|
||||
if (n > max2) reallocate(str2,max2,n);
|
||||
*str2 = '\0';
|
||||
char *ptr2 = str2;
|
||||
|
||||
|
||||
while (*ptr) {
|
||||
// variable substitution
|
||||
|
||||
|
||||
if (*ptr == '$' && !quote) {
|
||||
|
||||
|
||||
// value = ptr to expanded variable
|
||||
// variable name between curly braces, e.g. ${a}
|
||||
|
||||
|
||||
if (*(ptr+1) == '{') {
|
||||
var = ptr+2;
|
||||
i = 0;
|
||||
|
||||
|
||||
while (var[i] != '\0' && var[i] != '}') i++;
|
||||
|
||||
|
||||
if (var[i] == '\0') error->one(FLERR,"Invalid variable name");
|
||||
var[i] = '\0';
|
||||
beyond = ptr + strlen(var) + 3;
|
||||
value = variable->retrieve(var);
|
||||
|
||||
// immediate variable between parenthesis, e.g. $(1/2)
|
||||
|
||||
|
||||
// immediate variable between parenthesis, e.g. $(1/2)
|
||||
|
||||
} else if (*(ptr+1) == '(') {
|
||||
var = ptr+2;
|
||||
paren_count = 0;
|
||||
i = 0;
|
||||
|
||||
|
||||
while (var[i] != '\0' && !(var[i] == ')' && paren_count == 0)) {
|
||||
switch (var[i]) {
|
||||
case '(': paren_count++; break;
|
||||
case ')': paren_count--; break;
|
||||
default: ;
|
||||
case '(': paren_count++; break;
|
||||
case ')': paren_count--; break;
|
||||
default: ;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
if (var[i] == '\0') error->one(FLERR,"Invalid immediate variable");
|
||||
var[i] = '\0';
|
||||
beyond = ptr + strlen(var) + 3;
|
||||
sprintf(immediate,"%.20g",variable->compute_equal(var));
|
||||
value = immediate;
|
||||
|
||||
// single character variable name, e.g. $a
|
||||
|
||||
|
||||
// single character variable name, e.g. $a
|
||||
|
||||
} else {
|
||||
var = ptr;
|
||||
var[0] = var[1];
|
||||
|
@ -447,40 +458,40 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag)
|
|||
beyond = ptr + 2;
|
||||
value = variable->retrieve(var);
|
||||
}
|
||||
|
||||
|
||||
if (value == NULL) error->one(FLERR,"Substitution for illegal variable");
|
||||
|
||||
|
||||
// check if storage in str2 needs to be expanded
|
||||
// re-initialize ptr and ptr2 to the point beyond the variable.
|
||||
|
||||
|
||||
n = strlen(str2) + strlen(value) + strlen(beyond) + 1;
|
||||
if (n > max2) reallocate(str2,max2,n);
|
||||
strcat(str2,value);
|
||||
ptr2 = str2 + strlen(str2);
|
||||
ptr = beyond;
|
||||
|
||||
|
||||
// output substitution progress if requested
|
||||
|
||||
|
||||
if (flag && me == 0 && label_active == 0) {
|
||||
if (echo_screen && screen) fprintf(screen,"%s%s\n",str2,beyond);
|
||||
if (echo_log && logfile) fprintf(logfile,"%s%s\n",str2,beyond);
|
||||
}
|
||||
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (*ptr == quote) quote = '\0';
|
||||
else if (*ptr == '"' || *ptr == '\'') quote = *ptr;
|
||||
|
||||
|
||||
// copy current character into str2
|
||||
|
||||
|
||||
*ptr2++ = *ptr++;
|
||||
*ptr2 = '\0';
|
||||
}
|
||||
|
||||
|
||||
// set length of input str to length of work str2
|
||||
// copy work string back to input str
|
||||
|
||||
|
||||
if (max2 > max) reallocate(str,max,max2);
|
||||
strcpy(str,str2);
|
||||
}
|
||||
|
@ -489,26 +500,26 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag)
|
|||
rellocate a string
|
||||
if n > 0: set max >= n in increments of DELTALINE
|
||||
if n = 0: just increment max by DELTALINE
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Input::reallocate(char *&str, int &max, int n)
|
||||
{
|
||||
if (n) {
|
||||
while (n > max) max += DELTALINE;
|
||||
} else max += DELTALINE;
|
||||
|
||||
|
||||
str = (char *) memory->srealloc(str,max*sizeof(char),"input:str");
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
process a single parsed command
|
||||
return 0 if successful, -1 if did not recognize command
|
||||
------------------------------------------------------------------------- */
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
int Input::execute_command()
|
||||
{
|
||||
int flag = 1;
|
||||
|
||||
|
||||
if (!strcmp(command,"clear")) clear();
|
||||
else if (!strcmp(command,"echo")) echo();
|
||||
else if (!strcmp(command,"if")) ifthenelse();
|
||||
|
@ -522,7 +533,7 @@ int Input::execute_command()
|
|||
else if (!strcmp(command,"quit")) quit();
|
||||
else if (!strcmp(command,"shell")) shell();
|
||||
else if (!strcmp(command,"variable")) variable_command();
|
||||
|
||||
|
||||
else if (!strcmp(command,"angle_coeff")) angle_coeff();
|
||||
else if (!strcmp(command,"angle_style")) angle_style();
|
||||
else if (!strcmp(command,"atom_modify")) atom_modify();
|
||||
|
@ -574,32 +585,37 @@ int Input::execute_command()
|
|||
else if (!strcmp(command,"undump")) undump();
|
||||
else if (!strcmp(command,"unfix")) unfix();
|
||||
else if (!strcmp(command,"units")) units();
|
||||
|
||||
|
||||
else flag = 0;
|
||||
|
||||
|
||||
// return if command was listed above
|
||||
|
||||
|
||||
if (flag) return 0;
|
||||
|
||||
// check if command is added via style.h
|
||||
|
||||
if (0) return 0; // dummy line to enable else-if macro expansion
|
||||
|
||||
#define COMMAND_CLASS
|
||||
#define CommandStyle(key,Class) \
|
||||
else if (strcmp(command,#key) == 0) { \
|
||||
Class key(lmp); \
|
||||
key.command(narg,arg); \
|
||||
return 0; \
|
||||
|
||||
// invoke commands added via style_command.h
|
||||
|
||||
if (command_map->find(command) != command_map->end()) {
|
||||
CommandCreator command_creator = (*command_map)[command];
|
||||
command_creator(lmp,narg,arg);
|
||||
return 0;
|
||||
}
|
||||
#include "style_command.h"
|
||||
#undef COMMAND_CLASS
|
||||
|
||||
|
||||
// unrecognized command
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
one instance per command in style_command.h
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
template <typename T>
|
||||
void Input::command_creator(LAMMPS *lmp, int narg, char **arg)
|
||||
{
|
||||
T cmd(lmp);
|
||||
cmd.command(narg,arg);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
/* ---------------------------------------------------------------------- */
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include "stdio.h"
|
||||
#include "pointers.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
namespace LAMMPS_NS {
|
||||
|
||||
|
@ -49,6 +51,11 @@ class Input : protected Pointers {
|
|||
|
||||
FILE **infiles; // list of open input files
|
||||
|
||||
typedef void (*CommandCreator)(LAMMPS *, int, char **);
|
||||
std::map<std::string,CommandCreator> *command_map;
|
||||
|
||||
template <typename T> static void command_creator(LAMMPS *, int, char **);
|
||||
|
||||
void parse(); // parse an input text line
|
||||
char *nextword(char *, char **); // find next word in string with quotes
|
||||
void reallocate(char *&, int &, int); // reallocate a char string
|
||||
|
|
119
src/modify.cpp
119
src/modify.cpp
|
@ -72,6 +72,28 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp)
|
|||
|
||||
ncompute = maxcompute = 0;
|
||||
compute = NULL;
|
||||
|
||||
// fill map with fixes listed in style_fix.h
|
||||
|
||||
fix_map = new std::map<std::string,FixCreator>();
|
||||
|
||||
#define FIX_CLASS
|
||||
#define FixStyle(key,Class) \
|
||||
(*fix_map)[#key] = &fix_creator<Class>;
|
||||
#include "style_fix.h"
|
||||
#undef FixStyle
|
||||
#undef FIX_CLASS
|
||||
|
||||
// fill map with computes listed in style_compute.h
|
||||
|
||||
compute_map = new std::map<std::string,ComputeCreator>();
|
||||
|
||||
#define COMPUTE_CLASS
|
||||
#define ComputeStyle(key,Class) \
|
||||
(*compute_map)[#key] = &compute_creator<Class>;
|
||||
#include "style_compute.h"
|
||||
#undef ComputeStyle
|
||||
#undef COMPUTE_CLASS
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
@ -666,40 +688,27 @@ void Modify::add_fix(int narg, char **arg, char *suffix)
|
|||
}
|
||||
}
|
||||
|
||||
// create the Fix, first with suffix appended
|
||||
// create the Fix
|
||||
// try first with suffix appended
|
||||
|
||||
int success = 0;
|
||||
fix[ifix] = NULL;
|
||||
|
||||
if (suffix && lmp->suffix_enable) {
|
||||
char estyle[256];
|
||||
sprintf(estyle,"%s/%s",arg[2],suffix);
|
||||
success = 1;
|
||||
|
||||
if (0) return;
|
||||
|
||||
#define FIX_CLASS
|
||||
#define FixStyle(key,Class) \
|
||||
else if (strcmp(estyle,#key) == 0) fix[ifix] = new Class(lmp,narg,arg);
|
||||
#include "style_fix.h"
|
||||
#undef FixStyle
|
||||
#undef FIX_CLASS
|
||||
|
||||
else success = 0;
|
||||
if (fix_map->find(estyle) != fix_map->end()) {
|
||||
FixCreator fix_creator = (*fix_map)[estyle];
|
||||
fix[ifix] = fix_creator(lmp,narg,arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
if (0) return;
|
||||
|
||||
#define FIX_CLASS
|
||||
#define FixStyle(key,Class) \
|
||||
else if (strcmp(arg[2],#key) == 0) fix[ifix] = new Class(lmp,narg,arg);
|
||||
#include "style_fix.h"
|
||||
#undef FixStyle
|
||||
#undef FIX_CLASS
|
||||
|
||||
else error->all(FLERR,"Invalid fix style");
|
||||
if (fix[ifix] == NULL && fix_map->find(arg[2]) != fix_map->end()) {
|
||||
FixCreator fix_creator = (*fix_map)[arg[2]];
|
||||
fix[ifix] = fix_creator(lmp,narg,arg);
|
||||
}
|
||||
|
||||
if (fix[ifix] == NULL) error->all(FLERR,"Invalid fix style");
|
||||
|
||||
// set fix mask values and increment nfix (if new)
|
||||
|
||||
fmask[ifix] = fix[ifix]->setmask();
|
||||
|
@ -738,6 +747,16 @@ void Modify::add_fix(int narg, char **arg, char *suffix)
|
|||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
one instance per fix in style_fix.h
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
template <typename T>
|
||||
Fix *Modify::fix_creator(LAMMPS *lmp, int narg, char **arg)
|
||||
{
|
||||
return new T(lmp,narg,arg);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
modify a Fix's parameters
|
||||
------------------------------------------------------------------------- */
|
||||
|
@ -811,45 +830,41 @@ void Modify::add_compute(int narg, char **arg, char *suffix)
|
|||
memory->srealloc(compute,maxcompute*sizeof(Compute *),"modify:compute");
|
||||
}
|
||||
|
||||
// create the Compute, first with suffix appended
|
||||
// create the Compute
|
||||
// try first with suffix appended
|
||||
|
||||
int success = 0;
|
||||
compute[ncompute] = NULL;
|
||||
|
||||
if (suffix && lmp->suffix_enable) {
|
||||
char estyle[256];
|
||||
sprintf(estyle,"%s/%s",arg[2],suffix);
|
||||
success = 1;
|
||||
|
||||
if (0) return;
|
||||
|
||||
#define COMPUTE_CLASS
|
||||
#define ComputeStyle(key,Class) \
|
||||
else if (strcmp(estyle,#key) == 0) \
|
||||
compute[ncompute] = new Class(lmp,narg,arg);
|
||||
#include "style_compute.h"
|
||||
#undef ComputeStyle
|
||||
#undef COMPUTE_CLASS
|
||||
|
||||
else success = 0;
|
||||
if (compute_map->find(estyle) != compute_map->end()) {
|
||||
ComputeCreator compute_creator = (*compute_map)[estyle];
|
||||
compute[ncompute] = compute_creator(lmp,narg,arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
if (0) return;
|
||||
|
||||
#define COMPUTE_CLASS
|
||||
#define ComputeStyle(key,Class) \
|
||||
else if (strcmp(arg[2],#key) == 0) \
|
||||
compute[ncompute] = new Class(lmp,narg,arg);
|
||||
#include "style_compute.h"
|
||||
#undef ComputeStyle
|
||||
#undef COMPUTE_CLASS
|
||||
|
||||
else error->all(FLERR,"Invalid compute style");
|
||||
if (compute[ncompute] == NULL &&
|
||||
compute_map->find(arg[2]) != compute_map->end()) {
|
||||
ComputeCreator compute_creator = (*compute_map)[arg[2]];
|
||||
compute[ncompute] = compute_creator(lmp,narg,arg);
|
||||
}
|
||||
|
||||
if (compute[ncompute] == NULL) error->all(FLERR,"Invalid compute style");
|
||||
|
||||
ncompute++;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
one instance per compute in style_compute.h
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
template <typename T>
|
||||
Compute *Modify::compute_creator(LAMMPS *lmp, int narg, char **arg)
|
||||
{
|
||||
return new T(lmp,narg,arg);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
modify a Compute's parameters
|
||||
------------------------------------------------------------------------- */
|
||||
|
|
12
src/modify.h
12
src/modify.h
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include "stdio.h"
|
||||
#include "pointers.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
namespace LAMMPS_NS {
|
||||
|
||||
|
@ -135,6 +137,16 @@ class Modify : protected Pointers {
|
|||
void list_init_end_of_step(int, int &, int *&);
|
||||
void list_init_thermo_energy(int, int &, int *&);
|
||||
void list_init_compute();
|
||||
|
||||
private:
|
||||
typedef Compute *(*ComputeCreator)(LAMMPS *, int, char **);
|
||||
std::map<std::string,ComputeCreator> *compute_map;
|
||||
|
||||
typedef Fix *(*FixCreator)(LAMMPS *, int, char **);
|
||||
std::map<std::string,FixCreator> *fix_map;
|
||||
|
||||
template <typename T> static Compute *compute_creator(LAMMPS *, int, char **);
|
||||
template <typename T> static Fix *fix_creator(LAMMPS *, int, char **);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "string.h"
|
||||
#include "ctype.h"
|
||||
#include "pair_hybrid.h"
|
||||
#include "style_pair.h"
|
||||
#include "atom.h"
|
||||
#include "force.h"
|
||||
#include "pair.h"
|
||||
|
@ -211,10 +210,6 @@ void PairHybrid::settings(int narg, char **arg)
|
|||
}
|
||||
allocated = 0;
|
||||
|
||||
// build list of all known pair styles
|
||||
|
||||
build_styles();
|
||||
|
||||
// allocate list of sub-styles as big as possibly needed if no extra args
|
||||
|
||||
styles = new Pair*[narg];
|
||||
|
@ -223,7 +218,7 @@ void PairHybrid::settings(int narg, char **arg)
|
|||
|
||||
// allocate each sub-style
|
||||
// call settings() with set of args that are not pair style names
|
||||
// use known_style() to determine which args these are
|
||||
// use force->pair_map to determine which args these are
|
||||
|
||||
int iarg,jarg,dummy;
|
||||
|
||||
|
@ -239,17 +234,12 @@ void PairHybrid::settings(int narg, char **arg)
|
|||
keywords[nstyles] = new char[n];
|
||||
strcpy(keywords[nstyles],arg[iarg]);
|
||||
jarg = iarg + 1;
|
||||
while (jarg < narg && !known_style(arg[jarg])) jarg++;
|
||||
while (jarg < narg && !force->pair_map->count(arg[jarg])) jarg++;
|
||||
styles[nstyles]->settings(jarg-iarg-1,&arg[iarg+1]);
|
||||
iarg = jarg;
|
||||
nstyles++;
|
||||
}
|
||||
|
||||
// free allstyles created by build_styles()
|
||||
|
||||
for (int i = 0; i < nallstyles; i++) delete [] allstyles[i];
|
||||
delete [] allstyles;
|
||||
|
||||
// multiple[i] = 1 to M if sub-style used multiple times, else 0
|
||||
|
||||
for (int i = 0; i < nstyles; i++) {
|
||||
|
@ -762,45 +752,6 @@ int PairHybrid::check_ijtype(int itype, int jtype, char *substyle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
allstyles = list of all pair styles in this LAMMPS executable
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void PairHybrid::build_styles()
|
||||
{
|
||||
nallstyles = 0;
|
||||
#define PAIR_CLASS
|
||||
#define PairStyle(key,Class) nallstyles++;
|
||||
#include "style_pair.h"
|
||||
#undef PairStyle
|
||||
#undef PAIR_CLASS
|
||||
|
||||
allstyles = new char*[nallstyles];
|
||||
|
||||
int n;
|
||||
nallstyles = 0;
|
||||
#define PAIR_CLASS
|
||||
#define PairStyle(key,Class) \
|
||||
n = strlen(#key) + 1; \
|
||||
allstyles[nallstyles] = new char[n]; \
|
||||
strcpy(allstyles[nallstyles],#key); \
|
||||
nallstyles++;
|
||||
#include "style_pair.h"
|
||||
#undef PairStyle
|
||||
#undef PAIR_CLASS
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
allstyles = list of all known pair styles
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
int PairHybrid::known_style(char *str)
|
||||
{
|
||||
for (int i = 0; i < nallstyles; i++)
|
||||
if (strcmp(str,allstyles[i]) == 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
memory usage of each sub-style
|
||||
------------------------------------------------------------------------- */
|
||||
|
|
|
@ -59,14 +59,9 @@ class PairHybrid : public Pair {
|
|||
int **nmap; // # of sub-styles itype,jtype points to
|
||||
int ***map; // list of sub-styles itype,jtype points to
|
||||
|
||||
char **allstyles;
|
||||
int nallstyles;
|
||||
|
||||
void allocate();
|
||||
void flags();
|
||||
virtual void modify_requests();
|
||||
void build_styles();
|
||||
int known_style(char *);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue