diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index a47a216e21..b145139d19 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -136,6 +136,11 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all("Compute property/atom for " "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_radius; + } else if (strcmp(arg[iarg],"diameter") == 0) { + if (!atom->radius_flag) + error->all("Compute property/atom for " + "atom property that isn't allocated"); + pack_choice[i] = &ComputePropertyAtom::pack_diameter; } else if (strcmp(arg[iarg],"omegax") == 0) { if (!atom->omega_flag) error->all("Compute property/atom for " @@ -882,6 +887,21 @@ void ComputePropertyAtom::pack_radius(int n) /* ---------------------------------------------------------------------- */ +void ComputePropertyAtom::pack_diameter(int n) +{ + double *radius = atom->radius; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = 2.0*radius[i]; + else buf[n] = 0.0; + n += nvalues; + } +} + +/* ---------------------------------------------------------------------- */ + void ComputePropertyAtom::pack_omegax(int n) { double **omega = atom->omega; diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h index dcdcd5f5a5..b32d0a93df 100644 --- a/src/compute_property_atom.h +++ b/src/compute_property_atom.h @@ -79,6 +79,8 @@ class ComputePropertyAtom : public Compute { void pack_muz(int); void pack_mu(int); void pack_radius(int); + void pack_diameter(int); + void pack_omegax(int); void pack_omegay(int); void pack_omegaz(int); diff --git a/src/dump_cfg.cpp b/src/dump_cfg.cpp index de7790bb89..e6a272d971 100755 --- a/src/dump_cfg.cpp +++ b/src/dump_cfg.cpp @@ -47,7 +47,8 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : (strcmp(arg[8],"ys") != 0 && strcmp(arg[8],"ysu") != 0) || (strcmp(arg[9],"zs") != 0 && strcmp(arg[9],"zsu") != 0) ) - error->all("Dump cfg arguments must start with 'id type xs ys zs' or 'id type xsu ysu zsu'"); + error->all("Dump cfg arguments must start with " + "'id type xs ys zs' or 'id type xsu ysu zsu'"); if (strcmp(arg[7],"xs") == 0) if (strcmp(arg[8],"ysu") == 0 || strcmp(arg[9],"zsu") == 0) @@ -57,9 +58,6 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : error->all("Dump cfg arguments can not mix xs|ys|zs with xsu|ysu|zsu"); else unwrapflag = 1; - ntypes = atom->ntypes; - typenames = NULL; - // arrays for data rearrangement rbuf = NULL; @@ -108,11 +106,6 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : DumpCFG::~DumpCFG() { - if (typenames) { - for (int i = 1; i <= ntypes; i++) delete [] typenames[i]; - delete [] typenames; - } - if (rbuf) memory->destroy(rbuf); if (auxname) { @@ -127,16 +120,6 @@ void DumpCFG::init_style() { if (multifile == 0) error->all("Dump cfg requires one snapshot per file"); - if (typenames == NULL) { - typenames = new char*[ntypes+1]; - for (int itype = 1; itype <= ntypes; itype++) { - typenames[itype] = new char[3]; - strcpy(typenames[itype],"C"); - } - if (comm->me == 0) - error->warning("All element names have been set to 'C' for dump cfg"); - } - // setup format strings delete [] format; @@ -148,6 +131,16 @@ void DumpCFG::init_style() format = new char[n]; strcpy(format,str); + // default for element names = C + + if (typenames == NULL) { + typenames = new char*[ntypes+1]; + for (int itype = 1; itype <= ntypes; itype++) { + typenames[itype] = new char[2]; + strcpy(typenames[itype],"C"); + } + } + // tokenize the format string and add space at end of each format element char *ptr; @@ -319,29 +312,3 @@ void DumpCFG::write_data(int n, double *mybuf) nlines = 0; } } - -/* ---------------------------------------------------------------------- */ - -int DumpCFG::modify_param2(int narg, char **arg) -{ - if (strcmp(arg[0],"element") == 0) { - if (narg != ntypes+1) - error->all("Dump modify element names do not match atom types"); - - if (typenames) { - for (int i = 1; i <= ntypes; i++) delete [] typenames[i]; - delete [] typenames; - typenames = NULL; - } - - typenames = new char*[ntypes+1]; - for (int itype = 1; itype <= ntypes; itype++) { - typenames[itype] = new char[3]; - if (strlen(arg[itype]) >= 3) - error->all("Illegal chemical element names"); - strcpy(typenames[itype],arg[itype]); - } - return ntypes+1; - - } else return 0; -} diff --git a/src/dump_cfg.h b/src/dump_cfg.h index 3ddfc8fa44..bee5c1dbbb 100755 --- a/src/dump_cfg.h +++ b/src/dump_cfg.h @@ -30,8 +30,6 @@ class DumpCFG : public DumpCustom { ~DumpCFG(); private: - int ntypes; // # of atom types - char **typenames; // array of element names for each type char **auxname; // name strings of auxiliary properties int nchosen; // # of lines to be written on a writing proc int nlines; // # of lines transferred from buf to rbuf @@ -41,8 +39,6 @@ class DumpCFG : public DumpCustom { void init_style(); void write_header(bigint); void write_data(int, double *); - - int modify_param2(int, char **); }; } diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index b0dcc982a2..1e511fde00 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -32,18 +32,19 @@ using namespace LAMMPS_NS; // customize by adding keyword -// same list as in compute_property.cpp, also customize that command +// also customize compute_atom_property.cpp -enum{ID,MOL,TYPE,MASS, +enum{ID,MOL,TYPE,ELEMENT,MASS, X,Y,Z,XS,YS,ZS,XSTRI,YSTRI,ZSTRI,XU,YU,ZU,XUTRI,YUTRI,ZUTRI, XSU,YSU,ZSU,XSUTRI,YSUTRI,ZSUTRI, IX,IY,IZ, VX,VY,VZ,FX,FY,FZ, - Q,MUX,MUY,MUZ,MU,RADIUS,OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, + Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, + OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, TQX,TQY,TQZ,SPIN,ERADIUS,ERVEL,ERFORCE, COMPUTE,FIX,VARIABLE}; enum{LT,LE,GT,GE,EQ,NEQ}; -enum{INT,DOUBLE}; +enum{INT,DOUBLE,STRING}; #define INVOKED_PERATOM 8 @@ -97,6 +98,11 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : choose = NULL; dchoose = NULL; + // element names + + ntypes = atom->ntypes; + typenames = NULL; + // setup format strings vformat = new char*[size_one]; @@ -106,7 +112,8 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < size_one; i++) { if (vtype[i] == INT) format_default = strcat(format_default,"%d "); - else format_default = strcat(format_default,"%g "); + else if (vtype[i] == DOUBLE) format_default = strcat(format_default,"%g "); + else if (vtype[i] == STRING) strcat(format_default,"%s "); vformat[i] = NULL; } @@ -153,6 +160,11 @@ DumpCustom::~DumpCustom() memory->destroy(choose); memory->destroy(dchoose); + if (typenames) { + for (int i = 1; i <= ntypes; i++) delete [] typenames[i]; + delete [] typenames; + } + for (int i = 0; i < size_one; i++) delete [] vformat[i]; delete [] vformat; @@ -172,6 +184,16 @@ void DumpCustom::init_style() format = new char[n]; strcpy(format,str); + // default for element names = C + + if (typenames == NULL) { + typenames = new char*[ntypes+1]; + for (int itype = 1; itype <= ntypes; itype++) { + typenames[itype] = new char[2]; + strcpy(typenames[itype],"C"); + } + } + // tokenize the format string and add space at end of each format element char *ptr; @@ -429,6 +451,11 @@ int DumpCustom::count() for (i = 0; i < nlocal; i++) dchoose[i] = type[i]; ptr = dchoose; nstride = 1; + } else if (thresh_array[ithresh] == ELEMENT) { + int *type = atom->type; + for (i = 0; i < nlocal; i++) dchoose[i] = type[i]; + ptr = dchoose; + nstride = 1; } else if (thresh_array[ithresh] == MASS) { if (atom->rmass) { ptr = atom->rmass; @@ -581,7 +608,8 @@ int DumpCustom::count() double boxylo = domain->boxlo[1]; double invyprd = 1.0/domain->yprd; for (i = 0; i < nlocal; i++) - dchoose[i] = (x[i][1] - boxylo) * invyprd + (image[i] >> 10 & 1023) - 512; + dchoose[i] = + (x[i][1] - boxylo) * invyprd + (image[i] >> 10 & 1023) - 512; ptr = dchoose; nstride = 1; @@ -698,6 +726,13 @@ int DumpCustom::count() error->all("Threshhold for an atom property that isn't allocated"); ptr = atom->radius; nstride = 1; + } else if (thresh_array[ithresh] == DIAMETER) { + if (!atom->radius_flag) + error->all("Threshhold for an atom property that isn't allocated"); + double *radius = atom->radius; + for (i = 0; i < nlocal; i++) dchoose[i] = 2.0*radius[i]; + ptr = dchoose; + nstride = 1; } else if (thresh_array[ithresh] == OMEGAX) { if (!atom->omega_flag) error->all("Threshhold for an atom property that isn't allocated"); @@ -880,7 +915,9 @@ void DumpCustom::write_text(int n, double *mybuf) for (i = 0; i < n; i++) { for (j = 0; j < size_one; j++) { if (vtype[j] == INT) fprintf(fp,vformat[j],static_cast (mybuf[m])); - else fprintf(fp,vformat[j],mybuf[m]); + else if (vtype[j] == DOUBLE) fprintf(fp,vformat[j],mybuf[m]); + else if (vtype[j] == STRING) + fprintf(fp,vformat[j],typenames[(int) mybuf[m]]); m++; } fprintf(fp,"\n"); @@ -908,6 +945,9 @@ void DumpCustom::parse_fields(int narg, char **arg) } else if (strcmp(arg[iarg],"type") == 0) { pack_choice[i] = &DumpCustom::pack_type; vtype[i] = INT; + } else if (strcmp(arg[iarg],"element") == 0) { + pack_choice[i] = &DumpCustom::pack_type; + vtype[i] = STRING; } else if (strcmp(arg[iarg],"mass") == 0) { pack_choice[i] = &DumpCustom::pack_mass; vtype[i] = DOUBLE; @@ -1017,6 +1057,11 @@ void DumpCustom::parse_fields(int narg, char **arg) error->all("Dumping an atom property that isn't allocated"); pack_choice[i] = &DumpCustom::pack_radius; vtype[i] = DOUBLE; + } else if (strcmp(arg[iarg],"diameter") == 0) { + if (!atom->radius_flag) + error->all("Dumping an atom property that isn't allocated"); + pack_choice[i] = &DumpCustom::pack_diameter; + vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"omegax") == 0) { if (!atom->omega_flag) error->all("Dumping an atom property that isn't allocated"); @@ -1271,6 +1316,24 @@ int DumpCustom::modify_param(int narg, char **arg) } return 2; + } else if (strcmp(arg[0],"element") == 0) { + if (narg != ntypes+1) + error->all("Dump modify element names do not match atom types"); + + if (typenames) { + for (int i = 1; i <= ntypes; i++) delete [] typenames[i]; + delete [] typenames; + typenames = NULL; + } + + typenames = new char*[ntypes+1]; + for (int itype = 1; itype <= ntypes; itype++) { + int n = strlen(arg[itype]) + 1; + typenames[itype] = new char[n]; + strcpy(typenames[itype],arg[itype]); + } + return ntypes+1; + } else if (strcmp(arg[0],"thresh") == 0) { if (narg < 2) error->all("Illegal dump_modify command"); if (strcmp(arg[1],"none") == 0) { @@ -1362,6 +1425,7 @@ int DumpCustom::modify_param(int narg, char **arg) else if (strcmp(arg[1],"mu") == 0) thresh_array[nthresh] = MU; else if (strcmp(arg[1],"radius") == 0) thresh_array[nthresh] = RADIUS; + else if (strcmp(arg[1],"diameter") == 0) thresh_array[nthresh] = DIAMETER; else if (strcmp(arg[1],"omegax") == 0) thresh_array[nthresh] = OMEGAX; else if (strcmp(arg[1],"omegay") == 0) thresh_array[nthresh] = OMEGAY; else if (strcmp(arg[1],"omegaz") == 0) thresh_array[nthresh] = OMEGAZ; @@ -2236,6 +2300,20 @@ void DumpCustom::pack_radius(int n) /* ---------------------------------------------------------------------- */ +void DumpCustom::pack_diameter(int n) +{ + double *radius = atom->radius; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + buf[n] = 2.0*radius[i]; + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + void DumpCustom::pack_omegax(int n) { double **omega = atom->omega; diff --git a/src/dump_custom.h b/src/dump_custom.h index b6a65b2822..280f858d47 100644 --- a/src/dump_custom.h +++ b/src/dump_custom.h @@ -67,6 +67,9 @@ class DumpCustom : public Dump { int *variable; // list of indices for the Variables double **vbuf; // local storage for variable evaluation + int ntypes; // # of atom types + char **typenames; // array of element names for each type + // private methods virtual void init_style(); @@ -142,6 +145,8 @@ class DumpCustom : public Dump { void pack_muz(int); void pack_mu(int); void pack_radius(int); + void pack_diameter(int); + void pack_omegax(int); void pack_omegay(int); void pack_omegaz(int);