diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 1a0a746c07..85e2312a42 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -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"); } diff --git a/src/reader.h b/src/reader.h index 08b0010b81..7b31b666ba 100644 --- a/src/reader.h +++ b/src/reader.h @@ -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; diff --git a/src/reader_native.cpp b/src/reader_native.cpp index 2c60ffdfd4..7c772ab6b8 100644 --- a/src/reader_native.cpp +++ b/src/reader_native.cpp @@ -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); diff --git a/src/reader_native.h b/src/reader_native.h index ab99469aa8..de43e43003 100644 --- a/src/reader_native.h +++ b/src/reader_native.h @@ -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 **); diff --git a/src/reader_xyz.cpp b/src/reader_xyz.cpp index 37d30bd740..303c25cd7a 100644 --- a/src/reader_xyz.cpp +++ b/src/reader_xyz.cpp @@ -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 diff --git a/src/reader_xyz.h b/src/reader_xyz.h index 698c6ef240..f8b0ebcea1 100644 --- a/src/reader_xyz.h +++ b/src/reader_xyz.h @@ -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 **);