From 216f4bb3f712ed0c52c3e3a70840123debe0740a Mon Sep 17 00:00:00 2001 From: sjplimp Date: Tue, 13 Jan 2009 15:40:03 +0000 Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@2455 f3b2605a-c512-4ea7-a41b-209d697bcdaa --- src/dump_atom.cpp | 70 ++++++++++-- src/dump_atom.h | 2 + src/dump_custom.cpp | 258 +++++++++++++++++++++++++++++++++++++++----- src/dump_custom.h | 8 ++ 4 files changed, 301 insertions(+), 37 deletions(-) diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index a293bd0f59..0f71b58efd 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -40,12 +40,6 @@ DumpAtom::DumpAtom(LAMMPS *lmp, int narg, char **arg) : Dump(lmp, narg, arg) void DumpAtom::init() { - // this error check cannot occur in constructor since scale_flag = 1 - // is the default and it can be changed by dump_modify - - if (scale_flag && domain->triclinic) - error->all("Cannot dump scaled coords with triclinic box"); - if (image_flag == 0) size_one = 5; else size_one = 8; @@ -72,10 +66,14 @@ void DumpAtom::init() if (binary) header_choice = &DumpAtom::header_binary; else header_choice = &DumpAtom::header_item; - if (scale_flag == 1 && image_flag == 0) + if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 0) pack_choice = &DumpAtom::pack_scale_noimage; - else if (scale_flag == 1 && image_flag == 1) + else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 0) pack_choice = &DumpAtom::pack_scale_image; + else if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 1) + pack_choice = &DumpAtom::pack_scale_noimage_triclinic; + else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 1) + pack_choice = &DumpAtom::pack_scale_image_triclinic; else if (scale_flag == 0 && image_flag == 0) pack_choice = &DumpAtom::pack_noscale_noimage; else if (scale_flag == 0 && image_flag == 1) @@ -236,6 +234,62 @@ int DumpAtom::pack_scale_noimage() /* ---------------------------------------------------------------------- */ +int DumpAtom::pack_scale_image_triclinic() +{ + int *tag = atom->tag; + int *type = atom->type; + int *image = atom->image; + int *mask = atom->mask; + double **x = atom->x; + int nlocal = atom->nlocal; + + double lamda[3]; + + int m = 0; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + buf[m++] = tag[i]; + buf[m++] = type[i]; + domain->x2lamda(x[i],lamda); + buf[m++] = lamda[0]; + buf[m++] = lamda[1]; + buf[m++] = lamda[2]; + buf[m++] = (image[i] & 1023) - 512; + buf[m++] = (image[i] >> 10 & 1023) - 512; + buf[m++] = (image[i] >> 20) - 512; + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int DumpAtom::pack_scale_noimage_triclinic() +{ + int *tag = atom->tag; + int *type = atom->type; + int *mask = atom->mask; + double **x = atom->x; + int nlocal = atom->nlocal; + + double lamda[3]; + + int m = 0; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + buf[m++] = tag[i]; + buf[m++] = type[i]; + domain->x2lamda(x[i],lamda); + buf[m++] = lamda[0]; + buf[m++] = lamda[1]; + buf[m++] = lamda[2]; + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + int DumpAtom::pack_noscale_image() { int *tag = atom->tag; diff --git a/src/dump_atom.h b/src/dump_atom.h index 9b01d07831..7d207cdfa2 100644 --- a/src/dump_atom.h +++ b/src/dump_atom.h @@ -44,6 +44,8 @@ class DumpAtom : public Dump { int pack_scale_noimage(); int pack_noscale_image(); int pack_noscale_noimage(); + int pack_scale_image_triclinic(); + int pack_scale_noimage_triclinic(); typedef void (DumpAtom::*FnPtrData)(int, double *); FnPtrData write_choice; // ptr to write data functions diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 137759b061..09f6753c7f 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -32,7 +32,8 @@ using namespace LAMMPS_NS; // customize by adding keyword to 1st enum -enum{ID,MOL,TYPE,MASS,X,Y,Z,XS,YS,ZS,XU,YU,ZU,IX,IY,IZ, +enum{ID,MOL,TYPE,MASS, + X,Y,Z,XS,YS,ZS,XSTRI,YSTRI,ZSTRI,XU,YU,ZU,XUTRI,YUTRI,ZUTRI,IX,IY,IZ, VX,VY,VZ,FX,FY,FZ, Q,MUX,MUY,MUZ,RADIUS,OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, QUATW,QUATI,QUATJ,QUATK,TQX,TQY,TQZ, @@ -352,6 +353,7 @@ int DumpCustom::count() ptr = atom->rmass; nstride = 1; } + } else if (thresh_array[ithresh] == X) { ptr = &atom->x[0][0]; nstride = 3; @@ -361,6 +363,7 @@ int DumpCustom::count() } else if (thresh_array[ithresh] == Z) { ptr = &atom->x[0][2]; nstride = 3; + } else if (thresh_array[ithresh] == XS) { double **x = atom->x; double boxxlo = domain->boxlo[0]; @@ -385,6 +388,34 @@ int DumpCustom::count() dchoose[i] = (x[i][2] - boxzlo) * invzprd; ptr = dchoose; nstride = 1; + + } else if (thresh_array[ithresh] == XSTRI) { + double **x = atom->x; + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + for (i = 0; i < nlocal; i++) + dchoose[i] = h_inv[0]*(x[i][0]-boxlo[0]) + + h_inv[5]*(x[i][1]-boxlo[1]) + h_inv[4]*(x[i][2]-boxlo[2]); + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == YSTRI) { + double **x = atom->x; + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + for (i = 0; i < nlocal; i++) + dchoose[i] = h_inv[1]*(x[i][1]-boxlo[1]) + + h_inv[3]*(x[i][2]-boxlo[2]); + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == ZSTRI) { + double **x = atom->x; + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + for (i = 0; i < nlocal; i++) + dchoose[i] = h_inv[2]*(x[i][2]-boxlo[2]); + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == XU) { double **x = atom->x; int *image = atom->image; @@ -409,6 +440,44 @@ int DumpCustom::count() dchoose[i] = x[i][2] + ((image[i] >> 20) - 512) * zprd; ptr = dchoose; nstride = 1; + + } else if (thresh_array[ithresh] == XUTRI) { + double **x = atom->x; + int *image = atom->image; + double *h = domain->h; + int xbox,ybox,zbox; + for (i = 0; i < nlocal; i++) { + xbox = (image[i] & 1023) - 512; + ybox = (image[i] >> 10 & 1023) - 512; + zbox = (image[i] >> 20) - 512; + dchoose[i] = x[i][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox; + } + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == YUTRI) { + double **x = atom->x; + int *image = atom->image; + double *h = domain->h; + int ybox,zbox; + for (i = 0; i < nlocal; i++) { + ybox = (image[i] >> 10 & 1023) - 512; + zbox = (image[i] >> 20) - 512; + dchoose[i] = x[i][1] + h[1]*ybox + h[3]*zbox; + } + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == ZUTRI) { + double **x = atom->x; + int *image = atom->image; + double *h = domain->h; + int zbox; + for (i = 0; i < nlocal; i++) { + zbox = (image[i] >> 20) - 512; + dchoose[i] = x[i][2] + h[2]*zbox; + } + ptr = dchoose; + nstride = 1; + } else if (thresh_array[ithresh] == IX) { int *image = atom->image; for (i = 0; i < nlocal; i++) @@ -427,6 +496,7 @@ int DumpCustom::count() dchoose[i] = (image[i] >> 20) - 512; ptr = dchoose; nstride = 1; + } else if (thresh_array[ithresh] == VX) { ptr = &atom->v[0][0]; nstride = 3; @@ -685,28 +755,28 @@ void DumpCustom::parse_fields(int narg, char **arg) pack_choice[i] = &DumpCustom::pack_z; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"xs") == 0) { - if (domain->triclinic) - error->all("Cannot dump scaled coords with triclinic box"); - pack_choice[i] = &DumpCustom::pack_xs; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_xs_triclinic; + else pack_choice[i] = &DumpCustom::pack_xs; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"ys") == 0) { - if (domain->triclinic) - error->all("Cannot dump scaled coords with triclinic box"); - pack_choice[i] = &DumpCustom::pack_ys; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_ys_triclinic; + else pack_choice[i] = &DumpCustom::pack_ys; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"zs") == 0) { - if (domain->triclinic) - error->all("Cannot dump scaled coords with triclinic box"); - pack_choice[i] = &DumpCustom::pack_zs; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_zs_triclinic; + else pack_choice[i] = &DumpCustom::pack_zs; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"xu") == 0) { - pack_choice[i] = &DumpCustom::pack_xu; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_xu_triclinic; + else pack_choice[i] = &DumpCustom::pack_xu; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"yu") == 0) { - pack_choice[i] = &DumpCustom::pack_yu; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_yu_triclinic; + else pack_choice[i] = &DumpCustom::pack_yu; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"zu") == 0) { - pack_choice[i] = &DumpCustom::pack_zu; + if (domain->triclinic) pack_choice[i] = &DumpCustom::pack_zu_triclinic; + else pack_choice[i] = &DumpCustom::pack_zu; vtype[i] = DOUBLE; } else if (strcmp(arg[iarg],"ix") == 0) { pack_choice[i] = &DumpCustom::pack_ix; @@ -1043,13 +1113,6 @@ int DumpCustom::modify_param(int narg, char **arg) memory->srealloc(thresh_value,(nthresh+1)*sizeof(double), "dump:thresh_value"); - // error check for triclinic box - - if (domain->triclinic && - (strcmp(arg[1],"xs") == 0 || strcmp(arg[1],"ys") == 0 || - strcmp(arg[1],"zs") == 0)) - error->all("Cannot dump scaled coords with triclinic box"); - // set keyword type of threshhold // customize by adding to if statement @@ -1057,15 +1120,37 @@ int DumpCustom::modify_param(int narg, char **arg) else if (strcmp(arg[1],"mol") == 0) thresh_array[nthresh] = MOL; else if (strcmp(arg[1],"type") == 0) thresh_array[nthresh] = TYPE; else if (strcmp(arg[1],"mass") == 0) thresh_array[nthresh] = MASS; + else if (strcmp(arg[1],"x") == 0) thresh_array[nthresh] = X; else if (strcmp(arg[1],"y") == 0) thresh_array[nthresh] = Y; else if (strcmp(arg[1],"z") == 0) thresh_array[nthresh] = Z; - else if (strcmp(arg[1],"xs") == 0) thresh_array[nthresh] = XS; - else if (strcmp(arg[1],"ys") == 0) thresh_array[nthresh] = YS; - else if (strcmp(arg[1],"zs") == 0) thresh_array[nthresh] = ZS; - else if (strcmp(arg[1],"xu") == 0) thresh_array[nthresh] = XU; - else if (strcmp(arg[1],"yu") == 0) thresh_array[nthresh] = YU; - else if (strcmp(arg[1],"zu") == 0) thresh_array[nthresh] = ZU; + + else if (strcmp(arg[1],"xs") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = XS; + else if (strcmp(arg[1],"xs") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = XSTRI; + else if (strcmp(arg[1],"ys") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = YS; + else if (strcmp(arg[1],"ys") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = YSTRI; + else if (strcmp(arg[1],"zs") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = ZS; + else if (strcmp(arg[1],"zs") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = ZSTRI; + + else if (strcmp(arg[1],"xu") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = XU; + else if (strcmp(arg[1],"xu") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = XUTRI; + else if (strcmp(arg[1],"yu") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = YU; + else if (strcmp(arg[1],"yu") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = YUTRI; + else if (strcmp(arg[1],"zu") == 0 && domain->triclinic == 0) + thresh_array[nthresh] = ZU; + else if (strcmp(arg[1],"zu") == 0 && domain->triclinic == 1) + thresh_array[nthresh] = ZUTRI; + else if (strcmp(arg[1],"ix") == 0) thresh_array[nthresh] = IX; else if (strcmp(arg[1],"iy") == 0) thresh_array[nthresh] = IY; else if (strcmp(arg[1],"iz") == 0) thresh_array[nthresh] = IZ; @@ -1475,13 +1560,66 @@ void DumpCustom::pack_zs(int n) /* ---------------------------------------------------------------------- */ +void DumpCustom::pack_xs_triclinic(int n) +{ + double **x = atom->x; + int nlocal = atom->nlocal; + + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + buf[n] = h_inv[0]*(x[i][0]-boxlo[0]) + + h_inv[5]*(x[i][1]-boxlo[1]) + h_inv[4]*(x[i][2]-boxlo[2]); + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustom::pack_ys_triclinic(int n) +{ + double **x = atom->x; + int nlocal = atom->nlocal; + + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + buf[n] = h_inv[1]*(x[i][1]-boxlo[1]) + h_inv[3]*(x[i][2]-boxlo[2]); + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustom::pack_zs_triclinic(int n) +{ + double **x = atom->x; + int nlocal = atom->nlocal; + + double *boxlo = domain->boxlo; + double *h_inv = domain->h_inv; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + buf[n] = h_inv[2]*(x[i][2]-boxlo[2]); + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + void DumpCustom::pack_xu(int n) { double **x = atom->x; int *image = atom->image; - double xprd = domain->xprd; int nlocal = atom->nlocal; + double xprd = domain->xprd; + for (int i = 0; i < nlocal; i++) if (choose[i]) { buf[n] = x[i][0] + ((image[i] & 1023) - 512) * xprd; @@ -1495,9 +1633,10 @@ void DumpCustom::pack_yu(int n) { double **x = atom->x; int *image = atom->image; - double yprd = domain->yprd; int nlocal = atom->nlocal; + double yprd = domain->yprd; + for (int i = 0; i < nlocal; i++) if (choose[i]) { buf[n] = x[i][1] + ((image[i] >> 10 & 1023) - 512) * yprd; @@ -1511,9 +1650,10 @@ void DumpCustom::pack_zu(int n) { double **x = atom->x; int *image = atom->image; - double zprd = domain->zprd; int nlocal = atom->nlocal; + double zprd = domain->zprd; + for (int i = 0; i < nlocal; i++) if (choose[i]) { buf[n] = x[i][2] + ((image[i] >> 20) - 512) * zprd; @@ -1523,6 +1663,66 @@ void DumpCustom::pack_zu(int n) /* ---------------------------------------------------------------------- */ +void DumpCustom::pack_xu_triclinic(int n) +{ + double **x = atom->x; + int *image = atom->image; + int nlocal = atom->nlocal; + + double *h = domain->h; + int xbox,ybox,zbox; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + xbox = (image[i] & 1023) - 512; + ybox = (image[i] >> 10 & 1023) - 512; + zbox = (image[i] >> 20) - 512; + buf[n] = x[i][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox; + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustom::pack_yu_triclinic(int n) +{ + double **x = atom->x; + int *image = atom->image; + int nlocal = atom->nlocal; + + double *h = domain->h; + int ybox,zbox; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + ybox = (image[i] >> 10 & 1023) - 512; + zbox = (image[i] >> 20) - 512; + buf[n] = x[i][1] + h[1]*ybox + h[3]*zbox; + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustom::pack_zu_triclinic(int n) +{ + double **x = atom->x; + int *image = atom->image; + int nlocal = atom->nlocal; + + double *h = domain->h; + int zbox; + + for (int i = 0; i < nlocal; i++) + if (choose[i]) { + zbox = (image[i] >> 20) - 512; + buf[n] = x[i][2] + h[2]*zbox; + n += size_one; + } +} + +/* ---------------------------------------------------------------------- */ + void DumpCustom::pack_ix(int n) { int *image = atom->image; diff --git a/src/dump_custom.h b/src/dump_custom.h index da0fbfcc1a..5398a41132 100644 --- a/src/dump_custom.h +++ b/src/dump_custom.h @@ -92,18 +92,26 @@ class DumpCustom : public Dump { void pack_molecule(int); void pack_type(int); void pack_mass(int); + void pack_x(int); void pack_y(int); void pack_z(int); void pack_xs(int); void pack_ys(int); void pack_zs(int); + void pack_xs_triclinic(int); + void pack_ys_triclinic(int); + void pack_zs_triclinic(int); void pack_xu(int); void pack_yu(int); void pack_zu(int); + void pack_xu_triclinic(int); + void pack_yu_triclinic(int); + void pack_zu_triclinic(int); void pack_ix(int); void pack_iy(int); void pack_iz(int); + void pack_vx(int); void pack_vy(int); void pack_vz(int);