Added the boxinfo argument

This commit is contained in:
Aidan Thompson 2019-07-08 17:25:23 -06:00
parent 65e281d661
commit 74414afdea
6 changed files with 42 additions and 40 deletions

View File

@ -483,51 +483,52 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip)
void ReadDump::header(int fieldinfo)
{
int triclinic_snap;
int boxinfo, triclinic_snap;
int fieldflag,xflag,yflag,zflag;
if (filereader) {
for (int i = 0; i < nreader; i++)
nsnapatoms[i] = readers[i]->read_header(box,triclinic_snap,fieldinfo,
nsnapatoms[i] = readers[i]->read_header(box,boxinfo,triclinic_snap,fieldinfo,
nfield,fieldtype,fieldlabel,
scaleflag,wrapflag,fieldflag,
xflag,yflag,zflag);
}
MPI_Bcast(nsnapatoms,nreader,MPI_LMP_BIGINT,0,clustercomm);
MPI_Bcast(&boxinfo,1,MPI_INT,0,clustercomm);
MPI_Bcast(&triclinic_snap,1,MPI_INT,0,clustercomm);
MPI_Bcast(&box[0][0],9,MPI_DOUBLE,0,clustercomm);
// local copy of snapshot box parameters
// used in xfield,yfield,zfield when converting dump atom to absolute coords
xlo = box[0][0];
xhi = box[0][1];
ylo = box[1][0];
yhi = box[1][1];
zlo = box[2][0];
zhi = box[2][1];
// value of 1 indicates possible change in tilt factors
if (triclinic_snap == 1) {
xy = box[0][2];
xz = box[1][2];
yz = box[2][2];
double xdelta = MIN(0.0,xy);
xdelta = MIN(xdelta,xz);
xdelta = MIN(xdelta,xy+xz);
xlo = xlo - xdelta;
xdelta = MAX(0.0,xy);
xdelta = MAX(xdelta,xz);
xdelta = MAX(xdelta,xy+xz);
xhi = xhi - xdelta;
ylo = ylo - MIN(0.0,yz);
yhi = yhi - MAX(0.0,yz);
if (boxinfo) {
xlo = box[0][0];
xhi = box[0][1];
ylo = box[1][0];
yhi = box[1][1];
zlo = box[2][0];
zhi = box[2][1];
if (triclinic_snap) {
xy = box[0][2];
xz = box[1][2];
yz = box[2][2];
double xdelta = MIN(0.0,xy);
xdelta = MIN(xdelta,xz);
xdelta = MIN(xdelta,xy+xz);
xlo = xlo - xdelta;
xdelta = MAX(0.0,xy);
xdelta = MAX(xdelta,xz);
xdelta = MAX(xdelta,xy+xz);
xhi = xhi - xdelta;
ylo = ylo - MIN(0.0,yz);
yhi = yhi - MAX(0.0,yz);
}
xprd = xhi - xlo;
yprd = yhi - ylo;
zprd = zhi - zlo;
}
xprd = xhi - xlo;
yprd = yhi - ylo;
zprd = zhi - zlo;
// done if not checking fields
@ -539,13 +540,13 @@ void ReadDump::header(int fieldinfo)
MPI_Bcast(&zflag,1,MPI_INT,0,clustercomm);
// error check on current vs new box and fields
// triclinic_snap < 0 means no box info in file
// boxinfo == 0 means no box info in file
if (triclinic_snap < 0 && boxflag > 0)
error->all(FLERR,"No box information in dump, must use 'box no'");
if (triclinic_snap >= 0) {
if ((triclinic_snap && !triclinic) ||
(!triclinic_snap && triclinic))
if (boxflag) {
if (!boxinfo)
error->all(FLERR,"No box information in dump, must use 'box no'");
else if ((triclinic_snap && !triclinic) ||
(!triclinic_snap && triclinic))
error->one(FLERR,"Read_dump triclinic status does not match simulation");
}

View File

@ -29,7 +29,7 @@ class Reader : protected Pointers {
virtual int read_time(bigint &) = 0;
virtual void skip() = 0;
virtual bigint read_header(double [3][3], int &, int, int, int *, char **,
virtual bigint read_header(double [3][3], int &, int &, int, int, int *, char **,
int, int, int &, int &, int &, int &) = 0;
virtual void read_atoms(int, int, double **) = 0;

View File

@ -103,7 +103,7 @@ void ReaderNative::skip()
only called by proc 0
------------------------------------------------------------------------- */
bigint ReaderNative::read_header(double box[3][3], int &triclinic,
bigint ReaderNative::read_header(double box[3][3], int &boxinfo, int &triclinic,
int fieldinfo, int nfield,
int *fieldtype, char **fieldlabel,
int scaleflag, int wrapflag, int &fieldflag,
@ -113,6 +113,7 @@ bigint ReaderNative::read_header(double box[3][3], int &triclinic,
read_lines(2);
sscanf(line,BIGINT_FORMAT,&natoms);
boxinfo = 1;
triclinic = 0;
box[0][2] = box[1][2] = box[2][2] = 0.0;
read_lines(1);

View File

@ -33,7 +33,7 @@ class ReaderNative : public Reader {
int read_time(bigint &);
void skip();
bigint read_header(double [3][3], int &, int, int, int *, char **,
bigint read_header(double [3][3], int &, int &, int, int, int *, char **,
int, int, int &, int &, int &, int &);
void read_atoms(int, int, double **);

View File

@ -117,7 +117,7 @@ void ReaderXYZ::skip()
only called by proc 0
------------------------------------------------------------------------- */
bigint ReaderXYZ::read_header(double /*box*/[3][3], int &triclinic,
bigint ReaderXYZ::read_header(double /*box*/[3][3], int &boxinfo, int &/*triclinic*/,
int fieldinfo, int nfield,
int *fieldtype, char **/*fieldlabel*/,
int scaleflag, int wrapflag, int &fieldflag,
@ -128,7 +128,7 @@ bigint ReaderXYZ::read_header(double /*box*/[3][3], int &triclinic,
// signal that we have no box info at all
triclinic = -1;
boxinfo = 0;
// if no field info requested, just return

View File

@ -33,7 +33,7 @@ class ReaderXYZ : public Reader {
int read_time(bigint &);
void skip();
bigint read_header(double [3][3], int &, int, int, int *, char **,
bigint read_header(double [3][3], int &, int &, int, int, int *, char **,
int, int, int &, int &, int &, int &);
void read_atoms(int, int, double **);