forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@8355 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
0cd34fb8a2
commit
f3eb64fd0f
|
@ -294,7 +294,14 @@ void FixQEqReax::init()
|
|||
int irequest = neighbor->request(this);
|
||||
neighbor->requests[irequest]->pair = 0;
|
||||
neighbor->requests[irequest]->fix = 1;
|
||||
|
||||
// Ray
|
||||
//neighbor->requests[irequest]->half = 0;
|
||||
//neighbor->requests[irequest]->full = 1;
|
||||
//neighbor->requests[irequest]->ghost = 2; // 2 for newton off
|
||||
|
||||
neighbor->requests[irequest]->newton = 2;
|
||||
neighbor->requests[irequest]->ghost = 1;
|
||||
|
||||
init_shielding();
|
||||
init_taper();
|
||||
|
@ -338,11 +345,12 @@ void FixQEqReax::init_taper()
|
|||
else if (swb < 5 && comm->me == 0)
|
||||
error->warning(FLERR,"Fix qeq/reax has very low Taper radius cutoff");
|
||||
|
||||
d7 = pow( swb - swa, 7.0 );
|
||||
d7 = pow( swb - swa, 7 );
|
||||
swa2 = SQR( swa );
|
||||
swa3 = CUBE( swa );
|
||||
swb2 = SQR( swb );
|
||||
swb3 = CUBE( swb );
|
||||
|
||||
Tap[7] = 20.0 / d7;
|
||||
Tap[6] = -70.0 * (swa + swb) / d7;
|
||||
Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7;
|
||||
|
|
|
@ -59,6 +59,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp)
|
|||
single_enable = 0;
|
||||
restartinfo = 0;
|
||||
one_coeff = 1;
|
||||
ghostneigh = 1;
|
||||
|
||||
system = (reax_system *)
|
||||
memory->smalloc(sizeof(reax_system),"reax:system");
|
||||
|
@ -142,6 +143,7 @@ PairReaxC::~PairReaxC()
|
|||
if( allocated ) {
|
||||
memory->destroy(setflag);
|
||||
memory->destroy(cutsq);
|
||||
memory->destroy(cutghost);
|
||||
delete [] map;
|
||||
|
||||
delete [] chi;
|
||||
|
@ -163,6 +165,7 @@ void PairReaxC::allocate( )
|
|||
|
||||
memory->create(setflag,n+1,n+1,"pair:setflag");
|
||||
memory->create(cutsq,n+1,n+1,"pair:cutsq");
|
||||
memory->create(cutghost,n+1,n+1,"pair:cutghost");
|
||||
map = new int[n+1];
|
||||
|
||||
chi = new double[n+1];
|
||||
|
@ -308,11 +311,28 @@ void PairReaxC::init_style( )
|
|||
if (force->newton_pair == 0)
|
||||
error->all(FLERR,"Pair style reax/c requires newton pair on");
|
||||
|
||||
// original
|
||||
// need a half neighbor list w/ Newton off
|
||||
// built whenever re-neighboring occurs
|
||||
|
||||
//int irequest = neighbor->request(this);
|
||||
//neighbor->requests[irequest]->newton = 2;
|
||||
|
||||
// Ray
|
||||
// need a full+ghost neighbor list w/ Newton off
|
||||
// built whenever re-neighboring occurs
|
||||
|
||||
//int irequest = neighbor->request(this);
|
||||
//neighbor->requests[irequest]->half = 0;
|
||||
//neighbor->requests[irequest]->full = 1;
|
||||
//neighbor->requests[irequest]->ghost = 2; // 2 for newton off
|
||||
|
||||
// need a half neighbor list with ghosts w/ Newton off
|
||||
// built whenever re-neighboring occurs
|
||||
|
||||
int irequest = neighbor->request(this);
|
||||
neighbor->requests[irequest]->newton = 2;
|
||||
neighbor->requests[irequest]->ghost = 1;
|
||||
|
||||
cutmax = MAX3(control->nonb_cut, control->hbond_cut, 2*control->bond_cut);
|
||||
|
||||
|
@ -394,6 +414,7 @@ void PairReaxC::setup( )
|
|||
|
||||
double PairReaxC::init_one(int i, int j)
|
||||
{
|
||||
cutghost[i][j] = cutghost[j][i] = cutmax;
|
||||
return cutmax;
|
||||
}
|
||||
|
||||
|
@ -588,7 +609,11 @@ int PairReaxC::estimate_reax_lists()
|
|||
marked = (int*) calloc( system->N, sizeof(int) );
|
||||
dist = (double*) calloc( system->N, sizeof(double) );
|
||||
|
||||
for( itr_i = 0; itr_i < list->inum; ++itr_i ){
|
||||
int inum = list->inum;
|
||||
int gnum = list->gnum;
|
||||
int numall = inum + gnum;
|
||||
|
||||
for( itr_i = 0; itr_i < inum+gnum; ++itr_i ){
|
||||
i = ilist[itr_i];
|
||||
marked[i] = 1;
|
||||
++num_marked;
|
||||
|
@ -598,50 +623,8 @@ int PairReaxC::estimate_reax_lists()
|
|||
j = jlist[itr_j];
|
||||
j &= NEIGHMASK;
|
||||
get_distance( x[j], x[i], &d_sqr, &dvec );
|
||||
dist[j] = sqrt(d_sqr);
|
||||
|
||||
if( dist[j] <= control->nonb_cut )
|
||||
++num_nbrs;
|
||||
}
|
||||
|
||||
// compute the nbrs among ghost atoms
|
||||
for( itr_j = 0; itr_j < numneigh[i]; ++itr_j ){
|
||||
j = jlist[itr_j];
|
||||
j &= NEIGHMASK;
|
||||
|
||||
if( j >= nlocal && !marked[j] &&
|
||||
dist[j] <= (control->vlist_cut - control->bond_cut) ){
|
||||
marked[j] = 1;
|
||||
++num_marked;
|
||||
|
||||
for( itr_g = 0; itr_g < numneigh[i]; ++itr_g ){
|
||||
g = jlist[itr_g];
|
||||
g &= NEIGHMASK;
|
||||
|
||||
if( g >= nlocal && !marked[g] ){
|
||||
get_distance( x[g], x[j], &g_d_sqr, &g_dvec );
|
||||
//g_dvec[0] = x[g][0] - x[j][0];
|
||||
//g_dvec[1] = x[g][1] - x[j][1];
|
||||
//g_dvec[2] = x[g][2] - x[j][2];
|
||||
//g_d_sqr = SQR(g_dvec[0]) + SQR(g_dvec[1]) + SQR(g_dvec[2]);
|
||||
|
||||
if( g_d_sqr <= SQR(control->bond_cut) )
|
||||
++num_nbrs;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( i = 0; i < system->N; ++i )
|
||||
if( !marked[i] ) {
|
||||
marked[i] = 1;
|
||||
++num_marked;
|
||||
|
||||
for( j = i+1; j < system->N; ++j )
|
||||
if( !marked[j] ) {
|
||||
get_distance( x[j], x[i], &d_sqr, &dvec );
|
||||
if( d_sqr <= SQR(control->bond_cut) )
|
||||
if( d_sqr <= SQR(control->nonb_cut) )
|
||||
++num_nbrs;
|
||||
}
|
||||
}
|
||||
|
@ -680,7 +663,11 @@ int PairReaxC::write_reax_lists()
|
|||
marked = (int*) calloc( system->N, sizeof(int) );
|
||||
dist = (double*) calloc( system->N, sizeof(double) );
|
||||
|
||||
for( itr_i = 0; itr_i < list->inum; ++itr_i ){
|
||||
int inum = list->inum;
|
||||
int gnum = list->gnum;
|
||||
int numall = inum + gnum;
|
||||
|
||||
for( itr_i = 0; itr_i < inum+gnum; ++itr_i ){
|
||||
i = ilist[itr_i];
|
||||
marked[i] = 1;
|
||||
jlist = firstneigh[i];
|
||||
|
@ -690,60 +677,14 @@ int PairReaxC::write_reax_lists()
|
|||
j = jlist[itr_j];
|
||||
j &= NEIGHMASK;
|
||||
get_distance( x[j], x[i], &d_sqr, &dvec );
|
||||
dist[j] = sqrt( d_sqr );
|
||||
|
||||
if( dist[j] <= control->nonb_cut ){
|
||||
if( d_sqr <= (control->nonb_cut*control->nonb_cut) ){
|
||||
dist[j] = sqrt( d_sqr );
|
||||
set_far_nbr( &far_list[num_nbrs], j, dist[j], dvec );
|
||||
++num_nbrs;
|
||||
}
|
||||
}
|
||||
Set_End_Index( i, num_nbrs, far_nbrs );
|
||||
|
||||
// compute the nbrs among ghost atoms
|
||||
for( itr_j = 0; itr_j < numneigh[i]; ++itr_j ){
|
||||
j = jlist[itr_j];
|
||||
j &= NEIGHMASK;
|
||||
|
||||
if( j >= nlocal && !marked[j] &&
|
||||
dist[j] <= (control->vlist_cut - control->bond_cut) ){
|
||||
marked[j] = 1;
|
||||
Set_Start_Index( j, num_nbrs, far_nbrs );
|
||||
|
||||
for( itr_g = 0; itr_g < numneigh[i]; ++itr_g ){
|
||||
g = jlist[itr_g];
|
||||
g &= NEIGHMASK;
|
||||
|
||||
if( g >= nlocal && !marked[g] ){
|
||||
get_distance( x[g], x[j], &g_d_sqr, &g_dvec );
|
||||
|
||||
if( g_d_sqr <= SQR(control->bond_cut) ){
|
||||
g_d = sqrt( g_d_sqr );
|
||||
|
||||
set_far_nbr( &far_list[num_nbrs], g, g_d, g_dvec );
|
||||
++num_nbrs;
|
||||
}
|
||||
}
|
||||
}
|
||||
Set_End_Index( j, num_nbrs, far_nbrs );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( i = 0; i < system->N; ++i )
|
||||
if( !marked[i] ) {
|
||||
marked[i] = 1;
|
||||
Set_Start_Index( i, num_nbrs, far_nbrs );
|
||||
|
||||
for( j = i+1; j < system->N; ++j )
|
||||
if( !marked[j] ) {
|
||||
get_distance( x[j], x[i], &d_sqr, &dvec );
|
||||
if( d_sqr <= SQR(control->bond_cut) ) {
|
||||
set_far_nbr( &far_list[num_nbrs], j, sqrt(d_sqr), dvec );
|
||||
++num_nbrs;
|
||||
}
|
||||
}
|
||||
|
||||
Set_End_Index( i, num_nbrs, far_nbrs );
|
||||
}
|
||||
|
||||
free( marked );
|
||||
|
|
|
@ -119,6 +119,140 @@ void Neighbor::half_bin_no_newton(NeighList *list)
|
|||
list->inum = inum;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
binned neighbor list construction with partial Newton's 3rd law
|
||||
include neighbors of ghost atoms, but no "special neighbors" for ghosts
|
||||
owned and ghost atoms check own bin and other bins in stencil
|
||||
pair stored once if i,j are both owned and i < j
|
||||
pair stored by me if i owned and j ghost (also stored by proc owning j)
|
||||
pair stored once if i,j are both ghost and i < j
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Neighbor::half_bin_no_newton_ghost(NeighList *list)
|
||||
{
|
||||
int i,j,k,n,itype,jtype,ibin,which;
|
||||
double xtmp,ytmp,ztmp,delx,dely,delz,rsq;
|
||||
int xbin,ybin,zbin,xbin2,ybin2,zbin2;
|
||||
int *neighptr;
|
||||
|
||||
// bin local & ghost atoms
|
||||
|
||||
bin_atoms();
|
||||
|
||||
// loop over each atom, storing neighbors
|
||||
|
||||
int **special = atom->special;
|
||||
int **nspecial = atom->nspecial;
|
||||
int *tag = atom->tag;
|
||||
|
||||
double **x = atom->x;
|
||||
int *type = atom->type;
|
||||
int *mask = atom->mask;
|
||||
int *molecule = atom->molecule;
|
||||
int nlocal = atom->nlocal;
|
||||
int nall = nlocal + atom->nghost;
|
||||
int molecular = atom->molecular;
|
||||
|
||||
int *ilist = list->ilist;
|
||||
int *numneigh = list->numneigh;
|
||||
int **firstneigh = list->firstneigh;
|
||||
int **pages = list->pages;
|
||||
int nstencil = list->nstencil;
|
||||
int *stencil = list->stencil;
|
||||
int **stencilxyz = list->stencilxyz;
|
||||
|
||||
int inum = 0;
|
||||
int npage = 0;
|
||||
int npnt = 0;
|
||||
|
||||
for (i = 0; i < nall; i++) {
|
||||
|
||||
if (pgsize - npnt < oneatom) {
|
||||
npnt = 0;
|
||||
npage++;
|
||||
if (npage == list->maxpage) pages = list->add_pages();
|
||||
}
|
||||
|
||||
neighptr = &pages[npage][npnt];
|
||||
n = 0;
|
||||
|
||||
itype = type[i];
|
||||
xtmp = x[i][0];
|
||||
ytmp = x[i][1];
|
||||
ztmp = x[i][2];
|
||||
|
||||
// loop over all atoms in other bins in stencil including self
|
||||
// when i is a ghost atom, must check if stencil bin is out of bounds
|
||||
// only store pair if i < j
|
||||
// stores own/own pairs only once
|
||||
// stores own/ghost pairs with owned atom only, on both procs
|
||||
// stores ghost/ghost pairs only once
|
||||
|
||||
if (i < nlocal) {
|
||||
ibin = coord2bin(x[i]);
|
||||
|
||||
for (k = 0; k < nstencil; k++) {
|
||||
for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) {
|
||||
if (j <= i) continue;
|
||||
|
||||
jtype = type[j];
|
||||
if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue;
|
||||
|
||||
delx = xtmp - x[j][0];
|
||||
dely = ytmp - x[j][1];
|
||||
delz = ztmp - x[j][2];
|
||||
rsq = delx*delx + dely*dely + delz*delz;
|
||||
|
||||
if (rsq <= cutneighsq[itype][jtype]) {
|
||||
if (molecular) {
|
||||
which = find_special(special[i],nspecial[i],tag[j]);
|
||||
if (which == 0) neighptr[n++] = j;
|
||||
else if (domain->minimum_image_check(delx,dely,delz))
|
||||
neighptr[n++] = j;
|
||||
else if (which > 0) neighptr[n++] = j ^ (which << SBBITS);
|
||||
} else neighptr[n++] = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
ibin = coord2bin(x[i],xbin,ybin,zbin);
|
||||
for (k = 0; k < nstencil; k++) {
|
||||
xbin2 = xbin + stencilxyz[k][0];
|
||||
ybin2 = ybin + stencilxyz[k][1];
|
||||
zbin2 = zbin + stencilxyz[k][2];
|
||||
if (xbin2 < 0 || xbin2 >= mbinx ||
|
||||
ybin2 < 0 || ybin2 >= mbiny ||
|
||||
zbin2 < 0 || zbin2 >= mbinz) continue;
|
||||
for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) {
|
||||
if (j <= i) continue;
|
||||
|
||||
jtype = type[j];
|
||||
if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue;
|
||||
|
||||
delx = xtmp - x[j][0];
|
||||
dely = ytmp - x[j][1];
|
||||
delz = ztmp - x[j][2];
|
||||
rsq = delx*delx + dely*dely + delz*delz;
|
||||
|
||||
if (rsq <= cutneighghostsq[itype][jtype])
|
||||
neighptr[n++] = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ilist[inum++] = i;
|
||||
firstneigh[i] = neighptr;
|
||||
numneigh[i] = n;
|
||||
npnt += n;
|
||||
if (n > oneatom)
|
||||
error->one(FLERR,"Neighbor list overflow, boost neigh_modify one");
|
||||
}
|
||||
|
||||
list->inum = atom->nlocal;
|
||||
list->gnum = inum - atom->nlocal;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
binned neighbor list construction with full Newton's 3rd law
|
||||
each owned atom i checks its own bin and other bins in Newton stencil
|
||||
|
|
|
@ -79,6 +79,29 @@ void Neighbor::stencil_half_bin_3d_no_newton(NeighList *list,
|
|||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void Neighbor::stencil_half_ghost_bin_3d_no_newton(NeighList *list,
|
||||
int sx, int sy, int sz)
|
||||
{
|
||||
int i,j,k;
|
||||
int *stencil = list->stencil;
|
||||
int **stencilxyz = list->stencilxyz;
|
||||
int nstencil = 0;
|
||||
|
||||
for (k = -sz; k <= sz; k++)
|
||||
for (j = -sy; j <= sy; j++)
|
||||
for (i = -sx; i <= sx; i++)
|
||||
if (bin_distance(i,j,k) < cutneighmaxsq) {
|
||||
stencilxyz[nstencil][0] = i;
|
||||
stencilxyz[nstencil][1] = j;
|
||||
stencilxyz[nstencil][2] = k;
|
||||
stencil[nstencil++] = k*mbiny*mbinx + j*mbinx + i;
|
||||
}
|
||||
|
||||
list->nstencil = nstencil;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void Neighbor::stencil_half_bin_2d_newton(NeighList *list,
|
||||
int sx, int sy, int sz)
|
||||
{
|
||||
|
|
|
@ -493,8 +493,10 @@ void Neighbor::init()
|
|||
lists[i]->listskip = lists[requests[i]->otherlist];
|
||||
lists[i]->copy_skip_info(requests[i]->iskip,requests[i]->ijskip);
|
||||
|
||||
} else if (requests[i]->half_from_full)
|
||||
} else if (requests[i]->half_from_full) {
|
||||
lists[i]->listfull = lists[i-1];
|
||||
printf("AAA\n");
|
||||
}
|
||||
|
||||
else if (requests[i]->granhistory) {
|
||||
lists[i-1]->listgranhistory = lists[i];
|
||||
|
@ -520,6 +522,7 @@ void Neighbor::init()
|
|||
requests[i]->half = 0;
|
||||
requests[i]->half_from_full = 1;
|
||||
lists[i]->listfull = lists[j];
|
||||
printf("BBB %d %d\n",nlist,j);
|
||||
}
|
||||
|
||||
} else if (requests[i]->fix || requests[i]->compute) {
|
||||
|
@ -547,6 +550,7 @@ void Neighbor::init()
|
|||
requests[i]->half = 0;
|
||||
requests[i]->half_from_full = 1;
|
||||
lists[i]->listfull = lists[j];
|
||||
printf("CCC\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -829,9 +833,7 @@ void Neighbor::choose_build(int index, NeighRequest *rq)
|
|||
else if (newton_pair == 1) pb = &Neighbor::half_nsq_newton;
|
||||
} else if (rq->newton == 1) {
|
||||
pb = &Neighbor::half_nsq_newton;
|
||||
} else if (rq->newton == 2) {
|
||||
pb = &Neighbor::half_nsq_no_newton;
|
||||
}
|
||||
} else if (rq->newton == 2) pb = &Neighbor::half_nsq_no_newton;
|
||||
} else if (style == BIN) {
|
||||
if (rq->newton == 0) {
|
||||
if (newton_pair == 0) pb = &Neighbor::half_bin_no_newton;
|
||||
|
@ -840,7 +842,10 @@ void Neighbor::choose_build(int index, NeighRequest *rq)
|
|||
} else if (rq->newton == 1) {
|
||||
if (triclinic == 0) pb = &Neighbor::half_bin_newton;
|
||||
else if (triclinic == 1) pb = &Neighbor::half_bin_newton_tri;
|
||||
} else if (rq->newton == 2) pb = &Neighbor::half_bin_no_newton;
|
||||
} else if (rq->newton == 2) {
|
||||
if (rq->ghost) pb = &Neighbor::half_bin_no_newton_ghost;
|
||||
else pb = &Neighbor::half_bin_no_newton;
|
||||
}
|
||||
} else if (style == MULTI) {
|
||||
if (rq->newton == 0) {
|
||||
if (newton_pair == 0) pb = &Neighbor::half_multi_no_newton;
|
||||
|
@ -982,9 +987,9 @@ void Neighbor::choose_build(int index, NeighRequest *rq)
|
|||
|
||||
// general error check
|
||||
|
||||
if (rq->ghost && !rq->full)
|
||||
error->all(FLERR,
|
||||
"Neighbors of ghost atoms only allowed for full neighbor lists");
|
||||
//if (rq->ghost && !rq->full)
|
||||
// error->all(FLERR,
|
||||
// "Neighbors of ghost atoms only allowed for full neighbor lists");
|
||||
|
||||
pair_build[index] = pb;
|
||||
}
|
||||
|
@ -1038,8 +1043,10 @@ void Neighbor::choose_stencil(int index, NeighRequest *rq)
|
|||
} else if (rq->newton == 2) {
|
||||
if (dimension == 2)
|
||||
sc = &Neighbor::stencil_half_bin_2d_no_newton;
|
||||
else if (dimension == 3)
|
||||
sc = &Neighbor::stencil_half_bin_3d_no_newton;
|
||||
else if (dimension == 3) {
|
||||
if (rq->ghost) sc = &Neighbor::stencil_half_ghost_bin_3d_no_newton;
|
||||
else sc = &Neighbor::stencil_half_bin_3d_no_newton;
|
||||
}
|
||||
}
|
||||
|
||||
} else if (style == MULTI) {
|
||||
|
|
|
@ -180,6 +180,7 @@ class Neighbor : protected Pointers {
|
|||
void half_nsq_newton(class NeighList *);
|
||||
|
||||
void half_bin_no_newton(class NeighList *);
|
||||
void half_bin_no_newton_ghost(class NeighList *);
|
||||
void half_bin_newton(class NeighList *);
|
||||
void half_bin_newton_tri(class NeighList *);
|
||||
|
||||
|
@ -223,6 +224,7 @@ class Neighbor : protected Pointers {
|
|||
|
||||
void stencil_half_bin_2d_no_newton(class NeighList *, int, int, int);
|
||||
void stencil_half_bin_3d_no_newton(class NeighList *, int, int, int);
|
||||
void stencil_half_ghost_bin_3d_no_newton(class NeighList *, int, int, int);
|
||||
void stencil_half_bin_2d_newton(class NeighList *, int, int, int);
|
||||
void stencil_half_bin_3d_newton(class NeighList *, int, int, int);
|
||||
void stencil_half_bin_2d_newton_tri(class NeighList *, int, int, int);
|
||||
|
|
Loading…
Reference in New Issue