" author = {J. P. Larentzos, J. K. Brennan, J. D. Moore, M. Lisal, W. D. Mattson},\n"
" title = {Parallel implementation of isothermal and isoenergetic Dissipative Particle Dynamics using Shardlow-like splitting algorithms},\n"
" journal = {Computer Physics Communications},\n"
" year = 2014,\n"
" volume = 185\n"
" pages = {1987--1998}\n"
"}\n\n"
"@Article{Lisal11,\n"
" author = {M. Lisal, J. K. Brennan, J. Bonet Avalos},\n"
" title = {Dissipative particle dynamics at isothermal, isobaric, isoenergetic, and isoenthalpic conditions using Shardlow-like splitting algorithms},\n"
// NOTE: this logic is specific to orthogonal boxes, not triclinic
// Enforce the constraint that ghosts must be contained in the nearest sub-domains
doublebbx=domain->subhi[0]-domain->sublo[0];
doublebby=domain->subhi[1]-domain->sublo[1];
doublebbz=domain->subhi[2]-domain->sublo[2];
doublercut=double(2.0)*neighbor->cutneighmax;
if(domain->triclinic)
error->all(FLERR,"Fix shardlow does not yet support triclinic geometries");
if(rcut>=bbx||rcut>=bby||rcut>=bbz)
error->all(FLERR,"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either reduce the number of processors requested, or change the cutoff/skin\n");
// Allocate memory for the dvSSA arrays
dvSSA=newdouble*[nall];
for(ii=0;ii<nall;ii++){
dvSSA[ii]=newdouble[3];
}
// Zero the momenta
for(ii=0;ii<nlocal;ii++){
dvSSA[ii][0]=double(0.0);
dvSSA[ii][1]=double(0.0);
dvSSA[ii][2]=double(0.0);
if(pairDPDE){
duCond[ii]=double(0.0);
duMech[ii]=double(0.0);
}
}
// Communicate the updated momenta and velocities to all nodes
comm->forward_comm_fix(this);
// Define pointers to access the neighbor list
if(pairDPDE){
inum=pairDPDE->list->inum;
ilist=pairDPDE->list->ilist;
numneigh=pairDPDE->list->numneigh;
firstneigh=pairDPDE->list->firstneigh;
}else{
inum=pairDPD->list->inum;
ilist=pairDPD->list->ilist;
numneigh=pairDPD->list->numneigh;
firstneigh=pairDPD->list->firstneigh;
}
//Loop over all 14 directions (8 stages)
for(intidir=1;idir<=8;idir++){
// Loop over neighbors of my atoms
for(ii=0;ii<inum;ii++){
i=ilist[ii];
xtmp=x[i][0];
ytmp=x[i][1];
ztmp=x[i][2];
itype=type[i];
jlist=firstneigh[i];
jnum=numneigh[i];
// Loop over Directional Neighbors only
for(jj=0;jj<jnum;jj++){
j=jlist[jj];
j&=NEIGHMASK;
if(neighbor->ssa_airnum[j]!=idir)continue;
jtype=type[j];
delx=xtmp-x[j][0];
dely=ytmp-x[j][1];
delz=ztmp-x[j][2];
rsq=delx*delx+dely*dely+delz*delz;
if(pairDPDE){
cut2=pairDPDE->cutsq[itype][jtype];
cut=pairDPDE->cut[itype][jtype];
}else{
cut2=pairDPD->cutsq[itype][jtype];
cut=pairDPD->cut[itype][jtype];
}
// if (rsq < pairDPD->cutsq[itype][jtype]) {
if(rsq<cut2){
r=sqrt(rsq);
if(r<EPSILON)continue;// r can be 0.0 in DPD systems
rinv=double(1.0)/r;
// Store the velocities from previous Shardlow step
vx0i=v[i][0]+dvSSA[i][0];
vy0i=v[i][1]+dvSSA[i][1];
vz0i=v[i][2]+dvSSA[i][2];
vx0j=v[j][0]+dvSSA[j][0];
vy0j=v[j][1]+dvSSA[j][1];
vz0j=v[j][2]+dvSSA[j][2];
// Compute the velocity difference between atom i and atom j