diff --git a/src/dump_image.cpp b/src/dump_image.cpp index 5e6701ff344d6e9d3f457ea6766b2ca14c0d646a..5d1154478fb5375cef1d138c695010d581b5c378 100644 --- a/src/dump_image.cpp +++ b/src/dump_image.cpp @@ -27,6 +27,8 @@ #include "group.h" #include "force.h" #include "comm.h" +#include "modify.h" +#include "fix.h" #include "input.h" #include "variable.h" #include "math_const.h" @@ -40,7 +42,7 @@ using namespace MathConst; #define BIG 1.0e20 enum{NUMERIC,ATOM,TYPE,ELEMENT,ATTRIBUTE}; -enum{SPHERE,LINE}; // also in Body child classes +enum{SPHERE,LINE,TRI}; // also in some Body and Fix child classes enum{STATIC,DYNAMIC}; enum{NO,YES}; @@ -108,7 +110,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : // set defaults for optional args atomflag = YES; - lineflag = triflag = bodyflag = NO; + lineflag = triflag = bodyflag = fixflag = NO; if (atom->nbondtypes == 0) bondflag = NO; else { bondflag = YES; @@ -116,6 +118,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : bdiam = NUMERIC; bdiamvalue = 0.5; } + char *fixID = NULL; thetastr = phistr = NULL; cflag = STATIC; @@ -195,6 +198,16 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : bodyflag2 = force->numeric(FLERR,arg[iarg+3]); iarg += 4; + } else if (strcmp(arg[iarg],"fix") == 0) { + if (iarg+5 > narg) error->all(FLERR,"Illegal dump image command"); + fixflag = YES; + fixID = arg[iarg+1]; + if (strcmp(arg[iarg+2],"type") == 0) fixcolor = TYPE; + else error->all(FLERR,"Illegal dump image command"); + fixflag1 = force->numeric(FLERR,arg[iarg+3]); + fixflag2 = force->numeric(FLERR,arg[iarg+4]); + iarg += 5; + } else if (strcmp(arg[iarg],"size") == 0) { if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); int width = force->inumeric(FLERR,arg[iarg+1]); @@ -354,7 +367,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal dump image command"); } - // error checks and setup for lineflag, triflag, bodyflag + // error checks and setup for lineflag, triflag, bodyflag, fixflag if (lineflag) { avec_line = (AtomVecLine *) atom->style_match("line"); @@ -375,6 +388,12 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : extraflag = 0; if (lineflag || triflag || bodyflag) extraflag = 1; + if (fixflag) { + int ifix = modify->find_fix(fixID); + if (ifix < 0) error->all(FLERR,"Fix ID for dump image does not exist"); + fixptr = modify->fix[ifix]; + } + // allocate image buffer now that image size is known image->buffers(); @@ -716,9 +735,10 @@ void DumpImage::create_image() int i,j,k,m,n,itype,atom1,atom2,imol,iatom,btype,ibonus,drawflag; tagint tagprev; double diameter,delx,dely,delz; - int *bodyvec; - double **bodyarray; + int *bodyvec,*fixvec; + double **bodyarray,**fixarray; double *color,*color1,*color2; + double *p1,*p2,*p3; double xmid[3],pt1[3],pt2[3],pt3[3]; double mat[3][3]; @@ -820,7 +840,6 @@ void DumpImage::create_image() int *tri = atom->tri; int *type = atom->type; - for (i = 0; i < nchoose; i++) { j = clist[i]; if (tri[j] < 0) continue; @@ -1014,6 +1033,47 @@ void DumpImage::create_image() } } + // render objects provided by a fix + + if (fixflag) { + int tridraw,edgedraw; + if (domain->dimension == 3) { + tridraw = 1; + edgedraw = 1; + if ((int) fixflag1 == 2) tridraw = 0; + if ((int) fixflag1 == 1) edgedraw = 0; + } + + n = fixptr->image(fixvec,fixarray); + + for (i = 0; i < n; i++) { + if (fixvec[i] == SPHERE) { + // no fix draws spheres yet + } else if (fixvec[i] == LINE) { + if (fixcolor == TYPE) { + itype = static_cast<int> (fixarray[i][0]); + color = colortype[itype]; + } + image->draw_cylinder(&fixarray[i][1],&fixarray[i][4], + color,fixflag1,3); + } else if (fixvec[i] == TRI) { + if (fixcolor == TYPE) { + itype = static_cast<int> (fixarray[i][0]); + color = colortype[itype]; + } + p1 = &fixarray[i][1]; + p2 = &fixarray[i][4]; + p3 = &fixarray[i][7]; + if (tridraw) image->draw_triangle(p1,p2,p3,color); + if (edgedraw) { + image->draw_cylinder(p1,p2,color,fixflag2,3); + image->draw_cylinder(p2,p3,color,fixflag2,3); + image->draw_cylinder(p3,p1,color,fixflag2,3); + } + } + } + } + // render outline of my sub-box, orthogonal or triclinic if (subboxflag) { diff --git a/src/dump_image.h b/src/dump_image.h index 64846e3e4b5864261df73eda716baf255cf1da22..7e85ff9cd4c1eebc0d2eb83ba9636955a0ad8c28 100644 --- a/src/dump_image.h +++ b/src/dump_image.h @@ -50,7 +50,10 @@ class DumpImage : public DumpCustom { int bodyflag; // 0/1 for draw atoms as bodies int bodycolor; // what determines color of bodies double bodyflag1,bodyflag2; // user-specified params for drawing bodies - + int fixflag; // 0/1 to draw what fix provides + int fixcolor; // what determines color of fix objects + double fixflag1,fixflag2; // user-specified params for fix objects + int bondflag; // 0/1 for draw bonds int bcolor,bdiam; // what determines color/diam of bonds double bdiamvalue; // bond diameter value @@ -80,6 +83,8 @@ class DumpImage : public DumpCustom { class AtomVecTri *avec_tri; class AtomVecBody *avec_body; + class Fix *fixptr; // ptr to Fix that provides image data + class Image *image; // class that renders each image int *chooseghost; // extended choose array for comm