git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@8236 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2012-06-07 17:19:17 +00:00
parent 2bc8b55c79
commit 78f8f69895
4 changed files with 251 additions and 19 deletions

View File

@ -49,7 +49,7 @@ ReadDump::ReadDump(LAMMPS *lmp) : Pointers(lmp)
dimension = domain->dimension;
triclinic = domain->triclinic;
nfiles = 0;
nfile = 0;
files = NULL;
nfield = 0;
@ -59,13 +59,14 @@ ReadDump::ReadDump(LAMMPS *lmp) : Pointers(lmp)
uflag = ucflag = ucflag_all = NULL;
reader = NULL;
fp = NULL;
}
/* ---------------------------------------------------------------------- */
ReadDump::~ReadDump()
{
for (int i = 0; i < nfiles; i++) delete [] files[i];
for (int i = 0; i < nfile; i++) delete [] files[i];
delete [] files;
for (int i = 0; i < nfield; i++) delete [] fieldlabel[i];
delete [] fieldlabel;
@ -113,7 +114,6 @@ void ReadDump::command(int narg, char **arg)
bigint natoms_prev = atom->natoms;
atoms();
// NOTE: this logic is not yet right
if (me == 0) close();
// print out stats
@ -158,10 +158,10 @@ void ReadDump::command(int narg, char **arg)
void ReadDump::store_files(int nstr, char **str)
{
nfiles = nstr;
files = new char*[nfiles];
nfile = nstr;
files = new char*[nfile];
for (int i = 0; i < nfiles; i++) {
for (int i = 0; i < nfile; i++) {
int n = strlen(str[i]) + 1;
files[i] = new char[n];
strcpy(files[i],str[i]);
@ -184,7 +184,6 @@ void ReadDump::setup_reader()
/* ----------------------------------------------------------------------
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 = 0, find first step >= Nrequest
return matching ntimestep or -1 if did not find a match
@ -196,7 +195,11 @@ bigint ReadDump::seek(bigint nrequest, int exact)
bigint ntimestep;
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;
open(files[ifile]);
reader->file(fp);
@ -211,9 +214,9 @@ bigint ReadDump::seek(bigint nrequest, int exact)
}
currentfile = ifile;
if (ntimestep < nrequest) close();
if (ntimestep < nrequest) ntimestep = -1;
if (exact && ntimestep != nrequest) ntimestep = -1;
if (ntimestep < 0) close();
}
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
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
Nskip = skip every this many timesteps
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;
bigint ntimestep;
// NOTE: this logic is not yet right
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;
if (ifile != currentfile) open(files[ifile]);
reader->file(fp);
while (1) {
eofflag = reader->read_time(ntimestep);
if (eofflag) ntimestep = -1;
break;
if (iskip == nskip) iskip = 0;
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;
close();
if (eofflag) close();
else break;
}
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);
@ -860,6 +877,8 @@ void ReadDump::open(char *file)
void ReadDump::close()
{
if (fp == NULL) return;
if (compressed) pclose(fp);
else fclose(fp);
fp = NULL;
}

View File

@ -48,7 +48,7 @@ private:
int dimension;
int triclinic;
int nfiles; // # of dump files to process
int nfile; // # of dump files to process
char **files; // list of file names
int currentfile; // currently open file

177
src/rerun.cpp Normal file
View 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
View 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