new MESSAGE package for client/server/coupling
This commit is contained in:
229
src/lammps.cpp
229
src/lammps.cpp
@ -47,8 +47,8 @@
|
||||
#include "accelerator_omp.h"
|
||||
#include "timer.h"
|
||||
#include "python.h"
|
||||
#include "memory.h"
|
||||
#include "version.h"
|
||||
#include "memory.h"
|
||||
#include "error.h"
|
||||
|
||||
#include "lmpinstalledpkgs.h"
|
||||
@ -73,12 +73,50 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator)
|
||||
output = NULL;
|
||||
python = NULL;
|
||||
|
||||
clientserver = 0;
|
||||
cslib = NULL;
|
||||
cscomm = 0;
|
||||
|
||||
screen = NULL;
|
||||
logfile = NULL;
|
||||
infile = NULL;
|
||||
|
||||
initclock = MPI_Wtime();
|
||||
|
||||
// check if -mpi is first arg
|
||||
// if so, then 2 apps were launched with one mpirun command
|
||||
// this means passed communicator (e.g. MPI_COMM_WORLD) is bigger than LAMMPS
|
||||
// e.g. for client/server coupling with another code
|
||||
// communicator needs to shrink to be just LAMMPS
|
||||
// syntax: -mpi P1 means P1 procs for one app, P-P1 procs for second app
|
||||
// LAMMPS could be either app, based on proc IDs
|
||||
// do the following:
|
||||
// perform an MPI_Comm_split() to create a new LAMMPS-only subcomm
|
||||
// NOTE: assuming other app is doing the same thing, else will hang!
|
||||
// re-create universe with subcomm
|
||||
// store full two-app comm in cscomm
|
||||
// cscomm is used by CSLIB package to exchange messages w/ other app
|
||||
// eventually should extend to N > 2 apps launched with one mpirun command
|
||||
|
||||
int iarg = 1;
|
||||
if (narg-iarg >= 2 && (strcmp(arg[iarg],"-mpi") == 0 ||
|
||||
strcmp(arg[iarg],"-m") == 0)) {
|
||||
int me,nprocs;
|
||||
MPI_Comm_rank(communicator,&me);
|
||||
MPI_Comm_size(communicator,&nprocs);
|
||||
int p1 = atoi(arg[iarg+1]);
|
||||
if (p1 <= 0 || p1 >= nprocs)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
int which = 0;
|
||||
if (me >= p1) which = 1;
|
||||
MPI_Comm subcomm;
|
||||
MPI_Comm_split(communicator,which,me,&subcomm);
|
||||
cscomm = communicator;
|
||||
communicator = subcomm;
|
||||
delete universe;
|
||||
universe = new Universe(this,communicator);
|
||||
}
|
||||
|
||||
// parse input switches
|
||||
|
||||
int inflag = 0;
|
||||
@ -107,59 +145,30 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator)
|
||||
int *pfirst = NULL;
|
||||
int *plast = NULL;
|
||||
|
||||
int iarg = 1;
|
||||
iarg = 1;
|
||||
while (iarg < narg) {
|
||||
if (strcmp(arg[iarg],"-partition") == 0 ||
|
||||
strcmp(arg[iarg],"-p") == 0) {
|
||||
universe->existflag = 1;
|
||||
|
||||
if (strcmp(arg[iarg],"-echo") == 0 ||
|
||||
strcmp(arg[iarg],"-e") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
iarg++;
|
||||
while (iarg < narg && arg[iarg][0] != '-') {
|
||||
universe->add_world(arg[iarg]);
|
||||
iarg++;
|
||||
}
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-help") == 0 ||
|
||||
strcmp(arg[iarg],"-h") == 0) {
|
||||
if (iarg+1 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
helpflag = 1;
|
||||
citeflag = 0;
|
||||
iarg += 1;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-in") == 0 ||
|
||||
strcmp(arg[iarg],"-i") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
inflag = iarg + 1;
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"-screen") == 0 ||
|
||||
strcmp(arg[iarg],"-sc") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
screenflag = iarg + 1;
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"-log") == 0 ||
|
||||
strcmp(arg[iarg],"-l") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
logflag = iarg + 1;
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"-var") == 0 ||
|
||||
strcmp(arg[iarg],"-v") == 0) {
|
||||
if (iarg+3 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
iarg += 3;
|
||||
while (iarg < narg && arg[iarg][0] != '-') iarg++;
|
||||
} else if (strcmp(arg[iarg],"-echo") == 0 ||
|
||||
strcmp(arg[iarg],"-e") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"-pscreen") == 0 ||
|
||||
strcmp(arg[iarg],"-ps") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
partscreenflag = iarg + 1;
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"-plog") == 0 ||
|
||||
strcmp(arg[iarg],"-pl") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
partlogflag = iarg + 1;
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-kokkos") == 0 ||
|
||||
strcmp(arg[iarg],"-k") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
@ -172,6 +181,26 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator)
|
||||
kkfirst = iarg;
|
||||
while (iarg < narg && arg[iarg][0] != '-') iarg++;
|
||||
kklast = iarg;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-log") == 0 ||
|
||||
strcmp(arg[iarg],"-l") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
logflag = iarg + 1;
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-mpi") == 0 ||
|
||||
strcmp(arg[iarg],"-m") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
if (iarg != 1) error->universe_all(FLERR,"Invalid command-line argument");
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-nocite") == 0 ||
|
||||
strcmp(arg[iarg],"-nc") == 0) {
|
||||
citeflag = 0;
|
||||
iarg++;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-package") == 0 ||
|
||||
strcmp(arg[iarg],"-pk") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
@ -188,6 +217,69 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator)
|
||||
else break;
|
||||
}
|
||||
plast[npack++] = iarg;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-partition") == 0 ||
|
||||
strcmp(arg[iarg],"-p") == 0) {
|
||||
universe->existflag = 1;
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
iarg++;
|
||||
while (iarg < narg && arg[iarg][0] != '-') {
|
||||
universe->add_world(arg[iarg]);
|
||||
iarg++;
|
||||
}
|
||||
|
||||
} else if (strcmp(arg[iarg],"-plog") == 0 ||
|
||||
strcmp(arg[iarg],"-pl") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
partlogflag = iarg + 1;
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-pscreen") == 0 ||
|
||||
strcmp(arg[iarg],"-ps") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
partscreenflag = iarg + 1;
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-reorder") == 0 ||
|
||||
strcmp(arg[iarg],"-ro") == 0) {
|
||||
if (iarg+3 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
if (universe->existflag)
|
||||
error->universe_all(FLERR,"Cannot use -reorder after -partition");
|
||||
universe->reorder(arg[iarg+1],arg[iarg+2]);
|
||||
iarg += 3;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-restart") == 0 ||
|
||||
strcmp(arg[iarg],"-r") == 0) {
|
||||
if (iarg+3 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
restartflag = 1;
|
||||
rfile = arg[iarg+1];
|
||||
dfile = arg[iarg+2];
|
||||
// check for restart remap flag
|
||||
if (strcmp(dfile,"remap") == 0) {
|
||||
if (iarg+4 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
restartremapflag = 1;
|
||||
dfile = arg[iarg+3];
|
||||
iarg++;
|
||||
}
|
||||
iarg += 3;
|
||||
// delimit any extra args for the write_data command
|
||||
wdfirst = iarg;
|
||||
while (iarg < narg && arg[iarg][0] != '-') iarg++;
|
||||
wdlast = iarg;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-screen") == 0 ||
|
||||
strcmp(arg[iarg],"-sc") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
screenflag = iarg + 1;
|
||||
iarg += 2;
|
||||
|
||||
} else if (strcmp(arg[iarg],"-suffix") == 0 ||
|
||||
strcmp(arg[iarg],"-sf") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
@ -213,45 +305,14 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator)
|
||||
strcpy(suffix,arg[iarg+1]);
|
||||
iarg += 2;
|
||||
}
|
||||
} else if (strcmp(arg[iarg],"-reorder") == 0 ||
|
||||
strcmp(arg[iarg],"-ro") == 0) {
|
||||
|
||||
} else if (strcmp(arg[iarg],"-var") == 0 ||
|
||||
strcmp(arg[iarg],"-v") == 0) {
|
||||
if (iarg+3 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
if (universe->existflag)
|
||||
error->universe_all(FLERR,"Cannot use -reorder after -partition");
|
||||
universe->reorder(arg[iarg+1],arg[iarg+2]);
|
||||
iarg += 3;
|
||||
} else if (strcmp(arg[iarg],"-restart") == 0 ||
|
||||
strcmp(arg[iarg],"-r") == 0) {
|
||||
if (iarg+3 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
restartflag = 1;
|
||||
rfile = arg[iarg+1];
|
||||
dfile = arg[iarg+2];
|
||||
// check for restart remap flag
|
||||
if (strcmp(dfile,"remap") == 0) {
|
||||
if (iarg+4 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
restartremapflag = 1;
|
||||
dfile = arg[iarg+3];
|
||||
iarg++;
|
||||
}
|
||||
iarg += 3;
|
||||
// delimit any extra args for the write_data command
|
||||
wdfirst = iarg;
|
||||
while (iarg < narg && arg[iarg][0] != '-') iarg++;
|
||||
wdlast = iarg;
|
||||
} else if (strcmp(arg[iarg],"-nocite") == 0 ||
|
||||
strcmp(arg[iarg],"-nc") == 0) {
|
||||
citeflag = 0;
|
||||
iarg++;
|
||||
} else if (strcmp(arg[iarg],"-help") == 0 ||
|
||||
strcmp(arg[iarg],"-h") == 0) {
|
||||
if (iarg+1 > narg)
|
||||
error->universe_all(FLERR,"Invalid command-line argument");
|
||||
helpflag = 1;
|
||||
citeflag = 0;
|
||||
iarg += 1;
|
||||
|
||||
} else error->universe_all(FLERR,"Invalid command-line argument");
|
||||
}
|
||||
|
||||
@ -595,6 +656,14 @@ LAMMPS::~LAMMPS()
|
||||
delete [] suffix;
|
||||
delete [] suffix2;
|
||||
|
||||
// free the MPI comm created by -mpi command-line arg
|
||||
// it was passed to universe as if origianl universe world
|
||||
// may have been split later by partitions, universe will free the splits
|
||||
// free a copy of uorig here, so check in universe destructor will still work
|
||||
|
||||
MPI_Comm copy = universe->uorig;
|
||||
if (cscomm) MPI_Comm_free(©);
|
||||
|
||||
delete input;
|
||||
delete universe;
|
||||
delete error;
|
||||
|
||||
Reference in New Issue
Block a user