git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@8236 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -49,7 +49,7 @@ ReadDump::ReadDump(LAMMPS *lmp) : Pointers(lmp)
|
|||||||
dimension = domain->dimension;
|
dimension = domain->dimension;
|
||||||
triclinic = domain->triclinic;
|
triclinic = domain->triclinic;
|
||||||
|
|
||||||
nfiles = 0;
|
nfile = 0;
|
||||||
files = NULL;
|
files = NULL;
|
||||||
|
|
||||||
nfield = 0;
|
nfield = 0;
|
||||||
@ -59,13 +59,14 @@ ReadDump::ReadDump(LAMMPS *lmp) : Pointers(lmp)
|
|||||||
uflag = ucflag = ucflag_all = NULL;
|
uflag = ucflag = ucflag_all = NULL;
|
||||||
|
|
||||||
reader = NULL;
|
reader = NULL;
|
||||||
|
fp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
ReadDump::~ReadDump()
|
ReadDump::~ReadDump()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < nfiles; i++) delete [] files[i];
|
for (int i = 0; i < nfile; i++) delete [] files[i];
|
||||||
delete [] files;
|
delete [] files;
|
||||||
for (int i = 0; i < nfield; i++) delete [] fieldlabel[i];
|
for (int i = 0; i < nfield; i++) delete [] fieldlabel[i];
|
||||||
delete [] fieldlabel;
|
delete [] fieldlabel;
|
||||||
@ -113,7 +114,6 @@ void ReadDump::command(int narg, char **arg)
|
|||||||
bigint natoms_prev = atom->natoms;
|
bigint natoms_prev = atom->natoms;
|
||||||
atoms();
|
atoms();
|
||||||
|
|
||||||
// NOTE: this logic is not yet right
|
|
||||||
if (me == 0) close();
|
if (me == 0) close();
|
||||||
|
|
||||||
// print out stats
|
// print out stats
|
||||||
@ -158,10 +158,10 @@ void ReadDump::command(int narg, char **arg)
|
|||||||
|
|
||||||
void ReadDump::store_files(int nstr, char **str)
|
void ReadDump::store_files(int nstr, char **str)
|
||||||
{
|
{
|
||||||
nfiles = nstr;
|
nfile = nstr;
|
||||||
files = new char*[nfiles];
|
files = new char*[nfile];
|
||||||
|
|
||||||
for (int i = 0; i < nfiles; i++) {
|
for (int i = 0; i < nfile; i++) {
|
||||||
int n = strlen(str[i]) + 1;
|
int n = strlen(str[i]) + 1;
|
||||||
files[i] = new char[n];
|
files[i] = new char[n];
|
||||||
strcpy(files[i],str[i]);
|
strcpy(files[i],str[i]);
|
||||||
@ -184,7 +184,6 @@ void ReadDump::setup_reader()
|
|||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
seek Nrequest timestep in one or more dump files
|
seek Nrequest timestep in one or more dump files
|
||||||
Nrequest can be a timestamp or -1 to match first step with exact = 0
|
|
||||||
if exact = 1, must find exactly Nrequest
|
if exact = 1, must find exactly Nrequest
|
||||||
if exact = 0, find first step >= Nrequest
|
if exact = 0, find first step >= Nrequest
|
||||||
return matching ntimestep or -1 if did not find a match
|
return matching ntimestep or -1 if did not find a match
|
||||||
@ -196,7 +195,11 @@ bigint ReadDump::seek(bigint nrequest, int exact)
|
|||||||
bigint ntimestep;
|
bigint ntimestep;
|
||||||
|
|
||||||
if (me == 0) {
|
if (me == 0) {
|
||||||
for (ifile = 0; ifile < nfiles; ifile++) {
|
|
||||||
|
// exit file loop when dump timestep >= nrequest
|
||||||
|
// or files exhausted
|
||||||
|
|
||||||
|
for (ifile = 0; ifile < nfile; ifile++) {
|
||||||
ntimestep = -1;
|
ntimestep = -1;
|
||||||
open(files[ifile]);
|
open(files[ifile]);
|
||||||
reader->file(fp);
|
reader->file(fp);
|
||||||
@ -211,9 +214,9 @@ bigint ReadDump::seek(bigint nrequest, int exact)
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentfile = ifile;
|
currentfile = ifile;
|
||||||
if (ntimestep < nrequest) close();
|
|
||||||
if (ntimestep < nrequest) ntimestep = -1;
|
if (ntimestep < nrequest) ntimestep = -1;
|
||||||
if (exact && ntimestep != nrequest) ntimestep = -1;
|
if (exact && ntimestep != nrequest) ntimestep = -1;
|
||||||
|
if (ntimestep < 0) close();
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Bcast(&ntimestep,1,MPI_LMP_BIGINT,0,world);
|
MPI_Bcast(&ntimestep,1,MPI_LMP_BIGINT,0,world);
|
||||||
@ -223,34 +226,48 @@ bigint ReadDump::seek(bigint nrequest, int exact)
|
|||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
find next matching snapshot in one or more dump files
|
find next matching snapshot in one or more dump files
|
||||||
Ncurrent = current timestep from last snapshot
|
Ncurrent = current timestep from last snapshot
|
||||||
Nstop = match no timestep bigger than Nstop
|
Nlast = match no timestep bigger than Nlast
|
||||||
Nevery = only match timesteps that are a multiple of Nevery
|
Nevery = only match timesteps that are a multiple of Nevery
|
||||||
Nskip = skip every this many timesteps
|
Nskip = skip every this many timesteps
|
||||||
return matching ntimestep or -1 if did not find a match
|
return matching ntimestep or -1 if did not find a match
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
bigint ReadDump::next(bigint ncurrent, bigint nstop, int nevery, int nskip)
|
bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip)
|
||||||
{
|
{
|
||||||
int ifile,eofflag;
|
int ifile,eofflag;
|
||||||
bigint ntimestep;
|
bigint ntimestep;
|
||||||
|
|
||||||
// NOTE: this logic is not yet right
|
|
||||||
|
|
||||||
if (me == 0) {
|
if (me == 0) {
|
||||||
for (ifile = currentfile; ifile < nfiles; ifile++) {
|
|
||||||
|
// exit file loop when dump timestep matches all criteria
|
||||||
|
// or files exhausted
|
||||||
|
|
||||||
|
int iskip = 0;
|
||||||
|
|
||||||
|
for (ifile = currentfile; ifile < nfile; ifile++) {
|
||||||
ntimestep = -1;
|
ntimestep = -1;
|
||||||
if (ifile != currentfile) open(files[ifile]);
|
if (ifile != currentfile) open(files[ifile]);
|
||||||
reader->file(fp);
|
reader->file(fp);
|
||||||
while (1) {
|
while (1) {
|
||||||
eofflag = reader->read_time(ntimestep);
|
eofflag = reader->read_time(ntimestep);
|
||||||
if (eofflag) ntimestep = -1;
|
if (iskip == nskip) iskip = 0;
|
||||||
break;
|
iskip++;
|
||||||
|
if (eofflag) break;
|
||||||
|
if (ntimestep <= ncurrent) break;
|
||||||
|
if (ntimestep > nlast) break;
|
||||||
|
if (nevery && ntimestep % nevery) reader->skip();
|
||||||
|
else if (iskip < nskip) reader->skip();
|
||||||
|
else break;
|
||||||
}
|
}
|
||||||
if (ntimestep > ncurrent) break;
|
if (eofflag) close();
|
||||||
close();
|
else break;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentfile = ifile;
|
currentfile = ifile;
|
||||||
|
if (eofflag) ntimestep = -1;
|
||||||
|
if (ntimestep <= ncurrent) ntimestep = -1;
|
||||||
|
if (ntimestep > nlast) ntimestep = -1;
|
||||||
|
if (ntimestep < 0) close();
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Bcast(&ntimestep,1,MPI_LMP_BIGINT,0,world);
|
MPI_Bcast(&ntimestep,1,MPI_LMP_BIGINT,0,world);
|
||||||
@ -860,6 +877,8 @@ void ReadDump::open(char *file)
|
|||||||
|
|
||||||
void ReadDump::close()
|
void ReadDump::close()
|
||||||
{
|
{
|
||||||
|
if (fp == NULL) return;
|
||||||
if (compressed) pclose(fp);
|
if (compressed) pclose(fp);
|
||||||
else fclose(fp);
|
else fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,7 +48,7 @@ private:
|
|||||||
int dimension;
|
int dimension;
|
||||||
int triclinic;
|
int triclinic;
|
||||||
|
|
||||||
int nfiles; // # of dump files to process
|
int nfile; // # of dump files to process
|
||||||
char **files; // list of file names
|
char **files; // list of file names
|
||||||
int currentfile; // currently open file
|
int currentfile; // currently open file
|
||||||
|
|
||||||
|
|||||||
177
src/rerun.cpp
Normal file
177
src/rerun.cpp
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
http://lammps.sandia.gov, Sandia National Laboratories
|
||||||
|
Steve Plimpton, sjplimp@sandia.gov
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "lmptype.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "rerun.h"
|
||||||
|
#include "read_dump.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "integrate.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "output.h"
|
||||||
|
#include "finish.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
Rerun::Rerun(LAMMPS *lmp) : Pointers(lmp) {}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void Rerun::command(int narg, char **arg)
|
||||||
|
{
|
||||||
|
if (narg < 2) error->all(FLERR,"Illegal rerun command");
|
||||||
|
|
||||||
|
if (domain->box_exist == 0)
|
||||||
|
error->all(FLERR,"Rerun command before simulation box is defined");
|
||||||
|
|
||||||
|
// list of dump files = args until a keyword
|
||||||
|
|
||||||
|
int iarg = 0;
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg],"first") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"last") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"every") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"skip") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"start") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"stop") == 0) break;
|
||||||
|
if (strcmp(arg[iarg],"dump") == 0) break;
|
||||||
|
iarg++;
|
||||||
|
}
|
||||||
|
int nfile = iarg;
|
||||||
|
if (nfile == 0 || nfile == narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
|
||||||
|
// parse optional args up until "dump"
|
||||||
|
|
||||||
|
bigint first = 0;
|
||||||
|
bigint last = MAXBIGINT;
|
||||||
|
int nevery = 0;
|
||||||
|
int nskip = 1;
|
||||||
|
int startflag = 0;
|
||||||
|
int stopflag = 0;
|
||||||
|
bigint start,stop;
|
||||||
|
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg],"first") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
first = ATOBIGINT(arg[iarg+1]);
|
||||||
|
if (first < 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"last") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
last = ATOBIGINT(arg[iarg+1]);
|
||||||
|
if (last < 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"every") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
nevery = atoi(arg[iarg+1]);
|
||||||
|
if (nevery < 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"skip") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
nskip = atoi(arg[iarg+1]);
|
||||||
|
if (nskip <= 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"start") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
startflag = 1;
|
||||||
|
start = ATOBIGINT(arg[iarg+1]);
|
||||||
|
if (start < 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"stop") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal rerun command");
|
||||||
|
stopflag = 1;
|
||||||
|
stop = ATOBIGINT(arg[iarg+1]);
|
||||||
|
if (stop < 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"dump") == 0) {
|
||||||
|
break;
|
||||||
|
} else error->all(FLERR,"Illegal rerun command");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(arg[iarg],"dump") != 0) error->all(FLERR,"Illegal rerun command");
|
||||||
|
if (first > last) error->all(FLERR,"Illegal rerun command");
|
||||||
|
if (startflag && stopflag && start > stop)
|
||||||
|
error->all(FLERR,"Illegal rerun command");
|
||||||
|
|
||||||
|
// pass list of filenames to ReadDump, along with post-"dump" args
|
||||||
|
|
||||||
|
ReadDump *rd = new ReadDump(lmp);
|
||||||
|
|
||||||
|
rd->store_files(nfile,arg);
|
||||||
|
rd->fields_and_keywords(narg-iarg-1,&arg[iarg+1]);
|
||||||
|
rd->setup_reader();
|
||||||
|
|
||||||
|
// perform the psuedo run
|
||||||
|
// invoke lmp->init() only once
|
||||||
|
// read all relevant snapshots
|
||||||
|
// uset setup_minimal() since atoms are already owned by correct procs
|
||||||
|
// addstep_compute_all() insures energy/virial computed on every snapshot
|
||||||
|
// set update->nsteps to ndump for Finish stats to print
|
||||||
|
|
||||||
|
update->whichflag = 1;
|
||||||
|
|
||||||
|
if (startflag) update->beginstep = update->firststep = start;
|
||||||
|
else update->beginstep = update->firststep = first;
|
||||||
|
if (stopflag) update->endstep = update->laststep = stop;
|
||||||
|
else update->endstep = update->laststep = last;
|
||||||
|
|
||||||
|
int firstflag = 1;
|
||||||
|
int ndump = 0;
|
||||||
|
|
||||||
|
lmp->init();
|
||||||
|
|
||||||
|
timer->init();
|
||||||
|
timer->barrier_start(TIME_LOOP);
|
||||||
|
|
||||||
|
bigint ntimestep = rd->seek(first,0);
|
||||||
|
if (ntimestep < 0)
|
||||||
|
error->all(FLERR,"Rerun dump file does not contain requested snapshot");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ndump++;
|
||||||
|
rd->header(firstflag);
|
||||||
|
update->reset_timestep(ntimestep);
|
||||||
|
rd->atoms();
|
||||||
|
|
||||||
|
modify->addstep_compute_all(ntimestep);
|
||||||
|
update->integrate->setup_minimal(1);
|
||||||
|
output->setup(firstflag,firstflag);
|
||||||
|
firstflag = 0;
|
||||||
|
|
||||||
|
ntimestep = rd->next(ntimestep,last,nevery,nskip);
|
||||||
|
if (ntimestep < 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer->barrier_stop(TIME_LOOP);
|
||||||
|
|
||||||
|
update->integrate->cleanup();
|
||||||
|
|
||||||
|
update->nsteps = ndump;
|
||||||
|
|
||||||
|
Finish finish(lmp);
|
||||||
|
finish.end(1);
|
||||||
|
|
||||||
|
update->whichflag = 0;
|
||||||
|
update->firststep = update->laststep = 0;
|
||||||
|
update->beginstep = update->endstep = 0;
|
||||||
|
|
||||||
|
// clean-up
|
||||||
|
|
||||||
|
delete rd;
|
||||||
|
}
|
||||||
36
src/rerun.h
Normal file
36
src/rerun.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
http://lammps.sandia.gov, Sandia National Laboratories
|
||||||
|
Steve Plimpton, sjplimp@sandia.gov
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMMAND_CLASS
|
||||||
|
|
||||||
|
CommandStyle(rerun,Rerun)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_RERUN_H
|
||||||
|
#define LMP_RERUN_H
|
||||||
|
|
||||||
|
#include "pointers.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class Rerun : protected Pointers {
|
||||||
|
public:
|
||||||
|
Rerun(class LAMMPS *);
|
||||||
|
void command(int, char **);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user