git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@15235 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2016-06-30 20:43:33 +00:00
parent f735a669ad
commit cda102364a
3 changed files with 219 additions and 5 deletions

View File

@ -28,8 +28,8 @@ namespace LAMMPS_NS {
class FixShearHistory : public Fix { class FixShearHistory : public Fix {
friend class Neighbor; friend class Neighbor;
friend class PairGranHookeHistory; friend class PairGranHookeHistory;
friend class PairGranLine; friend class PairLineGranHooke;
friend class PairGranTri; friend class PairTriGranHooke;
public: public:
FixShearHistory(class LAMMPS *, int, char **); FixShearHistory(class LAMMPS *, int, char **);

View File

@ -24,6 +24,8 @@
#include "neigh_request.h" #include "neigh_request.h"
#include "atom.h" #include "atom.h"
#include "atom_vec.h" #include "atom_vec.h"
#include "atom_vec_line.h"
#include "atom_vec_tri.h"
#include "comm.h" #include "comm.h"
#include "force.h" #include "force.h"
#include "pair.h" #include "pair.h"
@ -35,6 +37,7 @@
#include "update.h" #include "update.h"
#include "respa.h" #include "respa.h"
#include "output.h" #include "output.h"
#include "math_extra.h"
#include "citeme.h" #include "citeme.h"
#include "memory.h" #include "memory.h"
#include "error.h" #include "error.h"
@ -95,6 +98,8 @@ Neighbor::Neighbor(LAMMPS *lmp) : Pointers(lmp)
maxhold = 0; maxhold = 0;
xhold = NULL; xhold = NULL;
line_hold = NULL;
tri_hold = NULL;
lastcall = -1; lastcall = -1;
// binning // binning
@ -180,6 +185,8 @@ Neighbor::~Neighbor()
delete [] fixchecklist; delete [] fixchecklist;
memory->destroy(xhold); memory->destroy(xhold);
memory->destroy(line_hold);
memory->destroy(tri_hold);
memory->destroy(binhead); memory->destroy(binhead);
memory->destroy(bins); memory->destroy(bins);
@ -241,6 +248,15 @@ void Neighbor::init()
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// settings // settings
// linetri_flag = 1/2 if atom style allows for lines/tris
avec_line = (AtomVecLine *) atom->style_match("line");
avec_tri = (AtomVecTri *) atom->style_match("tri");
linetri_flag = 0;
if (avec_line) linetri_flag = 1;
if (avec_tri) linetri_flag = 2;
// bbox lo/hi = bounding box of entire domain, stored by Domain // bbox lo/hi = bounding box of entire domain, stored by Domain
if (triclinic == 0) { if (triclinic == 0) {
@ -379,6 +395,14 @@ void Neighbor::init()
memory->destroy(xhold); memory->destroy(xhold);
maxhold = 0; maxhold = 0;
xhold = NULL; xhold = NULL;
if (linetri_flag == 1) {
memory->destroy(line_hold);
line_hold = NULL;
} else if (linetri_flag == 2) {
memory->destroy(tri_hold);
tri_hold = NULL;
}
} }
if (style == NSQ) { if (style == NSQ) {
@ -389,6 +413,7 @@ void Neighbor::init()
bins = NULL; bins = NULL;
// for USER-DPD Shardlow Splitting Algorithm (SSA) // for USER-DPD Shardlow Splitting Algorithm (SSA)
memory->destroy(bins_ssa); memory->destroy(bins_ssa);
memory->destroy(binhead_ssa); memory->destroy(binhead_ssa);
memory->destroy(gbinhead_ssa); memory->destroy(gbinhead_ssa);
@ -399,11 +424,18 @@ void Neighbor::init()
} }
// 1st time allocation of xhold and bins // 1st time allocation of xhold and bins
// also line/tri hold if linetri_flag is set
if (dist_check) { if (dist_check) {
if (maxhold == 0) { if (maxhold == 0) {
maxhold = atom->nmax; maxhold = atom->nmax;
memory->create(xhold,maxhold,3,"neigh:xhold"); memory->create(xhold,maxhold,3,"neigh:xhold");
if (linetri_flag) {
if (linetri_flag == 1)
memory->create(line_hold,maxhold,4,"neigh:line_hold");
else
memory->create(tri_hold,maxhold,9,"neigh:tri_hold");
}
} }
} }
@ -1505,12 +1537,25 @@ int Neighbor::check_distance()
if (includegroup) nlocal = atom->nfirst; if (includegroup) nlocal = atom->nfirst;
int flag = 0; int flag = 0;
for (int i = 0; i < nlocal; i++) { for (int i = 0; i < nlocal; i++) {
delx = x[i][0] - xhold[i][0]; delx = x[i][0] - xhold[i][0];
dely = x[i][1] - xhold[i][1]; dely = x[i][1] - xhold[i][1];
delz = x[i][2] - xhold[i][2]; delz = x[i][2] - xhold[i][2];
rsq = delx*delx + dely*dely + delz*delz; rsq = delx*delx + dely*dely + delz*delz;
if (rsq > deltasq) flag = 1; if (rsq > deltasq) {
flag = 1;
break;
}
}
// if line or tri particles:
// also check distance moved by corner pts
// since rotation could mean corners move when x coord does not
if (!flag && linetri_flag) {
if (linetri_flag == 1) flag = check_distance_line(deltasq);
else flag = check_distance_tri(deltasq);
} }
int flagall; int flagall;
@ -1519,10 +1564,154 @@ int Neighbor::check_distance()
return flagall; return flagall;
} }
/* ----------------------------------------------------------------------
if any line end pt moved deltasq, return 1
------------------------------------------------------------------------- */
int Neighbor::check_distance_line(double deltasq)
{
double length,theta,dx,dy,rsq;
double endpts[4];
AtomVecLine::Bonus *bonus = avec_line->bonus;
double **x = atom->x;
int *line = atom->line;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (line[i] < 0) continue;
length = bonus[line[i]].length;
theta = bonus[line[i]].theta;
dx = 0.5*length*cos(theta);
dy = 0.5*length*sin(theta);
endpts[0] = x[i][0] - dx;
endpts[1] = x[i][1] - dy;
endpts[2] = x[i][0] + dx;
endpts[3] = x[i][1] + dy;
dx = endpts[0] - line_hold[i][0];
dy = endpts[1] - line_hold[i][1];
rsq = dx*dx + dy*dy;
if (rsq > deltasq) return 1;
dx = endpts[2] - line_hold[i][2];
dy = endpts[3] - line_hold[i][3];
rsq = dx*dx + dy*dy;
if (rsq > deltasq) return 1;
}
return 0;
}
/* ----------------------------------------------------------------------
compute and store current line end pts in line_hold
------------------------------------------------------------------------- */
void Neighbor::calculate_endpts()
{
double length,theta,dx,dy;
double *endpt;
AtomVecLine::Bonus *bonus = avec_line->bonus;
double **x = atom->x;
int *line = atom->line;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (line[i] < 0) continue;
endpt = line_hold[i];
length = bonus[line[i]].length;
theta = bonus[line[i]].theta;
dx = 0.5*length*cos(theta);
dy = 0.5*length*sin(theta);
endpt[0] = x[i][0] - dx;
endpt[1] = x[i][1] - dy;
endpt[2] = x[i][0] + dx;
endpt[3] = x[i][1] + dy;
}
}
/* ----------------------------------------------------------------------
if any tri corner pt moved deltasq, return 1
------------------------------------------------------------------------- */
int Neighbor::check_distance_tri(double deltasq)
{
int ibonus;
double dx,dy,dz,rsq;
double p[3][3],corner[9];
AtomVecTri::Bonus *bonus = avec_tri->bonus;
double **x = atom->x;
int *tri = atom->tri;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (tri[i] < 0) continue;
ibonus = tri[i];
MathExtra::quat_to_mat(bonus[ibonus].quat,p);
MathExtra::matvec(p,bonus[ibonus].c1,&corner[0]);
MathExtra::add3(x[i],&corner[0],&corner[0]);
MathExtra::matvec(p,bonus[ibonus].c2,&corner[3]);
MathExtra::add3(x[i],&corner[3],&corner[3]);
MathExtra::matvec(p,bonus[ibonus].c3,&corner[6]);
MathExtra::add3(x[i],&corner[6],&corner[6]);
dx = corner[0] - tri_hold[i][0];
dy = corner[1] - tri_hold[i][1];
dz = corner[2] - tri_hold[i][2];
rsq = dx*dx + dy*dy + dz*dz;
if (rsq > deltasq) return 1;
dx = corner[3] - tri_hold[i][3];
dy = corner[4] - tri_hold[i][4];
dz = corner[5] - tri_hold[i][5];
rsq = dx*dx + dy*dy + dz*dz;
if (rsq > deltasq) return 1;
dx = corner[6] - tri_hold[i][6];
dy = corner[7] - tri_hold[i][7];
dz = corner[8] - tri_hold[i][8];
rsq = dx*dx + dy*dy + dz*dz;
if (rsq > deltasq) return 1;
}
return 0;
}
/* ----------------------------------------------------------------------
compute and store current tri corner pts in tri_hold
------------------------------------------------------------------------- */
void Neighbor::calculate_corners()
{
int ibonus;
double p[3][3];
double *corner;
AtomVecTri::Bonus *bonus = avec_tri->bonus;
double **x = atom->x;
int *tri = atom->tri;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (tri[i] < 0) continue;
ibonus = tri[i];
corner = tri_hold[i];
MathExtra::quat_to_mat(bonus[ibonus].quat,p);
MathExtra::matvec(p,bonus[ibonus].c1,&corner[0]);
MathExtra::add3(x[i],&corner[0],&corner[0]);
MathExtra::matvec(p,bonus[ibonus].c2,&corner[3]);
MathExtra::add3(x[i],&corner[3],&corner[3]);
MathExtra::matvec(p,bonus[ibonus].c3,&corner[6]);
MathExtra::add3(x[i],&corner[6],&corner[6]);
}
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
build perpetual neighbor lists build perpetual neighbor lists
called at setup and every few timesteps during run or minimization called at setup and every few timesteps during run or minimization
topology lists also built if topoflag = 1, USER-CUDA calls with topoflag = 0 topology lists also built if topoflag = 1, USER-CUDA called with tflag = 0
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void Neighbor::build(int topoflag) void Neighbor::build(int topoflag)
@ -1543,12 +1732,25 @@ void Neighbor::build(int topoflag)
maxhold = atom->nmax; maxhold = atom->nmax;
memory->destroy(xhold); memory->destroy(xhold);
memory->create(xhold,maxhold,3,"neigh:xhold"); memory->create(xhold,maxhold,3,"neigh:xhold");
if (linetri_flag) {
if (linetri_flag == 1) {
memory->destroy(line_hold);
memory->create(line_hold,maxhold,4,"neigh:line_hold");
} else {
memory->destroy(tri_hold);
memory->create(tri_hold,maxhold,4,"neigh:tri_hold");
}
}
} }
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
xhold[i][0] = x[i][0]; xhold[i][0] = x[i][0];
xhold[i][1] = x[i][1]; xhold[i][1] = x[i][1];
xhold[i][2] = x[i][2]; xhold[i][2] = x[i][2];
} }
if (linetri_flag) {
if (linetri_flag == 1) calculate_endpts();
else calculate_corners();
}
if (boxcheck) { if (boxcheck) {
if (triclinic == 0) { if (triclinic == 0) {
boxlo_hold[0] = bboxlo[0]; boxlo_hold[0] = bboxlo[0];
@ -2204,6 +2406,8 @@ bigint Neighbor::memory_usage()
{ {
bigint bytes = 0; bigint bytes = 0;
bytes += memory->usage(xhold,maxhold,3); bytes += memory->usage(xhold,maxhold,3);
if (linetri_flag == 1) bytes += memory->usage(line_hold,maxhold,4);
if (linetri_flag == 2) bytes += memory->usage(tri_hold,maxhold,9);
if (style != NSQ) { if (style != NSQ) {
bytes += memory->usage(bins,maxbin); bytes += memory->usage(bins,maxbin);
@ -2232,4 +2436,3 @@ int Neighbor::exclude_setting()
{ {
return exclude; return exclude;
} }

View File

@ -116,6 +116,12 @@ class Neighbor : protected Pointers {
double boxlo_hold[3],boxhi_hold[3]; // box size at last neighbor build double boxlo_hold[3],boxhi_hold[3]; // box size at last neighbor build
double corners_hold[8][3]; // box corners at last neighbor build double corners_hold[8][3]; // box corners at last neighbor build
int linetri_flag; // 1 if lines exist, 2 if tris exist
double **line_hold; // line corner pts at last neighbor build
double **tri_hold; // tri corner pts at last neighbor build
class AtomVecLine *avec_line; // used to extract line info
class AtomVecTri *avec_tri; // used to extract tri info
int binatomflag; // bin atoms or not when build neigh list int binatomflag; // bin atoms or not when build neigh list
// turned off by build_one() // turned off by build_one()
@ -184,6 +190,11 @@ class Neighbor : protected Pointers {
// methods // methods
int check_distance_line(double); // check line move dist since last neigh
int check_distance_tri(double); // check tri move dist since last neigh
void calculate_endpts();
void calculate_corners();
void bin_atoms(); // bin all atoms void bin_atoms(); // bin all atoms
double bin_distance(int, int, int); // distance between binx double bin_distance(int, int, int); // distance between binx
int coord2bin(double *); // mapping atom coord to a bin int coord2bin(double *); // mapping atom coord to a bin