Merge pull request #907 from akohlmey/dump_maxfile
Implement 'dump_modify maxfiles' feature
This commit is contained in:
@ -15,7 +15,7 @@ dump_modify dump-ID keyword values ... :pre
|
|||||||
dump-ID = ID of dump to modify :ulb,l
|
dump-ID = ID of dump to modify :ulb,l
|
||||||
one or more keyword/value pairs may be appended :l
|
one or more keyword/value pairs may be appended :l
|
||||||
these keywords apply to various dump styles :l
|
these keywords apply to various dump styles :l
|
||||||
keyword = {append} or {at} or {buffer} or {delay} or {element} or {every} or {fileper} or {first} or {flush} or {format} or {image} or {label} or {nfile} or {pad} or {precision} or {region} or {scale} or {sort} or {thresh} or {unwrap} :l
|
keyword = {append} or {at} or {buffer} or {delay} or {element} or {every} or {fileper} or {first} or {flush} or {format} or {image} or {label} or {maxfiles} or {nfile} or {pad} or {precision} or {region} or {scale} or {sort} or {thresh} or {unwrap} :l
|
||||||
{append} arg = {yes} or {no}
|
{append} arg = {yes} or {no}
|
||||||
{at} arg = N
|
{at} arg = N
|
||||||
N = index of frame written upon first dump
|
N = index of frame written upon first dump
|
||||||
@ -37,6 +37,8 @@ keyword = {append} or {at} or {buffer} or {delay} or {element} or {every} or {fi
|
|||||||
{image} arg = {yes} or {no}
|
{image} arg = {yes} or {no}
|
||||||
{label} arg = string
|
{label} arg = string
|
||||||
string = character string (e.g. BONDS) to use in header of dump local file
|
string = character string (e.g. BONDS) to use in header of dump local file
|
||||||
|
{maxfiles} arg = Fmax
|
||||||
|
Fmax = keep only the most recent {Fmax} snapshots (one snapshot per file)
|
||||||
{nfile} arg = Nf
|
{nfile} arg = Nf
|
||||||
Nf = write this many files, one from each of Nf processors
|
Nf = write this many files, one from each of Nf processors
|
||||||
{pad} arg = Nchar = # of characters to convert timestep to
|
{pad} arg = Nchar = # of characters to convert timestep to
|
||||||
@ -364,6 +366,20 @@ e.g. BONDS or ANGLES.
|
|||||||
|
|
||||||
:line
|
:line
|
||||||
|
|
||||||
|
The {maxfiles} keyword can only be used when a '*' wildcard is
|
||||||
|
included in the dump file name, i.e. when writing a new file(s) for
|
||||||
|
each snapshot. The specified {Fmax} is how many snapshots will be
|
||||||
|
kept. Once this number is reached, the file(s) containing the oldest
|
||||||
|
snapshot is deleted before a new dump file is written. If the
|
||||||
|
specified {Fmax} <= 0, then all files are retained.
|
||||||
|
|
||||||
|
This can be useful for debugging, especially if you don't know on what
|
||||||
|
timestep something bad will happen, e.g. when LAMMPS will exit with an
|
||||||
|
error. You can dump every timestep, and limit the number of dump
|
||||||
|
files produced, even if you run for 1000s of steps.
|
||||||
|
|
||||||
|
:line
|
||||||
|
|
||||||
The {nfile} or {fileper} keywords can be used in conjunction with the
|
The {nfile} or {fileper} keywords can be used in conjunction with the
|
||||||
"%" wildcard character in the specified dump file name, for all dump
|
"%" wildcard character in the specified dump file name, for all dump
|
||||||
styles except the {dcd}, {image}, {movie}, {xtc}, and {xyz} styles
|
styles except the {dcd}, {image}, {movie}, {xtc}, and {xyz} styles
|
||||||
@ -901,6 +917,7 @@ flush = yes
|
|||||||
format = %d and %g for each integer or floating point value
|
format = %d and %g for each integer or floating point value
|
||||||
image = no
|
image = no
|
||||||
label = ENTRIES
|
label = ENTRIES
|
||||||
|
maxifiles = -1
|
||||||
nfile = 1
|
nfile = 1
|
||||||
pad = 0
|
pad = 0
|
||||||
pbc = no
|
pbc = no
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
|
#ifndef _WIN32
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
|
#endif
|
||||||
#include "Function.h"
|
#include "Function.h"
|
||||||
#include "ATC_Error.h"
|
#include "ATC_Error.h"
|
||||||
#include "LammpsInterface.h"
|
#include "LammpsInterface.h"
|
||||||
@ -59,7 +61,11 @@ namespace ATC {
|
|||||||
{
|
{
|
||||||
string type = args[0];
|
string type = args[0];
|
||||||
int narg = nargs -1;
|
int narg = nargs -1;
|
||||||
|
#ifdef _WIN32
|
||||||
|
double *dargs = (double *) _alloca(sizeof(double) * narg);
|
||||||
|
#endif
|
||||||
double *dargs = (double *) alloca(sizeof(double) * narg);
|
double *dargs = (double *) alloca(sizeof(double) * narg);
|
||||||
|
#endif
|
||||||
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
|
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
|
||||||
|
|
||||||
return function(type, narg, dargs);
|
return function(type, narg, dargs);
|
||||||
@ -193,7 +199,11 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = NULL;
|
|||||||
{
|
{
|
||||||
string type = args[0];
|
string type = args[0];
|
||||||
int narg = nargs -1;
|
int narg = nargs -1;
|
||||||
|
#ifdef _WIN32
|
||||||
|
double *dargs = (double *) _alloca(sizeof(double) * narg);
|
||||||
|
#else
|
||||||
double *dargs = (double *) alloca(sizeof(double) * narg);
|
double *dargs = (double *) alloca(sizeof(double) * narg);
|
||||||
|
#endif
|
||||||
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
|
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
|
||||||
|
|
||||||
return function(type, narg, dargs);
|
return function(type, narg, dargs);
|
||||||
|
|||||||
@ -71,6 +71,19 @@ void DumpAtomGZ::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// each proc with filewriter = 1 opens a file
|
// each proc with filewriter = 1 opens a file
|
||||||
|
|||||||
@ -75,6 +75,19 @@ void DumpCFGGZ::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// each proc with filewriter = 1 opens a file
|
// each proc with filewriter = 1 opens a file
|
||||||
|
|||||||
@ -73,6 +73,19 @@ void DumpCustomGZ::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// each proc with filewriter = 1 opens a file
|
// each proc with filewriter = 1 opens a file
|
||||||
|
|||||||
@ -73,6 +73,19 @@ void DumpXYZGZ::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// each proc with filewriter = 1 opens a file
|
// each proc with filewriter = 1 opens a file
|
||||||
|
|||||||
@ -77,6 +77,19 @@ void DumpAtomMPIIO::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (append_flag) { // append open
|
if (append_flag) { // append open
|
||||||
|
|||||||
@ -94,6 +94,19 @@ void DumpCFGMPIIO::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (append_flag) { // append open
|
if (append_flag) { // append open
|
||||||
|
|||||||
@ -97,6 +97,19 @@ void DumpCustomMPIIO::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (append_flag) { // append open
|
if (append_flag) { // append open
|
||||||
|
|||||||
@ -97,6 +97,19 @@ void DumpXYZMPIIO::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (append_flag) { // append open
|
if (append_flag) { // append open
|
||||||
|
|||||||
47
src/dump.cpp
47
src/dump.cpp
@ -91,6 +91,11 @@ Dump::Dump(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
|
|||||||
pbcflag = 0;
|
pbcflag = 0;
|
||||||
delay_flag = 0;
|
delay_flag = 0;
|
||||||
|
|
||||||
|
maxfiles = -1;
|
||||||
|
numfiles = 0;
|
||||||
|
fileidx = 0;
|
||||||
|
nameslist = NULL;
|
||||||
|
|
||||||
maxbuf = maxids = maxsort = maxproc = 0;
|
maxbuf = maxids = maxsort = maxproc = 0;
|
||||||
buf = bufsort = NULL;
|
buf = bufsort = NULL;
|
||||||
ids = idsort = NULL;
|
ids = idsort = NULL;
|
||||||
@ -187,6 +192,14 @@ Dump::~Dump()
|
|||||||
|
|
||||||
if (multiproc) MPI_Comm_free(&clustercomm);
|
if (multiproc) MPI_Comm_free(&clustercomm);
|
||||||
|
|
||||||
|
// delete storage for caching file names
|
||||||
|
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
for (int idx=0; idx < numfiles; ++idx)
|
||||||
|
delete[] nameslist[idx];
|
||||||
|
delete[] nameslist;
|
||||||
|
}
|
||||||
|
|
||||||
// XTC style sets fp to NULL since it closes file in its destructor
|
// XTC style sets fp to NULL since it closes file in its destructor
|
||||||
|
|
||||||
if (multifile == 0 && fp != NULL) {
|
if (multifile == 0 && fp != NULL) {
|
||||||
@ -549,6 +562,19 @@ void Dump::openfile()
|
|||||||
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1);
|
||||||
}
|
}
|
||||||
*ptr = '*';
|
*ptr = '*';
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
if (numfiles < maxfiles) {
|
||||||
|
nameslist[numfiles] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[numfiles],filecurrent);
|
||||||
|
++numfiles;
|
||||||
|
} else {
|
||||||
|
remove(nameslist[fileidx]);
|
||||||
|
delete[] nameslist[fileidx];
|
||||||
|
nameslist[fileidx] = new char[strlen(filecurrent)+1];
|
||||||
|
strcpy(nameslist[fileidx],filecurrent);
|
||||||
|
fileidx = (fileidx + 1) % maxfiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// each proc with filewriter = 1 opens a file
|
// each proc with filewriter = 1 opens a file
|
||||||
@ -1003,6 +1029,27 @@ void Dump::modify_params(int narg, char **arg)
|
|||||||
iarg += n;
|
iarg += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (strcmp(arg[iarg],"maxfiles") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command");
|
||||||
|
if (!multifile)
|
||||||
|
error->all(FLERR,"Cannot use dump_modify maxfiles "
|
||||||
|
"without * in dump file name");
|
||||||
|
// wipe out existing storage
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
for (int idx=0; idx < numfiles; ++idx)
|
||||||
|
delete[] nameslist[idx];
|
||||||
|
delete[] nameslist;
|
||||||
|
}
|
||||||
|
maxfiles = force->inumeric(FLERR,arg[iarg+1]);
|
||||||
|
if (maxfiles == 0) error->all(FLERR,"Illegal dump_modify command");
|
||||||
|
if (maxfiles > 0) {
|
||||||
|
nameslist = new char*[maxfiles];
|
||||||
|
numfiles = 0;
|
||||||
|
for (int idx=0; idx < maxfiles; ++idx)
|
||||||
|
nameslist[idx] = NULL;
|
||||||
|
fileidx = 0;
|
||||||
|
}
|
||||||
|
iarg += 2;
|
||||||
} else if (strcmp(arg[iarg],"nfile") == 0) {
|
} else if (strcmp(arg[iarg],"nfile") == 0) {
|
||||||
if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command");
|
if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command");
|
||||||
if (!multiproc)
|
if (!multiproc)
|
||||||
|
|||||||
@ -106,6 +106,11 @@ class Dump : protected Pointers {
|
|||||||
double boxzlo,boxzhi;
|
double boxzlo,boxzhi;
|
||||||
double boxxy,boxxz,boxyz;
|
double boxxy,boxxz,boxyz;
|
||||||
|
|
||||||
|
int maxfiles; // max number of files created, -1 == infinite
|
||||||
|
int numfiles; // number of files in names list
|
||||||
|
int fileidx; // index of file in names list
|
||||||
|
char **nameslist; // list of history file names
|
||||||
|
|
||||||
bigint ntotal; // total # of per-atom lines in snapshot
|
bigint ntotal; // total # of per-atom lines in snapshot
|
||||||
int reorderflag; // 1 if OK to reorder instead of sort
|
int reorderflag; // 1 if OK to reorder instead of sort
|
||||||
int ntotal_reorder; // # of atoms that must be in snapshot
|
int ntotal_reorder; // # of atoms that must be in snapshot
|
||||||
|
|||||||
Reference in New Issue
Block a user