From 85e934681d298a2fa226562e9dedfb18365b9968 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Mon, 16 Apr 2018 12:38:14 -0600 Subject: [PATCH 001/243] Added DMT and JKR pair styles with rolling friction --- src/GRANULAR/pair_gran_dmt_rolling.cpp | 720 +++++++++++++++++++++ src/GRANULAR/pair_gran_dmt_rolling.h | 55 ++ src/GRANULAR/pair_gran_hertz_history.cpp | 2 +- src/GRANULAR/pair_gran_hooke_history.cpp | 5 +- src/GRANULAR/pair_gran_hooke_history.h | 4 +- src/GRANULAR/pair_gran_jkr_rolling.cpp | 763 +++++++++++++++++++++++ src/GRANULAR/pair_gran_jkr_rolling.h | 56 ++ 7 files changed, 1601 insertions(+), 4 deletions(-) create mode 100644 src/GRANULAR/pair_gran_dmt_rolling.cpp create mode 100644 src/GRANULAR/pair_gran_dmt_rolling.h create mode 100644 src/GRANULAR/pair_gran_jkr_rolling.cpp create mode 100644 src/GRANULAR/pair_gran_jkr_rolling.h diff --git a/src/GRANULAR/pair_gran_dmt_rolling.cpp b/src/GRANULAR/pair_gran_dmt_rolling.cpp new file mode 100644 index 0000000000..08299f85b5 --- /dev/null +++ b/src/GRANULAR/pair_gran_dmt_rolling.cpp @@ -0,0 +1,720 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gran_dmt_rolling.h" +#include "atom.h" +#include "update.h" +#include "force.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define TWOTHIRDS 0.6666666666666666 +#define EPSILON 1e-10 + +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + +/* ---------------------------------------------------------------------- */ + +PairGranDMTRolling::PairGranDMTRolling(LAMMPS *lmp) : + PairGranHookeHistory(lmp, 7), + E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), + Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) +{ + int ntypes = atom->ntypes; + memory->create(E,ntypes+1,ntypes+1,"pair:E"); + memory->create(G,ntypes+1,ntypes+1,"pair:G"); + memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); + memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); + memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); + memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); + memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); + memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); + memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); +} + +/* ---------------------------------------------------------------------- */ +PairGranDMTRolling::~PairGranDMTRolling() +{ + delete [] E_one; + delete [] G_one; + delete [] pois; + delete [] muS_one; + delete [] cor; + delete [] alpha_one; + delete [] Ecoh_one; + delete [] kR_one; + delete [] muR_one; + delete [] etaR_one; + //TODO: Make all this work with standard pair coeff type commands. + //Also these should not be in the destructor. + memory->destroy(E); + memory->destroy(G); + memory->destroy(alpha); + memory->destroy(gamman); + memory->destroy(muS); + memory->destroy(Ecoh); + memory->destroy(kR); + memory->destroy(muR); + memory->destroy(etaR); +} +/* ---------------------------------------------------------------------- */ + +void PairGranDMTRolling::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum; + int itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; + double overlap; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *shear,*allshear,**firstshear; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + jtype = type[j]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum){ + // unset non-touching neighbors + touch[jj] = 0; + shear = &allshear[size_history*jj]; + for (int k = 0; k < size_history; k++) + shear[k] = 0.0; + } else { + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + //**************************************** + //Normal force = Hertzian contact + DMT + damping + //**************************************** + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*E[itype][jtype]*a; + Fhz = kn*overlap; + + //Damping (based on Tsuji et al) + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + //DMT + Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; + + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including shear history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + //delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + touch[jj] = 1; + shear = &allshear[size_history*jj]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + + // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + //**************************************** + // Rolling force, including shear history effects + //**************************************** + + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } + + k_R = kR[itype][jtype]; + if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*shear[3] - eta_R*vrl1; + fr2 = -k_R*shear[4] - eta_R*vrl2; + fr3 = -k_R*shear[5] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne); + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + + + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit){ + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairGranDMTRolling::settings(int narg, char **arg) +{ + if (narg < 6) error->all(FLERR,"Illegal pair_style command"); + + int ntypes = atom->ntypes; + + if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); + + E_one = new double[ntypes+1]; + G_one = new double[ntypes+1]; + pois = new double[ntypes+1]; + muS_one = new double[ntypes+1]; + cor = new double[ntypes+1]; + alpha_one = new double[ntypes+1]; + Ecoh_one = new double[ntypes+1]; + kR_one = new double[ntypes+1]; + muR_one = new double[ntypes+1]; + etaR_one = new double[ntypes+1]; + + for (int i=0; i < ntypes;i++){ + E_one[i+1] = force->numeric(FLERR, arg[i]); + G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); + muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); + cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); + Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); + kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); + muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); + etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); + } + + //Defaults + normaldamp = TSUJI; + rollingdamp = INDEP; + + int iarg = 8*ntypes; + while (iarg < narg){ + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else{ + iarg +=1; + } + } + + //Derived from inputs + for (int i=1; i <= ntypes; i++){ + pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; + alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; + for (int j=i; j <= ntypes; j++){ + E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); + G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); + if (normaldamp == TSUJI){ + alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); + } + else if (normaldamp == BRILLIANTOV){ + gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); + } + muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); + Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); + kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); + etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); + muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); + } + } +} + +/* ---------------------------------------------------------------------- */ + +double PairGranDMTRolling::single(int i, int j, int itype, int jtype, + double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double overlap, a; + double mi,mj,meff,damp,kn,kt; + double Fhz,Fdamp,Fdmt,Fne,Fntot,Fscrit; + double eta_N,eta_T; + double vtr1,vtr2,vtr3,vrel; + double fs1,fs2,fs3,fs; + double shrmag; + + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum) { + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; + } + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/radsum; + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + + // normal force = Hertzian contact + normal velocity damping + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*E[itype][jtype]*a; + Fhz = kn*overlap; + + //Damping (based on Tsuji et al) + + eta_N=alpha[itype][jtype]*sqrt(meff*kn); + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + //DMT + Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; + + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; + + // relative velocities + + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allshear = fix_history->firstvalue[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *shear = &allshear[size_history*neighprev]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // tangential forces = shear + tangential velocity damping + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; + fs1 = -kt*shear[0] - eta_T*vtr1; + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + Fscrit= muS[itype][jtype] * fabs(Fne); + + if (fs > Fscrit) { + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set all forces and return no energy + + fforce = Fntot; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + return 0.0; +} diff --git a/src/GRANULAR/pair_gran_dmt_rolling.h b/src/GRANULAR/pair_gran_dmt_rolling.h new file mode 100644 index 0000000000..8f4ae2005e --- /dev/null +++ b/src/GRANULAR/pair_gran_dmt_rolling.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gran/dmt/rolling,PairGranDMTRolling) + +#else + +#ifndef LMP_PAIR_GRAN_DMT_ROLLING_H +#define LMP_PAIR_GRAN_DMT_ROLLING_H + +#include "pair_gran_hooke_history.h" + +namespace LAMMPS_NS { + +class PairGranDMTRolling : public PairGranHookeHistory { +public: + PairGranDMTRolling(class LAMMPS *); + virtual ~PairGranDMTRolling(); + virtual void compute(int, int); + void settings(int, char **); //Eventually set this through coeff method so that user can specify a particular i-j set of coefficients + double single(int, int, int, int, double, double, double, double &); + double *E_one, *G_one, *pois, *muS_one, *cor, *alpha_one, *Ecoh_one, *kR_one, *muR_one, *etaR_one; //Public so as to be accessible to fix/wall/gran +private: + double **E, **G, **alpha, **muS, **Ecoh, **kR, **muR, **etaR, **gamman; + int normaldamp, rollingdamp; + + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ diff --git a/src/GRANULAR/pair_gran_hertz_history.cpp b/src/GRANULAR/pair_gran_hertz_history.cpp index 9723531625..5508b17d99 100644 --- a/src/GRANULAR/pair_gran_hertz_history.cpp +++ b/src/GRANULAR/pair_gran_hertz_history.cpp @@ -36,7 +36,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ PairGranHertzHistory::PairGranHertzHistory(LAMMPS *lmp) : - PairGranHookeHistory(lmp) {} + PairGranHookeHistory(lmp, 3) {} /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 4f120150de..f1a155f2e4 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -39,7 +39,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) +PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp, int _size_history) : Pair(lmp), + size_history(_size_history) { single_enable = 1; no_virial_fdotr_compute = 1; @@ -412,7 +413,7 @@ void PairGranHookeHistory::init_style() if (history && fix_history == NULL) { char dnumstr[16]; - sprintf(dnumstr,"%d",3); + sprintf(dnumstr,"%d",size_history); char **fixarg = new char*[4]; fixarg[0] = (char *) "NEIGH_HISTORY"; fixarg[1] = (char *) "all"; diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index 3ca5c73116..c35de04109 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -26,7 +26,7 @@ namespace LAMMPS_NS { class PairGranHookeHistory : public Pair { public: - PairGranHookeHistory(class LAMMPS *); + PairGranHookeHistory(class LAMMPS *, int size_history = 3); virtual ~PairGranHookeHistory(); virtual void compute(int, int); virtual void settings(int, char **); @@ -54,6 +54,8 @@ class PairGranHookeHistory : public Pair { double *onerad_dynamic,*onerad_frozen; double *maxrad_dynamic,*maxrad_frozen; + int size_history; + class FixNeighHistory *fix_history; // storage of rigid body masses for use in granular interactions diff --git a/src/GRANULAR/pair_gran_jkr_rolling.cpp b/src/GRANULAR/pair_gran_jkr_rolling.cpp new file mode 100644 index 0000000000..ce109cccbc --- /dev/null +++ b/src/GRANULAR/pair_gran_jkr_rolling.cpp @@ -0,0 +1,763 @@ +/* ---------------------------------------------------------------------- + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gran_jkr_rolling.h" +#include "atom.h" +#include "update.h" +#include "force.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define ONETHIRD 0.33333333333333333 +#define TWOTHIRDS 0.66666666666666666 +#define POW6ONE 0.550321208149104 //6^(-1/3) +#define POW6TWO 0.30285343213869 //6^(-2/3) + +#define EPSILON 1e-10 + +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + +/* ---------------------------------------------------------------------- */ + +PairGranJKRRolling::PairGranJKRRolling(LAMMPS *lmp) : + PairGranHookeHistory(lmp, 7) +{ + E_one = NULL; + G_one = NULL; + pois = NULL; + muS_one = NULL; + cor = NULL; + alpha_one = NULL; + Ecoh_one = NULL; + kR_one = NULL; + muR_one = NULL; + etaR_one = NULL; + int ntypes = atom->ntypes; + memory->create(E,ntypes+1,ntypes+1,"pair:E"); + memory->create(G,ntypes+1,ntypes+1,"pair:G"); + memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); + memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); + memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); + memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); + memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); + memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); + memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); +} + +/* ---------------------------------------------------------------------- */ +PairGranJKRRolling::~PairGranJKRRolling() +{ + delete [] E_one; + delete [] G_one; + delete [] pois; + delete [] muS_one; + delete [] cor; + delete [] alpha_one; + delete [] Ecoh_one; + delete [] kR_one; + delete [] muR_one; + delete [] etaR_one; + //TODO: Make all this work with standard pair coeff type commands. + //Also these should not be in the destructor. + memory->destroy(E); + memory->destroy(G); + memory->destroy(alpha); + memory->destroy(gamman); + memory->destroy(muS); + memory->destroy(Ecoh); + memory->destroy(kR); + memory->destroy(muR); + memory->destroy(etaR); +} +/* ---------------------------------------------------------------------- */ + +void PairGranJKRRolling::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum; + int itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; + double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *shear,*allshear,**firstshear; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + jtype = type[j]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + if ((rsq >= radsum*radsum && touch[jj] == 0) || + (rsq >= (radsum+delta_C)*(radsum+delta_C))){ + // unset non-touching neighbors + touch[jj] = 0; + shear = &allshear[size_history*jj]; + for (int k = 0; k < size_history; k++) + shear[k] = 0.0; + } else { + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + //**************************************** + //Normal force = JKR-adjusted Hertzian contact + damping + //**************************************** + if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; + else delta_Cinv = 1.0; + overlap = (radsum - r)*delta_Cinv; + olapsq = overlap*overlap; + olapcubed = olapsq*overlap; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including shear history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + //delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + touch[jj] = 1; + shear = &allshear[size_history*jj]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + + // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + //**************************************** + // Rolling force, including shear history effects + //**************************************** + + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } + + k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); + if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*shear[3] - eta_R*vrl1; + fr2 = -k_R*shear[4] - eta_R*vrl2; + fr3 = -k_R*shear[5] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + + + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + //shear[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairGranJKRRolling::settings(int narg, char **arg) +{ + if (narg < 6) error->all(FLERR,"Illegal pair_style command"); + + int ntypes = atom->ntypes; + + if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); + + E_one = new double[ntypes+1]; + G_one = new double[ntypes+1]; + pois = new double[ntypes+1]; + muS_one = new double[ntypes+1]; + cor = new double[ntypes+1]; + alpha_one = new double[ntypes+1]; + Ecoh_one = new double[ntypes+1]; + kR_one = new double[ntypes+1]; + muR_one = new double[ntypes+1]; + etaR_one = new double[ntypes+1]; + + //Defaults + normaldamp = TSUJI; + rollingdamp = INDEP; + + int iarg = 8*ntypes; + while (iarg < narg){ + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg +=2; + } + else iarg += 1; + } + + for (int i=0; i < ntypes;i++){ + + E_one[i+1] = force->numeric(FLERR, arg[i]); + G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); + muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); + cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); + Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); + kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); + muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); + etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); + } + + //Optional keywords: + // normaldamp tsuji, or normaldamp brilliantov + // rollingdamp brilliantov + + //Derived from inputs + for (int i=1; i <= ntypes; i++){ + pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; + alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; + for (int j=i; j <= ntypes; j++){ + E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); + G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); + if (normaldamp == TSUJI){ + alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); + } + else if (normaldamp == BRILLIANTOV){ + gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); + } + muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); + Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); + kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); + etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); + muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); + } + } +} + +/* ---------------------------------------------------------------------- */ + +double PairGranJKRRolling::single(int i, int j, int itype, int jtype, + double rsq, + double factor_coul, double factor_lj, + double &fforce) +{//TODO: update PairGranJKRRolling::single for JKR + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double overlap, a; + double mi,mj,meff,damp,kn,kt; + double Fdamp,Fne,Fntot,Fscrit; + double eta_N,eta_T; + double vtr1,vtr2,vtr3,vrel; + double fs1,fs2,fs3,fs; + double shrmag; + double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + int *touch = fix_history->firstflag[i]; + if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| + (rsq >= radsum*radsum && touch[j])){ + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; + } + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + + // normal force = JKR + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + overlap = radsum - r; + olapsq = overlap*overlap; + olapcubed = olapsq*olapsq; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + + // relative velocities + + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allshear = fix_history->firstvalue[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *shear = &allshear[size_history*neighprev]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // tangential forces = shear + tangential velocity damping + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; + fs1 = -kt*shear[0] - eta_T*vtr1; + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); + + if (fs > Fscrit) { + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set all forces and return no energy + + fforce = Fntot; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + return 0.0; +} diff --git a/src/GRANULAR/pair_gran_jkr_rolling.h b/src/GRANULAR/pair_gran_jkr_rolling.h new file mode 100644 index 0000000000..8c4b339eb3 --- /dev/null +++ b/src/GRANULAR/pair_gran_jkr_rolling.h @@ -0,0 +1,56 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gran/jkr/rolling,PairGranJKRRolling) + +#else + +#ifndef LMP_PAIR_GRAN_JKR_ROLLING_H +#define LMP_PAIR_GRAN_JKR_ROLLING_H + +#include "pair_gran_hooke_history.h" + +namespace LAMMPS_NS { + +class PairGranJKRRolling : public PairGranHookeHistory { +public: + PairGranJKRRolling(class LAMMPS *); + virtual ~PairGranJKRRolling(); + virtual void compute(int, int); + void settings(int, char **); //Eventually set this through coeff method so that user can specify a particular i-j set of coefficients + double single(int, int, int, int, double, double, double, double &); + double *E_one, *G_one, *pois, *muS_one, *cor, *alpha_one, *Ecoh_one, *kR_one, *muR_one, *etaR_one; //Public so as to be accessible to fix/wall/gran +private: + double **E, **G, **alpha, **muS, **Ecoh, **kR, **muR, **etaR, **gamman; + int normaldamp, rollingdamp; + + + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ From f94c5b7637ac5840ddbd3db0e5f45e07e1413477 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Mon, 16 Apr 2018 12:40:22 -0600 Subject: [PATCH 002/243] Added 'store_contacts' option to fix/wall/gran/region to store info about individual particle-wall contacts --- src/GRANULAR/fix_wall_gran.cpp | 112 ++++++++++++++++++++++---- src/GRANULAR/fix_wall_gran.h | 11 ++- src/GRANULAR/fix_wall_gran_region.cpp | 96 ++++++++++++++-------- 3 files changed, 166 insertions(+), 53 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 033c35dbac..a8386238d7 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -100,7 +100,6 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg = 10; } - else { if (narg < 10) error->all(FLERR,"Illegal fix wall/gran command"); @@ -165,6 +164,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : wiggle = 0; wshear = 0; + peratom_flag = 0; while (iarg < narg) { if (strcmp(arg[iarg],"wiggle") == 0) { @@ -186,7 +186,13 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : vshear = force->numeric(FLERR,arg[iarg+2]); wshear = 1; iarg += 3; + } else if (strcmp(arg[iarg],"store_contacts") == 0){ + peratom_flag = 1; + size_peratom_cols = 8; //Could make this a user input option? + peratom_freq = 1; + iarg += 1; } else error->all(FLERR,"Illegal fix wall/gran command"); + } if (wallstyle == XPLANE && domain->xperiodic) @@ -239,6 +245,13 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : shearone[i][j] = 0.0; } + if (peratom_flag){ + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) + for (int m = 0; m < size_peratom_cols; m++) + array_atom[i][m] = 0.0; + } + time_origin = update->ntimestep; } @@ -425,20 +438,37 @@ void FixWallGran::post_force(int vflag) meff = rmass[i]; if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; + // store contact info + if (peratom_flag){ + array_atom[i][0] = (double)atom->tag[i]; + array_atom[i][4] = x[i][0] - dx; + array_atom[i][5] = x[i][1] - dy; + array_atom[i][6] = x[i][2] - dz; + array_atom[i][7] = radius[i]; + } + // invoke sphere/wall interaction + double *contact; + if (peratom_flag) + contact = array_atom[i]; + else + contact = NULL; if (pairstyle == HOOKE) hooke(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff); + omega[i],torque[i],radius[i],meff, contact); else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); + omega[i],torque[i],radius[i],meff,shearone[i], + contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); + omega[i],torque[i],radius[i],meff,shearone[i], + contact); else if (pairstyle == BONDED_HISTORY) bonded_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); + omega[i],torque[i],radius[i],meff,shearone[i], + contact); } } } @@ -456,7 +486,7 @@ void FixWallGran::post_force_respa(int vflag, int ilevel, int iloop) void FixWallGran::hooke(double rsq, double dx, double dy, double dz, double *vwall, double *v, double *f, double *omega, double *torque, - double radius, double meff) + double radius, double meff, double* contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -523,6 +553,12 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, fy = dy*ccel + fs2; fz = dz*ccel + fs3; + if (peratom_flag){ + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } + f[0] += fx; f[1] += fy; f[2] += fz; @@ -540,7 +576,8 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, double *vwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear) + double radius, double meff, double *shear, + double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -643,6 +680,12 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, f[1] += fy; f[2] += fz; + if (peratom_flag){ + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } + tor1 = rinv * (dy*fs3 - dz*fs2); tor2 = rinv * (dz*fs1 - dx*fs3); tor3 = rinv * (dx*fs2 - dy*fs1); @@ -656,7 +699,8 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, double *vwall, double rwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear) + double radius, double meff, double *shear, + double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -762,6 +806,12 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, fy = dy*ccel + fs2; fz = dz*ccel + fs3; + if (peratom_flag){ + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } + f[0] += fx; f[1] += fy; f[2] += fz; @@ -780,7 +830,8 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, double *vwall, double rwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear) + double radius, double meff, double *shear, + double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -999,6 +1050,12 @@ void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, f[1] += fy; f[2] += fz; + if (peratom_flag){ + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } + tor1 = rinv * (dy*fs3 - dz*fs2); tor2 = rinv * (dz*fs1 - dx*fs3); tor3 = rinv * (dx*fs2 - dy*fs1); @@ -1025,6 +1082,7 @@ double FixWallGran::memory_usage() double bytes = 0.0; if (history) bytes += nmax*sheardim * sizeof(double); // shear history if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid + if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); //store contacts return bytes; } @@ -1035,6 +1093,9 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { if (history) memory->grow(shearone,nmax,sheardim,"fix_wall_gran:shearone"); + if (peratom_flag){ + memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); + } } /* ---------------------------------------------------------------------- @@ -1046,6 +1107,10 @@ void FixWallGran::copy_arrays(int i, int j, int delflag) if (history) for (int m = 0; m < sheardim; m++) shearone[j][m] = shearone[i][m]; + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[j][m] = array_atom[i][m]; + } } /* ---------------------------------------------------------------------- @@ -1057,6 +1122,10 @@ void FixWallGran::set_arrays(int i) if (history) for (int m = 0; m < sheardim; m++) shearone[i][m] = 0; + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[i][m] = 0; + } } /* ---------------------------------------------------------------------- @@ -1065,11 +1134,15 @@ void FixWallGran::set_arrays(int i) int FixWallGran::pack_exchange(int i, double *buf) { - if (!history) return 0; - int n = 0; - for (int m = 0; m < sheardim; m++) - buf[n++] = shearone[i][m]; + if (history){ + for (int m = 0; m < sheardim; m++) + buf[n++] = shearone[i][m]; + } + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + buf[n++] = array_atom[i][m]; + } return n; } @@ -1079,11 +1152,15 @@ int FixWallGran::pack_exchange(int i, double *buf) int FixWallGran::unpack_exchange(int nlocal, double *buf) { - if (!history) return 0; - int n = 0; - for (int m = 0; m < sheardim; m++) - shearone[nlocal][m] = buf[n++]; + if (history){ + for (int m = 0; m < sheardim; m++) + shearone[nlocal][m] = buf[n++]; + } + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[nlocal][m] = buf[n++]; + } return n; } @@ -1148,3 +1225,4 @@ void FixWallGran::reset_dt() { dt = update->dt; } + diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index 2403a31907..f1a5dbc842 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -47,16 +47,16 @@ class FixWallGran : public Fix { void reset_dt(); void hooke(double, double, double, double, double *, - double *, double *, double *, double *, double, double); + double *, double *, double *, double *, double, double, double*); void hooke_history(double, double, double, double, double *, double *, double *, double *, double *, double, double, - double *); + double *, double *); void hertz_history(double, double, double, double, double *, double, double *, double *, double *, double *, double, double, - double *); + double *, double *); void bonded_history(double, double, double, double, double *, double, double *, double *, double *, double *, double, double, - double *); + double *, double *); protected: int wallstyle,wiggle,wshear,axis; @@ -82,6 +82,9 @@ class FixWallGran : public Fix { class Fix *fix_rigid; // ptr to rigid body fix, NULL if none double *mass_rigid; // rigid mass for owned+ghost atoms int nmax; // allocated size of mass_rigid + + // Store particle interactions + int store; }; } diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index d1c5d4c9c7..e00036c26a 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -238,23 +238,37 @@ void FixWallGranRegion::post_force(int vflag) meff = rmass[i]; if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; - // invoke sphere/wall interaction + // store contact info + if (peratom_flag){ + array_atom[i][0] = (double)atom->tag[i]; + array_atom[i][4] = x[i][0] - dx; + array_atom[i][5] = x[i][1] - dy; + array_atom[i][6] = x[i][2] - dz; + array_atom[i][7] = radius[i]; + } + // invoke sphere/wall interaction + double *contact; + if (peratom_flag) + contact = array_atom[i]; + else + contact = NULL; + if (pairstyle == HOOKE) hooke(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff); + omega[i],torque[i],radius[i],meff, contact); else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], omega[i],torque[i],radius[i],meff, - shearmany[i][c2r[ic]]); + shearmany[i][c2r[ic]], contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]]); + radius[i],meff,shearmany[i][c2r[ic]], contact); else if (pairstyle == BONDED_HISTORY) bonded_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]]); + radius[i],meff,shearmany[i][c2r[ic]], contact); } } } @@ -341,6 +355,9 @@ void FixWallGranRegion::grow_arrays(int nmax) memory->grow(walls,nmax,tmax,"fix_wall_gran:walls"); memory->grow(shearmany,nmax,tmax,sheardim,"fix_wall_gran:shearmany"); } + if (peratom_flag){ + memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); + } } /* ---------------------------------------------------------------------- @@ -351,16 +368,20 @@ void FixWallGranRegion::copy_arrays(int i, int j, int delflag) { int m,n,iwall; - if (!history) return; - - n = ncontact[i]; - - for (iwall = 0; iwall < n; iwall++) { - walls[j][iwall] = walls[i][iwall]; - for (m = 0; m < sheardim; m++) - shearmany[j][iwall][m] = shearmany[i][iwall][m]; + if (history){ + n = ncontact[i]; + for (iwall = 0; iwall < n; iwall++) { + walls[j][iwall] = walls[i][iwall]; + for (m = 0; m < sheardim; m++) + shearmany[j][iwall][m] = shearmany[i][iwall][m]; + } + ncontact[j] = ncontact[i]; + } + + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[j][m] = array_atom[i][m]; } - ncontact[j] = ncontact[i]; } /* ---------------------------------------------------------------------- @@ -369,8 +390,12 @@ void FixWallGranRegion::copy_arrays(int i, int j, int delflag) void FixWallGranRegion::set_arrays(int i) { - if (!history) return; - ncontact[i] = 0; + if (history) + ncontact[i] = 0; + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[i][m] = 0; + } } /* ---------------------------------------------------------------------- @@ -381,16 +406,19 @@ int FixWallGranRegion::pack_exchange(int i, double *buf) { int m; - if (!history) return 0; - int n = 0; - int count = ncontact[i]; - - buf[n++] = ubuf(count).d; - for (int iwall = 0; iwall < count; iwall++) { - buf[n++] = ubuf(walls[i][iwall]).d; - for (m = 0; m < sheardim; m++) - buf[n++] = shearmany[i][iwall][m]; + if (history){ + int count = ncontact[i]; + buf[n++] = ubuf(count).d; + for (int iwall = 0; iwall < count; iwall++) { + buf[n++] = ubuf(walls[i][iwall]).d; + for (m = 0; m < sheardim; m++) + buf[n++] = shearmany[i][iwall][m]; + } + } + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + buf[n++] = array_atom[i][m]; } return n; @@ -404,15 +432,19 @@ int FixWallGranRegion::unpack_exchange(int nlocal, double *buf) { int m; - if (!history) return 0; int n = 0; - int count = ncontact[nlocal] = (int) ubuf(buf[n++]).i; - - for (int iwall = 0; iwall < count; iwall++) { - walls[nlocal][iwall] = (int) ubuf(buf[n++]).i; - for (m = 0; m < sheardim; m++) - shearmany[nlocal][iwall][m] = buf[n++]; + if (history){ + int count = ncontact[nlocal] = (int) ubuf(buf[n++]).i; + for (int iwall = 0; iwall < count; iwall++) { + walls[nlocal][iwall] = (int) ubuf(buf[n++]).i; + for (m = 0; m < sheardim; m++) + shearmany[nlocal][iwall][m] = buf[n++]; + } + } + if (peratom_flag){ + for (int m = 0; m < size_peratom_cols; m++) + array_atom[nlocal][m] = buf[n++]; } return n; From 158c7531fe4a46631eb55d764b62ecba574157e7 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Mon, 16 Apr 2018 15:51:06 -0600 Subject: [PATCH 003/243] Added pair/gran/dmt as a granular wall interaction option --- src/GRANULAR/fix_wall_gran.cpp | 505 ++++++++++--------- src/GRANULAR/fix_wall_gran.h | 26 +- src/GRANULAR/fix_wall_gran_region.cpp | 32 +- src/GRANULAR/pair_gran_dmt_rolling.cpp | 650 ++++++++++++------------- 4 files changed, 633 insertions(+), 580 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index a8386238d7..0c2aaed403 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -39,15 +39,19 @@ using namespace MathConst; // XYZ PLANE need to be 0,1,2 enum{XPLANE=0,YPLANE=1,ZPLANE=2,ZCYLINDER,REGION}; -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,BONDED_HISTORY}; +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,JKR_ROLLING,DMT_ROLLING}; enum{NONE,CONSTANT,EQUAL}; +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + #define BIG 1.0e20 +#define EPSILON 1e-10 /* ---------------------------------------------------------------------- */ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), idregion(NULL), shearone(NULL), fix_rigid(NULL), mass_rigid(NULL) + Fix(lmp, narg, arg), idregion(NULL), shearone(NULL), fix_rigid(NULL), mass_rigid(NULL) { if (narg < 4) error->all(FLERR,"Illegal fix wall/gran command"); @@ -62,7 +66,8 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[3],"hooke") == 0) pairstyle = HOOKE; else if (strcmp(arg[3],"hooke/history") == 0) pairstyle = HOOKE_HISTORY; else if (strcmp(arg[3],"hertz/history") == 0) pairstyle = HERTZ_HISTORY; - //else if (strcmp(arg[3],"bonded/history") == 0) pairstyle = BONDED_HISTORY; + else if (strcmp(arg[3],"dmt/rolling") == 0) pairstyle = DMT_ROLLING; + //else if (strcmp(arg[3],"jkr/rolling") == 0) pairstyle = JKR_ROLLING; else error->all(FLERR,"Invalid fix wall/gran interaction style"); history = restart_peratom = 1; @@ -72,7 +77,8 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : int iarg; - if (pairstyle != BONDED_HISTORY) { + if (pairstyle != JKR_ROLLING && pairstyle != DMT_ROLLING) { + sheardim = 3; if (narg < 11) error->all(FLERR,"Illegal fix wall/gran command"); kn = force->numeric(FLERR,arg[4]); @@ -101,20 +107,42 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg = 10; } else { - if (narg < 10) error->all(FLERR,"Illegal fix wall/gran command"); + if (narg < 12) error->all(FLERR,"Illegal fix wall/gran command"); - E = force->numeric(FLERR,arg[4]); - G = force->numeric(FLERR,arg[5]); - SurfEnergy = force->numeric(FLERR,arg[6]); - // Note: this doesn't get used, check w/ Jeremy? + sheardim = 7; + Emod = force->numeric(FLERR,arg[4]); + Gmod = force->numeric(FLERR,arg[5]); + xmu = force->numeric(FLERR,arg[6]); gamman = force->numeric(FLERR,arg[7]); + Ecoh = force->numeric(FLERR,arg[8]); + kR = force->numeric(FLERR,arg[9]); + muR = force->numeric(FLERR,arg[10]); + etaR = force->numeric(FLERR,arg[11]); - xmu = force->numeric(FLERR,arg[8]); - // pois = E/(2.0*G) - 1.0; - // kn = 2.0*E/(3.0*(1.0+pois)*(1.0-pois)); - // gammat=0.5*gamman; + //Defaults + normaldamp = TSUJI; + rollingdamp = INDEP; - iarg = 9; + iarg = 12; + for (int iiarg=iarg; iiarg < narg; ++iiarg){ + if (strcmp(arg[iiarg], "normaldamp") == 0){ + if(iiarg+2 > narg) error->all(FLERR, "Invalid fix/wall/gran region command"); + if (strcmp(arg[iiarg+1],"tsuji") == 0){ + normaldamp = TSUJI; + alpha = gamman; + } + else if (strcmp(arg[iiarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for fix wall/gran dmt/rolling"); + iarg += 2; + } + if (strcmp(arg[iiarg], "rollingdamp") == 0){ + if(iiarg+2 > narg) error->all(FLERR, "Invalid fix/wall/gran region command"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for fix wall/gran dmt/rolling"); + iarg += 2; + } + } } // wallstyle args @@ -224,9 +252,6 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class - if (pairstyle == BONDED_HISTORY) sheardim = 7; - else sheardim = 3; - shearone = NULL; grow_arrays(atom->nmax); atom->add_callback(0); @@ -448,27 +473,31 @@ void FixWallGran::post_force(int vflag) } // invoke sphere/wall interaction - double *contact; + double *contact; if (peratom_flag) contact = array_atom[i]; else - contact = NULL; + contact = NULL; if (pairstyle == HOOKE) hooke(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff, contact); + omega[i],torque[i],radius[i],meff, contact); else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], - contact); + omega[i],torque[i],radius[i],meff,shearone[i], + contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], - contact); - else if (pairstyle == BONDED_HISTORY) - bonded_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], - contact); + omega[i],torque[i],radius[i],meff,shearone[i], + contact); + else if (pairstyle == DMT_ROLLING) + dmt_rolling(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,shearone[i], + contact); + /*else if (pairstyle == JKR_ROLLING) + jkr_rolling(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,shearone[i], + contact);*/ } } } @@ -484,9 +513,9 @@ void FixWallGran::post_force_respa(int vflag, int ilevel, int iloop) /* ---------------------------------------------------------------------- */ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, - double *vwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double* contact) + double *vwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double* contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -554,10 +583,10 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, fz = dz*ccel + fs3; if (peratom_flag){ - contact[1] = fx; - contact[2] = fy; - contact[3] = fz; - } + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } f[0] += fx; f[1] += fy; @@ -574,10 +603,10 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, /* ---------------------------------------------------------------------- */ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, - double *vwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double *shear, - double *contact) + double *vwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *shear, + double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -659,11 +688,11 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, if (fs > fn) { if (shrmag != 0.0) { shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - - meff*gammat*vtr1/kt; + meff*gammat*vtr1/kt; shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - - meff*gammat*vtr2/kt; + meff*gammat*vtr2/kt; shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - - meff*gammat*vtr3/kt; + meff*gammat*vtr3/kt; fs1 *= fn/fs ; fs2 *= fn/fs; fs3 *= fn/fs; @@ -697,10 +726,10 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, /* ---------------------------------------------------------------------- */ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, - double *vwall, double rwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double *shear, - double *contact) + double *vwall, double rwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *shear, + double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; @@ -789,11 +818,11 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, if (fs > fn) { if (shrmag != 0.0) { shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - - meff*gammat*vtr1/kt; + meff*gammat*vtr1/kt; shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - - meff*gammat*vtr2/kt; + meff*gammat*vtr2/kt; shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - - meff*gammat*vtr3/kt; + meff*gammat*vtr3/kt; fs1 *= fn/fs ; fs2 *= fn/fs; fs3 *= fn/fs; @@ -807,10 +836,10 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, fz = dz*ccel + fs3; if (peratom_flag){ - contact[1] = fx; - contact[2] = fy; - contact[3] = fz; - } + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } f[0] += fx; f[1] += fy; @@ -825,34 +854,44 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, } -/* ---------------------------------------------------------------------- */ - -void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, - double *vwall, double rwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double *shear, - double *contact) +void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, + double *vwall, double rwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *shear, + double *contact) { - double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; - double fn,fs,fs1,fs2,fs3,fx,fy,fz,tor1,tor2,tor3; - double shrmag,rsht,polyhertz,rinv,rsqinv; - - double pois,E_eff,G_eff,rad_eff; - double a0,Fcrit,delcrit,delcritinv; - double overlap,olapsq,olapcubed,sqrtterm,tmp,keyterm,keyterm2,keyterm3; - double aovera0,foverFc; - double gammatsuji; - - double ktwist,kroll,twistcrit,rollcrit; + int i,j,ii,jj,inum,jnum; + int itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; + double overlap; + double mi,mj,damp,ccel,tor1,tor2,tor3; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double magtwist,magtortwist; - double magrollsq,magroll,magrollinv,magtorroll; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + r = sqrt(rsq); rinv = 1.0/r; rsqinv = 1.0/rsq; + radsum = radius + rwall; + if (rwall == 0) R = radius; + else R = radius*rwall/(radius+rwall); + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + // relative translational velocity vr1 = v[0] - vwall[0]; @@ -861,13 +900,37 @@ void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, // normal component - vnnr = vr1*dx + vr2*dy + vr3*dz; - vn1 = dx*vnnr / rsq; - vn2 = dy*vnnr / rsq; - vn3 = dz*vnnr / rsq; + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + + //**************************************** + //Normal force = Hertzian contact + DMT + damping + //**************************************** + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*Emod*a; + Fhz = kn*overlap; + + //Damping (based on Tsuji et al) + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman; + else if (normaldamp == TSUJI) eta_N=alpha*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + //DMT + Fdmt = -4*MY_PI*Ecoh*R; + + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including shear history effects + //**************************************** // tangential component - vt1 = vr1 - vn1; vt2 = vr2 - vn2; vt3 = vr3 - vn3; @@ -878,200 +941,182 @@ void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, wr2 = radius*omega[1] * rinv; wr3 = radius*omega[2] * rinv; - // normal forces = Hertzian contact + normal velocity damping - // material properties: currently assumes identical materials - - pois = E/(2.0*G) - 1.0; - E_eff=0.5*E/(1.0-pois*pois); - G_eff=G/(4.0-2.0*pois); - - // rwall = 0 is infinite wall radius of curvature (flat wall) - - if (rwall == 0) rad_eff = radius; - else rad_eff = radius*rwall/(radius+rwall); - - Fcrit = rad_eff * (3.0 * M_PI * SurfEnergy); - a0=pow(9.0*M_PI*SurfEnergy*rad_eff*rad_eff/E_eff,1.0/3.0); - delcrit = 1.0/rad_eff*(0.5 * a0*a0/pow(6.0,1.0/3.0)); - delcritinv = 1.0/delcrit; - - overlap = (radius-r) * delcritinv; - olapsq = overlap*overlap; - olapcubed = olapsq*overlap; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,THIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = pow(6.0,-TWOTHIRDS) * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3)); - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5)); - ccel = Fcrit*foverFc*rinv; - - // damp = meff*gamman*vnnr*rsqinv; - // ccel = kn*(radius-r)*rinv - damp; - // polyhertz = sqrt((radius-r)*radius); - // ccel *= polyhertz; - - // use Tsuji et al form - - polyhertz = 1.2728- 4.2783*0.9 + 11.087*0.9*0.9 - 22.348*0.9*0.9*0.9 + - 27.467*0.9*0.9*0.9*0.9 - 18.022*0.9*0.9*0.9*0.9*0.9 + - 4.8218*0.9*0.9*0.9*0.9*0.9*0.9; - - gammatsuji = 0.2*sqrt(meff*kn); - damp = gammatsuji*vnnr/rsq; - ccel = ccel - polyhertz * damp; - - // relative velocities - - vtr1 = vt1 - (dz*wr2-dy*wr3); - vtr2 = vt2 - (dx*wr3-dz*wr1); - vtr3 = vt3 - (dy*wr1-dx*wr2); + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); // shear history effects + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history shear[0] += vtr1*dt; shear[1] += vtr2*dt; shear[2] += vtr3*dt; } - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); - - // rotate shear displacements - - rsht = shear[0]*dx + shear[1]*dy + shear[2]*dz; - rsht = rsht*rsqinv; - if (shearupdate) { - shear[0] -= rsht*dx; - shear[1] -= rsht*dy; - shear[2] -= rsht*dz; - } // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*Gmod*a; - fs1 = -polyhertz * (kt*shear[0] + meff*gammat*vtr1); - fs2 = -polyhertz * (kt*shear[1] + meff*gammat*vtr2); - fs3 = -polyhertz * (kt*shear[2] + meff*gammat*vtr3); - - kt=8.0*G_eff*a0*aovera0; - - // shear damping uses Tsuji et al form also - - fs1 = -kt*shear[0] - polyhertz*gammatsuji*vtr1; - fs2 = -kt*shear[1] - polyhertz*gammatsuji*vtr2; - fs3 = -kt*shear[2] - polyhertz*gammatsuji*vtr3; + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; // rescale frictional displacements and forces if needed + Fscrit = xmu * fabs(Fne); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + //Redundant, should be same as above? + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - fn = xmu * fabs(ccel*r + 2.0*Fcrit); - - if (fs > fn) { + if (fs > Fscrit) { if (shrmag != 0.0) { - shear[0] = (fn/fs) * (shear[0] + polyhertz*gammatsuji*vtr1/kt) - - polyhertz*gammatsuji*vtr1/kt; - shear[1] = (fn/fs) * (shear[1] + polyhertz*gammatsuji*vtr2/kt) - - polyhertz*gammatsuji*vtr2/kt; - shear[2] = (fn/fs) * (shear[2] + polyhertz*gammatsuji*vtr3/kt) - - polyhertz*gammatsuji*vtr3/kt; - fs1 *= fn/fs ; - fs2 *= fn/fs; - fs3 *= fn/fs; + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; } else fs1 = fs2 = fs3 = 0.0; } - // calculate twisting and rolling components of torque - // NOTE: this assumes spheres! + //**************************************** + // Rolling force, including shear history effects + //**************************************** - relrot1 = omega[0]; - relrot2 = omega[1]; - relrot3 = omega[2]; + relrot1 = omega[0]; //- omega[j][0]; TODO: figure out how to + relrot2 = omega[1]; //- omega[j][1]; incorporate wall angular + relrot3 = omega[2]; //- omega[j][2]; velocity - // rolling velocity - // NOTE: this assumes mondisperse spheres! - - vrl1 = -rad_eff*rinv * (relrot2*dz - relrot3*dy); - vrl2 = -rad_eff*rinv * (relrot3*dx - relrot1*dz); - vrl3 = -rad_eff*rinv * (relrot1*dy - relrot2*dx); + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - // bond history effects + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } - // rotate bonded displacements correctly + if (rollingdamp == BRILLROLL) etaR = muR*fabs(Fne); + fr1 = -kR*shear[3] - etaR*vrl1; + fr2 = -kR*shear[4] - etaR*vrl2; + fr3 = -kR*shear[5] - etaR*vrl3; - double rlt = shear[3]*dx + shear[4]*dy + shear[5]*dz; - rlt /= rsq; - shear[3] -= rlt*dx; - shear[4] -= rlt*dy; - shear[5] -= rlt*dz; + // rescale frictional displacements and forces if needed + Frcrit = muR * fabs(Fne); - // twisting torque + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/kR*(Frcrit*fr1/fr + etaR*vrl1); + shear[4] = -1.0/kR*(Frcrit*fr2/fr + etaR*vrl2); + shear[5] = -1.0/kR*(Frcrit*fr3/fr + etaR*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } - magtwist = rinv*(relrot1*dx + relrot2*dy + relrot3*dz); + + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - ktwist = 0.5*kt*(a0*aovera0)*(a0*aovera0); - magtortwist = -ktwist*shear[6] - - 0.5*polyhertz*gammatsuji*(a0*aovera0)*(a0*aovera0)*magtwist; + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit){ + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } - twistcrit=TWOTHIRDS*a0*aovera0*Fcrit; - if (fabs(magtortwist) > twistcrit) - magtortwist = -twistcrit * magtwist/fabs(magtwist); + // Apply forces & torques - // rolling torque - - magrollsq = shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]; - magroll = sqrt(magrollsq); - if (magroll != 0.0) magrollinv = 1.0/magroll; - else magrollinv = 0.0; - - kroll = 1.0*4.0*Fcrit*pow(aovera0,1.5); - magtorroll = -kroll*magroll - 0.1*gammat*vrlmag; - - rollcrit = 0.01; - if (magroll > rollcrit) magtorroll = -kroll*rollcrit; - - // forces & torques - - fx = dx*ccel + fs1; - fy = dy*ccel + fs2; - fz = dz*ccel + fs3; + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; f[0] += fx; f[1] += fy; f[2] += fz; - if (peratom_flag){ - contact[1] = fx; - contact[2] = fy; - contact[3] = fz; - } + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; - tor1 = rinv * (dy*fs3 - dz*fs2); - tor2 = rinv * (dz*fs1 - dx*fs3); - tor3 = rinv * (dx*fs2 - dy*fs1); - torque[0] -= radius*tor1; - torque[1] -= radius*tor2; - torque[2] -= radius*tor3; + torque[0] -= radi*tor1; + torque[1] -= radi*tor2; + torque[2] -= radi*tor3; - torque[0] += magtortwist * dx*rinv; - torque[1] += magtortwist * dy*rinv; - torque[2] += magtortwist * dz*rinv; + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[0] += tortwist1; + torque[1] += tortwist2; + torque[2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[0] += torroll1; + torque[1] += torroll2; + torque[2] += torroll3; - torque[0] += magtorroll * (shear[4]*dz - shear[5]*dy)*rinv*magrollinv; - torque[1] += magtorroll * (shear[5]*dx - shear[3]*dz)*rinv*magrollinv; - torque[2] += magtorroll * (shear[3]*dy - shear[4]*dx)*rinv*magrollinv; } + /* ---------------------------------------------------------------------- memory usage of local atom-based arrays ------------------------------------------------------------------------- */ @@ -1108,8 +1153,8 @@ void FixWallGran::copy_arrays(int i, int j, int delflag) for (int m = 0; m < sheardim; m++) shearone[j][m] = shearone[i][m]; if (peratom_flag){ - for (int m = 0; m < size_peratom_cols; m++) - array_atom[j][m] = array_atom[i][m]; + for (int m = 0; m < size_peratom_cols; m++) + array_atom[j][m] = array_atom[i][m]; } } @@ -1124,7 +1169,7 @@ void FixWallGran::set_arrays(int i) shearone[i][m] = 0; if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) - array_atom[i][m] = 0; + array_atom[i][m] = 0; } } diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index f1a5dbc842..4212b96544 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -47,23 +47,31 @@ class FixWallGran : public Fix { void reset_dt(); void hooke(double, double, double, double, double *, - double *, double *, double *, double *, double, double, double*); + double *, double *, double *, double *, double, double, double*); void hooke_history(double, double, double, double, double *, - double *, double *, double *, double *, double, double, - double *, double *); + double *, double *, double *, double *, double, double, + double *, double *); void hertz_history(double, double, double, double, double *, double, - double *, double *, double *, double *, double, double, - double *, double *); - void bonded_history(double, double, double, double, double *, double, - double *, double *, double *, double *, double, double, - double *, double *); + double *, double *, double *, double *, double, double, + double *, double *); + void dmt_rolling(double, double, double, double, double *, double, + double *, double *, double *, double *, double, double, + double *, double *); + // void jkr_rolling(double, double, double, double, double *, double, + // double *, double *, double *, double *, double, double, + // double *, double *); protected: int wallstyle,wiggle,wshear,axis; int pairstyle,nlevels_respa; bigint time_origin; double kn,kt,gamman,gammat,xmu; - double E,G,SurfEnergy; + + //For DMT/ROLLING + int normaldamp, rollingdamp; + double Emod, Gmod, alpha, Ecoh, kR, muR, etaR; + + double lo,hi,cylradius; double amplitude,period,omega,vshear; double dt; diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index e00036c26a..71b6503f36 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -39,15 +39,15 @@ using namespace MathConst; // same as FixWallGran -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,BONDED_HISTORY}; +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,JKR_ROLLING,DMT_ROLLING}; #define BIG 1.0e20 /* ---------------------------------------------------------------------- */ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : - FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), ncontact(NULL), - walls(NULL), shearmany(NULL), c2r(NULL) + FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), ncontact(NULL), + walls(NULL), shearmany(NULL), c2r(NULL) { restart_global = 1; motion_resetflag = 0; @@ -114,7 +114,7 @@ void FixWallGranRegion::init() nregion != region->nregion) { char str[256]; sprintf(str,"Region properties for region %s changed between runs, " - "resetting its motion",idregion); + "resetting its motion",idregion); error->warning(FLERR,str); region->reset_vel(); } @@ -122,7 +122,7 @@ void FixWallGranRegion::init() if (motion_resetflag){ char str[256]; sprintf(str,"Region properties for region %s are inconsistent " - "with restart file, resetting its motion",idregion); + "with restart file, resetting its motion",idregion); error->warning(FLERR,str); region->reset_vel(); } @@ -253,22 +253,22 @@ void FixWallGranRegion::post_force(int vflag) contact = array_atom[i]; else contact = NULL; - + if (pairstyle == HOOKE) hooke(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff, contact); + omega[i],torque[i],radius[i],meff, contact); else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff, - shearmany[i][c2r[ic]], contact); + omega[i],torque[i],radius[i],meff, + shearmany[i][c2r[ic]], contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, - v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]], contact); - else if (pairstyle == BONDED_HISTORY) - bonded_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, - v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]], contact); + v[i],f[i],omega[i],torque[i], + radius[i],meff,shearmany[i][c2r[ic]], contact); + else if (pairstyle == DMT_ROLLING) + dmt_rolling(rsq,dx,dy,dz,vwall,region->contact[ic].radius, + v[i],f[i],omega[i],torque[i], + radius[i],meff,shearmany[i][c2r[ic]], contact); } } } @@ -394,7 +394,7 @@ void FixWallGranRegion::set_arrays(int i) ncontact[i] = 0; if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) - array_atom[i][m] = 0; + array_atom[i][m] = 0; } } diff --git a/src/GRANULAR/pair_gran_dmt_rolling.cpp b/src/GRANULAR/pair_gran_dmt_rolling.cpp index 08299f85b5..7a71fc7200 100644 --- a/src/GRANULAR/pair_gran_dmt_rolling.cpp +++ b/src/GRANULAR/pair_gran_dmt_rolling.cpp @@ -44,9 +44,9 @@ enum {INDEP, BRILLROLL}; /* ---------------------------------------------------------------------- */ PairGranDMTRolling::PairGranDMTRolling(LAMMPS *lmp) : - PairGranHookeHistory(lmp, 7), - E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), - Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) + PairGranHookeHistory(lmp, 7), + E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), + Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) { int ntypes = atom->ntypes; memory->create(E,ntypes+1,ntypes+1,"pair:E"); @@ -122,19 +122,19 @@ void PairGranDMTRolling::compute(int eflag, int vflag) // mass_body = mass of each rigid body if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); } double **x = atom->x; @@ -158,304 +158,304 @@ void PairGranDMTRolling::compute(int eflag, int vflag) // loop over neighbors of my atoms for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - jtype = type[j]; - j &= NEIGHMASK; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + jtype = type[j]; + j &= NEIGHMASK; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; - if (rsq >= radsum*radsum){ - // unset non-touching neighbors - touch[jj] = 0; - shear = &allshear[size_history*jj]; - for (int k = 0; k < size_history; k++) - shear[k] = 0.0; - } else { - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; + if (rsq >= radsum*radsum){ + // unset non-touching neighbors + touch[jj] = 0; + shear = &allshear[size_history*jj]; + for (int k = 0; k < size_history; k++) + shear[k] = 0.0; + } else { + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; - // relative translational velocity + // relative translational velocity - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; - // normal component + // normal component - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; - //**************************************** - //Normal force = Hertzian contact + DMT + damping - //**************************************** - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*E[itype][jtype]*a; - Fhz = kn*overlap; + //**************************************** + //Normal force = Hertzian contact + DMT + damping + //**************************************** + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*E[itype][jtype]*a; + Fhz = kn*overlap; - //Damping (based on Tsuji et al) - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + //Damping (based on Tsuji et al) + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - //DMT - Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; + //DMT + Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; - //**************************************** - //Tangential force, including shear history effects - //**************************************** + //**************************************** + //Tangential force, including shear history effects + //**************************************** - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; - // relative rotational velocity - //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - //delta/2, i.e. instead of radi, use distance to center of contact point? - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); + // relative rotational velocity + //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + //delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); - // shear history effects - touch[jj] = 1; - shear = &allshear[size_history*jj]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); + // shear history effects + touch[jj] = 1; + shear = &allshear[size_history*jj]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; + // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } - //**************************************** - // Rolling force, including shear history effects - //**************************************** + //**************************************** + // Rolling force, including shear history effects + //**************************************** - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } - k_R = kR[itype][jtype]; - if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*shear[3] - eta_R*vrl1; - fr2 = -k_R*shear[4] - eta_R*vrl2; - fr3 = -k_R*shear[5] - eta_R*vrl3; + k_R = kR[itype][jtype]; + if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*shear[3] - eta_R*vrl1; + fr2 = -k_R*shear[4] - eta_R*vrl2; + fr3 = -k_R*shear[5] - eta_R*vrl3; - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne); + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne); - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit){ - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit){ + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } - // Apply forces & torques + // Apply forces & torques - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); } + } } } @@ -483,14 +483,14 @@ void PairGranDMTRolling::settings(int narg, char **arg) etaR_one = new double[ntypes+1]; for (int i=0; i < ntypes;i++){ - E_one[i+1] = force->numeric(FLERR, arg[i]); - G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); - muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); - cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); - Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); - kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); - muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); - etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); + E_one[i+1] = force->numeric(FLERR, arg[i]); + G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); + muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); + cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); + Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); + kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); + muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); + etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); } //Defaults @@ -499,53 +499,53 @@ void PairGranDMTRolling::settings(int narg, char **arg) int iarg = 8*ntypes; while (iarg < narg){ - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else{ - iarg +=1; - } + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else{ + iarg +=1; + } } //Derived from inputs for (int i=1; i <= ntypes; i++){ - pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; - alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; - for (int j=i; j <= ntypes; j++){ - E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); - G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); - if (normaldamp == TSUJI){ - alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); - } - else if (normaldamp == BRILLIANTOV){ - gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); - } - muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); - Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); - kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); - etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); - muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); + pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; + alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; + for (int j=i; j <= ntypes; j++){ + E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); + G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); + if (normaldamp == TSUJI){ + alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); } + else if (normaldamp == BRILLIANTOV){ + gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); + } + muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); + Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); + kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); + etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); + muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); + } } } /* ---------------------------------------------------------------------- */ double PairGranDMTRolling::single(int i, int j, int itype, int jtype, - double rsq, - double factor_coul, double factor_lj, - double &fforce) + double rsq, + double factor_coul, double factor_lj, + double &fforce) { double radi,radj,radsum; double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; @@ -565,9 +565,9 @@ double PairGranDMTRolling::single(int i, int j, int itype, int jtype, radsum = radi + radj; if (rsq >= radsum*radsum) { - fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; - return 0.0; + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; } r = sqrt(rsq); @@ -623,9 +623,9 @@ double PairGranDMTRolling::single(int i, int j, int itype, int jtype, mi = rmass[i]; mj = rmass[j]; if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; } meff = mi*mj / (mi+mj); @@ -669,14 +669,14 @@ double PairGranDMTRolling::single(int i, int j, int itype, int jtype, double *allshear = fix_history->firstvalue[i]; for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; } double *shear = &allshear[size_history*neighprev]; shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); + shear[2]*shear[2]); // tangential forces = shear + tangential velocity damping kt=8.0*G[itype][jtype]*a; @@ -692,12 +692,12 @@ double PairGranDMTRolling::single(int i, int j, int itype, int jtype, Fscrit= muS[itype][jtype] * fabs(Fne); if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; } // set all forces and return no energy From 5dafd03d1f261950ec0522e23cc9f6374a0a8549 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Thu, 10 May 2018 13:56:02 -0600 Subject: [PATCH 004/243] Various fixes to fix/wall/gran DMT --- src/GRANULAR/fix_wall_gran.cpp | 13 ++++++------- src/GRANULAR/fix_wall_gran_region.cpp | 6 ++---- src/GRANULAR/pair_gran_dmt_rolling.cpp | 1 + src/GRANULAR/pair_gran_hooke_history.cpp | 2 ++ src/GRANULAR/pair_gran_hooke_history.h | 1 + src/MAKE/Makefile.mpi | 2 +- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 0c2aaed403..0cf1dde90b 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -879,7 +879,6 @@ void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, double tortwist1, tortwist2, tortwist3; double shrmag,rsht; - r = sqrt(rsq); rinv = 1.0/r; rsqinv = 1.0/rsq; @@ -888,9 +887,9 @@ void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, if (rwall == 0) R = radius; else R = radius*rwall/(radius+rwall); - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; + nx = dx*rinv; + ny = dy*rinv; + nz = dz*rinv; // relative translational velocity @@ -986,9 +985,8 @@ void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, Fscrit = xmu * fabs(Fne); // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - //Redundant, should be same as above? - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { @@ -1050,6 +1048,7 @@ void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, // rescale frictional displacements and forces if needed Frcrit = muR * fabs(Fne); + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); if (fr > Frcrit) { diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index 71b6503f36..2f415a0bc6 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -217,7 +217,6 @@ void FixWallGranRegion::post_force(int vflag) } // process current contacts - for (int ic = 0; ic < nc; ic++) { // rsq = squared contact distance @@ -266,9 +265,8 @@ void FixWallGranRegion::post_force(int vflag) v[i],f[i],omega[i],torque[i], radius[i],meff,shearmany[i][c2r[ic]], contact); else if (pairstyle == DMT_ROLLING) - dmt_rolling(rsq,dx,dy,dz,vwall,region->contact[ic].radius, - v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]], contact); + dmt_rolling(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], radius[i],meff,shearmany[i][c2r[ic]], contact); + } } } diff --git a/src/GRANULAR/pair_gran_dmt_rolling.cpp b/src/GRANULAR/pair_gran_dmt_rolling.cpp index 7a71fc7200..f293998e92 100644 --- a/src/GRANULAR/pair_gran_dmt_rolling.cpp +++ b/src/GRANULAR/pair_gran_dmt_rolling.cpp @@ -372,6 +372,7 @@ void PairGranDMTRolling::compute(int eflag, int vflag) // rescale frictional displacements and forces if needed Frcrit = muR[itype][jtype] * fabs(Fne); + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); if (fr > Frcrit) { if (rollmag != 0.0) { diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index f1a155f2e4..2f56b53736 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -58,6 +58,8 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp, int _size_history) : Pai // set comm size needed by this Pair if used with fix rigid comm_forward = 1; + + nondefault_history_transfer = 0; //keep default behavior of history[i][j] = -history[j][i] } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index c35de04109..6d9980919b 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -42,6 +42,7 @@ class PairGranHookeHistory : public Pair { int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); double memory_usage(); + int nondefault_history_transfer; protected: double kn,kt,gamman,gammat,xmu; diff --git a/src/MAKE/Makefile.mpi b/src/MAKE/Makefile.mpi index aebb465454..f30220da3d 100644 --- a/src/MAKE/Makefile.mpi +++ b/src/MAKE/Makefile.mpi @@ -12,7 +12,7 @@ SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpicxx -LINKFLAGS = -g -O +LINKFLAGS = -g -O3 LIB = SIZE = size From ab1c3f649832aa37f770dd9c1775050ce4075b7a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 11:54:48 -0700 Subject: [PATCH 005/243] rendevous comm option for special bonds and fix rigid/small --- src/RIGID/fix_rigid_small.cpp | 491 +++++++-------- src/RIGID/fix_rigid_small.h | 26 +- src/comm.cpp | 51 ++ src/comm.h | 4 + src/create_atoms.cpp | 37 +- src/hashlittle.cpp | 333 ++++++++++ src/hashlittle.h | 5 + src/irregular.cpp | 17 +- src/read_data.cpp | 15 + src/read_restart.cpp | 15 + src/replicate.cpp | 8 +- src/special.cpp | 1095 ++++++++++++++++----------------- src/special.h | 27 +- 13 files changed, 1249 insertions(+), 875 deletions(-) create mode 100644 src/hashlittle.cpp create mode 100644 src/hashlittle.h diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 44e1870e0a..4421d9ae17 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -34,6 +34,7 @@ #include "variable.h" #include "random_mars.h" #include "math_const.h" +#include "hashlittle.h" #include "memory.h" #include "error.h" @@ -70,8 +71,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : xcmimage(NULL), displace(NULL), eflags(NULL), orient(NULL), dorient(NULL), avec_ellipsoid(NULL), avec_line(NULL), avec_tri(NULL), counts(NULL), itensor(NULL), mass_body(NULL), langextra(NULL), random(NULL), - id_dilate(NULL), onemols(NULL), hash(NULL), bbox(NULL), ctr(NULL), - idclose(NULL), rsqclose(NULL) + id_dilate(NULL), onemols(NULL) { int i; @@ -107,18 +107,18 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // parse args for rigid body specification int *mask = atom->mask; - tagint *bodyid = NULL; + tagint *bodyID = NULL; int nlocal = atom->nlocal; if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); if (strcmp(arg[3],"molecule") == 0) { if (atom->molecule_flag == 0) error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); - bodyid = atom->molecule; + bodyID = atom->molecule; } else if (strcmp(arg[3],"custom") == 0) { if (narg < 5) error->all(FLERR,"Illegal fix rigid/small command"); - bodyid = new tagint[nlocal]; + bodyID = new tagint[nlocal]; customflag = 1; // determine whether atom-style variable or atom property is used. @@ -126,9 +126,11 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : int is_double=0; int custom_index = atom->find_custom(arg[4]+2,is_double); if (custom_index == -1) - error->all(FLERR,"Fix rigid/small custom requires previously defined property/atom"); + error->all(FLERR,"Fix rigid/small custom requires " + "previously defined property/atom"); else if (is_double) - error->all(FLERR,"Fix rigid/small custom requires integer-valued property/atom"); + error->all(FLERR,"Fix rigid/small custom requires " + "integer-valued property/atom"); int minval = INT_MAX; int *value = atom->ivector[custom_index]; @@ -139,15 +141,17 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyid[i] = (tagint)(value[i] - minval + 1); - else bodyid[i] = 0; + bodyID[i] = (tagint)(value[i] - minval + 1); + else bodyID[i] = 0; } else if (strstr(arg[4],"v_") == arg[4]) { int ivariable = input->variable->find(arg[4]+2); if (ivariable < 0) - error->all(FLERR,"Variable name for fix rigid/small custom does not exist"); + error->all(FLERR,"Variable name for fix rigid/small custom " + "does not exist"); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR,"Fix rigid/small custom variable is no atom-style variable"); + error->all(FLERR,"Fix rigid/small custom variable is not " + "atom-style variable"); double *value = new double[nlocal]; input->variable->compute_atom(ivariable,0,value,1,0); int minval = INT_MAX; @@ -158,8 +162,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyid[i] = (tagint)((tagint)value[i] - minval + 1); - else bodyid[0] = 0; + bodyID[i] = (tagint)((tagint)value[i] - minval + 1); + else bodyID[0] = 0; delete[] value; } else error->all(FLERR,"Unsupported fix rigid custom property"); } else error->all(FLERR,"Illegal fix rigid/small command"); @@ -167,10 +171,11 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (atom->map_style == 0) error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify"); - // maxmol = largest bodyid # + // maxmol = largest bodyID # + maxmol = -1; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyid[i]); + if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyID[i]); tagint itmp; MPI_Allreduce(&maxmol,&itmp,1,MPI_LMP_TAGINT,MPI_MAX,world); @@ -400,8 +405,19 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // sets bodytag for owned atoms // body attributes are computed later by setup_bodies() - create_bodies(bodyid); - if (customflag) delete [] bodyid; + double time1 = MPI_Wtime(); + + create_bodies(bodyID); + if (customflag) delete [] bodyID; + + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) + fprintf(screen," create_bodies CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," create_bodies CPU = %g secs\n",time2-time1); + } // set nlocal_body and allocate bodies I own @@ -1514,175 +1530,71 @@ void FixRigidSmall::set_v() set bodytag for all owned atoms ------------------------------------------------------------------------- */ -void FixRigidSmall::create_bodies(tagint *bodyid) +void FixRigidSmall::create_bodies(tagint *bodyID) { - int i,m,n; - double unwrap[3]; + int i,m; - // error check on image flags of atoms in rigid bodies - - imageint *image = atom->image; + // allocate buffer for input to rendezvous comm + // ncount = # of my atoms in bodies + int *mask = atom->mask; int nlocal = atom->nlocal; - int *periodicity = domain->periodicity; - int xbox,ybox,zbox; - - int flag = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - xbox = (image[i] & IMGMASK) - IMGMAX; - ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; - zbox = (image[i] >> IMG2BITS) - IMGMAX; - if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) || - (zbox && !periodicity[2])) flag = 1; - } - - int flagall; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) error->all(FLERR,"Fix rigid/small atom has non-zero image flag " - "in a non-periodic dimension"); - - // allocate buffer for passing messages around ring of procs - // percount = max number of values to put in buffer for each of ncount - int ncount = 0; for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) ncount++; - int percount = 5; - double *buf; - memory->create(buf,ncount*percount,"rigid/small:buf"); + int *proclist; + memory->create(proclist,ncount,"rigid/small:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc(ncount*sizeof(InRvous),"rigid/small:inbuf"); - // create map hash for storing unique body IDs of my atoms - // key = body ID - // value = index into per-body data structure - // n = # of entries in hash - - hash = new std::map(); - hash->clear(); - - // setup hash - // key = body ID - // value = index into N-length data structure - // n = count of unique bodies my atoms are part of - - n = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - if (hash->find(bodyid[i]) == hash->end()) (*hash)[bodyid[i]] = n++; - } - - // bbox = bounding box of each rigid body my atoms are part of - - memory->create(bbox,n,6,"rigid/small:bbox"); - - for (i = 0; i < n; i++) { - bbox[i][0] = bbox[i][2] = bbox[i][4] = BIG; - bbox[i][1] = bbox[i][3] = bbox[i][5] = -BIG; - } - - // pack my atoms into buffer as body ID, unwrapped coords + // setup buf to pass to rendezvous comm + // one BodyMsg datum for each constituent atom + // datum = me, local index of atom, atomID, bodyID, unwrapped coords + // owning proc for each datum = random hash of bodyID double **x = atom->x; - - m = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = bodyid[i]; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; - } - - // pass buffer around ring of procs - // func = update bbox with atom coords from every proc - // when done, have full bbox for every rigid body my atoms are part of - - comm->ring(m,sizeof(double),buf,1,ring_bbox,NULL,(void *)this); - - // check if any bbox is size 0.0, meaning rigid body is a single particle - - flag = 0; - for (i = 0; i < n; i++) - if (bbox[i][0] == bbox[i][1] && bbox[i][2] == bbox[i][3] && - bbox[i][4] == bbox[i][5]) flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) - error->all(FLERR,"One or more rigid bodies are a single particle"); - - // ctr = center pt of each rigid body my atoms are part of - - memory->create(ctr,n,6,"rigid/small:bbox"); - - for (i = 0; i < n; i++) { - ctr[i][0] = 0.5 * (bbox[i][0] + bbox[i][1]); - ctr[i][1] = 0.5 * (bbox[i][2] + bbox[i][3]); - ctr[i][2] = 0.5 * (bbox[i][4] + bbox[i][5]); - } - - // idclose = ID of atom in body closest to center pt (smaller ID if tied) - // rsqclose = distance squared from idclose to center pt - - memory->create(idclose,n,"rigid/small:idclose"); - memory->create(rsqclose,n,"rigid/small:rsqclose"); - - for (i = 0; i < n; i++) rsqclose[i] = BIG; - - // pack my atoms into buffer as body ID, atom ID, unwrapped coords - tagint *tag = atom->tag; + imageint *image = atom->image; m = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = bodyid[i]; - buf[m++] = ubuf(tag[i]).d; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; + proclist[m] = hashlittle(&bodyID[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].ilocal = i; + inbuf[m].atomID = tag[i]; + inbuf[m].bodyID = bodyID[i]; + domain->unmap(x[i],image[i],inbuf[m].x); + m++; } - // pass buffer around ring of procs - // func = update idclose,rsqclose with atom IDs from every proc - // when done, have idclose for every rigid body my atoms are part of + // perform rendezvous operation + // each proc owns random subset of bodies, receives all atoms in the bodies + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body - comm->ring(m,sizeof(double),buf,2,ring_nearest,NULL,(void *)this); + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_body,buf,sizeof(OutRvous), + (void *) this); + OutRvous *outbuf = (OutRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); - // set bodytag of all owned atoms, based on idclose - // find max value of rsqclose across all procs + // set bodytag of all owned atoms based on outbuf info for constituent atoms - double rsqmax = 0.0; - for (i = 0; i < nlocal; i++) { - bodytag[i] = 0; - if (!(mask[i] & groupbit)) continue; - m = hash->find(bodyid[i])->second; - bodytag[i] = idclose[m]; - rsqmax = MAX(rsqmax,rsqclose[m]); - } + for (i = 0; i < nlocal; i++) + if (!(mask[i] & groupbit)) bodytag[i] = 0; - // pack my atoms into buffer as bodytag of owning atom, unwrapped coords + for (m = 0; m < nreturn; m++) + bodytag[outbuf[m].ilocal] = outbuf[m].atomID; - m = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = ubuf(bodytag[i]).d; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; - } + memory->sfree(outbuf); - // pass buffer around ring of procs - // func = update rsqfar for atoms belonging to bodies I own - // when done, have rsqfar for all atoms in bodies I own - - rsqfar = 0.0; - comm->ring(m,sizeof(double),buf,3,ring_farthest,NULL,(void *)this); - - // find maxextent of rsqfar across all procs + // maxextent = max of rsqfar across all procs // if defined, include molecule->maxextent MPI_Allreduce(&rsqfar,&maxextent,1,MPI_DOUBLE,MPI_MAX,world); @@ -1691,125 +1603,151 @@ void FixRigidSmall::create_bodies(tagint *bodyid) for (int i = 0; i < nmol; i++) maxextent = MAX(maxextent,onemols[i]->maxextent); } +} + +/* ---------------------------------------------------------------------- + process rigid bodies assigned to me + buf = list of N BodyMsg datums +------------------------------------------------------------------------- */ + +int FixRigidSmall::rendezvous_body(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) +{ + int i,j,m; + double delx,dely,delz,rsq; + int *iclose; + tagint *idclose; + double *x,*xown,*rsqclose; + double **bbox,**ctr; + + FixRigidSmall *frsptr = (FixRigidSmall *) ptr; + Memory *memory = frsptr->memory; + Error *error = frsptr->error; + MPI_Comm world = frsptr->world; + + // setup hash + // ncount = number of bodies assigned to me + // key = body ID + // value = index into Ncount-length data structure + + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) { + id = in[i].bodyID; + if (hash.find(id) == hash.end()) hash[id] = ncount++; + } + + // bbox = bounding box of each rigid body + + memory->create(bbox,ncount,6,"rigid/small:bbox"); + + for (m = 0; m < ncount; m++) { + bbox[m][0] = bbox[m][2] = bbox[m][4] = BIG; + bbox[m][1] = bbox[m][3] = bbox[m][5] = -BIG; + } + + for (i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + x = in[i].x; + bbox[m][0] = MIN(bbox[m][0],x[0]); + bbox[m][1] = MAX(bbox[m][1],x[0]); + bbox[m][2] = MIN(bbox[m][2],x[1]); + bbox[m][3] = MAX(bbox[m][3],x[1]); + bbox[m][4] = MIN(bbox[m][4],x[2]); + bbox[m][5] = MAX(bbox[m][5],x[2]); + } + + // check if any bbox is size 0.0, meaning rigid body is a single particle + + int flag = 0; + for (m = 0; m < ncount; m++) + if (bbox[m][0] == bbox[m][1] && bbox[m][2] == bbox[m][3] && + bbox[m][4] == bbox[m][5]) flag = 1; + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); // sync here? + if (flagall) + error->all(FLERR,"One or more rigid bodies are a single particle"); + + // ctr = geometric center pt of each rigid body + + memory->create(ctr,ncount,3,"rigid/small:bbox"); + + for (m = 0; m < ncount; m++) { + ctr[m][0] = 0.5 * (bbox[m][0] + bbox[m][1]); + ctr[m][1] = 0.5 * (bbox[m][2] + bbox[m][3]); + ctr[m][2] = 0.5 * (bbox[m][4] + bbox[m][5]); + } + + // idclose = atomID closest to center point of each body + + memory->create(idclose,ncount,"rigid/small:idclose"); + memory->create(iclose,ncount,"rigid/small:iclose"); + memory->create(rsqclose,ncount,"rigid/small:rsqclose"); + for (m = 0; m < ncount; m++) rsqclose[m] = BIG; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + x = in[i].x; + delx = x[0] - ctr[m][0]; + dely = x[1] - ctr[m][1]; + delz = x[2] - ctr[m][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq <= rsqclose[m]) { + if (rsq == rsqclose[m] && in[i].atomID > idclose[m]) continue; + iclose[m] = i; + idclose[m] = in[i].atomID; + rsqclose[m] = rsq; + } + } + + // compute rsqfar for all bodies I own + // set rsqfar back in caller + + double rsqfar = 0.0; + + for (int i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + xown = in[iclose[m]].x; + x = in[i].x; + delx = x[0] - xown[0]; + dely = x[1] - xown[1]; + delz = x[2] - xown[2]; + rsq = delx*delx + dely*dely + delz*delz; + rsqfar = MAX(rsqfar,rsq); + } + + frsptr->rsqfar = rsqfar; + + // pass list of OutRvous datums back to comm->rendezvous + + int nout = n; + memory->create(proclist,nout,"rigid/small:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc(nout*sizeof(OutRvous),"rigid/small:out"); + + for (int i = 0; i < nout; i++) { + proclist[i] = in[i].me; + out[i].ilocal = in[i].ilocal; + m = hash.find(in[i].bodyID)->second; + out[i].atomID = idclose[m]; + } + + outbuf = (char *) out; // clean up + // Comm::rendezvous will delete proclist and out (outbuf) - delete hash; - memory->destroy(buf); memory->destroy(bbox); memory->destroy(ctr); memory->destroy(idclose); + memory->destroy(iclose); memory->destroy(rsqclose); -} -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update bounding box for rigid bodies my atoms are part of -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_bbox(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - std::map *hash = frsptr->hash; - double **bbox = frsptr->bbox; - - double *buf = (double *) cbuf; - int ndatums = n/4; - - int j,imol; - double *x; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 4) { - imol = static_cast (buf[m]); - if (hash->find(imol) != hash->end()) { - j = hash->find(imol)->second; - x = &buf[m+1]; - bbox[j][0] = MIN(bbox[j][0],x[0]); - bbox[j][1] = MAX(bbox[j][1],x[0]); - bbox[j][2] = MIN(bbox[j][2],x[1]); - bbox[j][3] = MAX(bbox[j][3],x[1]); - bbox[j][4] = MIN(bbox[j][4],x[2]); - bbox[j][5] = MAX(bbox[j][5],x[2]); - } - } -} - -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update nearest atom to body center for rigid bodies my atoms are part of -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_nearest(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - std::map *hash = frsptr->hash; - double **ctr = frsptr->ctr; - tagint *idclose = frsptr->idclose; - double *rsqclose = frsptr->rsqclose; - - double *buf = (double *) cbuf; - int ndatums = n/5; - - int j,imol; - tagint tag; - double delx,dely,delz,rsq; - double *x; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 5) { - imol = static_cast (buf[m]); - if (hash->find(imol) != hash->end()) { - j = hash->find(imol)->second; - tag = (tagint) ubuf(buf[m+1]).i; - x = &buf[m+2]; - delx = x[0] - ctr[j][0]; - dely = x[1] - ctr[j][1]; - delz = x[2] - ctr[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= rsqclose[j]) { - if (rsq == rsqclose[j] && tag > idclose[j]) continue; - idclose[j] = tag; - rsqclose[j] = rsq; - } - } - } -} - -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update rsqfar = distance from owning atom to other atom -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_farthest(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - double **x = frsptr->atom->x; - imageint *image = frsptr->atom->image; - int nlocal = frsptr->atom->nlocal; - - double *buf = (double *) cbuf; - int ndatums = n/4; - - int iowner; - tagint tag; - double delx,dely,delz,rsq; - double *xx; - double unwrap[3]; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 4) { - tag = (tagint) ubuf(buf[m]).i; - iowner = frsptr->atom->map(tag); - if (iowner < 0 || iowner >= nlocal) continue; - frsptr->domain->unmap(x[iowner],image[iowner],unwrap); - xx = &buf[m+1]; - delx = xx[0] - unwrap[0]; - dely = xx[1] - unwrap[1]; - delz = xx[2] - unwrap[2]; - rsq = delx*delx + dely*dely + delz*delz; - frsptr->rsqfar = MAX(frsptr->rsqfar,rsq); - } + return nout; } /* ---------------------------------------------------------------------- @@ -2472,9 +2410,9 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) int nlocal = atom->nlocal; - hash = new std::map(); + std::map hash; for (i = 0; i < nlocal; i++) - if (bodyown[i] >= 0) (*hash)[atom->molecule[i]] = bodyown[i]; + if (bodyown[i] >= 0) hash[atom->molecule[i]] = bodyown[i]; // open file and read header @@ -2533,11 +2471,11 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) id = ATOTAGINT(values[0]); if (id <= 0 || id > maxmol) error->all(FLERR,"Invalid rigid body ID in fix rigid/small file"); - if (hash->find(id) == hash->end()) { + if (hash.find(id) == hash.end()) { buf = next + 1; continue; } - m = (*hash)[id]; + m = hash[id]; inbody[m] = 1; if (which == 0) { @@ -2576,7 +2514,6 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) delete [] buffer; delete [] values; - delete hash; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index 3f6826f9bb..a820efcdea 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -23,7 +23,7 @@ FixStyle(rigid/small,FixRigidSmall) #include "fix.h" // replace this later -#include +//#include namespace LAMMPS_NS { @@ -180,13 +180,21 @@ class FixRigidSmall : public Fix { // class data used by ring communication callbacks - std::map *hash; - double **bbox; - double **ctr; - tagint *idclose; - double *rsqclose; double rsqfar; + struct InRvous { + int me,ilocal; + tagint atomID,bodyID; + double x[3]; + }; + + struct OutRvous { + int ilocal; + tagint atomID; + }; + + // local methods + void image_shift(); void set_xv(); void set_v(); @@ -199,11 +207,9 @@ class FixRigidSmall : public Fix { void grow_body(); void reset_atom2body(); - // callback functions for ring communication + // callback function for rendezvous communication - static void ring_bbox(int, char *, void *); - static void ring_nearest(int, char *, void *); - static void ring_farthest(int, char *, void *); + static int rendezvous_body(int, char *, int *&, char *&, void *); // debug diff --git a/src/comm.cpp b/src/comm.cpp index f355a562fc..5fcfa141d0 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -28,6 +28,7 @@ #include "dump.h" #include "group.h" #include "procmap.h" +#include "irregular.h" #include "accelerator_kokkos.h" #include "memory.h" #include "error.h" @@ -725,6 +726,56 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, memory->destroy(bufcopy); } +/* ---------------------------------------------------------------------- + rendezvous communication operation +------------------------------------------------------------------------- */ + +int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, + int (*callback)(int, char *, int *&, char *&, void *), + char *&outbuf, int outsize, void *ptr) +{ + // comm data from caller decomposition to rendezvous decomposition + + Irregular *irregular = new Irregular(lmp); + + int n_rvous = irregular->create_data(n,proclist); // add sort + char *inbuf_rvous = (char *) memory->smalloc((bigint) n_rvous*insize, + "rendezvous:inbuf_rvous"); + irregular->exchange_data(inbuf,insize,inbuf_rvous); + + irregular->destroy_data(); + delete irregular; + + // peform rendezvous computation via callback() + // callback() allocates proclist_rvous and outbuf_rvous + + int *proclist_rvous; + char *outbuf_rvous; + + int nout_rvous = + callback(n_rvous,inbuf_rvous,proclist_rvous,outbuf_rvous,ptr); + + memory->sfree(inbuf_rvous); + + // comm data from rendezvous decomposition back to caller + // caller will free outbuf + + irregular = new Irregular(lmp); + + int nout = irregular->create_data(nout_rvous,proclist_rvous); + outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + irregular->exchange_data(outbuf_rvous,outsize,outbuf); + + irregular->destroy_data(); + delete irregular; + memory->destroy(proclist_rvous); + memory->sfree(outbuf_rvous); + + // return number of datums + + return nout; +} + /* ---------------------------------------------------------------------- proc 0 reads Nlines from file into buf and bcasts buf to all procs caller allocates buf to max size needed diff --git a/src/comm.h b/src/comm.h index 2579f9b283..8bb057a0c1 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,6 +109,10 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); + int rendezvous(int, int *, char *, int, + int (*)(int, char *, int *&, char *&, void *), + char *&, int, void *); + int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 383c60f1cd..ecbf612f70 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -513,9 +513,6 @@ void CreateAtoms::command(int narg, char **arg) if (domain->triclinic) domain->lamda2x(atom->nlocal); } - MPI_Barrier(world); - double time2 = MPI_Wtime(); - // clean up delete ranmol; @@ -525,21 +522,6 @@ void CreateAtoms::command(int narg, char **arg) delete [] ystr; delete [] zstr; - // print status - - if (comm->me == 0) { - if (screen) { - fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(screen," Time spent = %g secs\n",time2-time1); - } - if (logfile) { - fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(logfile," Time spent = %g secs\n",time2-time1); - } - } - // for MOLECULE mode: // create special bond lists for molecular systems, // but not for atom style template @@ -549,6 +531,25 @@ void CreateAtoms::command(int narg, char **arg) if (atom->molecular == 1 && onemol->bondflag && !onemol->specialflag) { Special special(lmp); special.build(); + + } + } + + // print status + + MPI_Barrier(world); + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) { + fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(screen," create_atoms CPU = %g secs\n",time2-time1); + } + if (logfile) { + fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(logfile," create_atoms CPU = %g secs\n",time2-time1); } } } diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp new file mode 100644 index 0000000000..be930217a1 --- /dev/null +++ b/src/hashlittle.cpp @@ -0,0 +1,333 @@ +// Hash function hashlittle() +// from lookup3.c, by Bob Jenkins, May 2006, Public Domain +// bob_jenkins@burtleburtle.net + +#include "stddef.h" +#include "stdint.h" + +#define HASH_LITTLE_ENDIAN 1 // Intel and AMD are little endian + +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) + +/* +------------------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. + +This is reversible, so any information in (a,b,c) before mix() is +still in (a,b,c) after mix(). + +If four pairs of (a,b,c) inputs are run through mix(), or through +mix() in reverse, there are at least 32 bits of the output that +are sometimes the same for one pair and different for another pair. +This was tested for: +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that +satisfy this are + 4 6 8 16 19 4 + 9 15 3 18 27 15 + 14 9 3 7 17 3 +Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing +for "differ" defined as + with a one-bit base and a two-bit delta. I +used http://burtleburtle.net/bob/hash/avalanche.html to choose +the operations, constants, and arrangements of the variables. + +This does not achieve avalanche. There are input bits of (a,b,c) +that fail to affect some output bits of (a,b,c), especially of a. The +most thoroughly mixed value is c, but it doesn't really even achieve +avalanche in c. + +This allows some parallelism. Read-after-writes are good at doubling +the number of bits affected, so the goal of mixing pulls in the opposite +direction as the goal of parallelism. I did what I could. Rotates +seem to cost as much as shifts on every machine I could lay my hands +on, and rotates are much kinder to the top and bottom bits, so I used +rotates. +------------------------------------------------------------------------------- +*/ +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} + +/* +------------------------------------------------------------------------------- +final -- final mixing of 3 32-bit values (a,b,c) into c + +Pairs of (a,b,c) values differing in only a few bits will usually +produce values of c that look totally different. This was tested for +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +These constants passed: + 14 11 25 16 4 14 24 + 12 14 25 16 4 14 24 +and these came close: + 4 8 15 26 3 22 24 + 10 8 15 26 3 22 24 + 11 8 15 26 3 22 24 +------------------------------------------------------------------------------- +*/ +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + +/* +------------------------------------------------------------------------------- +hashlittle() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + length : the length of the key, counting by bytes + initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Two keys differing by one or two bits will have +totally different hash values. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8_t **)k, do it like this: + for (i=0, h=0; i 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]&0xffffff" actually reads beyond the end of the string, but + * then masks off the part it's not allowed to read. Because the + * string is aligned, the masked-off tail is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff; a+=k[0]; break; + case 6 : b+=k[1]&0xffff; a+=k[0]; break; + case 5 : b+=k[1]&0xff; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff; break; + case 2 : a+=k[0]&0xffff; break; + case 1 : a+=k[0]&0xff; break; + case 0 : return c; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ + case 1 : a+=k8[0]; break; + case 0 : return c; + } + +#endif /* !valgrind */ + + } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { + const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ + const uint8_t *k8; + + /*--------------- all but last block: aligned reads and different mixing */ + while (length > 12) + { + a += k[0] + (((uint32_t)k[1])<<16); + b += k[2] + (((uint32_t)k[3])<<16); + c += k[4] + (((uint32_t)k[5])<<16); + mix(a,b,c); + length -= 12; + k += 6; + } + + /*----------------------------- handle the last (probably partial) block */ + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[4]+(((uint32_t)k[5])<<16); + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=k[4]; + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=k[2]; + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=k[0]; + break; + case 1 : a+=k8[0]; + break; + case 0 : return c; /* zero length requires no mixing */ + } + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : return c; + } + } + + final(a,b,c); + return c; + +#else /* PURIFY_HATES_HASHLITTLE */ +/* I don't know what it is about Jenkins' hashlittle function, but + * it drives purify insane, even with VALGRIND defined. It makes + * purify unusable!! The code execution doesn't even make sense. + * Below is a (probably) weaker hash function that at least allows + * testing with purify. + */ +#define MAXINT_DIV_PHI 11400714819323198485U + + uint32_t h, rest, *p, bytes, num_bytes; + char *byteptr; + + num_bytes = length; + + /* First hash the uint32_t-sized portions of the key */ + h = 0; + for (p = (uint32_t *)key, bytes=num_bytes; + bytes >= (uint32_t) sizeof(uint32_t); + bytes-=sizeof(uint32_t), p++){ + h = (h^(*p))*MAXINT_DIV_PHI; + } + + /* Then take care of the remaining bytes, if any */ + rest = 0; + for (byteptr = (char *)p; bytes > 0; bytes--, byteptr++){ + rest = (rest<<8) | (*byteptr); + } + + /* If extra bytes, merge the two parts */ + if (rest) + h = (h^rest)*MAXINT_DIV_PHI; + + return h; +#endif /* PURIFY_HATES_HASHLITTLE */ +} diff --git a/src/hashlittle.h b/src/hashlittle.h new file mode 100644 index 0000000000..7b57a35c80 --- /dev/null +++ b/src/hashlittle.h @@ -0,0 +1,5 @@ +// Hash function hashlittle() +// from lookup3.c, by Bob Jenkins, May 2006, Public Domain +// bob_jenkins@burtleburtle.net + +uint32_t hashlittle(const void *key, size_t length, uint32_t); diff --git a/src/irregular.cpp b/src/irregular.cpp index 9c15f135d0..60025249cf 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -501,7 +501,8 @@ int compare_standalone(const int i, const int j, void *ptr) void Irregular::exchange_atom(double *sendbuf, int *sizes, double *recvbuf) { - int i,m,n,offset,count; + int i,m,n,count; + bigint offset; // post all receives @@ -739,11 +740,13 @@ int Irregular::create_data(int n, int *proclist, int sortflag) void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) { - int i,m,n,offset,count; + int i,n,count; + bigint m; // these 2 lines enable send/recv buf to be larger than 2 GB + char *dest; // post all receives, starting after self copies - offset = num_self*nbytes; + bigint offset = num_self*nbytes; for (int irecv = 0; irecv < nrecv_proc; irecv++) { MPI_Irecv(&recvbuf[offset],num_recv[irecv]*nbytes,MPI_CHAR, proc_recv[irecv],0,world,&request[irecv]); @@ -765,18 +768,22 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) n = 0; for (int isend = 0; isend < nsend_proc; isend++) { count = num_send[isend]; + dest = buf; for (i = 0; i < count; i++) { m = index_send[n++]; - memcpy(&buf[i*nbytes],&sendbuf[m*nbytes],nbytes); + memcpy(dest,&sendbuf[m*nbytes],nbytes); + dest += nbytes; } MPI_Send(buf,count*nbytes,MPI_CHAR,proc_send[isend],0,world); } // copy datums to self, put at beginning of recvbuf + dest = recvbuf; for (i = 0; i < num_self; i++) { m = index_self[i]; - memcpy(&recvbuf[i*nbytes],&sendbuf[m*nbytes],nbytes); + memcpy(dest,&sendbuf[m*nbytes],nbytes); + dest += nbytes; } // wait on all incoming messages diff --git a/src/read_data.cpp b/src/read_data.cpp index 373ba30151..d7bd298e7b 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -120,6 +120,9 @@ void ReadData::command(int narg, char **arg) { if (narg < 1) error->all(FLERR,"Illegal read_data command"); + MPI_Barrier(world); + double time1 = MPI_Wtime; + // optional args addflag = NONE; @@ -905,6 +908,18 @@ void ReadData::command(int narg, char **arg) force->kspace = saved_kspace; } + + // total time + + MPI_Barrier(world); + double time2 = MPI_Wtime; + + if (comm->me == 0) { + if (screen) + fprintf(screen," read_atoms CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," read_atoms CPU = %g secs\n",time2-time1); + } } /* ---------------------------------------------------------------------- diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 82028d8316..a338a843d7 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -81,6 +81,9 @@ void ReadRestart::command(int narg, char **arg) if (domain->box_exist) error->all(FLERR,"Cannot read_restart after simulation box is defined"); + MPI_Barrier(world); + double time1 = MPI_Wtime; + MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -562,6 +565,18 @@ void ReadRestart::command(int narg, char **arg) Special special(lmp); special.build(); } + + // total time + + MPI_Barrier(world); + double time2 = MPI_Wtime; + + if (comm->me == 0) { + if (screen) + fprintf(screen," read_restart CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," read_restart CPU = %g secs\n",time2-time1); + } } /* ---------------------------------------------------------------------- diff --git a/src/replicate.cpp b/src/replicate.cpp index cdadf1fd1f..3c8f4a8aee 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -76,7 +76,7 @@ void Replicate::command(int narg, char **arg) if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store) error->all(FLERR,"Cannot replicate with fixes that store atom quantities"); - // Record wall time for atom replication + // record wall time for atom replication MPI_Barrier(world); double time1 = MPI_Wtime(); @@ -762,15 +762,15 @@ void Replicate::command(int narg, char **arg) special.build(); } - // Wall time + // total time MPI_Barrier(world); double time2 = MPI_Wtime(); if (me == 0) { if (screen) - fprintf(screen," Time spent = %g secs\n",time2-time1); + fprintf(screen," replicate CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," Time spent = %g secs\n",time2-time1); + fprintf(logfile," replicate CPU = %g secs\n",time2-time1); } } diff --git a/src/special.cpp b/src/special.cpp index fccc930353..a18c597765 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -21,9 +21,10 @@ #include "modify.h" #include "fix.h" #include "accelerator_kokkos.h" +#include "hashlittle.h" +#include "atom_masks.h" #include "memory.h" #include "error.h" -#include "atom_masks.h" using namespace LAMMPS_NS; @@ -54,11 +55,12 @@ Special::~Special() void Special::build() { - int i,j,k,size; - int max,maxall,nbuf; - tagint *buf; + int i,j,k,m,n,size,proc; + int max,maxall; + char *buf; MPI_Barrier(world); + double time1 = MPI_Wtime(); int nlocal = atom->nlocal; @@ -87,99 +89,88 @@ void Special::build() // ----------------------------------------------------- // compute nspecial[i][0] = # of 1-2 neighbors of atom i + // create onetwo[i] = list of 1-2 neighbors for atom i // ----------------------------------------------------- - // bond partners stored by atom itself + // ncount = # of my datums to send (newton or newton off) + // include nlocal datums with owner of each atom - for (i = 0; i < nlocal; i++) nspecial[i][0] = num_bond[i]; + int newton_bond = force->newton_bond; - // if newton_bond off, then done - // else only counted 1/2 of all bonds, so count other half + int ncount = 0; + for (i = 0; i < nlocal; i++) ncount += num_bond[i]; + if (newton_bond) ncount *= 2; + ncount += nlocal; - if (force->newton_bond) { + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = global tag of 2nd atom in each bond + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += num_bond[i]; - memory->create(buf,nbuf,"special:buf"); + m = 0; + for (i = 0; i < nlocal; i++) { + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - // fill buffer with global tags of bond partners of my atoms - - size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) - buf[size++] = bond_atom[i][j]; - - // cycle buffer around ring of procs back to self - // when receive buffer, scan tags for atoms I own - // when find one, increment nspecial count for that atom - - comm->ring(size,sizeof(tagint),buf,1,ring_one,NULL,(void *)this); - - memory->destroy(buf); + for (j = 0; j < num_bond[i]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = bond_atom[i][j]; + m++; + } + if (newton_bond) { + for (j = 0; j < num_bond[i]; j++) { + proclist[m] = hashlittle(&bond_atom[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -1; + inbuf[m].atomID = bond_atom[i][j]; + inbuf[m].partnerID = tag[i]; + m++; + } + } } - // ---------------------------------------------------- - // create onetwo[i] = list of 1-2 neighbors for atom i - // ---------------------------------------------------- + // perform rendezvous operation + // each proc owns random subset of atoms, receives all their bond partners - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][0]); + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[0] and onetwo for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); + + // compute and print max # of 1-2 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-2 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-2 neighbors\n",maxall); } - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - // count = accumulating counter - - memory->create(count,nlocal,"special:count"); - for (i = 0; i < nlocal; i++) count[i] = 0; - - // add bond partners stored by atom to onetwo list - - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) - onetwo[i][count[i]++] = bond_atom[i][j]; - - // if newton_bond off, then done - // else only stored 1/2 of all bonds, so store other half - - if (force->newton_bond) { - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 global tags in each bond - - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2*num_bond[i]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with global tags of both atoms in bond - - size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) { - buf[size++] = tag[i]; - buf[size++] = bond_atom[i][j]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan 2nd-atom tags for atoms I own - // when find one, add 1st-atom tag to onetwo list for 2nd atom - - comm->ring(size,sizeof(tagint),buf,2,ring_two,NULL,(void *)this); - - memory->destroy(buf); - } - - memory->destroy(count); - // ----------------------------------------------------- // done if special_bond weights for 1-3, 1-4 are set to 1.0 // ----------------------------------------------------- @@ -189,114 +180,83 @@ void Special::build() dedup(); combine(); fix_alteration(); + timer_output(time1); return; } // ----------------------------------------------------- // compute nspecial[i][1] = # of 1-3 neighbors of atom i + // create onethree[i] = list of 1-3 neighbors for atom i // ----------------------------------------------------- - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 scalars + list of 1-2 neighbors + // ncount = # of my datums to send + // include nlocal datums with owner of each atom - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][0]; - memory->create(buf,nbuf,"special:buf"); + ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][0]*(nspecial[i][0]-1); - // fill buffer with: - // (1) = counter for 1-3 neighbors, initialized to 0 - // (2) = # of 1-2 neighbors - // (3:N) = list of 1-2 neighbors + memory->create(proclist,ncount,"special:proclist"); + inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - size = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - buf[size++] = 0; - buf[size++] = nspecial[i][0]; - for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; + proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; + + for (j = 0; j < nspecial[i][0]; j++) { + proc = hashlittle(&onetwo[i][j],sizeof(tagint),0) % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = onetwo[i][j]; + inbuf[m].partnerID = onetwo[i][k]; + m++; + } + } } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-2 neighbors for atoms I own - // when find one, increment 1-3 count by # of 1-2 neighbors of my atom, - // subtracting one since my list will contain original atom + // perform rendezvous operation + // each proc owns random subset of atoms, receives all their bond partners - comm->ring(size,sizeof(tagint),buf,3,ring_three,buf,(void *)this); + nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + outbuf = (OutRvous *) buf; - // extract count from buffer that has cycled back to me - // nspecial[i][1] = # of 1-3 neighbors of atom i + memory->destroy(proclist); + memory->sfree(inbuf); - j = 0; - for (i = 0; i < nlocal; i++) { - nspecial[i][1] = buf[j]; - j += 2 + nspecial[i][0]; + // set nspecial[1] and onethree for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onethree,nlocal,maxall,"special:onethree"); + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; } - memory->destroy(buf); + memory->destroy(outbuf); - // ---------------------------------------------------- - // create onethree[i] = list of 1-3 neighbors for atom i - // ---------------------------------------------------- - - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][1]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + // compute and print max # of 1-3 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-3 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-3 neighbors\n",maxall); } - memory->create(onethree,nlocal,maxall,"special:onethree"); - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 4 scalars + list of 1-2 neighs + list of 1-3 neighs - - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 4 + nspecial[i][0] + nspecial[i][1]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with: - // (1) = global tag of original atom - // (2) = # of 1-2 neighbors - // (3) = # of 1-3 neighbors - // (4) = counter for 1-3 neighbors, initialized to 0 - // (5:N) = list of 1-2 neighbors - // (N+1:2N) space for list of 1-3 neighbors - - size = 0; - for (i = 0; i < nlocal; i++) { - buf[size++] = tag[i]; - buf[size++] = nspecial[i][0]; - buf[size++] = nspecial[i][1]; - buf[size++] = 0; - for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; - size += nspecial[i][1]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-2 neighbors for atoms I own - // when find one, add its neighbors to 1-3 list - // increment the count in buf(i+4) - // exclude the atom whose tag = original - // this process may include duplicates but they will be culled later - - comm->ring(size,sizeof(tagint),buf,4,ring_four,buf,(void *)this); - - // fill onethree with buffer values that have been returned to me - // sanity check: accumulated buf[i+3] count should equal - // nspecial[i][1] for each atom - - j = 0; - for (i = 0; i < nlocal; i++) { - if (buf[j+3] != nspecial[i][1]) - error->one(FLERR,"1-3 bond count is inconsistent"); - j += 4 + nspecial[i][0]; - for (k = 0; k < nspecial[i][1]; k++) - onethree[i][k] = buf[j++]; - } - - memory->destroy(buf); - // done if special_bond weights for 1-4 are set to 1.0 if (force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { @@ -304,117 +264,92 @@ void Special::build() if (force->special_angle) angle_trim(); combine(); fix_alteration(); + timer_output(time1); return; } // ----------------------------------------------------- // compute nspecial[i][2] = # of 1-4 neighbors of atom i + // create onefour[i] = list of 1-4 neighbors for atom i // ----------------------------------------------------- - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 scalars + list of 1-3 neighbors + // ncount = # of my datums to send + // include nlocal datums with owner of each atom - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][1]; - memory->create(buf,nbuf,"special:buf"); + ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]*nspecial[i][0]; - // fill buffer with: - // (1) = counter for 1-4 neighbors, initialized to 0 - // (2) = # of 1-3 neighbors - // (3:N) = list of 1-3 neighbors + memory->create(proclist,ncount,"special:proclist"); + inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - size = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - buf[size++] = 0; - buf[size++] = nspecial[i][1]; - for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; + proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; + + for (j = 0; j < nspecial[i][1]; j++) { + proc = hashlittle(&onethree[i][j],sizeof(tagint),0) % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = onethree[i][j]; + inbuf[m].partnerID = onetwo[i][k]; + m++; + } + } } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-3 neighbors for atoms I own - // when find one, increment 1-4 count by # of 1-2 neighbors of my atom - // may include duplicates and original atom but they will be culled later + // perform rendezvous operation + // each proc owns random subset of bodies, receives all atoms in the bodies + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body - comm->ring(size,sizeof(tagint),buf,5,ring_five,buf,(void *)this); + nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + outbuf = (OutRvous *) buf; - // extract count from buffer that has cycled back to me - // nspecial[i][2] = # of 1-4 neighbors of atom i + memory->destroy(proclist); + memory->sfree(inbuf); - j = 0; - for (i = 0; i < nlocal; i++) { - nspecial[i][2] = buf[j]; - j += 2 + nspecial[i][1]; + // set nspecial[2] and onefour for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onefour,nlocal,maxall,"special:onefour"); + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; } - memory->destroy(buf); + memory->destroy(outbuf); - // ---------------------------------------------------- - // create onefour[i] = list of 1-4 neighbors for atom i - // ---------------------------------------------------- - - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][2]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + // compute and print max # of 1-4 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-4 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-4 neighbors\n",maxall); } - memory->create(onefour,nlocal,maxall,"special:onefour"); - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 3 scalars + list of 1-3 neighs + list of 1-4 neighs - - nbuf = 0; - for (i = 0; i < nlocal; i++) - nbuf += 3 + nspecial[i][1] + nspecial[i][2]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with: - // (1) = # of 1-3 neighbors - // (2) = # of 1-4 neighbors - // (3) = counter for 1-4 neighbors, initialized to 0 - // (4:N) = list of 1-3 neighbors - // (N+1:2N) space for list of 1-4 neighbors - - size = 0; - for (i = 0; i < nlocal; i++) { - buf[size++] = nspecial[i][1]; - buf[size++] = nspecial[i][2]; - buf[size++] = 0; - for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; - size += nspecial[i][2]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-3 neighbors for atoms I own - // when find one, add its neighbors to 1-4 list - // incrementing the count in buf(i+4) - // this process may include duplicates but they will be culled later - - comm->ring(size,sizeof(tagint),buf,6,ring_six,buf,(void *)this); - - // fill onefour with buffer values that have been returned to me - // sanity check: accumulated buf[i+2] count should equal - // nspecial[i][2] for each atom - - j = 0; - for (i = 0; i < nlocal; i++) { - if (buf[j+2] != nspecial[i][2]) - error->one(FLERR,"1-4 bond count is inconsistent"); - j += 3 + nspecial[i][1]; - for (k = 0; k < nspecial[i][2]; k++) - onefour[i][k] = buf[j++]; - } - - memory->destroy(buf); + // finish processing the onetwo, onethree, onefour lists dedup(); if (force->special_angle) angle_trim(); if (force->special_dihedral) dihedral_trim(); combine(); fix_alteration(); + timer_output(time1); } /* ---------------------------------------------------------------------- @@ -663,17 +598,19 @@ void Special::combine() void Special::angle_trim() { - int i,j,m,n; + int i,j,m,n,proc,index; int *num_angle = atom->num_angle; int *num_dihedral = atom->num_dihedral; tagint **angle_atom1 = atom->angle_atom1; + tagint **angle_atom2 = atom->angle_atom2; tagint **angle_atom3 = atom->angle_atom3; tagint **dihedral_atom1 = atom->dihedral_atom1; tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom3 = atom->dihedral_atom3; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; + tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-3 neighbor counts @@ -697,68 +634,125 @@ void Special::angle_trim() if ((num_angle && atom->nangles) || (num_dihedral && atom->ndihedrals)) { - // dflag = flag for 1-3 neighs of all owned atoms - - int maxcount = 0; - for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][1]); - memory->create(dflag,nlocal,maxcount,"special::dflag"); + // ncount = # of my datums to send in 3 parts for each owned atom + // proc owner, onethree list, angle end points + // angle end points are from angle list and 1-3 and 2-4 pairs in dihedrals + // latter is only for angles or dihedrlas where I own atom2 + int ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]; for (i = 0; i < nlocal; i++) { - n = nspecial[i][1]; - for (j = 0; j < n; j++) dflag[i][j] = 0; + for (j = 0; j < num_angle[i]; j++) { + index = atom->map(angle_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 2; + } + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 4; + } } - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = list of 1,3 atoms in each angle stored by atom - // and list of 1,3 and 2,4 atoms in each dihedral stored by atom + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - int nbuf = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // sent to owner of atomID + // one datum for each 1-4 partner: datum = atomID, ID + // sent to owner of atomID + // two datums for each dihedral 1-4 endatoms : datum = atomID, ID + // sent to owner of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - if (num_angle && atom->nangles) nbuf += 2*num_angle[i]; - if (num_dihedral && atom->ndihedrals) nbuf += 2*2*num_dihedral[i]; - } - int *buf; - memory->create(buf,nbuf,"special:buf"); + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - // fill buffer with list of 1,3 atoms in each angle - // and with list of 1,3 and 2,4 atoms in each dihedral + for (j = 0; j < nspecial[i][1]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = onethree[i][j]; + m++; + } - int size = 0; - if (num_angle && atom->nangles) - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_angle[i]; j++) { - buf[size++] = angle_atom1[i][j]; - buf[size++] = angle_atom3[i][j]; - } + for (j = 0; j < num_angle[i]; j++) { + index = atom->map(angle_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - if (num_dihedral && atom->ndihedrals) - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_dihedral[i]; j++) { - buf[size++] = dihedral_atom1[i][j]; - buf[size++] = dihedral_atom3[i][j]; - buf[size++] = dihedral_atom2[i][j]; - buf[size++] = dihedral_atom4[i][j]; - } + proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = angle_atom1[i][j]; + inbuf[m].partnerID = angle_atom3[i][j]; + m++; - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1,3 atoms looking for atoms I own - // when find one, scan its 1-3 neigh list and mark I,J as in an angle + proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = angle_atom3[i][j]; + inbuf[m].partnerID = angle_atom1[i][j]; + m++; + } - comm->ring(size,sizeof(tagint),buf,7,ring_seven,NULL,(void *)this); + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - // delete 1-3 neighbors if they are not flagged in dflag + proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom1[i][j]; + inbuf[m].partnerID = dihedral_atom3[i][j]; + m++; - for (i = 0; i < nlocal; i++) { - m = 0; - for (j = 0; j < nspecial[i][1]; j++) - if (dflag[i][j]) onethree[i][m++] = onethree[i][j]; - nspecial[i][1] = m; + proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom2[i][j]; + inbuf[m].partnerID = dihedral_atom4[i][j]; + m++; + + proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom3[i][j]; + inbuf[m].partnerID = dihedral_atom1[i][j]; + m++; + + proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom4[i][j]; + inbuf[m].partnerID = dihedral_atom2[i][j]; + m++; + } } - // clean up + // perform rendezvous operation + // each proc owns random subset of atoms + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_trim, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - memory->destroy(dflag); - memory->destroy(buf); + memory->destroy(proclist); + memory->sfree(inbuf); + + // reset nspecial[1] and onethree for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + } + + memory->destroy(outbuf); // if no angles or dihedrals are defined, delete all 1-3 neighs @@ -789,12 +783,14 @@ void Special::angle_trim() void Special::dihedral_trim() { - int i,j,m,n; + int i,j,m,n,proc,index; int *num_dihedral = atom->num_dihedral; tagint **dihedral_atom1 = atom->dihedral_atom1; + tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; + tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-4 neighbor counts @@ -813,57 +809,95 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, flag each 1-4 neigh if it appears in a dihedral + // if dihedrals are defined, rendezvous onefour list with dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { - // dflag = flag for 1-4 neighs of all owned atoms - - int maxcount = 0; - for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][2]); - memory->create(dflag,nlocal,maxcount,"special::dflag"); + // ncount = # of my datums to send in 3 parts for each owned atom + // onefour list, proc owner, dihedral end points + // latter is only for dihedrals where I own atom2 + int ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][2]; for (i = 0; i < nlocal; i++) { - n = nspecial[i][2]; - for (j = 0; j < n; j++) dflag[i][j] = 0; + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 2; + } } - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = list of 1,4 atoms in each dihedral stored by atom + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - int nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2*num_dihedral[i]; - int *buf; - memory->create(buf,nbuf,"special:buf"); + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // sent to owner of atomID + // one datum for each 1-4 partner: datum = atomID, ID + // sent to owner of atomID + // two datums for each dihedral 1-4 endatoms : datum = atomID, ID + // sent to owner of atomID - // fill buffer with list of 1,4 atoms in each dihedral + m = 0; + for (i = 0; i < nlocal; i++) { + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - int size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_dihedral[i]; j++) { - buf[size++] = dihedral_atom1[i][j]; - buf[size++] = dihedral_atom4[i][j]; + for (j = 0; j < nspecial[i][2]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = onefour[i][j]; + m++; } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1,4 atoms looking for atoms I own - // when find one, scan its 1-4 neigh list and mark I,J as in a dihedral + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - comm->ring(size,sizeof(tagint),buf,8,ring_eight,NULL,(void *)this); + proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom1[i][j]; + inbuf[m].partnerID = dihedral_atom4[i][j]; + m++; - // delete 1-4 neighbors if they are not flagged in dflag - - for (i = 0; i < nlocal; i++) { - m = 0; - for (j = 0; j < nspecial[i][2]; j++) - if (dflag[i][j]) onefour[i][m++] = onefour[i][j]; - nspecial[i][2] = m; + proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom4[i][j]; + inbuf[m].partnerID = dihedral_atom1[i][j]; + m++; + } } - // clean up + // perform rendezvous operation + // each proc owns random subset of atoms + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_trim, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - memory->destroy(dflag); - memory->destroy(buf); + memory->destroy(proclist); + memory->sfree(inbuf); + + // reset nspecial[2] and onefour for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + } + + memory->destroy(outbuf); // if no dihedrals are defined, delete all 1-4 neighs @@ -888,262 +922,213 @@ void Special::dihedral_trim() } /* ---------------------------------------------------------------------- - when receive buffer, scan tags for atoms I own - when find one, increment nspecial count for that atom + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N InRvous datums + create outbuf = list of Nout OutRvous datums ------------------------------------------------------------------------- */ -void Special::ring_one(int ndatum, char *cbuf, void *ptr) +int Special::rendezvous_1234(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) { + int i,j,m; + Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + Memory *memory = sptr->memory; - tagint *buf = (tagint *) cbuf; - int m; + // setup hash + // ncount = number of atoms assigned to me + // key = atom ID + // value = index into Ncount-length data structure - for (int i = 0; i < ndatum; i++) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) nspecial[m][0]++; + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) + if (in[i].me >= 0) + hash[in[i].atomID] = ncount++; + + // procowner = caller proc that owns each atom + // atomID = ID of each rendezvous atom I own + + int *procowner,*npartner; + tagint *atomID; + memory->create(procowner,ncount,"special:procowner"); + memory->create(atomID,ncount,"special:atomID"); + memory->create(npartner,ncount,"special:npartner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].atomID)->second; + if (in[i].me >= 0) { + procowner[m] = in[i].me; + atomID[m] = in[i].atomID; + } else npartner[m]++; } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan 2nd-atom tags for atoms I own - when find one, add 1st-atom tag to onetwo list for 2nd atom -------------------------------------------------------------------------- */ + int max = 0; + for (m = 0; m < ncount; m++) + max = MAX(max,npartner[m]); + sptr->max_rvous = max; -void Special::ring_two(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int nlocal = atom->nlocal; + int **partner; + memory->create(partner,ncount,max,"special:partner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; - tagint **onetwo = sptr->onetwo; - int *count = sptr->count; - - tagint *buf = (tagint *) cbuf; - int m; - - for (int i = 1; i < ndatum; i += 2) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) onetwo[m][count[m]++] = buf[i-1]; + for (i = 0; i < n; i++) { + if (in[i].me >= 0) continue; + m = hash.find(in[i].atomID)->second; + partner[m][npartner[m]++] = in[i].partnerID; } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-2 neighbors for atoms I own - when find one, increment 1-3 count by # of 1-2 neighbors of my atom, - subtracting one since my list will contain original atom -------------------------------------------------------------------------- */ + // pass list of OutRvous datums back to comm->rendezvous -void Special::ring_three(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + int nout = 0; + for (m = 0; m < ncount; m++) nout += npartner[m]; - tagint *buf = (tagint *) cbuf; - int i,j,m,n,num12; + memory->create(proclist,nout,"special:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); - i = 0; - while (i < ndatum) { - n = buf[i]; - num12 = buf[i+1]; - for (j = 0; j < num12; j++) { - m = atom->map(buf[i+2+j]); - if (m >= 0 && m < nlocal) - n += nspecial[m][0] - 1; + nout = 0; + for (m = 0; m < ncount; m++) + for (j = 0; j < npartner[m]; j++) { + proclist[nout] = procowner[m]; + out[nout].atomID = atomID[m]; + out[nout].partnerID = partner[m][j]; + nout++; } - buf[i] = n; - i += 2 + num12; - } + + outbuf = (char *) out; + + // clean up + // Comm::rendezvous will delete proclist and out (outbuf) + + memory->destroy(procowner); + memory->destroy(atomID); + memory->destroy(npartner); + memory->destroy(partner); + + return nout; } /* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-2 neighbors for atoms I own - when find one, add its neighbors to 1-3 list - increment the count in buf(i+4) - exclude the atom whose tag = original - this process may include duplicates but they will be culled later + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N InRvous datums + create outbuf = list of Nout OutRvous datums ------------------------------------------------------------------------- */ -void Special::ring_four(int ndatum, char *cbuf, void *ptr) +int Special::rendezvous_trim(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) { + int i,j,m; + Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + Memory *memory = sptr->memory; - tagint **onetwo = sptr->onetwo; + // setup hash + // ncount = number of atoms assigned to me + // key = atom ID + // value = index into Ncount-length data structure - tagint *buf = (tagint *) cbuf; - tagint original; - int i,j,k,m,n,num12,num13; + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) + if (in[i].me >= 0) + hash[in[i].atomID] = ncount++; - i = 0; - while (i < ndatum) { - original = buf[i]; - num12 = buf[i+1]; - num13 = buf[i+2]; - n = buf[i+3]; - for (j = 0; j < num12; j++) { - m = atom->map(buf[i+4+j]); - if (m >= 0 && m < nlocal) - for (k = 0; k < nspecial[m][0]; k++) - if (onetwo[m][k] != original) - buf[i+4+num12+(n++)] = onetwo[m][k]; + // procowner = caller proc that owns each atom + // atomID = ID of each rendezvous atom I own + // npartner = # of 1-3 partners for each atom I own + + int *procowner,*npartner; + tagint *atomID; + memory->create(procowner,ncount,"special:procowner"); + memory->create(atomID,ncount,"special:atomID"); + memory->create(npartner,ncount,"special:npartner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].atomID)->second; + if (in[i].me >= 0) { + procowner[m] = in[i].me; + atomID[m] = in[i].atomID; + } else if (in[i].me == -1) npartner[m]++; + } + + int max = 0; + for (m = 0; m < ncount; m++) max = MAX(max,npartner[m]); + + // partner = list of 1-3 or 1-4 partners for each atom I own + + int **partner; + memory->create(partner,ncount,max,"special:partner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + if (in[i].me >= 0 || in[i].me == -2) continue; + m = hash.find(in[i].atomID)->second; + partner[m][npartner[m]++] = in[i].partnerID; + } + + // flag = 1 if partner is in an actual angle or in a dihedral + + int **flag; + memory->create(flag,ncount,max,"special:flag"); + + for (i = 0; i < ncount; i++) + for (j = 0; j < npartner[i]; j++) + flag[i][j] = 0; + + tagint actual; + for (i = 0; i < n; i++) { + if (in[i].me != -2) continue; + actual = in[i].partnerID; + m = hash.find(in[i].atomID)->second; + for (j = 0; j < npartner[m]; j++) + if (partner[m][j] == actual) { + flag[m][j] = 1; + break; + } + } + + // pass list of OutRvous datums back to comm->rendezvous + + int nout = 0; + for (m = 0; m < ncount; m++) nout += npartner[m]; + + memory->create(proclist,nout,"special:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); + + nout = 0; + for (m = 0; m < ncount; m++) + for (j = 0; j < npartner[m]; j++) { + if (flag[m][j] == 0) continue; + proclist[nout] = procowner[m]; + out[nout].atomID = atomID[m]; + out[nout].partnerID = partner[m][j]; + nout++; } - buf[i+3] = n; - i += 4 + num12 + num13; - } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-3 neighbors for atoms I own - when find one, increment 1-4 count by # of 1-2 neighbors of my atom - may include duplicates and original atom but they will be culled later -------------------------------------------------------------------------- */ + outbuf = (char *) out; -void Special::ring_five(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + // clean up + // Comm::rendezvous will delete proclist and out (outbuf) - tagint *buf = (tagint *) cbuf; - int i,j,m,n,num13; + memory->destroy(procowner); + memory->destroy(atomID); + memory->destroy(npartner); + memory->destroy(partner); + memory->destroy(flag); - i = 0; - while (i < ndatum) { - n = buf[i]; - num13 = buf[i+1]; - for (j = 0; j < num13; j++) { - m = atom->map(buf[i+2+j]); - if (m >= 0 && m < nlocal) n += nspecial[m][0]; - } - buf[i] = n; - i += 2 + num13; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-3 neighbors for atoms I own - when find one, add its neighbors to 1-4 list - incrementing the count in buf(i+4) - this process may include duplicates but they will be culled later -------------------------------------------------------------------------- */ - -void Special::ring_six(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onetwo = sptr->onetwo; - - tagint *buf = (tagint *) cbuf; - int i,j,k,m,n,num13,num14; - - i = 0; - while (i < ndatum) { - num13 = buf[i]; - num14 = buf[i+1]; - n = buf[i+2]; - for (j = 0; j < num13; j++) { - m = atom->map(buf[i+3+j]); - if (m >= 0 && m < nlocal) - for (k = 0; k < nspecial[m][0]; k++) - buf[i+3+num13+(n++)] = onetwo[m][k]; - } - buf[i+2] = n; - i += 3 + num13 + num14; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1,3 atoms looking for atoms I own - when find one, scan its 1-3 neigh list and mark I,J as in an angle -------------------------------------------------------------------------- */ - -void Special::ring_seven(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onethree = sptr->onethree; - int **dflag = sptr->dflag; - - tagint *buf = (tagint *) cbuf; - tagint iglobal,jglobal; - int i,m,ilocal,jlocal; - - i = 0; - while (i < ndatum) { - iglobal = buf[i]; - jglobal = buf[i+1]; - ilocal = atom->map(iglobal); - jlocal = atom->map(jglobal); - if (ilocal >= 0 && ilocal < nlocal) - for (m = 0; m < nspecial[ilocal][1]; m++) - if (jglobal == onethree[ilocal][m]) { - dflag[ilocal][m] = 1; - break; - } - if (jlocal >= 0 && jlocal < nlocal) - for (m = 0; m < nspecial[jlocal][1]; m++) - if (iglobal == onethree[jlocal][m]) { - dflag[jlocal][m] = 1; - break; - } - i += 2; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1,4 atoms looking for atoms I own - when find one, scan its 1-4 neigh list and mark I,J as in a dihedral -------------------------------------------------------------------------- */ - -void Special::ring_eight(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onefour = sptr->onefour; - int **dflag = sptr->dflag; - - tagint *buf = (tagint *) cbuf; - tagint iglobal,jglobal; - int i,m,ilocal,jlocal; - - i = 0; - while (i < ndatum) { - iglobal = buf[i]; - jglobal = buf[i+1]; - ilocal = atom->map(iglobal); - jlocal = atom->map(jglobal); - if (ilocal >= 0 && ilocal < nlocal) - for (m = 0; m < nspecial[ilocal][2]; m++) - if (jglobal == onefour[ilocal][m]) { - dflag[ilocal][m] = 1; - break; - } - if (jlocal >= 0 && jlocal < nlocal) - for (m = 0; m < nspecial[jlocal][2]; m++) - if (iglobal == onefour[jlocal][m]) { - dflag[jlocal][m] = 1; - break; - } - i += 2; - } + return nout; } /* ---------------------------------------------------------------------- @@ -1159,3 +1144,15 @@ void Special::fix_alteration() modify->fix[ifix]->rebuild_special(); } +/* ---------------------------------------------------------------------- + print timing output +------------------------------------------------------------------------- */ + +void Special::timer_output(double time1) +{ + double t2 = MPI_Wtime(); + if (comm->me == 0) { + if (screen) fprintf(screen," special bonds CPU = %g secs\n",t2-t1); + if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",t2-t1); + } +} diff --git a/src/special.h b/src/special.h index 9f25200336..f7892075ac 100644 --- a/src/special.h +++ b/src/special.h @@ -28,27 +28,30 @@ class Special : protected Pointers { int me,nprocs; tagint **onetwo,**onethree,**onefour; - // data used by ring callback methods + // data used by rendezvous callback methods - int *count; - int **dflag; + int max_rvous; + + struct InRvous { + int me; + tagint atomID,partnerID; + }; + + struct OutRvous { + tagint atomID,partnerID; + }; void dedup(); void angle_trim(); void dihedral_trim(); void combine(); void fix_alteration(); + void timer_output(double); - // callback functions for ring communication + // callback function for rendezvous communication - static void ring_one(int, char *, void *); - static void ring_two(int, char *, void *); - static void ring_three(int, char *, void *); - static void ring_four(int, char *, void *); - static void ring_five(int, char *, void *); - static void ring_six(int, char *, void *); - static void ring_seven(int, char *, void *); - static void ring_eight(int, char *, void *); + static int rendezvous_1234(int, char *, int *&, char *&, void *); + static int rendezvous_trim(int, char *, int *&, char *&, void *); }; } From 2e0d69b005ef26ccf1fdf0bcc671bfd8a61fafea Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 13:06:31 -0700 Subject: [PATCH 006/243] replace STL map with atom->map in special, better code comments --- src/RIGID/fix_rigid_small.cpp | 8 ++-- src/comm.cpp | 20 ++++++-- src/read_data.cpp | 8 ++-- src/read_restart.cpp | 4 +- src/special.cpp | 89 +++++++++++++++++++++++++---------- 5 files changed, 92 insertions(+), 37 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 4421d9ae17..fc51e0aa4f 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1571,9 +1571,9 @@ void FixRigidSmall::create_bodies(tagint *bodyID) } // perform rendezvous operation - // each proc owns random subset of bodies, receives all atoms in the bodies - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body + // each proc owns random subset of bodies + // receives all atoms in those bodies + // func = compute bbox of each body, find atom closest to geometric center char *buf; int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), @@ -1627,6 +1627,8 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, MPI_Comm world = frsptr->world; // setup hash + // use STL map instead of atom->map + // b/c know nothing about body ID values specified by user // ncount = number of bodies assigned to me // key = body ID // value = index into Ncount-length data structure diff --git a/src/comm.cpp b/src/comm.cpp index 5fcfa141d0..6512b21fef 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -728,13 +728,27 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, /* ---------------------------------------------------------------------- rendezvous communication operation + three stages: + first Irregular converts inbuf from caller decomp to rvous decomp + callback operates on data in rendevous decomp + last Irregular converts outbuf from rvous decomp back to caller decomp + inputs: + n = # of input datums + proclist = proc that owns each input datum in rendezvous decomposition + inbuf = list of input datums + insize = size in bytes of each input datum + callback = caller function to invoke in rendezvous decomposition + outputs: + nout = # of output datums (function return) + outbuf = list of output datums + outsize = size in bytes of each output datum ------------------------------------------------------------------------- */ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, int (*callback)(int, char *, int *&, char *&, void *), char *&outbuf, int outsize, void *ptr) { - // comm data from caller decomposition to rendezvous decomposition + // comm inbuf from caller decomposition to rendezvous decomposition Irregular *irregular = new Irregular(lmp); @@ -747,7 +761,7 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, delete irregular; // peform rendezvous computation via callback() - // callback() allocates proclist_rvous and outbuf_rvous + // callback() allocates/populates proclist_rvous and outbuf_rvous int *proclist_rvous; char *outbuf_rvous; @@ -757,7 +771,7 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, memory->sfree(inbuf_rvous); - // comm data from rendezvous decomposition back to caller + // comm outbuf from rendezvous decomposition back to caller // caller will free outbuf irregular = new Irregular(lmp); diff --git a/src/read_data.cpp b/src/read_data.cpp index d7bd298e7b..cdeda03066 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -121,7 +121,7 @@ void ReadData::command(int narg, char **arg) if (narg < 1) error->all(FLERR,"Illegal read_data command"); MPI_Barrier(world); - double time1 = MPI_Wtime; + double time1 = MPI_Wtime(); // optional args @@ -912,13 +912,13 @@ void ReadData::command(int narg, char **arg) // total time MPI_Barrier(world); - double time2 = MPI_Wtime; + double time2 = MPI_Wtime(); if (comm->me == 0) { if (screen) - fprintf(screen," read_atoms CPU = %g secs\n",time2-time1); + fprintf(screen," read_data CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," read_atoms CPU = %g secs\n",time2-time1); + fprintf(logfile," read_data CPU = %g secs\n",time2-time1); } } diff --git a/src/read_restart.cpp b/src/read_restart.cpp index a338a843d7..b61fb2278f 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -82,7 +82,7 @@ void ReadRestart::command(int narg, char **arg) error->all(FLERR,"Cannot read_restart after simulation box is defined"); MPI_Barrier(world); - double time1 = MPI_Wtime; + double time1 = MPI_Wtime(); MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -569,7 +569,7 @@ void ReadRestart::command(int narg, char **arg) // total time MPI_Barrier(world); - double time2 = MPI_Wtime; + double time2 = MPI_Wtime(); if (comm->me == 0) { if (screen) diff --git a/src/special.cpp b/src/special.cpp index a18c597765..6dad30a9a7 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -108,9 +108,11 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID + // input datums = pairs of bonded atoms // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on m = 0; for (i = 0; i < nlocal; i++) { @@ -140,7 +142,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of atoms, receives all their bond partners + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -151,6 +154,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[0] and onetwo for all owned atoms based on output info + // output datums = pairs of atoms that are 1-2 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onetwo,nlocal,maxall,"special:onetwo"); @@ -200,9 +204,10 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID + // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onetwo pair: datum = atomID1, atomID2 m = 0; for (i = 0; i < nlocal; i++) { @@ -226,7 +231,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of atoms, receives all their bond partners + // each proc owns random subset of atoms + // receives all info to form and return their onethree lists nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -237,6 +243,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[1] and onethree for all owned atoms based on output info + // output datums = pairs of atoms that are 1-3 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onethree,nlocal,maxall,"special:onethree"); @@ -284,9 +291,10 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each partner: datum = atomID, bond partner ID + // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 m = 0; for (i = 0; i < nlocal; i++) { @@ -309,9 +317,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of bodies, receives all atoms in the bodies - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body + // each proc owns random subset of atoms + // receives all info to form and return their onefour lists nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -322,6 +329,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[2] and onefour for all owned atoms based on output info + // output datums = pairs of atoms that are 1-4 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onefour,nlocal,maxall,"special:onefour"); @@ -934,21 +942,28 @@ int Special::rendezvous_1234(int n, char *inbuf, int i,j,m; Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // setup hash + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // initialize hash // ncount = number of atoms assigned to me // key = atom ID // value = index into Ncount-length data structure InRvous *in = (InRvous *) inbuf; - std::map hash; + //std::map hash; tagint id; int ncount = 0; for (i = 0; i < n; i++) if (in[i].me >= 0) - hash[in[i].atomID] = ncount++; + //hash[in[i].atomID] = ncount++; + atom->map_one(in[i].atomID,ncount++); // procowner = caller proc that owns each atom // atomID = ID of each rendezvous atom I own @@ -961,7 +976,8 @@ int Special::rendezvous_1234(int n, char *inbuf, for (m = 0; m < ncount; m++) npartner[m] = 0; for (i = 0; i < n; i++) { - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); if (in[i].me >= 0) { procowner[m] = in[i].me; atomID[m] = in[i].atomID; @@ -979,7 +995,8 @@ int Special::rendezvous_1234(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me >= 0) continue; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); partner[m][npartner[m]++] = in[i].partnerID; } @@ -1011,6 +1028,12 @@ int Special::rendezvous_1234(int n, char *inbuf, memory->destroy(npartner); memory->destroy(partner); + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + return nout; } @@ -1027,21 +1050,28 @@ int Special::rendezvous_trim(int n, char *inbuf, int i,j,m; Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // setup hash + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // initialize hash // ncount = number of atoms assigned to me // key = atom ID // value = index into Ncount-length data structure InRvous *in = (InRvous *) inbuf; - std::map hash; + //std::map hash; tagint id; int ncount = 0; for (i = 0; i < n; i++) if (in[i].me >= 0) - hash[in[i].atomID] = ncount++; + //hash[in[i].atomID] = ncount++; + atom->map_one(in[i].atomID,ncount++); // procowner = caller proc that owns each atom // atomID = ID of each rendezvous atom I own @@ -1055,7 +1085,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (m = 0; m < ncount; m++) npartner[m] = 0; for (i = 0; i < n; i++) { - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); if (in[i].me >= 0) { procowner[m] = in[i].me; atomID[m] = in[i].atomID; @@ -1073,7 +1104,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me >= 0 || in[i].me == -2) continue; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); partner[m][npartner[m]++] = in[i].partnerID; } @@ -1090,7 +1122,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me != -2) continue; actual = in[i].partnerID; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); for (j = 0; j < npartner[m]; j++) if (partner[m][j] == actual) { flag[m][j] = 1; @@ -1128,6 +1161,12 @@ int Special::rendezvous_trim(int n, char *inbuf, memory->destroy(partner); memory->destroy(flag); + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + return nout; } @@ -1150,9 +1189,9 @@ void Special::fix_alteration() void Special::timer_output(double time1) { - double t2 = MPI_Wtime(); + double time2 = MPI_Wtime(); if (comm->me == 0) { - if (screen) fprintf(screen," special bonds CPU = %g secs\n",t2-t1); - if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",t2-t1); + if (screen) fprintf(screen," special bonds CPU = %g secs\n",time2-time1); + if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",time2-time1); } } From ece1aff7e9c33b7145973880677e3fbdb3b5e37a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Dec 2018 15:46:27 -0700 Subject: [PATCH 007/243] less comm version of special bonds rendezvous --- src/comm.cpp | 8 +- src/comm.h | 2 +- src/special.cpp | 834 ++++++++++++++++++++++++++++-------------------- src/special.h | 26 +- 4 files changed, 517 insertions(+), 353 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 6512b21fef..9bdaf0798a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -745,7 +745,7 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, ------------------------------------------------------------------------- */ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, - int (*callback)(int, char *, int *&, char *&, void *), + int (*callback)(int, char *, int &, int *&, char *&, void *), char *&outbuf, int outsize, void *ptr) { // comm inbuf from caller decomposition to rendezvous decomposition @@ -763,13 +763,15 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, // peform rendezvous computation via callback() // callback() allocates/populates proclist_rvous and outbuf_rvous + int flag; int *proclist_rvous; char *outbuf_rvous; int nout_rvous = - callback(n_rvous,inbuf_rvous,proclist_rvous,outbuf_rvous,ptr); + callback(n_rvous,inbuf_rvous,flag,proclist_rvous,outbuf_rvous,ptr); - memory->sfree(inbuf_rvous); + if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular // comm outbuf from rendezvous decomposition back to caller // caller will free outbuf diff --git a/src/comm.h b/src/comm.h index 8bb057a0c1..a1bac53ac8 100644 --- a/src/comm.h +++ b/src/comm.h @@ -110,7 +110,7 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); int rendezvous(int, int *, char *, int, - int (*)(int, char *, int *&, char *&, void *), + int (*)(int, char *, int &, int *&, char *&, void *), char *&, int, void *); int read_lines_from_file(FILE *, int, int, char *); diff --git a/src/special.cpp b/src/special.cpp index 6dad30a9a7..79d2f77e46 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -55,20 +55,9 @@ Special::~Special() void Special::build() { - int i,j,k,m,n,size,proc; - int max,maxall; - char *buf; - MPI_Barrier(world); double time1 = MPI_Wtime(); - int nlocal = atom->nlocal; - - tagint *tag = atom->tag; - int *num_bond = atom->num_bond; - tagint **bond_atom = atom->bond_atom; - int **nspecial = atom->nspecial; - if (me == 0 && screen) { const double * const special_lj = force->special_lj; const double * const special_coul = force->special_coul; @@ -81,183 +70,51 @@ void Special::build() // initialize nspecial counters to 0 - for (i = 0; i < nlocal; i++) { + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { nspecial[i][0] = 0; nspecial[i][1] = 0; nspecial[i][2] = 0; } - // ----------------------------------------------------- - // compute nspecial[i][0] = # of 1-2 neighbors of atom i + // setup atomIDs and procowner vectors in rendezvous decomposition + + atom_owners(); + + // tally nspecial[i][0] = # of 1-2 neighbors of atom i // create onetwo[i] = list of 1-2 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send (newton or newton off) - // include nlocal datums with owner of each atom + if (force->newton_bond) onetwo_build_newton(); + else onetwo_build_newton_off(); - int newton_bond = force->newton_bond; - - int ncount = 0; - for (i = 0; i < nlocal; i++) ncount += num_bond[i]; - if (newton_bond) ncount *= 2; - ncount += nlocal; - - int *proclist; - memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on - - m = 0; - for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < num_bond[i]; j++) { - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = bond_atom[i][j]; - m++; - } - if (newton_bond) { - for (j = 0; j < num_bond[i]; j++) { - proclist[m] = hashlittle(&bond_atom[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -1; - inbuf[m].atomID = bond_atom[i][j]; - inbuf[m].partnerID = tag[i]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists - - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[0] and onetwo for all owned atoms based on output info - // output datums = pairs of atoms that are 1-2 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; - } - - memory->sfree(outbuf); - - // compute and print max # of 1-2 neighbors + // print max # of 1-2 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-2 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-2 neighbors\n",maxall); } - // ----------------------------------------------------- // done if special_bond weights for 1-3, 1-4 are set to 1.0 - // ----------------------------------------------------- if (force->special_lj[2] == 1.0 && force->special_coul[2] == 1.0 && force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { dedup(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); timer_output(time1); return; } - // ----------------------------------------------------- - // compute nspecial[i][1] = # of 1-3 neighbors of atom i + // tally nspecial[i][1] = # of 1-3 neighbors of atom i // create onethree[i] = list of 1-3 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + onethree_build(); - ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][0]*(nspecial[i][0]-1); - - memory->create(proclist,ncount,"special:proclist"); - inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onetwo pair: datum = atomID1, atomID2 - - m = 0; - for (i = 0; i < nlocal; i++) { - proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][0]; j++) { - proc = hashlittle(&onetwo[i][j],sizeof(tagint),0) % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - if (j == k) continue; - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = onetwo[i][j]; - inbuf[m].partnerID = onetwo[i][k]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onethree lists - - nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[1] and onethree for all owned atoms based on output info - // output datums = pairs of atoms that are 1-3 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onethree,nlocal,maxall,"special:onethree"); - - for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; - } - - memory->destroy(outbuf); - - // compute and print max # of 1-3 neighbors + // print max # of 1-3 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-3 neighbors\n",maxall); @@ -271,79 +128,18 @@ void Special::build() if (force->special_angle) angle_trim(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); timer_output(time1); return; } - // ----------------------------------------------------- - // compute nspecial[i][2] = # of 1-4 neighbors of atom i + // tally nspecial[i][2] = # of 1-4 neighbors of atom i // create onefour[i] = list of 1-4 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + onefour_build(); - ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]*nspecial[i][0]; - - memory->create(proclist,ncount,"special:proclist"); - inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 - - m = 0; - for (i = 0; i < nlocal; i++) { - proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][1]; j++) { - proc = hashlittle(&onethree[i][j],sizeof(tagint),0) % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = onethree[i][j]; - inbuf[m].partnerID = onetwo[i][k]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onefour lists - - nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[2] and onefour for all owned atoms based on output info - // output datums = pairs of atoms that are 1-4 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onefour,nlocal,maxall,"special:onefour"); - - for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; - } - - memory->destroy(outbuf); - - // compute and print max # of 1-4 neighbors + // print max # of 1-4 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-4 neighbors\n",maxall); @@ -357,9 +153,380 @@ void Special::build() if (force->special_dihedral) dihedral_trim(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); + timer_output(time1); } +/* ---------------------------------------------------------------------- + setup atomIDs and procowner +------------------------------------------------------------------------- */ + +void Special::atom_owners() +{ + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + int *proclist; + memory->create(proclist,nlocal,"special:proclist"); + IDRvous *idbuf = (IDRvous *) + memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on + + for (int i = 0; i < nlocal; i++) { + //proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[i] = tag[i] % nprocs; + idbuf[i].me = me; + idbuf[i].atomID = tag[i]; + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists + + char *buf; + comm->rendezvous(nlocal,proclist, + (char *) idbuf,sizeof(PairRvous), + rendezvous_ids,buf,sizeof(PairRvous), + (void *) this); + + memory->destroy(proclist); + memory->sfree(idbuf); +} + +/* ---------------------------------------------------------------------- + onetwo build +------------------------------------------------------------------------- */ + +void Special::onetwo_build_newton() +{ + int i,j,m; + + tagint *tag = atom->tag; + int *num_bond = atom->num_bond; + tagint **bond_atom = atom->bond_atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m < 0 || m >= nlocal) ncount++; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) continue; + proclist[ncount] = bond_atom[i][j] % nprocs; + inbuf[ncount].atomID = bond_atom[i][j]; + inbuf[ncount].partnerID = tag[i]; + ncount++; + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[0] and onetwo for all owned atoms based on output info + // output datums = pairs of atoms that are 1-2 neighbors + + for (i = 0; i < nlocal; i++) { + nspecial[i][0] = num_bond[i]; + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][0]++; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][0]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][0]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + onetwo[i][nspecial[i][0]++] = bond_atom[i][j]; + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) onetwo[m][nspecial[m][0]++] = tag[i]; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + onetwo build with newton_bond flag off + no need for rendezvous comm +------------------------------------------------------------------------- */ + +void Special::onetwo_build_newton_off() +{ +} + +/* ---------------------------------------------------------------------- + onetwo build with newton_bond flag off + no need for rendezvous comm +------------------------------------------------------------------------- */ + +void Special::onethree_build() +{ + int i,j,k,m,proc; + + tagint *tag = atom->tag; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m < 0 || m >= nlocal) ncount += nspecial[i][0]-1; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onetwo pair: datum = atomID1, atomID2 + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m >= 0 && m < nlocal) continue; + proc = onetwo[i][j] % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + proclist[ncount] = proc; + inbuf[ncount].atomID = onetwo[i][j]; + inbuf[ncount].partnerID = onetwo[i][k]; + ncount++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onethree lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[1] and onethree for all owned atoms based on output info + // output datums = pairs of atoms that are 1-3 neighbors + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][1] += nspecial[i][0]-1; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][1]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][1]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onethree,nlocal,maxall,"special:onethree"); + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m < 0 || m >= nlocal) continue; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + onethree[m][nspecial[m][1]++] = onetwo[i][k]; + } + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + remove duplicates within each of onetwo, onethree, onefour individually +------------------------------------------------------------------------- */ + +void Special::onefour_build() +{ + int i,j,k,m,proc; + + tagint *tag = atom->tag; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m < 0 || m >= nlocal) ncount += nspecial[i][0]; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m >= 0 && m < nlocal) continue; + proc = onethree[i][j] % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + proclist[ncount] = proc; + inbuf[ncount].atomID = onethree[i][j]; + inbuf[ncount].partnerID = onetwo[i][k]; + ncount++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onefour lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[2] and onefour for all owned atoms based on output info + // output datums = pairs of atoms that are 1-4 neighbors + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][2] += nspecial[i][0]; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][2]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][2]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onefour,nlocal,maxall,"special:onefour"); + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m < 0 || m >= nlocal) continue; + for (k = 0; k < nspecial[i][0]; k++) { + onefour[m][nspecial[m][2]++] = onetwo[i][k]; + } + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + /* ---------------------------------------------------------------------- remove duplicates within each of onetwo, onethree, onefour individually ------------------------------------------------------------------------- */ @@ -662,8 +829,8 @@ void Special::angle_trim() int *proclist; memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // one datum for each owned atom: datum = proc, atomID @@ -675,16 +842,9 @@ void Special::angle_trim() m = 0; for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - for (j = 0; j < nspecial[i][1]; j++) { proclist[m] = proc; - inbuf[m].me = -1; + //inbuf[m].me = -1; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = onethree[i][j]; m++; @@ -695,13 +855,13 @@ void Special::angle_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = angle_atom1[i][j]; inbuf[m].partnerID = angle_atom3[i][j]; m++; proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = angle_atom3[i][j]; inbuf[m].partnerID = angle_atom1[i][j]; m++; @@ -712,25 +872,25 @@ void Special::angle_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom1[i][j]; inbuf[m].partnerID = dihedral_atom3[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom2[i][j]; inbuf[m].partnerID = dihedral_atom4[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom3[i][j]; inbuf[m].partnerID = dihedral_atom1[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom4[i][j]; inbuf[m].partnerID = dihedral_atom2[i][j]; m++; @@ -743,10 +903,11 @@ void Special::angle_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_trim, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_trim,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); @@ -836,8 +997,8 @@ void Special::dihedral_trim() int *proclist; memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // one datum for each owned atom: datum = proc, atomID @@ -851,14 +1012,14 @@ void Special::dihedral_trim() for (i = 0; i < nlocal; i++) { proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; proclist[m] = proc; - inbuf[m].me = me; + //inbuf[m].me = me; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = 0; m++; for (j = 0; j < nspecial[i][2]; j++) { proclist[m] = proc; - inbuf[m].me = -1; + //inbuf[m].me = -1; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = onefour[i][j]; m++; @@ -869,13 +1030,13 @@ void Special::dihedral_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom1[i][j]; inbuf[m].partnerID = dihedral_atom4[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom4[i][j]; inbuf[m].partnerID = dihedral_atom1[i][j]; m++; @@ -888,10 +1049,11 @@ void Special::dihedral_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_trim, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_trim,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); @@ -931,16 +1093,55 @@ void Special::dihedral_trim() /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N InRvous datums - create outbuf = list of Nout OutRvous datums + inbuf = list of N PairRvous datums + outbuf = empty +------------------------------------------------------------------------- */ + +int Special::rendezvous_ids(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + Special *sptr = (Special *) ptr; + Memory *memory = sptr->memory; + + int *procowner; + tagint *atomIDs; + + memory->create(procowner,n,"special:procowner"); + memory->create(atomIDs,n,"special:atomIDs"); + // NOTE: when to free these vectors + + IDRvous *in = (IDRvous *) inbuf; + + for (int i = 0; i < n; i++) { + procowner[i] = in[i].me; + atomIDs[i] = in[i].atomID; + } + + // store rendezvous data in Special class + + sptr->ncount = n; + sptr->procowner = procowner; + sptr->atomIDs = atomIDs; + + proclist = NULL; + outbuf = NULL; + + flag = 0; + return 0; +} + + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ int Special::rendezvous_1234(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &flag, int *&proclist, char *&outbuf, void *ptr) { - int i,j,m; - Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; Memory *memory = sptr->memory; @@ -950,105 +1151,52 @@ int Special::rendezvous_1234(int n, char *inbuf, atom->map_clear(); - // initialize hash - // ncount = number of atoms assigned to me - // key = atom ID - // value = index into Ncount-length data structure - - InRvous *in = (InRvous *) inbuf; - //std::map hash; - tagint id; + // hash atom IDs stored in rendezvous decomposition - int ncount = 0; - for (i = 0; i < n; i++) - if (in[i].me >= 0) - //hash[in[i].atomID] = ncount++; - atom->map_one(in[i].atomID,ncount++); + int ncount = sptr->ncount; + tagint *atomIDs = sptr->atomIDs; - // procowner = caller proc that owns each atom - // atomID = ID of each rendezvous atom I own + for (int i = 0; i < ncount; i++) + atom->map_one(atomIDs[i],i); - int *procowner,*npartner; - tagint *atomID; - memory->create(procowner,ncount,"special:procowner"); - memory->create(atomID,ncount,"special:atomID"); - memory->create(npartner,ncount,"special:npartner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; + // proclist = owner of atomID in caller decomposition + + PairRvous *in = (PairRvous *) inbuf; + int *procowner = sptr->procowner; + memory->create(proclist,n,"special:proclist"); - for (i = 0; i < n; i++) { - //m = hash.find(in[i].atomID)->second; + int m; + for (int i = 0; i < n; i++) { m = atom->map(in[i].atomID); - if (in[i].me >= 0) { - procowner[m] = in[i].me; - atomID[m] = in[i].atomID; - } else npartner[m]++; + proclist[i] = procowner[m]; } - int max = 0; - for (m = 0; m < ncount; m++) - max = MAX(max,npartner[m]); - sptr->max_rvous = max; - - int **partner; - memory->create(partner,ncount,max,"special:partner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - if (in[i].me >= 0) continue; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - partner[m][npartner[m]++] = in[i].partnerID; - } - - // pass list of OutRvous datums back to comm->rendezvous - - int nout = 0; - for (m = 0; m < ncount; m++) nout += npartner[m]; - - memory->create(proclist,nout,"special:proclist"); - OutRvous *out = (OutRvous *) - memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); - - nout = 0; - for (m = 0; m < ncount; m++) - for (j = 0; j < npartner[m]; j++) { - proclist[nout] = procowner[m]; - out[nout].atomID = atomID[m]; - out[nout].partnerID = partner[m][j]; - nout++; - } - - outbuf = (char *) out; - - // clean up - // Comm::rendezvous will delete proclist and out (outbuf) - - memory->destroy(procowner); - memory->destroy(atomID); - memory->destroy(npartner); - memory->destroy(partner); - + outbuf = inbuf; + // NOTE: set out = in flag + // re-create atom map atom->map_init(0); atom->nghost = 0; atom->map_set(); - return nout; + flag = 1; + return n; } /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N InRvous datums - create outbuf = list of Nout OutRvous datums + inbuf = list of N PairRvous datums + create outbuf = list of Nout PairRvous datums ------------------------------------------------------------------------- */ int Special::rendezvous_trim(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &flag, int *&proclist, char *&outbuf, void *ptr) { int i,j,m; + /* Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; Memory *memory = sptr->memory; @@ -1063,7 +1211,7 @@ int Special::rendezvous_trim(int n, char *inbuf, // key = atom ID // value = index into Ncount-length data structure - InRvous *in = (InRvous *) inbuf; + PairRvous *in = (PairRvous *) inbuf; //std::map hash; tagint id; @@ -1131,14 +1279,14 @@ int Special::rendezvous_trim(int n, char *inbuf, } } - // pass list of OutRvous datums back to comm->rendezvous + // pass list of PairRvous datums back to comm->rendezvous int nout = 0; for (m = 0; m < ncount; m++) nout += npartner[m]; memory->create(proclist,nout,"special:proclist"); - OutRvous *out = (OutRvous *) - memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); + PairRvous *out = (PairRvous *) + memory->smalloc((bigint) nout*sizeof(PairRvous),"special:out"); nout = 0; for (m = 0; m < ncount; m++) @@ -1167,7 +1315,11 @@ int Special::rendezvous_trim(int n, char *inbuf, atom->nghost = 0; atom->map_set(); - return nout; + */ + + //return nout; + flag = 2; + return 0; } /* ---------------------------------------------------------------------- diff --git a/src/special.h b/src/special.h index f7892075ac..772ba613ac 100644 --- a/src/special.h +++ b/src/special.h @@ -26,20 +26,29 @@ class Special : protected Pointers { private: int me,nprocs; + int maxall; tagint **onetwo,**onethree,**onefour; // data used by rendezvous callback methods - int max_rvous; + int ncount; + tagint *atomIDs; + int *procowner; - struct InRvous { + struct IDRvous { int me; + tagint atomID; + }; + + struct PairRvous { tagint atomID,partnerID; }; - struct OutRvous { - tagint atomID,partnerID; - }; + void atom_owners(); + void onetwo_build_newton(); + void onetwo_build_newton_off(); + void onethree_build(); + void onefour_build(); void dedup(); void angle_trim(); @@ -48,10 +57,11 @@ class Special : protected Pointers { void fix_alteration(); void timer_output(double); - // callback function for rendezvous communication + // callback functions for rendezvous communication - static int rendezvous_1234(int, char *, int *&, char *&, void *); - static int rendezvous_trim(int, char *, int *&, char *&, void *); + static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); + static int rendezvous_1234(int, char *, int &, int *&, char *&, void *); + static int rendezvous_trim(int, char *, int &, int *&, char *&, void *); }; } From 7c3d6dc051976664acf315a321e2846c93d407e2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Dec 2018 16:43:01 -0700 Subject: [PATCH 008/243] propagate rendezvous changes to fix rigid/small --- src/RIGID/fix_rigid_small.cpp | 3 ++- src/RIGID/fix_rigid_small.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index fc51e0aa4f..3da516894c 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1611,7 +1611,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) ------------------------------------------------------------------------- */ int FixRigidSmall::rendezvous_body(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &rflag, int *&proclist, char *&outbuf, void *ptr) { int i,j,m; @@ -1749,6 +1749,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, memory->destroy(iclose); memory->destroy(rsqclose); + rflag = 2; return nout; } diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index a820efcdea..f6ad1b7206 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -209,7 +209,7 @@ class FixRigidSmall : public Fix { // callback function for rendezvous communication - static int rendezvous_body(int, char *, int *&, char *&, void *); + static int rendezvous_body(int, char *, int &, int *&, char *&, void *); // debug From e538fd5c6d9594edc15554f8bded8cd9baa32704 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 12 Dec 2018 17:14:56 -0700 Subject: [PATCH 009/243] added rendezvous alg to fix shake --- src/RIGID/fix_rigid_small.cpp | 6 +- src/RIGID/fix_shake.cpp | 795 +++++++++++++++++++++++----------- src/RIGID/fix_shake.h | 43 +- src/special.cpp | 633 +++++++++++++-------------- src/special.h | 7 +- 5 files changed, 899 insertions(+), 585 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 3da516894c..e20c64487b 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -414,9 +414,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (comm->me == 0) { if (screen) - fprintf(screen," create_bodies CPU = %g secs\n",time2-time1); + fprintf(screen," create bodies CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," create_bodies CPU = %g secs\n",time2-time1); + fprintf(logfile," create bodies CPU = %g secs\n",time2-time1); } // set nlocal_body and allocate bodies I own @@ -1749,6 +1749,8 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, memory->destroy(iclose); memory->destroy(rsqclose); + // flag = 2: new outbuf + rflag = 2; return nout; } diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index e0d1bf132b..66c92d42c5 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -219,8 +219,19 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : // identify all SHAKE clusters + double time1 = MPI_Wtime(); + find_clusters(); + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) + fprintf(screen," find clusters CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," find clusters CPU = %g secs\n",time2-time1); + } + // initialize list of SHAKE clusters to constrain maxlist = 0; @@ -707,13 +718,6 @@ void FixShake::find_clusters() int nlocal = atom->nlocal; int angles_allow = atom->avec->angles_allow; - // setup ring of procs - - int next = me + 1; - int prev = me -1; - if (next == nprocs) next = 0; - if (prev < 0) prev = nprocs - 1; - // ----------------------------------------------------- // allocate arrays for self (1d) and bond partners (2d) // max = max # of bond partners for owned atoms = 2nd dim of partner arrays @@ -755,6 +759,10 @@ void FixShake::find_clusters() memory->create(partner_shake,nlocal,max,"shake:partner_shake"); memory->create(partner_nshake,nlocal,max,"shake:partner_nshake"); + // setup atomIDs and procowner vectors in rendezvous decomposition + + atom_owners(); + // ----------------------------------------------------- // set npartner and partner_tag from special arrays // ----------------------------------------------------- @@ -778,86 +786,13 @@ void FixShake::find_clusters() } // ----------------------------------------------------- - // set partner_mask, partner_type, partner_massflag, partner_bondtype - // for bonded partners - // requires communication for off-proc partners + // set partner_mask, partner_type, partner_massflag, + // partner_bondtype for all my bonded partners + // requires rendezvous communication for off-proc partners // ----------------------------------------------------- - // fill in mask, type, massflag, bondtype if own bond partner - // info to store in buf for each off-proc bond = nper = 6 - // 2 atoms IDs in bond, space for mask, type, massflag, bondtype - // nbufmax = largest buffer needed to hold info from any proc - - int nper = 6; - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - partner_mask[i][j] = 0; - partner_type[i][j] = 0; - partner_massflag[i][j] = 0; - partner_bondtype[i][j] = 0; - - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) { - partner_mask[i][j] = mask[m]; - partner_type[i][j] = type[m]; - if (nmass) { - if (rmass) massone = rmass[m]; - else massone = mass[type[m]]; - partner_massflag[i][j] = masscheck(massone); - } - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - else { - n = bondtype_findset(m,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - } - } else nbuf += nper; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = tag[i]; - buf[size+1] = partner_tag[i][j]; - buf[size+2] = 0; - buf[size+3] = 0; - buf[size+4] = 0; - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) buf[size+5] = n; - else buf[size+5] = 0; - size += nper; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,1,ring_bonds,buf,(void *)this); - - // store partner info returned to me - - m = 0; - while (m < size) { - i = atom->map(buf[m]); - for (j = 0; j < npartner[i]; j++) - if (buf[m+1] == partner_tag[i][j]) break; - partner_mask[i][j] = buf[m+2]; - partner_type[i][j] = buf[m+3]; - partner_massflag[i][j] = buf[m+4]; - partner_bondtype[i][j] = buf[m+5]; - m += nper; - } - - memory->destroy(buf); + partner_info(npartner,partner_tag,partner_mask,partner_type, + partner_massflag,partner_bondtype); // error check for unfilled partner info // if partner_type not set, is an error @@ -868,17 +803,18 @@ void FixShake::find_clusters() // else it's an error flag = 0; + int flag2 = 0; for (i = 0; i < nlocal; i++) for (j = 0; j < npartner[i]; j++) { - if (partner_type[i][j] == 0) flag = 1; + if (partner_type[i][j] == 0) flag++; if (!(mask[i] & groupbit)) continue; if (!(partner_mask[i][j] & groupbit)) continue; - if (partner_bondtype[i][j] == 0) flag = 1; + if (partner_bondtype[i][j] == 0) flag2++; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Did not find fix shake partner info"); - + // ----------------------------------------------------- // identify SHAKEable bonds // set nshake[i] = # of SHAKE bonds attached to atom i @@ -931,56 +867,11 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set partner_nshake for bonded partners - // requires communication for off-proc partners + // requires rendezvous communication for off-proc partners // ----------------------------------------------------- - // fill in partner_nshake if own bond partner - // info to store in buf for each off-proc bond = - // 2 atoms IDs in bond, space for nshake value - // nbufmax = largest buffer needed to hold info from any proc - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) partner_nshake[i][j] = nshake[m]; - else nbuf += 3; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = tag[i]; - buf[size+1] = partner_tag[i][j]; - size += 3; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,2,ring_nshake,buf,(void *)this); - - // store partner info returned to me - - m = 0; - while (m < size) { - i = atom->map(buf[m]); - for (j = 0; j < npartner[i]; j++) - if (buf[m+1] == partner_tag[i][j]) break; - partner_nshake[i][j] = buf[m+2]; - m += 3; - } - - memory->destroy(buf); - + nshake_info(npartner,partner_tag,partner_nshake); + // ----------------------------------------------------- // error checks // no atom with nshake > 3 @@ -988,7 +879,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- flag = 0; - for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag = 1; + for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag++; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake cluster of more than 4 atoms"); @@ -996,7 +887,7 @@ void FixShake::find_clusters() for (i = 0; i < nlocal; i++) { if (nshake[i] <= 1) continue; for (j = 0; j < npartner[i]; j++) - if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag = 1; + if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag++; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake clusters are connected"); @@ -1067,60 +958,7 @@ void FixShake::find_clusters() // requires communication for off-proc atoms // ----------------------------------------------------- - // fill in shake arrays for each bond partner I own - // info to store in buf for each off-proc bond = - // all values from shake_flag, shake_atom, shake_type - // nbufmax = largest buffer needed to hold info from any proc - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - if (shake_flag[i] == 0) continue; - for (j = 0; j < npartner[i]; j++) { - if (partner_shake[i][j] == 0) continue; - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) { - shake_flag[m] = shake_flag[i]; - shake_atom[m][0] = shake_atom[i][0]; - shake_atom[m][1] = shake_atom[i][1]; - shake_atom[m][2] = shake_atom[i][2]; - shake_atom[m][3] = shake_atom[i][3]; - shake_type[m][0] = shake_type[i][0]; - shake_type[m][1] = shake_type[i][1]; - shake_type[m][2] = shake_type[i][2]; - } else nbuf += 9; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - if (shake_flag[i] == 0) continue; - for (j = 0; j < npartner[i]; j++) { - if (partner_shake[i][j] == 0) continue; - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = partner_tag[i][j]; - buf[size+1] = shake_flag[i]; - buf[size+2] = shake_atom[i][0]; - buf[size+3] = shake_atom[i][1]; - buf[size+4] = shake_atom[i][2]; - buf[size+5] = shake_atom[i][3]; - buf[size+6] = shake_type[i][0]; - buf[size+7] = shake_type[i][1]; - buf[size+8] = shake_type[i][2]; - size += 9; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,3,ring_shake,NULL,(void *)this); - - memory->destroy(buf); + shake_info(npartner,partner_tag,partner_shake); // ----------------------------------------------------- // free local memory @@ -1199,98 +1037,549 @@ void FixShake::find_clusters() } /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner: - fill in mask and type and massflag - search for bond with 1st atom and fill in bondtype + setup atomIDs and procowner ------------------------------------------------------------------------- */ -void FixShake::ring_bonds(int ndatum, char *cbuf, void *ptr) +void FixShake::atom_owners() { - FixShake *fsptr = (FixShake *)ptr; - Atom *atom = fsptr->atom; + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + int *proclist; + memory->create(proclist,nlocal,"shake:proclist"); + IDRvous *idbuf = (IDRvous *) + memory->smalloc((bigint) nlocal*sizeof(IDRvous),"shake:idbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + + for (int i = 0; i < nlocal; i++) { + proclist[i] = tag[i] % nprocs; + idbuf[i].me = me; + idbuf[i].atomID = tag[i]; + } + + // perform rendezvous operation + // each proc assigned every 1/Pth atom + + char *buf; + comm->rendezvous(nlocal,proclist, + (char *) idbuf,sizeof(IDRvous), + rendezvous_ids,buf,0,(void *) this); + + memory->destroy(proclist); + memory->sfree(idbuf); +} + +/* ---------------------------------------------------------------------- + setup partner_mask, partner_type, partner_massflag, partner_bondtype +------------------------------------------------------------------------- */ + +void FixShake::partner_info(int *npartner, tagint **partner_tag, + int **partner_mask, int **partner_type, + int **partner_massflag, int **partner_bondtype) +{ + int i,j,m,n; + int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + PartnerInfo *inbuf = (PartnerInfo *) + memory->smalloc((bigint) nsend*sizeof(PartnerInfo),"special:inbuf"); + + // set values in 4 partner arrays for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = pair of bonded atoms where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) + // 4 values for my owned atom + double *rmass = atom->rmass; double *mass = atom->mass; - int *mask = atom->mask; int *type = atom->type; + int *mask = atom->mask; + tagint *tag = atom->tag; + + double massone; + + nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + partner_mask[i][j] = 0; + partner_type[i][j] = 0; + partner_massflag[i][j] = 0; + partner_bondtype[i][j] = 0; + + m = atom->map(partner_tag[i][j]); + + if (m >= 0 && m < nlocal) { + partner_mask[i][j] = mask[m]; + partner_type[i][j] = type[m]; + if (nmass) { + if (rmass) massone = rmass[m]; + else massone = mass[type[m]]; + partner_massflag[i][j] = masscheck(massone); + } + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + else { + n = bondtype_findset(m,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + } + + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].mask = mask[i]; + inbuf[nsend].type = type[i]; + if (nmass) { + if (rmass) massone = rmass[i]; + else massone = mass[type[i]]; + inbuf[nsend].massflag = masscheck(massone); + } else inbuf[nsend].massflag = 0; + + // my atom may own bond, in which case set partner_bondtype + // else receiver of this datum will own the bond and return the value + + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) { + partner_bondtype[i][j] = n; + inbuf[nsend].bondtype = n; + } else inbuf[nsend].bondtype = 0; + + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned partner 4 values + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(PartnerInfo), + rendezvous_partners_info,buf,sizeof(PartnerInfo), + (void *) this); + PartnerInfo *outbuf = (PartnerInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set partner 4 values for un-onwed partners based on output info + // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + for (j = 0; j < npartner[i]; j++) + if (partner_tag[i][j] == outbuf[m].partnerID) break; + partner_mask[i][j] = outbuf[m].mask; + partner_type[i][j] = outbuf[m].type; + partner_massflag[i][j] = outbuf[m].massflag; + + // only set partner_bondtype if my atom did not set it when setting up rendezvous + // if this proc set it, then sender of this datum set outbuf.bondtype = 0 + + if (partner_bondtype[i][j] == 0) + partner_bondtype[i][j] = outbuf[m].bondtype; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + setup partner_nshake +------------------------------------------------------------------------- */ + +void FixShake::nshake_info(int *npartner, tagint **partner_tag, + int **partner_nshake) +{ + int i,j,m,n; int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + NShakeInfo *inbuf = (NShakeInfo *) + memory->smalloc((bigint) nsend*sizeof(NShakeInfo),"special:inbuf"); + + // set partner_nshake for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = pair of bonded atoms where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) + // nshake value for my owned atom + + tagint *tag = atom->tag; + + nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + partner_nshake[i][j] = 0; + m = atom->map(partner_tag[i][j]); + if (m >= 0 && m < nlocal) { + partner_nshake[i][j] = nshake[m]; + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].nshake = nshake[i]; + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned partner nshake + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(NShakeInfo), + rendezvous_nshake,buf,sizeof(NShakeInfo), + (void *) this); + NShakeInfo *outbuf = (NShakeInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set partner nshake for un-onwed partners based on output info + // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + for (j = 0; j < npartner[i]; j++) + if (partner_tag[i][j] == outbuf[m].partnerID) break; + partner_nshake[i][j] = outbuf[m].nshake; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + setup shake_flag, shake_atom, shake_type +------------------------------------------------------------------------- */ + +void FixShake::shake_info(int *npartner, tagint **partner_tag, + int **partner_shake) +{ + int i,j,m,n; + int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + ShakeInfo *inbuf = (ShakeInfo *) + memory->smalloc((bigint) nsend*sizeof(ShakeInfo),"special:inbuf"); + + // set 3 shake arrays for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = partner atom where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc) + // values in 3 shake arrays + + nsend = 0; + for (i = 0; i < nlocal; i++) { + if (shake_flag[i] == 0) continue; + for (j = 0; j < npartner[i]; j++) { + if (partner_shake[i][j] == 0) continue; + m = atom->map(partner_tag[i][j]); + + if (m >= 0 && m < nlocal) { + shake_flag[m] = shake_flag[i]; + shake_atom[m][0] = shake_atom[i][0]; + shake_atom[m][1] = shake_atom[i][1]; + shake_atom[m][2] = shake_atom[i][2]; + shake_atom[m][3] = shake_atom[i][3]; + shake_type[m][0] = shake_type[i][0]; + shake_type[m][1] = shake_type[i][1]; + shake_type[m][2] = shake_type[i][2]; + + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].shake_flag = shake_flag[i]; + inbuf[nsend].shake_atom[0] = shake_atom[i][0]; + inbuf[nsend].shake_atom[1] = shake_atom[i][1]; + inbuf[nsend].shake_atom[2] = shake_atom[i][2]; + inbuf[nsend].shake_atom[3] = shake_atom[i][3]; + inbuf[nsend].shake_type[0] = shake_type[i][0]; + inbuf[nsend].shake_type[1] = shake_type[i][1]; + inbuf[nsend].shake_type[2] = shake_type[i][2]; + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned shake info + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(ShakeInfo), + rendezvous_shake,buf,sizeof(ShakeInfo), + (void *) this); + ShakeInfo *outbuf = (ShakeInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set shake info for un-onwed partners based on output info + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + shake_flag[i] = outbuf[m].shake_flag; + shake_atom[i][0] = outbuf[m].shake_atom[0]; + shake_atom[i][1] = outbuf[m].shake_atom[1]; + shake_atom[i][2] = outbuf[m].shake_atom[2]; + shake_atom[i][3] = outbuf[m].shake_atom[3]; + shake_type[i][0] = outbuf[m].shake_type[0]; + shake_type[i][1] = outbuf[m].shake_type[1]; + shake_type[i][2] = outbuf[m].shake_type[2]; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N IDRvous datums + no outbuf +------------------------------------------------------------------------- */ + +int FixShake::rendezvous_ids(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + FixShake *fsptr = (FixShake *) ptr; + Memory *memory = fsptr->memory; + + int *procowner; + tagint *atomIDs; + + memory->create(procowner,n,"special:procowner"); + memory->create(atomIDs,n,"special:atomIDs"); + + IDRvous *in = (IDRvous *) inbuf; + + for (int i = 0; i < n; i++) { + procowner[i] = in[i].me; + atomIDs[i] = in[i].atomID; + } + + // store rendezvous data in FixShake class + + fsptr->nrvous = n; + fsptr->procowner = procowner; + fsptr->atomIDs = atomIDs; + + // flag = 0: no 2nd irregular comm needed in comm->rendezvous + + flag = 0; + return 0; +} + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs +------------------------------------------------------------------------- */ + +int FixShake::rendezvous_partners_info(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + int i,m; + + FixShake *fsptr = (FixShake *) ptr; + Atom *atom = fsptr->atom; + Memory *memory = fsptr->memory; + + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID = 4 values + + PartnerInfo *in = (PartnerInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + double massone; int nmass = fsptr->nmass; - tagint *buf = (tagint *) cbuf; - int m,n; - double massone; - - for (int i = 0; i < ndatum; i += 6) { - m = atom->map(buf[i+1]); - if (m >= 0 && m < nlocal) { - buf[i+2] = mask[m]; - buf[i+3] = type[m]; - if (nmass) { - if (rmass) massone = rmass[m]; - else massone = mass[type[m]]; - buf[i+4] = fsptr->masscheck(massone); - } - if (buf[i+5] == 0) { - n = fsptr->bondtype_findset(m,buf[i],buf[i+1],0); - if (n) buf[i+5] = n; - } - } + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf + + flag = 1; + return n; } /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner, fill in nshake value + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N NShakeInfo datums + outbuf = same list of N NShakeInfo datums, routed to different procs ------------------------------------------------------------------------- */ -void FixShake::ring_nshake(int ndatum, char *cbuf, void *ptr) +int FixShake::rendezvous_nshake(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) { - FixShake *fsptr = (FixShake *)ptr; + int i,j,m; + + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; - int nlocal = atom->nlocal; + Memory *memory = fsptr->memory; - int *nshake = fsptr->nshake; + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts - tagint *buf = (tagint *) cbuf; - int m; + atom->map_clear(); - for (int i = 0; i < ndatum; i += 3) { - m = atom->map(buf[i+1]); - if (m >= 0 && m < nlocal) buf[i+2] = nshake[m]; + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID + + NShakeInfo *in = (NShakeInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf + + flag = 1; + return n; } - /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner, fill in nshake value + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ -void FixShake::ring_shake(int ndatum, char *cbuf, void *ptr) +int FixShake::rendezvous_shake(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) { - FixShake *fsptr = (FixShake *)ptr; + int i,j,m; + + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; - int nlocal = atom->nlocal; + Memory *memory = fsptr->memory; - int *shake_flag = fsptr->shake_flag; - tagint **shake_atom = fsptr->shake_atom; - int **shake_type = fsptr->shake_type; + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts - tagint *buf = (tagint *) cbuf; - int m; + atom->map_clear(); - for (int i = 0; i < ndatum; i += 9) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) { - shake_flag[m] = buf[i+1]; - shake_atom[m][0] = buf[i+2]; - shake_atom[m][1] = buf[i+3]; - shake_atom[m][2] = buf[i+4]; - shake_atom[m][3] = buf[i+5]; - shake_type[m][0] = buf[i+6]; - shake_type[m][1] = buf[i+7]; - shake_type[m][2] = buf[i+8]; - } + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID + + ShakeInfo *in = (ShakeInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf; + + flag = 1; + return n; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index d4e7b85ec4..2baea90a4a 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -120,6 +120,11 @@ class FixShake : public Fix { int nmol; void find_clusters(); + void atom_owners(); + void partner_info(int *, tagint **, int **, int **, int **, int **); + void nshake_info(int *, tagint **, int **); + void shake_info(int *, tagint **, int **); + int masscheck(double); void unconstrained_update(); void unconstrained_update_respa(int); @@ -131,12 +136,40 @@ class FixShake : public Fix { int bondtype_findset(int, tagint, tagint, int); int angletype_findset(int, tagint, tagint, int); - // static variable for ring communication callback to access class data - // callback functions for ring communication + // data used by rendezvous callback methods - static void ring_bonds(int, char *, void *); - static void ring_nshake(int, char *, void *); - static void ring_shake(int, char *, void *); + int nrvous; + tagint *atomIDs; + int *procowner; + + struct IDRvous { + int me; + tagint atomID; + }; + + struct PartnerInfo { + tagint atomID,partnerID; + int mask,type,massflag,bondtype; + }; + + struct NShakeInfo { + tagint atomID,partnerID; + int nshake; + }; + + struct ShakeInfo { + tagint atomID; + int shake_flag; + int shake_atom[4]; + int shake_type[3]; + }; + + // callback functions for rendezvous communication + + static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); + static int rendezvous_partners_info(int, char *, int &, int *&, char *&, void *); + static int rendezvous_nshake(int, char *, int &, int *&, char *&, void *); + static int rendezvous_shake(int, char *, int &, int *&, char *&, void *); }; } diff --git a/src/special.cpp b/src/special.cpp index 79d2f77e46..b0d5bc7dca 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -21,7 +21,6 @@ #include "modify.h" #include "fix.h" #include "accelerator_kokkos.h" -#include "hashlittle.h" #include "atom_masks.h" #include "memory.h" #include "error.h" @@ -177,25 +176,20 @@ void Special::atom_owners() // input datums = pairs of bonded atoms // owning proc for each datum = random hash of atomID // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on for (int i = 0; i < nlocal; i++) { - //proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; proclist[i] = tag[i] % nprocs; idbuf[i].me = me; idbuf[i].atomID = tag[i]; } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists + // each proc assigned every 1/Pth atom char *buf; comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(PairRvous), - rendezvous_ids,buf,sizeof(PairRvous), - (void *) this); + (char *) idbuf,sizeof(IDRvous), + rendezvous_ids,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -215,49 +209,45 @@ void Special::onetwo_build_newton() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + // nsend = # of my datums to send - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_bond[i]; j++) { m = atom->map(bond_atom[i][j]); - if (m < 0 || m >= nlocal) ncount++; + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on + // owning proc for each datum = atomID % nprocs + // one datum for each bond partner: bond partner ID, atomID - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_bond[i]; j++) { m = atom->map(bond_atom[i][j]); if (m >= 0 && m < nlocal) continue; - proclist[ncount] = bond_atom[i][j] % nprocs; - inbuf[ncount].atomID = bond_atom[i][j]; - inbuf[ncount].partnerID = tag[i]; - ncount++; + proclist[nsend] = bond_atom[i][j] % nprocs; + inbuf[nsend].atomID = bond_atom[i][j]; + inbuf[nsend].partnerID = tag[i]; + nsend++; } } // perform rendezvous operation // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -312,6 +302,28 @@ void Special::onetwo_build_newton() void Special::onetwo_build_newton_off() { + int i,j; + + int *num_bond = atom->num_bond; + tagint **bond_atom = atom->bond_atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,num_bond[i]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + // nsend = # of my datums to send + // include nlocal datums with owner of each atom + + for (i = 0; i < nlocal; i++) { + nspecial[i][0] = num_bond[i]; + for (j = 0; j < num_bond[i]; j++) + onetwo[i][j] = bond_atom[i][j]; + } } /* ---------------------------------------------------------------------- @@ -327,21 +339,20 @@ void Special::onethree_build() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + // nsend = # of my datums to send - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][0]; j++) { m = atom->map(onetwo[i][j]); - if (m < 0 || m >= nlocal) ncount += nspecial[i][0]-1; + if (m < 0 || m >= nlocal) nsend += nspecial[i][0]-1; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) @@ -349,7 +360,7 @@ void Special::onethree_build() // one datum for each owned atom: datum = owning proc, atomID // one datum for each onetwo pair: datum = atomID1, atomID2 - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][0]; j++) { m = atom->map(onetwo[i][j]); @@ -357,10 +368,10 @@ void Special::onethree_build() proc = onetwo[i][j] % nprocs; for (k = 0; k < nspecial[i][0]; k++) { if (j == k) continue; - proclist[ncount] = proc; - inbuf[ncount].atomID = onetwo[i][j]; - inbuf[ncount].partnerID = onetwo[i][k]; - ncount++; + proclist[nsend] = proc; + inbuf[nsend].atomID = onetwo[i][j]; + inbuf[nsend].partnerID = onetwo[i][k]; + nsend++; } } } @@ -370,9 +381,9 @@ void Special::onethree_build() // receives all info to form and return their onethree lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -434,21 +445,21 @@ void Special::onefour_build() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send + // nsend = # of my datums to send // include nlocal datums with owner of each atom - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][1]; j++) { m = atom->map(onethree[i][j]); - if (m < 0 || m >= nlocal) ncount += nspecial[i][0]; + if (m < 0 || m >= nlocal) nsend += nspecial[i][0]; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) @@ -456,17 +467,17 @@ void Special::onefour_build() // one datum for each owned atom: datum = owning proc, atomID // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][1]; j++) { m = atom->map(onethree[i][j]); if (m >= 0 && m < nlocal) continue; proc = onethree[i][j] % nprocs; for (k = 0; k < nspecial[i][0]; k++) { - proclist[ncount] = proc; - inbuf[ncount].atomID = onethree[i][j]; - inbuf[ncount].partnerID = onetwo[i][k]; - ncount++; + proclist[nsend] = proc; + inbuf[nsend].atomID = onethree[i][j]; + inbuf[nsend].partnerID = onetwo[i][k]; + nsend++; } } } @@ -476,9 +487,9 @@ void Special::onefour_build() // receives all info to form and return their onefour lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -773,7 +784,7 @@ void Special::combine() void Special::angle_trim() { - int i,j,m,n,proc,index; + int i,j,k,m;; int *num_angle = atom->num_angle; int *num_dihedral = atom->num_dihedral; @@ -804,96 +815,89 @@ void Special::angle_trim() " %g = # of 1-3 neighbors before angle trim\n",allcount); } - // if angles or dihedrals are defined, - // flag each 1-3 neigh if it appears in an angle or dihedral + // if angles or dihedrals are defined + // rendezvous angle 1-3 and dihedral 1-3,2-4 pairs if ((num_angle && atom->nangles) || (num_dihedral && atom->ndihedrals)) { - // ncount = # of my datums to send in 3 parts for each owned atom - // proc owner, onethree list, angle end points - // angle end points are from angle list and 1-3 and 2-4 pairs in dihedrals - // latter is only for angles or dihedrlas where I own atom2 + // nsend = # of my datums to send + // latter is only for angles or dihedrlas where I own atom2 (newton bond off) - int ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { - index = atom->map(angle_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 2; + if (tag[i] != angle_atom2[i][j]) continue; + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; } for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 4; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // sent to owner of atomID - // one datum for each 1-4 partner: datum = atomID, ID - // sent to owner of atomID - // two datums for each dihedral 1-4 endatoms : datum = atomID, ID - // sent to owner of atomID - m = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - proclist[m] = proc; - //inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = onethree[i][j]; - m++; - } - for (j = 0; j < num_angle[i]; j++) { - index = atom->map(angle_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != angle_atom2[i][j]) continue; - proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = angle_atom1[i][j]; - inbuf[m].partnerID = angle_atom3[i][j]; - m++; + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom1[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom1[i][j]; + inbuf[nsend].partnerID = angle_atom3[i][j]; + nsend++; + } - proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = angle_atom3[i][j]; - inbuf[m].partnerID = angle_atom1[i][j]; - m++; + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom3[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom3[i][j]; + inbuf[nsend].partnerID = angle_atom1[i][j]; + nsend++; + } } for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom1[i][j]; - inbuf[m].partnerID = dihedral_atom3[i][j]; - m++; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom3[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom2[i][j]; - inbuf[m].partnerID = dihedral_atom4[i][j]; - m++; + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom3[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom3[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom3[i][j]; - inbuf[m].partnerID = dihedral_atom1[i][j]; - m++; - - proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom4[i][j]; - inbuf[m].partnerID = dihedral_atom2[i][j]; - m++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom2[i][j]; + nsend++; + } } } @@ -903,26 +907,112 @@ void Special::angle_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_trim,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // reset nspecial[1] and onethree for all owned atoms based on output info + // flag all onethree atoms to keep - for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][1]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + + int **flag; + memory->create(flag,nlocal,maxall,"special:flag"); + + for (i = 0; i < nlocal; i++) + for (j = 0; j < nspecial[i][1]; j++) + flag[i][j] = 0; + + // reset nspecial[1] and onethree for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_angle[i]; j++) { + if (tag[i] != angle_atom2[i][j]) continue; + + m = atom->map(angle_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(angle_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + } + + for (j = 0; j < num_dihedral[i]; j++) { + if (tag[i] != dihedral_atom2[i][j]) continue; + + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom2[i][j]) { + flag[m][k] = 1; + break; + } + } + } + } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); - onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + for (k = 0; k < nspecial[i][1]; k++) + if (onethree[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } - + memory->destroy(outbuf); + // use flag values to compress onefour list for each atom + + for (i = 0; i < nlocal; i++) { + j = 0; + while (j < nspecial[i][1]) { + if (flag[i][j] == 0) { + onethree[i][j] = onethree[i][nspecial[i][1]-1]; + flag[i][j] = flag[i][nspecial[i][1]-1]; + nspecial[i][1]--; + } else j++; + } + } + + memory->destroy(flag); + // if no angles or dihedrals are defined, delete all 1-3 neighs } else { @@ -952,7 +1042,7 @@ void Special::angle_trim() void Special::dihedral_trim() { - int i,j,m,n,proc,index; + int i,j,k,m; int *num_dihedral = atom->num_dihedral; tagint **dihedral_atom1 = atom->dihedral_atom1; @@ -978,68 +1068,51 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, rendezvous onefour list with dihedral 1-4 pairs + // if dihedrals are defined, rendezvous dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { - // ncount = # of my datums to send in 3 parts for each owned atom - // onefour list, proc owner, dihedral end points - // latter is only for dihedrals where I own atom2 + // nsend = # of my datums to send + // latter is only for dihedrals where I own atom2 (newton bond off) - int ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][2]; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 2; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); - + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); + // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // sent to owner of atomID - // one datum for each 1-4 partner: datum = atomID, ID - // sent to owner of atomID - // two datums for each dihedral 1-4 endatoms : datum = atomID, ID - // sent to owner of atomID - m = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - //inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][2]; j++) { - proclist[m] = proc; - //inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = onefour[i][j]; - m++; - } - for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom1[i][j]; - inbuf[m].partnerID = dihedral_atom4[i][j]; - m++; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom4[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom4[i][j]; - inbuf[m].partnerID = dihedral_atom1[i][j]; - m++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } } } @@ -1049,26 +1122,81 @@ void Special::dihedral_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_trim,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); + // flag all onefour atoms to keep + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][2]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + + int **flag; + memory->create(flag,nlocal,maxall,"special:flag"); + + for (i = 0; i < nlocal; i++) + for (j = 0; j < nspecial[i][2]; j++) + flag[i][j] = 0; + // reset nspecial[2] and onefour for all owned atoms based on output info - for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_dihedral[i]; j++) { + if (tag[i] != dihedral_atom2[i][j]) continue; + + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom4[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + } + } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); - onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + for (k = 0; k < nspecial[i][2]; k++) + if (onefour[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } memory->destroy(outbuf); + // use flag values to compress onefour list for each atom + + for (i = 0; i < nlocal; i++) { + j = 0; + while (j < nspecial[i][2]) { + if (flag[i][j] == 0) { + onefour[i][j] = onefour[i][nspecial[i][2]-1]; + flag[i][j] = flag[i][nspecial[i][2]-1]; + nspecial[i][2]--; + } else j++; + } + } + + memory->destroy(flag); + // if no dihedrals are defined, delete all 1-4 neighs } else { @@ -1093,8 +1221,8 @@ void Special::dihedral_trim() /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - outbuf = empty + inbuf = list of N IDRvous datums + no outbuf ------------------------------------------------------------------------- */ int Special::rendezvous_ids(int n, char *inbuf, @@ -1109,7 +1237,6 @@ int Special::rendezvous_ids(int n, char *inbuf, memory->create(procowner,n,"special:procowner"); memory->create(atomIDs,n,"special:atomIDs"); - // NOTE: when to free these vectors IDRvous *in = (IDRvous *) inbuf; @@ -1120,13 +1247,12 @@ int Special::rendezvous_ids(int n, char *inbuf, // store rendezvous data in Special class - sptr->ncount = n; + sptr->nrvous = n; sptr->procowner = procowner; sptr->atomIDs = atomIDs; - proclist = NULL; - outbuf = NULL; - + // flag = 0: no 2nd irregular comm needed in comm->rendezvous + flag = 0; return 0; } @@ -1138,7 +1264,7 @@ int Special::rendezvous_ids(int n, char *inbuf, outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ -int Special::rendezvous_1234(int n, char *inbuf, +int Special::rendezvous_pairs(int n, char *inbuf, int &flag, int *&proclist, char *&outbuf, void *ptr) { @@ -1153,10 +1279,10 @@ int Special::rendezvous_1234(int n, char *inbuf, // hash atom IDs stored in rendezvous decomposition - int ncount = sptr->ncount; + int nrvous = sptr->nrvous; tagint *atomIDs = sptr->atomIDs; - for (int i = 0; i < ncount; i++) + for (int i = 0; i < nrvous; i++) atom->map_one(atomIDs[i],i); // proclist = owner of atomID in caller decomposition @@ -1172,7 +1298,6 @@ int Special::rendezvous_1234(int n, char *inbuf, } outbuf = inbuf; - // NOTE: set out = in flag // re-create atom map @@ -1180,148 +1305,12 @@ int Special::rendezvous_1234(int n, char *inbuf, atom->nghost = 0; atom->map_set(); + // flag = 1: outbuf = inbuf + flag = 1; return n; } -/* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - create outbuf = list of Nout PairRvous datums -------------------------------------------------------------------------- */ - -int Special::rendezvous_trim(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) -{ - int i,j,m; - - /* - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - Memory *memory = sptr->memory; - - // clear atom map so it can be here as a hash table - // faster than an STL map for large atom counts - - atom->map_clear(); - - // initialize hash - // ncount = number of atoms assigned to me - // key = atom ID - // value = index into Ncount-length data structure - - PairRvous *in = (PairRvous *) inbuf; - //std::map hash; - tagint id; - - int ncount = 0; - for (i = 0; i < n; i++) - if (in[i].me >= 0) - //hash[in[i].atomID] = ncount++; - atom->map_one(in[i].atomID,ncount++); - - // procowner = caller proc that owns each atom - // atomID = ID of each rendezvous atom I own - // npartner = # of 1-3 partners for each atom I own - - int *procowner,*npartner; - tagint *atomID; - memory->create(procowner,ncount,"special:procowner"); - memory->create(atomID,ncount,"special:atomID"); - memory->create(npartner,ncount,"special:npartner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - if (in[i].me >= 0) { - procowner[m] = in[i].me; - atomID[m] = in[i].atomID; - } else if (in[i].me == -1) npartner[m]++; - } - - int max = 0; - for (m = 0; m < ncount; m++) max = MAX(max,npartner[m]); - - // partner = list of 1-3 or 1-4 partners for each atom I own - - int **partner; - memory->create(partner,ncount,max,"special:partner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - if (in[i].me >= 0 || in[i].me == -2) continue; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - partner[m][npartner[m]++] = in[i].partnerID; - } - - // flag = 1 if partner is in an actual angle or in a dihedral - - int **flag; - memory->create(flag,ncount,max,"special:flag"); - - for (i = 0; i < ncount; i++) - for (j = 0; j < npartner[i]; j++) - flag[i][j] = 0; - - tagint actual; - for (i = 0; i < n; i++) { - if (in[i].me != -2) continue; - actual = in[i].partnerID; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - for (j = 0; j < npartner[m]; j++) - if (partner[m][j] == actual) { - flag[m][j] = 1; - break; - } - } - - // pass list of PairRvous datums back to comm->rendezvous - - int nout = 0; - for (m = 0; m < ncount; m++) nout += npartner[m]; - - memory->create(proclist,nout,"special:proclist"); - PairRvous *out = (PairRvous *) - memory->smalloc((bigint) nout*sizeof(PairRvous),"special:out"); - - nout = 0; - for (m = 0; m < ncount; m++) - for (j = 0; j < npartner[m]; j++) { - if (flag[m][j] == 0) continue; - proclist[nout] = procowner[m]; - out[nout].atomID = atomID[m]; - out[nout].partnerID = partner[m][j]; - nout++; - } - - outbuf = (char *) out; - - // clean up - // Comm::rendezvous will delete proclist and out (outbuf) - - memory->destroy(procowner); - memory->destroy(atomID); - memory->destroy(npartner); - memory->destroy(partner); - memory->destroy(flag); - - // re-create atom map - - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); - - */ - - //return nout; - flag = 2; - return 0; -} - /* ---------------------------------------------------------------------- allow fixes to alter special list currently, only fix drude does this diff --git a/src/special.h b/src/special.h index 772ba613ac..d02a8522f6 100644 --- a/src/special.h +++ b/src/special.h @@ -31,7 +31,7 @@ class Special : protected Pointers { // data used by rendezvous callback methods - int ncount; + int nrvous; tagint *atomIDs; int *procowner; @@ -44,6 +44,8 @@ class Special : protected Pointers { tagint atomID,partnerID; }; + // private methods + void atom_owners(); void onetwo_build_newton(); void onetwo_build_newton_off(); @@ -60,8 +62,7 @@ class Special : protected Pointers { // callback functions for rendezvous communication static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); - static int rendezvous_1234(int, char *, int &, int *&, char *&, void *); - static int rendezvous_trim(int, char *, int &, int *&, char *&, void *); + static int rendezvous_pairs(int, char *, int &, int *&, char *&, void *); }; } From 67782d71a8126512ced150224b96aea3cea67817 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Tue, 18 Dec 2018 21:23:04 -0700 Subject: [PATCH 010/243] Granular pair style files added --- src/GRANULAR/pair_gran_dmt_rolling2.cpp | 719 ++++++++++ src/GRANULAR/pair_gran_hooke_history.cpp | 3 +- src/GRANULAR/pair_gran_hooke_history.h | 2 +- .../pair_gran_hooke_history_multi.cpp | 915 +++++++++++++ src/GRANULAR/pair_gran_hooke_history_multi.h | 109 ++ src/GRANULAR/pair_gran_jkr_rolling_multi.cpp | 1181 ++++++++++++++++ src/GRANULAR/pair_gran_jkr_rolling_multi.h | 87 ++ src/GRANULAR/pair_granular.cpp | 1187 +++++++++++++++++ src/GRANULAR/pair_granular.h | 89 ++ 9 files changed, 4289 insertions(+), 3 deletions(-) create mode 100644 src/GRANULAR/pair_gran_dmt_rolling2.cpp create mode 100644 src/GRANULAR/pair_gran_hooke_history_multi.cpp create mode 100644 src/GRANULAR/pair_gran_hooke_history_multi.h create mode 100644 src/GRANULAR/pair_gran_jkr_rolling_multi.cpp create mode 100644 src/GRANULAR/pair_gran_jkr_rolling_multi.h create mode 100644 src/GRANULAR/pair_granular.cpp create mode 100644 src/GRANULAR/pair_granular.h diff --git a/src/GRANULAR/pair_gran_dmt_rolling2.cpp b/src/GRANULAR/pair_gran_dmt_rolling2.cpp new file mode 100644 index 0000000000..5c1211cbc5 --- /dev/null +++ b/src/GRANULAR/pair_gran_dmt_rolling2.cpp @@ -0,0 +1,719 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gran_dmt_rolling.h" +#include "atom.h" +#include "update.h" +#include "force.h" +#include "fix.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define TWOTHIRDS 0.6666666666666666 +#define EPSILON 1e-10 + +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + +/* ---------------------------------------------------------------------- */ + +PairGranDMTRolling::PairGranDMTRolling(LAMMPS *lmp) : + PairGranHookeHistory(lmp, 7), + E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), + Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) +{ + int ntypes = atom->ntypes; + memory->create(E,ntypes+1,ntypes+1,"pair:E"); + memory->create(G,ntypes+1,ntypes+1,"pair:G"); + memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); + memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); + memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); + memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); + memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); + memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); + memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); +} + +/* ---------------------------------------------------------------------- */ +PairGranDMTRolling::~PairGranDMTRolling() +{ + delete [] E_one; + delete [] G_one; + delete [] pois; + delete [] muS_one; + delete [] cor; + delete [] alpha_one; + delete [] Ecoh_one; + delete [] kR_one; + delete [] muR_one; + delete [] etaR_one; + //TODO: Make all this work with standard pair coeff type commands. + //Also these should not be in the destructor. + memory->destroy(E); + memory->destroy(G); + memory->destroy(alpha); + memory->destroy(gamman); + memory->destroy(muS); + memory->destroy(Ecoh); + memory->destroy(kR); + memory->destroy(muR); + memory->destroy(etaR); +} +/* ---------------------------------------------------------------------- */ + +void PairGranDMTRolling::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum; + int itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; + double overlap; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *shear,*allshear,**firstshear; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = list->listhistory->firstneigh; + firstshear = list->listhistory->firstdouble; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + jtype = type[j]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum){ + // unset non-touching neighbors + touch[jj] = 0; + shear = &allshear[nsheardim*jj]; + for (int k = 0; k < nsheardim; k++) + shear[k] = 0.0; + } else { + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + //**************************************** + //Normal force = Hertzian contact + DMT + damping + //**************************************** + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*E[itype][jtype]*a; + Fhz = kn*overlap; + + //Damping (based on Tsuji et al) + if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + //DMT + Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; + + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including shear history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + //delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + touch[jj] = 1; + shear = &allshear[nsheardim*jj]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + + // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + //**************************************** + // Rolling force, including shear history effects + //**************************************** + + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } + + k_R = kR[itype][jtype]; + if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*shear[3] - eta_R*vrl1; + fr2 = -k_R*shear[4] - eta_R*vrl2; + fr3 = -k_R*shear[5] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne); + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + + + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit){ + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairGranDMTRolling::settings(int narg, char **arg) +{ + if (narg < 6) error->all(FLERR,"Illegal pair_style command"); + + int ntypes = atom->ntypes; + + if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); + + E_one = new double[ntypes+1]; + G_one = new double[ntypes+1]; + pois = new double[ntypes+1]; + muS_one = new double[ntypes+1]; + cor = new double[ntypes+1]; + alpha_one = new double[ntypes+1]; + Ecoh_one = new double[ntypes+1]; + kR_one = new double[ntypes+1]; + muR_one = new double[ntypes+1]; + etaR_one = new double[ntypes+1]; + + for (int i=0; i < ntypes;i++){ + E_one[i+1] = force->numeric(FLERR, arg[i]); + G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); + muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); + cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); + Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); + kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); + muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); + etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); + } + + //Defaults + normaldamp = TSUJI; + rollingdamp = INDEP; + + int iarg = 8*ntypes; + while (iarg < narg){ + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else{ + iarg +=1; + } + } + + //Derived from inputs + for (int i=1; i <= ntypes; i++){ + pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; + alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; + for (int j=i; j <= ntypes; j++){ + E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); + G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); + if (normaldamp == TSUJI){ + alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); + } + else if (normaldamp == BRILLIANTOV){ + gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); + } + muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); + Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); + kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); + etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); + muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); + } + } +} + +/* ---------------------------------------------------------------------- */ + +double PairGranDMTRolling::single(int i, int j, int itype, int jtype, + double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double overlap, a; + double mi,mj,meff,damp,kn,kt; + double Fhz,Fdamp,Fdmt,Fne,Fntot,Fscrit; + double eta_N,eta_T; + double vtr1,vtr2,vtr3,vrel; + double fs1,fs2,fs3,fs; + double shrmag; + + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum) { + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; + } + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/radsum; + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + + // normal force = Hertzian contact + normal velocity damping + overlap = radsum - r; + a = sqrt(R*overlap); + kn = 4.0/3.0*E[itype][jtype]*a; + Fhz = kn*overlap; + + //Damping (based on Tsuji et al) + + eta_N=alpha[itype][jtype]*sqrt(meff*kn); + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + //DMT + Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; + + Fne = Fhz + Fdmt; + Fntot = Fne + Fdamp; + + // relative velocities + + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allshear = list->listhistory->firstdouble[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *shear = &allshear[nsheardim*neighprev]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // tangential forces = shear + tangential velocity damping + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; + fs1 = -kt*shear[0] - eta_T*vtr1; + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + Fscrit= muS[itype][jtype] * fabs(Fne); + + if (fs > Fscrit) { + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set all forces and return no energy + + fforce = Fntot; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + return 0.0; +} diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 4bc867e426..cf30e77ccb 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -39,8 +39,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp, int _size_history) : Pair(lmp), - size_history(_size_history) +PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) { single_enable = 1; no_virial_fdotr_compute = 1; diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index 6d9980919b..2cb609fd82 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -26,7 +26,7 @@ namespace LAMMPS_NS { class PairGranHookeHistory : public Pair { public: - PairGranHookeHistory(class LAMMPS *, int size_history = 3); + PairGranHookeHistory(class LAMMPS *); virtual ~PairGranHookeHistory(); virtual void compute(int, int); virtual void settings(int, char **); diff --git a/src/GRANULAR/pair_gran_hooke_history_multi.cpp b/src/GRANULAR/pair_gran_hooke_history_multi.cpp new file mode 100644 index 0000000000..48e793bbb3 --- /dev/null +++ b/src/GRANULAR/pair_gran_hooke_history_multi.cpp @@ -0,0 +1,915 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gran_hooke_history_multi.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define BIG 1.0e20 + +/* ---------------------------------------------------------------------- */ + +PairGranHookeHistoryMulti::PairGranHookeHistoryMulti(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + no_virial_fdotr_compute = 1; + history = 1; + fix_history = NULL; + + single_extra = 10; + svector = new double[10]; + + neighprev = 0; + + nmax = 0; + mass_rigid = NULL; + + // set comm size needed by this Pair if used with fix rigid + + comm_forward = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairGranHookeHistoryMulti::~PairGranHookeHistoryMulti() +{ + delete [] svector; + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(kn); + memory->destroy(kt); + memory->destroy(gamman); + memory->destroy(gammat); + memory->destroy(xmu); + memory->destroy(dampflag); + + delete [] onerad_dynamic; + delete [] onerad_frozen; + delete [] maxrad_dynamic; + delete [] maxrad_frozen; + } + memory->destroy(mass_rigid); +} + +/* ---------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz; + double radi,radj,radsum,rsq,r,rinv,rsqinv; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double fn,fs,fs1,fs2,fs3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *shear,*allshear,**firstshear; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0) { + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *mask = atom->mask; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; + + // 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]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum) { + + // unset non-touching neighbors + + touch[jj] = 0; + shear = &allshear[3*jj]; + shear[0] = 0.0; + shear[1] = 0.0; + shear[2] = 0.0; + + } else { + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv; + wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv; + wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + // normal forces = Hookian contact + normal velocity damping + + damp = meff*gamman[itype][jtype]*vnnr*rsqinv; + ccel = kn[itype][jtype]*(radsum-r)*rinv - damp; + + // relative velocities + + vtr1 = vt1 - (delz*wr2-dely*wr3); + vtr2 = vt2 - (delx*wr3-delz*wr1); + vtr3 = vt3 - (dely*wr1-delx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + + touch[jj] = 1; + shear = &allshear[3*jj]; + + if (shearupdate) { + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // rotate shear displacements + + rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz; + rsht *= rsqinv; + if (shearupdate) { + shear[0] -= rsht*delx; + shear[1] -= rsht*dely; + shear[2] -= rsht*delz; + } + + // tangential forces = shear + tangential velocity damping + + fs1 = - (kt[itype][jtype]*shear[0] + meff*gammat[itype][jtype]*vtr1); + fs2 = - (kt[itype][jtype]*shear[1] + meff*gammat[itype][jtype]*vtr2); + fs3 = - (kt[itype][jtype]*shear[2] + meff*gammat[itype][jtype]*vtr3); + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + fn = xmu[itype][jtype] * fabs(ccel*r); + + if (fs > fn) { + if (shrmag != 0.0) { + shear[0] = (fn/fs) * (shear[0] + + meff*gammat[itype][jtype]*vtr1/kt[itype][jtype]) - + meff*gammat[itype][jtype]*vtr1/kt[itype][jtype]; + shear[1] = (fn/fs) * (shear[1] + + meff*gammat[itype][jtype]*vtr2/kt[itype][jtype]) - + meff*gammat[itype][jtype]*vtr2/kt[itype][jtype]; + shear[2] = (fn/fs) * (shear[2] + + meff*gammat[itype][jtype]*vtr3/kt[itype][jtype]) - + meff*gammat[itype][jtype]*vtr3/kt[itype][jtype]; + fs1 *= fn/fs; + fs2 *= fn/fs; + fs3 *= fn/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + // forces & torques + + fx = delx*ccel + fs1; + fy = dely*ccel + fs2; + fz = delz*ccel + fs3; + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = rinv * (dely*fs3 - delz*fs2); + tor2 = rinv * (delz*fs1 - delx*fs3); + tor3 = rinv * (delx*fs2 - dely*fs1); + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + if (newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + } + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(kn,n+1,n+1,"pair:kn"); + memory->create(kt,n+1,n+1,"pair:kt"); + memory->create(gamman,n+1,n+1,"pair:gamman"); + memory->create(gammat,n+1,n+1,"pair:gammat"); + memory->create(xmu,n+1,n+1,"pair:xmu"); + memory->create(dampflag,n+1,n+1,"pair:dampflag"); + + onerad_dynamic = new double[n+1]; + onerad_frozen = new double[n+1]; + maxrad_dynamic = new double[n+1]; + maxrad_frozen = new double[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; + else cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::coeff(int narg, char **arg) +{ + if (narg < 8 || narg > 9) + error->all(FLERR,"Incorrect args for pair coefficients"); + + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double kn_one = force->numeric(FLERR,arg[2]); + double kt_one; + if (strcmp(arg[3],"NULL") == 0) kt_one = kn_one * 2.0/7.0; + else kt_one = force->numeric(FLERR,arg[3]); + + double gamman_one = force->numeric(FLERR,arg[4]); + double gammat_one; + if (strcmp(arg[5],"NULL") == 0) gammat_one = 0.5 * gamman_one; + else gammat_one = force->numeric(FLERR,arg[5]); + + double xmu_one = force->numeric(FLERR,arg[6]); + int dampflag_one = force->inumeric(FLERR,arg[7]); + if (dampflag_one == 0) gammat_one = 0.0; + + if (kn_one < 0.0 || kt_one < 0.0 || gamman_one < 0.0 || gammat_one < 0.0 || + xmu_one < 0.0 || xmu_one > 10000.0 || dampflag_one < 0 || dampflag_one > 1) + error->all(FLERR,"Illegal pair_style command"); + + // convert Kn and Kt from pressure units to force/distance^2 + kn_one /= force->nktv2p; + kt_one /= force->nktv2p; + + double cut_one = cut_global; + if (narg==9) { + if (strcmp(arg[8],"NULL") == 0) cut_one = -1.0; + else cut_one = force->numeric(FLERR,arg[8]); + } + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + kn[i][j] = kn_one; + kt[i][j] = kt_one; + gamman[i][j] = gamman_one; + gammat[i][j] = gammat_one; + xmu[i][j] = xmu_one; + dampflag[i][j] = dampflag_one; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::init_style() +{ + int i; + + // error and warning checks + + if (!atom->radius_flag || !atom->rmass_flag) + error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair granular requires ghost atoms store velocity"); + + // need a granular neigh list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->size = 1; + if (history) neighbor->requests[irequest]->history = 1; + + dt = update->dt; + + // if shear history is stored: + // if first init, create Fix needed for storing shear history + + if (history && fix_history == NULL) { + char dnumstr[16]; + sprintf(dnumstr,"%d",3); + char **fixarg = new char*[4]; + fixarg[0] = (char *) "NEIGH_HISTORY"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "NEIGH_HISTORY"; + fixarg[3] = dnumstr; + modify->add_fix(4,fixarg,1); + delete [] fixarg; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; + fix_history->pair = this; + } + + // check for FixFreeze and set freeze_group_bit + + for (i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"freeze") == 0) break; + if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; + else freeze_group_bit = 0; + + // check for FixRigid so can extract rigid body masses + + fix_rigid = NULL; + for (i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) break; + if (i < modify->nfix) fix_rigid = modify->fix[i]; + + // check for FixPour and FixDeposit so can extract particle radii + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + // set maxrad_dynamic and maxrad_frozen for each type + // include future FixPour and FixDeposit particles as dynamic + + int itype; + for (i = 1; i <= atom->ntypes; i++) { + onerad_dynamic[i] = onerad_frozen[i] = 0.0; + if (ipour >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[ipour]->extract("radius",itype)); + } + if (idep >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[idep]->extract("radius",itype)); + } + } + + double *radius = atom->radius; + int *mask = atom->mask; + int *type = atom->type; + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) + if (mask[i] & freeze_group_bit) + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); + else + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); + + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + + // set fix which stores history info + + if (history) { + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + kn[i][j] = mix_stiffness(kn[i][i],kn[j][j]); + kt[i][j] = mix_stiffness(kt[i][i],kt[j][j]); + gamman[i][j] = mix_damping(gamman[i][i],gamman[j][j]); + gammat[i][j] = mix_damping(gammat[i][i],gammat[j][j]); + xmu[i][j] = mix_friction(xmu[i][i],xmu[j][j]); + + dampflag[i][j] = 0; + if (dampflag[i][i] || dampflag[j][j]) dampflag[i][j] = 1; + + } + + kn[j][i] = kn[i][j]; + kt[j][i] = kt[i][j]; + gamman[j][i] = gamman[i][j]; + gammat[j][i] = gammat[i][j]; + xmu[j][i] = xmu[i][j]; + dampflag[j][i] = dampflag[i][j]; + + double cutoff = cut[i][j]; + + // It is likely that cut[i][j] at this point is still 0.0. This can happen when + // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates + // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size + // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only + // if there is no current information about radius/cutoff of type i and j). + // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. + + if (cut[i][j] < 0.0) { + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); + } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + return cutoff; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&kn[i][j],sizeof(double),1,fp); + fwrite(&kt[i][j],sizeof(double),1,fp); + fwrite(&gamman[i][j],sizeof(double),1,fp); + fwrite(&gammat[i][j],sizeof(double),1,fp); + fwrite(&xmu[i][j],sizeof(double),1,fp); + fwrite(&dampflag[i][j],sizeof(int),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&kn[i][j],sizeof(double),1,fp); + fread(&kt[i][j],sizeof(double),1,fp); + fread(&gamman[i][j],sizeof(double),1,fp); + fread(&gammat[i][j],sizeof(double),1,fp); + fread(&xmu[i][j],sizeof(double),1,fp); + fread(&dampflag[i][j],sizeof(int),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&kn[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&kt[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gammat[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&xmu[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&dampflag[i][j],1,MPI_INT,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_global,sizeof(double),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::single(int i, int j, int itype, int jtype, + double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double mi,mj,meff,damp,ccel; + double vtr1,vtr2,vtr3,vrel,shrmag,rsht; + double fs1,fs2,fs3,fs,fn; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + if (rsq >= radsum*radsum) { + fforce = 0.0; + for (int m = 0; m < single_extra; m++) svector[m] = 0.0; + return 0.0; + } + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv; + wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv; + wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: insure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + // normal forces = Hookian contact + normal velocity damping + + damp = meff*gamman[itype][jtype]*vnnr*rsqinv; + ccel = kn[itype][jtype]*(radsum-r)*rinv - damp; + + // relative velocities + + vtr1 = vt1 - (delz*wr2-dely*wr3); + vtr2 = vt2 - (delx*wr3-delz*wr1); + vtr3 = vt3 - (dely*wr1-delx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allshear = fix_history->firstvalue[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *shear = &allshear[3*neighprev]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // rotate shear displacements + + rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz; + rsht *= rsqinv; + + // tangential forces = shear + tangential velocity damping + + fs1 = - (kt[itype][jtype]*shear[0] + meff*gammat[itype][jtype]*vtr1); + fs2 = - (kt[itype][jtype]*shear[1] + meff*gammat[itype][jtype]*vtr2); + fs3 = - (kt[itype][jtype]*shear[2] + meff*gammat[itype][jtype]*vtr3); + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + fn = xmu[itype][jtype] * fabs(ccel*r); + + if (fs > fn) { + if (shrmag != 0.0) { + fs1 *= fn/fs; + fs2 *= fn/fs; + fs3 *= fn/fs; + fs *= fn/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set force and return no energy + + fforce = ccel; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairGranHookeHistoryMulti::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = mass_rigid[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairGranHookeHistoryMulti::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + mass_rigid[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + mixing of stiffness +------------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::mix_stiffness(double kii, double kjj) +{ + return kii*kjj/(kii + kjj); +} + +/* ---------------------------------------------------------------------- + mixing of damping +------------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::mix_damping(double gammaii, double gammajj) +{ + return sqrt(gammaii*gammajj); +} + +/* ---------------------------------------------------------------------- + mixing of friction +------------------------------------------------------------------------- */ + +double PairGranHookeHistoryMulti::mix_friction(double xmuii, double xmujj) +{ + return MAX(xmuii,xmujj); +} + diff --git a/src/GRANULAR/pair_gran_hooke_history_multi.h b/src/GRANULAR/pair_gran_hooke_history_multi.h new file mode 100644 index 0000000000..f302ede96c --- /dev/null +++ b/src/GRANULAR/pair_gran_hooke_history_multi.h @@ -0,0 +1,109 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gran/hooke/history/multi,PairGranHookeHistoryMulti) + +#else + +#ifndef LMP_PAIR_GRAN_HOOKE_HISTORY_MULTI_H +#define LMP_PAIR_GRAN_HOOKE_HISTORY_MULTI_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGranHookeHistoryMulti : public Pair { + public: + PairGranHookeHistoryMulti(class LAMMPS *); + virtual ~PairGranHookeHistoryMulti(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); // Made Virtual by IS Oct 7 2017 + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void reset_dt(); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double memory_usage(); + + protected: + double cut_global; + double **kn,**kt,**gamman,**gammat,**xmu,**cut; + int **dampflag; + double dt; + int freeze_group_bit; + int history; + + int neighprev; + double *onerad_dynamic,*onerad_frozen; + double *maxrad_dynamic,*maxrad_frozen; + + class FixNeighHistory *fix_history; + + // storage of rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid + + virtual void allocate(); // Made Virtual by IS Oct 7 2017 + +private: + double mix_stiffness(double kii, double kjj); + double mix_damping(double gammaii, double gammajj); + double mix_friction(double xmuii, double xmujj); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair granular requires atom attributes radius, rmass + +The atom style defined does not have these attributes. + +E: Pair granular requires ghost atoms store velocity + +Use the comm_modify vel yes command to enable this. + +E: Pair granular with shear history requires newton pair off + +This is a current restriction of the implementation of pair +granular styles with history. + +E: Could not find pair fix ID + +A fix is created internally by the pair style to store shear +history information. You cannot delete it. + +*/ diff --git a/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp b/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp new file mode 100644 index 0000000000..a9156390e5 --- /dev/null +++ b/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp @@ -0,0 +1,1181 @@ +/* ---------------------------------------------------------------------- +http://lammps.sandia.gov, Sandia National Laboratories +Steve Plimpton, sjplimp@sandia.gov + +Copyright (2003) Sandia Corporation. Under the terms of Contract +DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains +certain rights in this software. This software is distributed under +the GNU General Public License. + +See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gran_jkr_rolling_multi.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" +//#include + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define ONETHIRD 0.33333333333333333 +#define TWOTHIRDS 0.66666666666666666 +#define POW6ONE 0.550321208149104 //6^(-1/3) +#define POW6TWO 0.30285343213869 //6^(-2/3) + +#define EPSILON 1e-10 + +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + +/* ---------------------------------------------------------------------- */ + +PairGranJKRRollingMulti::PairGranJKRRollingMulti(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + no_virial_fdotr_compute = 1; + history = 1; + fix_history = NULL; + + single_extra = 10; + svector = new double[10]; + + neighprev = 0; + + nmax = 0; + mass_rigid = NULL; + + // set comm size needed by this Pair if used with fix rigid + + comm_forward = 1; +} + +/* ---------------------------------------------------------------------- */ +PairGranJKRRollingMulti::~PairGranJKRRollingMulti() +{ + delete [] svector; + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(E); + memory->destroy(G); + memory->destroy(normaldamp); + memory->destroy(rollingdamp); + memory->destroy(alpha); + memory->destroy(gamman); + memory->destroy(muS); + memory->destroy(Ecoh); + memory->destroy(kR); + memory->destroy(muR); + memory->destroy(etaR); + + delete [] onerad_dynamic; + delete [] onerad_frozen; + delete [] maxrad_dynamic; + delete [] maxrad_frozen; + } + memory->destroy(mass_rigid); +} +/* ---------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::compute(int eflag, int vflag) +{ +// feenableexcept(FE_INVALID | FE_OVERFLOW); + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; + double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *shear,*allshear,**firstshear; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *mask = atom->mask; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; + + // 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]; + radi = radius[i]; + touch = firsttouch[i]; + allshear = firstshear[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + jtype = type[j]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + if ((rsq >= radsum*radsum && touch[jj] == 0) || + (rsq >= (radsum+delta_C)*(radsum+delta_C))) { + + // unset non-touching neighbors + + touch[jj] = 0; + shear = &allshear[3*jj]; + shear[0] = 0.0; + shear[1] = 0.0; + shear[2] = 0.0; + + } else { + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + //**************************************** + //Normal force = JKR-adjusted Hertzian contact + damping + //**************************************** + if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; + else delta_Cinv = 1.0; + overlap = (radsum - r)*delta_Cinv; + olapsq = overlap*overlap; + olapcubed = olapsq*overlap; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + //if (screen) fprintf(screen,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); + //if (logfile) fprintf(logfile,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); + + //**************************************** + //Tangential force, including shear history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + // Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + // delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + touch[jj] = 1; + shear = &allshear[3*jj]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // Rotate and update shear displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (shearupdate) { + rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shear[0] -= rsht*nx; + shear[1] -= rsht*ny; + shear[2] -= rsht*nz; + //Also rescale to preserve magnitude + shear[0] *= scalefac; + shear[1] *= scalefac; + shear[2] *= scalefac; + } + //Update shear history + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + + // tangential forces = shear + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + //**************************************** + // Rolling force, including shear history effects + //**************************************** + + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // Rolling displacement + rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + + if (shearupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + shear[3] -= rolldotn*nx; + shear[4] -= rolldotn*ny; + shear[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + shear[3] *= scalefac; + shear[4] *= scalefac; + shear[5] *= scalefac; + } + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + } + + k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); + if (rollingdamp[itype][jtype] == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp[itype][jtype] == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*shear[3] - eta_R*vrl1; + fr2 = -k_R*shear[4] - eta_R*vrl2; + fr3 = -k_R*shear[5] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + + + //**************************************** + // Twisting torque, including shear history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + shear[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + //shear[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); + shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + //if (screen) fprintf(screen,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); + //if (logfile) fprintf(logfile,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + + +/* ---------------------------------------------------------------------- + allocate all arrays + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(E,n+1,n+1,"pair:E"); + memory->create(G,n+1,n+1,"pair:G"); + memory->create(normaldamp,n+1,n+1,"pair:normaldamp"); + memory->create(rollingdamp,n+1,n+1,"pair:rollingdamp"); + memory->create(alpha,n+1,n+1,"pair:alpha"); + memory->create(gamman,n+1,n+1,"pair:gamman"); + memory->create(muS,n+1,n+1,"pair:muS"); + memory->create(Ecoh,n+1,n+1,"pair:Ecoh"); + memory->create(kR,n+1,n+1,"pair:kR"); + memory->create(muR,n+1,n+1,"pair:muR"); + memory->create(etaR,n+1,n+1,"pair:etaR"); + + onerad_dynamic = new double[n+1]; + onerad_frozen = new double[n+1]; + maxrad_dynamic = new double[n+1]; + maxrad_frozen = new double[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; + else cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::coeff(int narg, char **arg) +{ + if (narg < 10 || narg > 15) + error->all(FLERR,"Incorrect args for pair coefficients2"); + + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double E_one = force->numeric(FLERR,arg[2]); + double G_one = force->numeric(FLERR,arg[3]); + double muS_one = force->numeric(FLERR,arg[4]); + double cor_one = force->numeric(FLERR,arg[5]); + double Ecoh_one = force->numeric(FLERR,arg[6]); + double kR_one = force->numeric(FLERR,arg[7]); + double muR_one = force->numeric(FLERR,arg[8]); + double etaR_one = force->numeric(FLERR,arg[9]); + + //Defaults + int normaldamp_one = TSUJI; + int rollingdamp_one = INDEP; + double cut_one = cut_global; + + int iarg = 10; + while (iarg < narg) { + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp_one = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp_one = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp_one = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp_one = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg +=2; + } + else { + if (strcmp(arg[iarg],"NULL") == 0) cut_one = -1.0; + else cut_one = force->numeric(FLERR,arg[iarg]); + iarg += 1; + } + } + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + double pois = E_one/(2.0*G_one) - 1.0; + double alpha_one = 1.2728-4.2783*cor_one+11.087*cor_one*cor_one-22.348*cor_one*cor_one*cor_one+27.467*cor_one*cor_one*cor_one*cor_one-18.022*cor_one*cor_one*cor_one*cor_one*cor_one+4.8218*cor_one*cor_one*cor_one*cor_one*cor_one*cor_one; + + for (int j = MAX(jlo,i); j <= jhi; j++) { + E[i][j] = E_one; + G[i][j] = G_one; + if (normaldamp_one == TSUJI) { + normaldamp[i][j] = TSUJI; + alpha[i][j] = alpha_one; + } + else if (normaldamp_one == BRILLIANTOV) { + normaldamp[i][j] = BRILLIANTOV; + gamman[i][j] = cor_one; + } + if (rollingdamp_one == INDEP) { + rollingdamp[i][j] = INDEP; + } + else if (rollingdamp_one == BRILLROLL) { + rollingdamp[i][j] = BRILLROLL; + } + muS[i][j] = muS_one; + Ecoh[i][j] = Ecoh_one; + kR[i][j] = kR_one; + etaR[i][j] = etaR_one; + muR[i][j] = muR_one; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients1"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::init_style() +{ + int i; + + // error and warning checks + + if (!atom->radius_flag || !atom->rmass_flag) + error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair granular requires ghost atoms store velocity"); + + // need a granular neigh list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->size = 1; + if (history) neighbor->requests[irequest]->history = 1; + + dt = update->dt; + + // if shear history is stored: + // if first init, create Fix needed for storing shear history + + if (history && fix_history == NULL) { + char dnumstr[16]; + sprintf(dnumstr,"%d",3); + char **fixarg = new char*[4]; + fixarg[0] = (char *) "NEIGH_HISTORY"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "NEIGH_HISTORY"; + fixarg[3] = dnumstr; + modify->add_fix(4,fixarg,1); + delete [] fixarg; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; + fix_history->pair = this; + } + + // check for FixFreeze and set freeze_group_bit + + for (i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"freeze") == 0) break; + if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; + else freeze_group_bit = 0; + + // check for FixRigid so can extract rigid body masses + + fix_rigid = NULL; + for (i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) break; + if (i < modify->nfix) fix_rigid = modify->fix[i]; + + // check for FixPour and FixDeposit so can extract particle radii + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + // set maxrad_dynamic and maxrad_frozen for each type + // include future FixPour and FixDeposit particles as dynamic + + int itype; + for (i = 1; i <= atom->ntypes; i++) { + onerad_dynamic[i] = onerad_frozen[i] = 0.0; + if (ipour >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[ipour]->extract("radius",itype)); + } + if (idep >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[idep]->extract("radius",itype)); + } + } + + double *radius = atom->radius; + int *mask = atom->mask; + int *type = atom->type; + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) + if (mask[i] & freeze_group_bit) + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); + else + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); + + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + + // set fix which stores history info + + if (history) { + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i + ------------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + E[i][j] = mix_stiffnessE(E[i][i],E[j][j],G[i][i],G[j][j]); + G[i][j] = mix_stiffnessG(G[i][i],E[j][j],G[i][i],G[j][j]); + if (normaldamp[i][j] == TSUJI) { + alpha[i][j] = mix_geom(alpha[i][i],alpha[j][j]); + } + else if (normaldamp[i][j] == BRILLIANTOV) { + gamman[i][j] = mix_geom(gamman[i][i],gamman[j][j]); + } + muS[i][j] = mix_geom(muS[i][i],muS[j][j]); + Ecoh[i][j] = mix_geom(Ecoh[i][i],Ecoh[j][j]); + kR[i][j] = mix_geom(kR[i][i],kR[j][j]); + etaR[i][j] = mix_geom(etaR[i][i],etaR[j][j]); + muR[i][j] = mix_geom(muR[i][i],muR[j][j]); + } + + E[j][i] = E[i][j]; + G[j][i] = G[i][j]; + normaldamp[j][i] = normaldamp[i][j]; + alpha[j][i] = alpha[i][j]; + gamman[j][i] = gamman[i][j]; + rollingdamp[j][i] = rollingdamp[i][j]; + muS[j][i] = muS[i][j]; + Ecoh[j][i] = Ecoh[i][j]; + kR[j][i] = kR[i][j]; + etaR[j][i] = etaR[i][j]; + muR[j][i] = muR[i][j]; + + double cutoff = cut[i][j]; + + // It is likely that cut[i][j] at this point is still 0.0. This can happen when + // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates + // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size + // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only + // if there is no current information about radius/cutoff of type i and j). + // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. + + if (cut[i][j] < 0.0) { + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); + } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + return cutoff; +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&E[i][j],sizeof(double),1,fp); + fwrite(&G[i][j],sizeof(double),1,fp); + fwrite(&normaldamp[i][j],sizeof(int),1,fp); + fwrite(&rollingdamp[i][j],sizeof(int),1,fp); + fwrite(&alpha[i][j],sizeof(double),1,fp); + fwrite(&gamman[i][j],sizeof(double),1,fp); + fwrite(&muS[i][j],sizeof(double),1,fp); + fwrite(&Ecoh[i][j],sizeof(double),1,fp); + fwrite(&kR[i][j],sizeof(double),1,fp); + fwrite(&muR[i][j],sizeof(double),1,fp); + fwrite(&etaR[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&E[i][j],sizeof(double),1,fp); + fread(&G[i][j],sizeof(double),1,fp); + fread(&normaldamp[i][j],sizeof(int),1,fp); + fread(&rollingdamp[i][j],sizeof(int),1,fp); + fread(&alpha[i][j],sizeof(double),1,fp); + fread(&gamman[i][j],sizeof(double),1,fp); + fread(&muS[i][j],sizeof(double),1,fp); + fread(&Ecoh[i][j],sizeof(double),1,fp); + fread(&kR[i][j],sizeof(double),1,fp); + fread(&muR[i][j],sizeof(double),1,fp); + fread(&etaR[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&E[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&G[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&normaldamp[i][j],1,MPI_INT,0,world); + MPI_Bcast(&rollingdamp[i][j],1,MPI_INT,0,world); + MPI_Bcast(&alpha[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&muS[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&Ecoh[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&kR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&muR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&etaR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_global,sizeof(double),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::single(int i, int j, int itype, int jtype, + double rsq, double factor_coul, double factor_lj, double &fforce) +{ +// feenableexcept(FE_INVALID | FE_OVERFLOW); + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double overlap, a; + double mi,mj,meff,damp,kn,kt; + double Fdamp,Fne,Fntot,Fscrit; + double eta_N,eta_T; + double vtr1,vtr2,vtr3,vrel; + double fs1,fs2,fs3,fs; + double shrmag; + double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + int *touch = fix_history->firstflag[i]; + if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| + (rsq >= radsum*radsum && touch[j])){ + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; + } + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + + // normal force = JKR + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + overlap = radsum - r; + olapsq = overlap*overlap; + olapcubed = olapsq*olapsq; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + + // relative velocities + + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // shear history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allshear = fix_history->firstvalue[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *shear = &allshear[3*neighprev]; + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + + shear[2]*shear[2]); + + // tangential forces = shear + tangential velocity damping + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; + fs1 = -kt*shear[0] - eta_T*vtr1; + fs2 = -kt*shear[1] - eta_T*vtr2; + fs3 = -kt*shear[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); + + if (fs > Fscrit) { + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set all forces and return no energy + + fforce = Fntot; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairGranJKRRollingMulti::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = mass_rigid[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairGranJKRRollingMulti::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + mass_rigid[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays + ------------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + mixing of stiffness (E) + ------------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); +} + +/* ---------------------------------------------------------------------- + mixing of stiffness (G) + ------------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); +} + +/* ---------------------------------------------------------------------- + mixing of everything else + ------------------------------------------------------------------------- */ + +double PairGranJKRRollingMulti::mix_geom(double valii, double valjj) +{ + return sqrt(valii*valjj); +} diff --git a/src/GRANULAR/pair_gran_jkr_rolling_multi.h b/src/GRANULAR/pair_gran_jkr_rolling_multi.h new file mode 100644 index 0000000000..c9c75de9a6 --- /dev/null +++ b/src/GRANULAR/pair_gran_jkr_rolling_multi.h @@ -0,0 +1,87 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gran/jkr/rolling/multi,PairGranJKRRollingMulti) + +#else + +#ifndef LMP_PAIR_GRAN_JKR_ROLLING_MULTI_H +#define LMP_PAIR_GRAN_JKR_ROLLING_MULTI_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGranJKRRollingMulti : public Pair { +public: + PairGranJKRRollingMulti(class LAMMPS *); + virtual ~PairGranJKRRollingMulti(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); // Made Virtual by IS Oct 7 2017 + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void reset_dt(); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double memory_usage(); + + protected: + double cut_global; + double **E,**G,**alpha,**gamman,**muS,**Ecoh,**kR,**muR,**etaR,**cut; + int **normaldamp, **rollingdamp; + double dt; + int freeze_group_bit; + int history; + + int neighprev; + double *onerad_dynamic,*onerad_frozen; + double *maxrad_dynamic,*maxrad_frozen; + + class FixNeighHistory *fix_history; + + // storage of rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid + + virtual void allocate(); // Made Virtual by IS Oct 7 2017 + +private: + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); + double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); + double mix_geom(double valii, double valjj); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp new file mode 100644 index 0000000000..9b693c74b5 --- /dev/null +++ b/src/GRANULAR/pair_granular.cpp @@ -0,0 +1,1187 @@ +/* ---------------------------------------------------------------------- +http://lammps.sandia.gov, Sandia National Laboratories +Steve Plimpton, sjplimp@sandia.gov + +Copyright (2003) Sandia Corporation. Under the terms of Contract +DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains +certain rights in this software. This software is distributed under +the GNU General Public License. + +See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), + Jeremy Lechman (SNL), Dan Bolintineanu (SNL), Ishan Srivastava (SNL) +----------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_granular.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define ONETHIRD 0.33333333333333333 +#define TWOTHIRDS 0.66666666666666666 +#define POW6ONE 0.550321208149104 //6^(-1/3) +#define POW6TWO 0.30285343213869 //6^(-2/3) + +#define EPSILON 1e-10 + +enum {TSUJI, BRILLIANTOV}; +enum {INDEP, BRILLROLL}; + +/* ---------------------------------------------------------------------- */ + +PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + no_virial_fdotr_compute = 1; + history = 1; + fix_history = NULL; + + single_extra = 10; + svector = new double[10]; + + neighprev = 0; + + nmax = 0; + mass_rigid = NULL; + + onerad_dynamic = NULL; + onerad_frozen = NULL; + maxrad_dynamic = NULL; + maxrad_frozen = NULL; + + dt = update->dt; + + // set comm size needed by this Pair if used with fix rigid + + comm_forward = 1; +} + +/* ---------------------------------------------------------------------- */ +PairGranular::~PairGranular() +{ + delete [] svector; + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(E); + memory->destroy(G); + memory->destroy(normaldamp); + memory->destroy(rollingdamp); + memory->destroy(alpha); + memory->destroy(gamman); + memory->destroy(muS); + memory->destroy(Ecoh); + memory->destroy(kR); + memory->destroy(muR); + memory->destroy(etaR); + + delete [] onerad_dynamic; + delete [] onerad_frozen; + delete [] maxrad_dynamic; + delete [] maxrad_frozen; + } + memory->destroy(mass_rigid); +} +/* ---------------------------------------------------------------------- */ + +void PairGranular::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; + double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + double signtwist, magtwist, magtortwist, Mtcrit; + double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; + double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int historyupdate = 1; + if (update->setupflag) historyupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *mask = atom->mask; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firsthistory = fix_history->firstvalue; + + // 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]; + radi = radius[i]; + touch = firsttouch[i]; + allhistory = firsthistory[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + jtype = type[j]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + if ((rsq >= radsum*radsum && touch[jj] == 0) || + (rsq >= (radsum+delta_C)*(radsum+delta_C))) { + + // unset non-touching neighbors + + touch[jj] = 0; + history = &allhistory[3*jj]; + history[0] = 0.0; + history[1] = 0.0; + history[2] = 0.0; + + } else { + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + //**************************************** + //Normal force = JKR-adjusted Hertzian contact + damping + //**************************************** + if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; + else delta_Cinv = 1.0; + overlap = (radsum - r)*delta_Cinv; + olapsq = overlap*overlap; + olapcubed = olapsq*overlap; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + //if (screen) fprintf(screen,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); + //if (logfile) fprintf(logfile,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + // Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting + // delta/2, i.e. instead of radi, use distance to center of contact point? + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // history effects + touch[jj] = 1; + history = &allhistory[3*jj]; + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // Rotate and update displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (historyupdate) { + rsht = history[0]*nx + history[1]*ny + history[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + history[0] -= rsht*nx; + history[1] -= rsht*ny; + history[2] -= rsht*nz; + //Also rescale to preserve magnitude + history[0] *= scalefac; + history[1] *= scalefac; + history[2] *= scalefac; + } + //Update history + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; + } + + // tangential forces = history + tangential velocity damping + // following Zhao and Marshall Phys Fluids v20, p043302 (2008) + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter + fs1 = -kt*history[0] - eta_T*vtr1; //eq 26 + fs2 = -kt*history[1] - eta_T*vtr2; + fs3 = -kt*history[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + //history[0] = (Fcrit/fs) * (history[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //history[1] = (Fcrit/fs) * (history[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + //history[2] = (Fcrit/fs) * (history[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; + history[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) + history[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); + history[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + //**************************************** + // Rolling force, including history history effects + //**************************************** + + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // Rolling displacement + rollmag = sqrt(history[3]*history[3] + history[4]*history[4] + history[5]*history[5]); + rolldotn = history[3]*nx + history[4]*ny + history[5]*nz; + + if (historyupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[3] -= rolldotn*nx; + history[4] -= rolldotn*ny; + history[5] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[3] *= scalefac; + history[4] *= scalefac; + history[5] *= scalefac; + } + history[3] += vrl1*dt; + history[4] += vrl2*dt; + history[5] += vrl3*dt; + } + + k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); + if (rollingdamp[itype][jtype] == INDEP) eta_R = etaR[itype][jtype]; + else if (rollingdamp[itype][jtype] == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); + fr1 = -k_R*history[3] - eta_R*vrl1; + fr2 = -k_R*history[4] - eta_R*vrl2; + fr3 = -k_R*history[5] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + history[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + history[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + + + //**************************************** + // Twisting torque, including history effects + //**************************************** + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + history[6] += magtwist*dt; + k_Q = 0.5*kt*a*a;; //eq 32 + eta_Q = 0.5*eta_T*a*a; + magtortwist = -k_Q*history[6] - eta_Q*magtwist;//M_t torque (eq 30) + + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + //history[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); + history[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + //if (screen) fprintf(screen,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); + //if (logfile) fprintf(logfile,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + + +/* ---------------------------------------------------------------------- +allocate all arrays +------------------------------------------------------------------------- */ + +void PairGranular::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(E,n+1,n+1,"pair:E"); + memory->create(G,n+1,n+1,"pair:G"); + memory->create(normaldamp,n+1,n+1,"pair:normaldamp"); + memory->create(rollingdamp,n+1,n+1,"pair:rollingdamp"); + memory->create(alpha,n+1,n+1,"pair:alpha"); + memory->create(gamman,n+1,n+1,"pair:gamman"); + memory->create(muS,n+1,n+1,"pair:muS"); + memory->create(Ecoh,n+1,n+1,"pair:Ecoh"); + memory->create(kR,n+1,n+1,"pair:kR"); + memory->create(muR,n+1,n+1,"pair:muR"); + memory->create(etaR,n+1,n+1,"pair:etaR"); + + onerad_dynamic = new double[n+1]; + onerad_frozen = new double[n+1]; + maxrad_dynamic = new double[n+1]; + maxrad_frozen = new double[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairGranular::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; + else cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairGranular::coeff(int narg, char **arg) +{ + if (narg < 10 || narg > 15) + error->all(FLERR,"Incorrect args for pair coefficients2"); + + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double E_one = force->numeric(FLERR,arg[2]); + double G_one = force->numeric(FLERR,arg[3]); + double muS_one = force->numeric(FLERR,arg[4]); + double cor_one = force->numeric(FLERR,arg[5]); + double Ecoh_one = force->numeric(FLERR,arg[6]); + double kR_one = force->numeric(FLERR,arg[7]); + double muR_one = force->numeric(FLERR,arg[8]); + double etaR_one = force->numeric(FLERR,arg[9]); + + //Defaults + int normaldamp_one = TSUJI; + int rollingdamp_one = INDEP; + double cut_one = cut_global; + + int iarg = 10; + while (iarg < narg) { + if (strcmp(arg[iarg],"normaldamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp_one = TSUJI; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp_one = BRILLIANTOV; + else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); + iarg += 2; + } + else if (strcmp(arg[iarg],"rollingdamp") == 0){ + if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); + if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp_one = INDEP; + else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp_one = BRILLROLL; + else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); + iarg +=2; + } + else { + if (strcmp(arg[iarg],"NULL") == 0) cut_one = -1.0; + else cut_one = force->numeric(FLERR,arg[iarg]); + iarg += 1; + } + } + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + double pois = E_one/(2.0*G_one) - 1.0; + double alpha_one = 1.2728-4.2783*cor_one+11.087*cor_one*cor_one-22.348*cor_one*cor_one*cor_one+27.467*cor_one*cor_one*cor_one*cor_one-18.022*cor_one*cor_one*cor_one*cor_one*cor_one+4.8218*cor_one*cor_one*cor_one*cor_one*cor_one*cor_one; + + for (int j = MAX(jlo,i); j <= jhi; j++) { + E[i][j] = E_one; + G[i][j] = G_one; + if (normaldamp_one == TSUJI) { + normaldamp[i][j] = TSUJI; + alpha[i][j] = alpha_one; + } + else if (normaldamp_one == BRILLIANTOV) { + normaldamp[i][j] = BRILLIANTOV; + gamman[i][j] = cor_one; + } + if (rollingdamp_one == INDEP) { + rollingdamp[i][j] = INDEP; + } + else if (rollingdamp_one == BRILLROLL) { + rollingdamp[i][j] = BRILLROLL; + } + muS[i][j] = muS_one; + Ecoh[i][j] = Ecoh_one; + kR[i][j] = kR_one; + etaR[i][j] = etaR_one; + muR[i][j] = muR_one; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients1"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairGranular::init_style() +{ + int i; + + // error and warning checks + + if (!atom->radius_flag || !atom->rmass_flag) + error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair granular requires ghost atoms store velocity"); + + // need a granular neigh list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->size = 1; + if (history) neighbor->requests[irequest]->history = 1; + + dt = update->dt; + + // if history is stored: + // if first init, create Fix needed for storing history + + if (history && fix_history == NULL) { + char dnumstr[16]; + sprintf(dnumstr,"%d",size_history); + char **fixarg = new char*[4]; + fixarg[0] = (char *) "NEIGH_HISTORY"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "NEIGH_HISTORY"; + fixarg[3] = dnumstr; + modify->add_fix(4,fixarg,1); + delete [] fixarg; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; + fix_history->pair = this; + } + + // check for FixFreeze and set freeze_group_bit + + for (i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"freeze") == 0) break; + if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; + else freeze_group_bit = 0; + + // check for FixRigid so can extract rigid body masses + + fix_rigid = NULL; + for (i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) break; + if (i < modify->nfix) fix_rigid = modify->fix[i]; + + // check for FixPour and FixDeposit so can extract particle radii + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + // set maxrad_dynamic and maxrad_frozen for each type + // include future FixPour and FixDeposit particles as dynamic + + int itype; + for (i = 1; i <= atom->ntypes; i++) { + onerad_dynamic[i] = onerad_frozen[i] = 0.0; + if (ipour >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[ipour]->extract("radius",itype)); + } + if (idep >= 0) { + itype = i; + onerad_dynamic[i] = + *((double *) modify->fix[idep]->extract("radius",itype)); + } + } + + double *radius = atom->radius; + int *mask = atom->mask; + int *type = atom->type; + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) + if (mask[i] & freeze_group_bit) + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); + else + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); + + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + + // set fix which stores history info + + if (history) { + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairGranular::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + E[i][j] = mix_stiffnessE(E[i][i],E[j][j],G[i][i],G[j][j]); + G[i][j] = mix_stiffnessG(G[i][i],E[j][j],G[i][i],G[j][j]); + if (normaldamp[i][j] == TSUJI) { + alpha[i][j] = mix_geom(alpha[i][i],alpha[j][j]); + } + else if (normaldamp[i][j] == BRILLIANTOV) { + gamman[i][j] = mix_geom(gamman[i][i],gamman[j][j]); + } + muS[i][j] = mix_geom(muS[i][i],muS[j][j]); + Ecoh[i][j] = mix_geom(Ecoh[i][i],Ecoh[j][j]); + kR[i][j] = mix_geom(kR[i][i],kR[j][j]); + etaR[i][j] = mix_geom(etaR[i][i],etaR[j][j]); + muR[i][j] = mix_geom(muR[i][i],muR[j][j]); + } + + E[j][i] = E[i][j]; + G[j][i] = G[i][j]; + normaldamp[j][i] = normaldamp[i][j]; + alpha[j][i] = alpha[i][j]; + gamman[j][i] = gamman[i][j]; + rollingdamp[j][i] = rollingdamp[i][j]; + muS[j][i] = muS[i][j]; + Ecoh[j][i] = Ecoh[i][j]; + kR[j][i] = kR[i][j]; + etaR[j][i] = etaR[i][j]; + muR[j][i] = muR[i][j]; + + double cutoff = cut[i][j]; + + // It is likely that cut[i][j] at this point is still 0.0. This can happen when + // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates + // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size + // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only + // if there is no current information about radius/cutoff of type i and j). + // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. + + if (cut[i][j] < 0.0) { + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); + } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + return cutoff; +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranular::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&E[i][j],sizeof(double),1,fp); + fwrite(&G[i][j],sizeof(double),1,fp); + fwrite(&normaldamp[i][j],sizeof(int),1,fp); + fwrite(&rollingdamp[i][j],sizeof(int),1,fp); + fwrite(&alpha[i][j],sizeof(double),1,fp); + fwrite(&gamman[i][j],sizeof(double),1,fp); + fwrite(&muS[i][j],sizeof(double),1,fp); + fwrite(&Ecoh[i][j],sizeof(double),1,fp); + fwrite(&kR[i][j],sizeof(double),1,fp); + fwrite(&muR[i][j],sizeof(double),1,fp); + fwrite(&etaR[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranular::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&E[i][j],sizeof(double),1,fp); + fread(&G[i][j],sizeof(double),1,fp); + fread(&normaldamp[i][j],sizeof(int),1,fp); + fread(&rollingdamp[i][j],sizeof(int),1,fp); + fread(&alpha[i][j],sizeof(double),1,fp); + fread(&gamman[i][j],sizeof(double),1,fp); + fread(&muS[i][j],sizeof(double),1,fp); + fread(&Ecoh[i][j],sizeof(double),1,fp); + fread(&kR[i][j],sizeof(double),1,fp); + fread(&muR[i][j],sizeof(double),1,fp); + fread(&etaR[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&E[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&G[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&normaldamp[i][j],1,MPI_INT,0,world); + MPI_Bcast(&rollingdamp[i][j],1,MPI_INT,0,world); + MPI_Bcast(&alpha[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&muS[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&Ecoh[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&kR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&muR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&etaR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranular::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranular::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_global,sizeof(double),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void PairGranular::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- */ + +double PairGranular::single(int i, int j, int itype, int jtype, + double rsq, double factor_coul, double factor_lj, double &fforce) +{ + // feenableexcept(FE_INVALID | FE_OVERFLOW); + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double overlap, a; + double mi,mj,meff,damp,kn,kt; + double Fdamp,Fne,Fntot,Fscrit; + double eta_N,eta_T; + double vtr1,vtr2,vtr3,vrel; + double fs1,fs2,fs3,fs; + double shrmag; + double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; + double keyterm, keyterm2, keyterm3, aovera0, foverFc; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + R = radi*radj/(radi+radj); + a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); + delta_C = 0.5*a0*a0*POW6ONE/R; + + int *touch = fix_history->firstflag[i]; + if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| + (rsq >= radsum*radsum && touch[j])){ + fforce = 0.0; + svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + return 0.0; + } + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + + // normal force = JKR + F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + overlap = radsum - r; + olapsq = overlap*overlap; + olapcubed = olapsq*olapsq; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,ONETHIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = POW6TWO * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 + a = aovera0*a0; + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + + Fne = F_C*foverFc; + + //Damping + kn = 4.0/3.0*E[itype][jtype]*a; + if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; + else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); + + Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + + Fntot = Fne + Fdamp; + + // relative velocities + + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // history effects + // neighprev = index of found neigh on previous call + // search entire jnum list of neighbors of I for neighbor J + // start from neighprev, since will typically be next neighbor + // reset neighprev to 0 as necessary + + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allhistory = fix_history->firstvalue[i]; + + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + + double *history = &allhistory[3*neighprev]; + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // tangential forces = history + tangential velocity damping + kt=8.0*G[itype][jtype]*a; + + eta_T = eta_N; + fs1 = -kt*history[0] - eta_T*vtr1; + fs2 = -kt*history[1] - eta_T*vtr2; + fs3 = -kt*history[2] - eta_T*vtr3; + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); + + if (fs > Fscrit) { + if (shrmag != 0.0) { + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + fs *= Fscrit/fs; + } else fs1 = fs2 = fs3 = fs = 0.0; + } + + // set all forces and return no energy + + fforce = Fntot; + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = vn1; + svector[5] = vn2; + svector[6] = vn3; + svector[7] = vt1; + svector[8] = vt2; + svector[9] = vt3; + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairGranular::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = mass_rigid[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairGranular::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + mass_rigid[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays + ------------------------------------------------------------------------- */ + +double PairGranular::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + mixing of stiffness (E) +------------------------------------------------------------------------- */ + +double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); +} + +/* ---------------------------------------------------------------------- + mixing of stiffness (G) + ------------------------------------------------------------------------- */ + +double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); +} + +/* ---------------------------------------------------------------------- + mixing of everything else + ------------------------------------------------------------------------- */ + +double PairGranular::mix_geom(double valii, double valjj) +{ + return sqrt(valii*valjj); +} diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h new file mode 100644 index 0000000000..9fbc9acd51 --- /dev/null +++ b/src/GRANULAR/pair_granular.h @@ -0,0 +1,89 @@ +/* ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(granular,PairGranular) + +#else + +#ifndef LMP_PAIR_GRANULAR_H +#define LMP_PAIR_GRANULAR_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGranular : public Pair { +public: + PairGranular(class LAMMPS *); + virtual ~PairGranular(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void reset_dt(); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double memory_usage(); + + protected: + double cut_global; + double dt; + int freeze_group_bit; + int history; + + int neighprev; + double *onerad_dynamic,*onerad_frozen; + double *maxrad_dynamic,*maxrad_frozen; + + class FixNeighHistory *fix_history; + + // storage of rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid + + virtual void allocate(); + + private: + int size_history; + int num_coeffs; + double ***coeffs; + + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); + double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); + double mix_geom(double valii, double valjj); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ From fd8130859b9dc840af8d4b459c7de3d055be5c60 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 19 Dec 2018 17:40:35 -0700 Subject: [PATCH 011/243] fix a small memory leak in SHAKE setup --- src/RIGID/fix_shake.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 66c92d42c5..51121f0853 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -955,7 +955,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set shake_flag,shake_atom,shake_type for non-central atoms - // requires communication for off-proc atoms + // requires rendezvous communication for off-proc atoms // ----------------------------------------------------- shake_info(npartner,partner_tag,partner_shake); @@ -964,6 +964,9 @@ void FixShake::find_clusters() // free local memory // ----------------------------------------------------- + memory->destroy(atomIDs); + memory->destroy(procowner); + memory->destroy(npartner); memory->destroy(nshake); memory->destroy(partner_tag); @@ -1390,24 +1393,24 @@ int FixShake::rendezvous_ids(int n, char *inbuf, FixShake *fsptr = (FixShake *) ptr; Memory *memory = fsptr->memory; - int *procowner; tagint *atomIDs; + int *procowner; - memory->create(procowner,n,"special:procowner"); memory->create(atomIDs,n,"special:atomIDs"); + memory->create(procowner,n,"special:procowner"); IDRvous *in = (IDRvous *) inbuf; for (int i = 0; i < n; i++) { - procowner[i] = in[i].me; atomIDs[i] = in[i].atomID; + procowner[i] = in[i].me; } // store rendezvous data in FixShake class fsptr->nrvous = n; - fsptr->procowner = procowner; fsptr->atomIDs = atomIDs; + fsptr->procowner = procowner; // flag = 0: no 2nd irregular comm needed in comm->rendezvous From 7861de03a21da687d813f5f34eaf92dc27787def Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Thu, 20 Dec 2018 16:59:21 -0700 Subject: [PATCH 012/243] Progress on general granular pair style --- src/GRANULAR/pair_granular.cpp | 643 +++++++++++++++++++++++++++------ src/GRANULAR/pair_granular.h | 44 ++- 2 files changed, 564 insertions(+), 123 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 9b693c74b5..73fcb19a8c 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -46,8 +46,12 @@ using namespace MathConst; #define EPSILON 1e-10 -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; +enum {STIFFNESS, MATERIAL}; +enum {VELOCITY, VISCOELASTIC, TSUJI}; +enum {HOOKE, HERTZ, DMT, JKR}; +enum {TANGENTIAL_MINDLIN, TANGENTIAL_NOHISTORY}; +enum {NONE, TWISTING_NOHISTORY, TWISTING_SDS, TWISTING_MARSHALL}; +enum {NONE, ROLLING_NOHISTORY, ROLLING_SDS}; /* ---------------------------------------------------------------------- */ @@ -55,7 +59,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) { single_enable = 1; no_virial_fdotr_compute = 1; - history = 1; + use_history = 1; fix_history = NULL; single_extra = 10; @@ -76,6 +80,10 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) // set comm size needed by this Pair if used with fix rigid comm_forward = 1; + + beyond_contact = 0; + rolling_history_index = twisting_history_index = 0; + tangential_history_index = -1; } /* ---------------------------------------------------------------------- */ @@ -108,9 +116,194 @@ PairGranular::~PairGranular() } memory->destroy(mass_rigid); } -/* ---------------------------------------------------------------------- */ -void PairGranular::compute(int eflag, int vflag) +void PairGranular::compute(int eflag, int vflag){ + /* +#ifdef TEMPLATED_PAIR_GRANULAR + if (normal == 0){ + if (damping == 0){ + if (tangential == 0){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,0,0,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,0,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,0,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,0,0,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,0,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,0,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,0,0,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,0,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,0,2,2>(eflag, vflag); + } + } + else if (tangential == 1){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,0,1,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,1,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,1,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,0,1,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,1,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,1,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,0,1,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,1,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,1,2,2>(eflag, vflag); + } + } + else if (tangential == 2){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,0,2,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,2,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,2,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,0,2,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,2,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,2,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,0,2,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,0,2,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,0,2,2,2>(eflag, vflag); + } + } + } + else if (damping == 1){ + if (tangential == 0){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,1,0,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,0,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,0,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,1,0,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,0,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,0,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,1,0,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,0,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,0,2,2>(eflag, vflag); + } + } + else if (tangential == 1){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,1,1,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,1,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,1,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,1,1,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,1,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,1,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,1,1,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,1,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,1,2,2>(eflag, vflag); + } + } + else if (tangential == 2){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,1,2,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,2,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,2,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,1,2,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,2,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,2,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,1,2,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,1,2,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,1,2,2,2>(eflag, vflag); + } + } + } + else if (damping == 2){ + if (tangential == 0){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,2,0,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,0,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,0,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,2,0,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,0,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,0,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,2,0,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,0,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,0,2,2>(eflag, vflag); + } + } + else if (tangential == 1){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,2,1,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,1,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,1,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,2,1,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,1,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,1,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,2,1,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,1,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,1,2,2>(eflag, vflag); + } + } + else if (tangential == 2){ + if (rolling == 0){ + if (twisting == 0) compute_templated<0,0,2,2,0,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,2,0,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,2,0,2>(eflag, vflag); + } + else if (rolling == 1){ + if (twisting == 0) compute_templated<0,0,2,2,1,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,2,1,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,2,1,2>(eflag, vflag); + } + else if (rolling == 2){ + if (twisting == 0) compute_templated<0,0,2,2,2,0>(eflag, vflag); + else if (twisting == 1) compute_templated<0,0,2,2,2,1>(eflag, vflag); + else if (twisting == 2) compute_templated<0,0,2,2,2,2>(eflag, vflag); + } + } + } + } + + + } +#else +#endif +*/ + compute_untemplated(Tp_coeff_types, Tp_normal, Tp_damping, Tp_tangential, + Tp_rolling, Tp_twisting, eflag, vflag); +} +/* ---------------------------------------------------------------------- */ +/*#ifdef TEMPLATED_PAIR_GRANULAR +template < int Tp_coeff_types, + int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_rolling, int Tp_twisting > +void PairGranular::compute_templated(int eflag, int vflag) +#else +*/ +void PairGranular::compute_untemplated + (int Tp_coeff_types, + int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_rolling, int Tp_twisting, + int eflag, int vflag) +//#endif { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; @@ -119,9 +312,13 @@ void PairGranular::compute(int eflag, int vflag) double wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; + double Fne, Fdamp, Fntot, Fscrit, Frcrit; + + //For JKR + double R, R2, coh, delta_pulloff, dist_pulloff, a, E; double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; double keyterm, keyterm2, keyterm3, aovera0, foverFc; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; double rollmag, rolldotn, scalefac; @@ -134,6 +331,8 @@ void PairGranular::compute(int eflag, int vflag) int *touch,**firsttouch; double *history,*allhistory,**firsthistory; + bool untouchflag; + if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = 0; @@ -179,10 +378,18 @@ void PairGranular::compute(int eflag, int vflag) firsttouch = fix_history->firstflag; firsthistory = fix_history->firstvalue; - // loop over neighbors of my atoms + double coh; + double **cohesion; + double **stiffness; + double **damping; + if (Tp_normal == JKR){ + cohesion = coeffs[normal_coeff_inds[4]]; + } + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; + itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -193,7 +400,7 @@ void PairGranular::compute(int eflag, int vflag) jlist = firstneigh[i]; jnum = numneigh[i]; - for (jj = 0; jj < jnum; jj++) { + for (jj = 0; jj < jnum; jj++){ j = jlist[jj]; j &= NEIGHMASK; @@ -204,23 +411,25 @@ void PairGranular::compute(int eflag, int vflag) rsq = delx*delx + dely*dely + delz*delz; radj = radius[j]; radsum = radi + radj; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; + untouchflag = (rsq >= radsum*radsum); - if ((rsq >= radsum*radsum && touch[jj] == 0) || - (rsq >= (radsum+delta_C)*(radsum+delta_C))) { + if (normal[itype][jtype] == JKR){ + R = radi*radj/(radi+radj); + R2 = R*R; + coh = cohesion[itype][jtype]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/R - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum+delta_pulloff; + untouchflag = (rsq >= (dist_pulloff)*(dist_pulloff)); + } + if (untouchflag){ // unset non-touching neighbors - touch[jj] = 0; - history = &allhistory[3*jj]; - history[0] = 0.0; - history[1] = 0.0; - history[2] = 0.0; - - } else { - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; + history = &allhistory[size_history*jj]; + for (int k = 0; k < size_history; k++) history[k] = 0.0; + } + else{ r = sqrt(rsq); rinv = 1.0/r; rsqinv = 1.0/rsq; @@ -260,23 +469,9 @@ void PairGranular::compute(int eflag, int vflag) //**************************************** //Normal force = JKR-adjusted Hertzian contact + damping //**************************************** - if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; - else delta_Cinv = 1.0; - overlap = (radsum - r)*delta_Cinv; - olapsq = overlap*overlap; - olapcubed = olapsq*overlap; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) - - Fne = F_C*foverFc; + if (normal[itype][jtype] == JKR){ + } //Damping kn = 4.0/3.0*E[itype][jtype]*a; if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; @@ -522,18 +717,15 @@ void PairGranular::allocate() setflag[i][j] = 0; memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(E,n+1,n+1,"pair:E"); - memory->create(G,n+1,n+1,"pair:G"); - memory->create(normaldamp,n+1,n+1,"pair:normaldamp"); - memory->create(rollingdamp,n+1,n+1,"pair:rollingdamp"); - memory->create(alpha,n+1,n+1,"pair:alpha"); - memory->create(gamman,n+1,n+1,"pair:gamman"); - memory->create(muS,n+1,n+1,"pair:muS"); - memory->create(Ecoh,n+1,n+1,"pair:Ecoh"); - memory->create(kR,n+1,n+1,"pair:kR"); - memory->create(muR,n+1,n+1,"pair:muR"); - memory->create(etaR,n+1,n+1,"pair:etaR"); + memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); + memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); + memory->create(rolling_coeffs,n+1,n+1,3,"pair:rolling_coeffs"); + memory->create(twisting_coeffs,n+1,n+1,3,"pair:twisting_coeffs"); + + memory->create(normal,n+1,n+1,"pair:normal"); + memory->create(tangential,n+1,n+1,"pair:tangential"); + memory->create(rolling,n+1,n+1,"pair:rolling"); + memory->create(twisting,n+1,n+1,"pair:twisting"); onerad_dynamic = new double[n+1]; onerad_frozen = new double[n+1]; @@ -547,17 +739,135 @@ void PairGranular::allocate() void PairGranular::settings(int narg, char **arg) { - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + if (narg < 5) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; - else cut_global = force->numeric(FLERR,arg[0]); + int iarg = 0; - // reset cutoffs that have been explicitly set - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; + //Some defaults + damping_global = VISCOELASTIC; + coeff_types = STIFFNESS; + tangential_global = -1; //Needs to be explicitly set, since it requires parameters + rolling_global = NONE; + twisting_global = NONE; + tangential_history = rolling_history = twisting_history = 0; + + if (strcmp(arg[iarg], "material") == 0){ + coeff_types = MATERIAL; + iarg += 1; + } + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (coeff_types == MATERIAL) error->all(FLERR,"Illegal pair_coeff command, 'stiffness' coefficients required for Hooke"); + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); + normal_global = HOOKE; + memory->create(normal_coeffs_one, 2, "pair:normal_coeffs_one"); + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += 3; + } + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (coeff_types == MATERIAL) num_coeffs += 1; + if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = HERTZ; + memory->create(normal_coeffs_one, num_coeffs, "pair:normal_coeffs_one"); + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + if (coeff_types == MATERIAL) normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "dmt") == 0){ + if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for DMT"); + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = DMT; + memory->create(normal_coeffs_one, 4, "pair:normal_coeffs_one"); + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); + if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for JKR"); + beyond_contact = 1; + normal_global = JKR; + memory->create(normal_coeffs_one, 4, "pair:normal_coeffs_one"); + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "damp_velocity") == 0){ + damping_global = VELOCITY; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ + damping_global = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_tsuji") == 0){ + damping_global = TSUJI; + iarg += 1; + } + else if (strstr(arg[iarg], "tangential") != NULL){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + tangential_global = TANGENTIAL_NOHISTORY; + } + else{ + tangential_global = TANGENTIAL_MINDLIN; + tangential_history = 1; + } + memory->create(tangential_coeffs_one, 3, "pair:tangential_coeffs_one"); + tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + else if (strstr(arg[iarg], "rolling") != NULL){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + rolling_global = ROLLING_NOHISTORY; + } + else{ + rolling_global = ROLLING_SDS; + rolling_history = 1; + } + memory->create(rolling_coeffs_one, 3, "pair:rolling_coeffs_one"); + rolling_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt + rolling_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + rolling_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + else if (strstr(arg[iarg], "twisting") != NULL){ + if (strstr(arg[iarg], "marshall") != NULL){ + twisting_global = TWISTING_MARSHALL; + twisting_history = 1; + memory->create(twisting_coeffs_one, 3, "pair:twisting_coeffs_one"); //To be filled later + } + else{ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twisting model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + twisting_global = TWISTING_NOHISTORY; + } + else{ + twisting_global = TWISTING_SDS; + twisting_history = 1; + } + memory->create(twisting_coeffs_one, 3, "pair:twisting_coeffs_one"); + twisting_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt + twisting_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + twisting_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + } + } + + //Additional checks + if (tangential_global == -1){ + error->all(FLERR, "Illegal pair_style command: must specify tangential model"); } } @@ -567,8 +877,19 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - if (narg < 10 || narg > 15) - error->all(FLERR,"Incorrect args for pair coefficients2"); + int normal_local, damping_local, tangential_local, rolling_local, twisting_local; + double *normal_coeffs_local; + double *tangential_coeffs_local; + double *rolling_coeffs_local; + double *twisting_coeffs_local; + + normal_coeffs_local = new double[4]; + tangential_coeffs_local = new double[4]; + rolling_coeffs_local = new double[4]; + twisting_coeffs_local = new double[4]; + + if (narg < 2) + error->all(FLERR,"Incorrect args for pair coefficients"); if (!allocated) allocate(); @@ -576,77 +897,149 @@ void PairGranular::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - double E_one = force->numeric(FLERR,arg[2]); - double G_one = force->numeric(FLERR,arg[3]); - double muS_one = force->numeric(FLERR,arg[4]); - double cor_one = force->numeric(FLERR,arg[5]); - double Ecoh_one = force->numeric(FLERR,arg[6]); - double kR_one = force->numeric(FLERR,arg[7]); - double muR_one = force->numeric(FLERR,arg[8]); - double etaR_one = force->numeric(FLERR,arg[9]); - - //Defaults - int normaldamp_one = TSUJI; - int rollingdamp_one = INDEP; - double cut_one = cut_global; - - int iarg = 10; - while (iarg < narg) { - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp_one = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp_one = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; + int iarg = 2; + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (coeff_types == MATERIAL) error->all(FLERR,"Illegal pair_coeff command, 'stiffness' coefficients required for Hooke"); + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); + normal_local = HOOKE; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += 3; } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp_one = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp_one = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg +=2; + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (coeff_types == MATERIAL) num_coeffs += 1; + if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = HERTZ; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + if (coeff_types == MATERIAL) normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') + iarg += num_coeffs+1; } - else { - if (strcmp(arg[iarg],"NULL") == 0) cut_one = -1.0; - else cut_one = force->numeric(FLERR,arg[iarg]); + else if (strcmp(arg[iarg], "dmt") == 0){ + if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_coeff command, 'material' coefficients required for DMT"); + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = DMT; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); + if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_coeff command, 'material' coefficients required for JKR"); + beyond_contact = 1; + normal_local = JKR; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "damp_velocity") == 0){ + damping_local = VELOCITY; iarg += 1; } + else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ + damping_local = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_tsuji") == 0){ + damping_local = TSUJI; + iarg += 1; + } + else if (strstr(arg[iarg], "tangential") != NULL){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + tangential_local = TANGENTIAL_NOHISTORY; + } + else{ + tangential_local = TANGENTIAL_MINDLIN; + tangential_history = 1; + } + tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt + tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + else if (strstr(arg[iarg], "rolling") != NULL){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + rolling_local = ROLLING_NOHISTORY; + } + else{ + rolling_local = ROLLING_SDS; + rolling_history = 1; + } + rolling_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt + rolling_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + rolling_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + else if (strstr(arg[iarg], "twisting") != NULL){ + if (strstr(arg[iarg], "marshall") != NULL){ + twisting_local = TWISTING_MARSHALL; + twisting_history = 1; + } + else{ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twisting model"); + if (strstr(arg[iarg], "nohistory") != NULL){ + twisting_local = TWISTING_NOHISTORY; + } + else{ + twisting_local = TWISTING_SDS; + twisting_history = 1; + size_history += 1; + } + twisting_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt + twisting_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + twisting_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + } } int count = 0; - for (int i = ilo; i <= ihi; i++) { - double pois = E_one/(2.0*G_one) - 1.0; - double alpha_one = 1.2728-4.2783*cor_one+11.087*cor_one*cor_one-22.348*cor_one*cor_one*cor_one+27.467*cor_one*cor_one*cor_one*cor_one-18.022*cor_one*cor_one*cor_one*cor_one*cor_one+4.8218*cor_one*cor_one*cor_one*cor_one*cor_one*cor_one; + double damp; + if (damping_local == TSUJI){ + double cor = normal_coeffs_local[1]; + damp =1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_local[1]; + for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - E[i][j] = E_one; - G[i][j] = G_one; - if (normaldamp_one == TSUJI) { - normaldamp[i][j] = TSUJI; - alpha[i][j] = alpha_one; - } - else if (normaldamp_one == BRILLIANTOV) { - normaldamp[i][j] = BRILLIANTOV; - gamman[i][j] = cor_one; - } - if (rollingdamp_one == INDEP) { - rollingdamp[i][j] = INDEP; - } - else if (rollingdamp_one == BRILLROLL) { - rollingdamp[i][j] = BRILLROLL; - } - muS[i][j] = muS_one; - Ecoh[i][j] = Ecoh_one; - kR[i][j] = kR_one; - etaR[i][j] = etaR_one; - muR[i][j] = muR_one; - cut[i][j] = cut_one; + normal[i][j] = normal_local; + normal_coeffs[i][j][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = damp; + if (coeff_types == MATERIAL) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal_local == JKR) || (normal_local == DMT)) + normal_coeffs[i][j][3] = normal_coeffs_local[3]; + + tangential[i][j] = tangential_local; + if (tangential_local != NONE) + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + + rolling[i][j] = rolling_local; + if (rolling_local != NONE) + for (int k = 0; k < 3; k++) + rolling_coeffs[i][j][k] = tangential_coeffs_local[k]; + + twisting[i][j] = twisting_local; + if (twisting_local != NONE) + for (int k = 0; k < 3; k++) + rolling_coeffs[i][j][k] = tangential_coeffs_local[k]; + setflag[i][j] = 1; count++; } } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients1"); + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } /* ---------------------------------------------------------------------- @@ -751,7 +1144,7 @@ void PairGranular::init_style() // set fix which stores history info - if (history) { + if (size_history > 0) { int ifix = modify->find_fix("NEIGH_HISTORY"); if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); fix_history = (FixNeighHistory *) modify->fix[ifix]; @@ -765,7 +1158,17 @@ void PairGranular::init_style() double PairGranular::init_one(int i, int j) { if (setflag[i][j] == 0) { - E[i][j] = mix_stiffnessE(E[i][i],E[j][j],G[i][i],G[j][j]); + if ((normal[i] != normal[j]) || + (damping[i] != damping[j]) || + (tangential[i] != tangential[j]) || + (rolling[i] != rolling[j]) || + (twisting[i] != twisting[j])){ + + char str[128]; + sprintf(str,"Failed to open FFmpeg pipeline to file %s",filename); + error->one(FLERR,str); + } + G[i][j] = mix_stiffnessG(G[i][i],E[j][j],G[i][i],G[j][j]); if (normaldamp[i][j] == TSUJI) { alpha[i][j] = mix_geom(alpha[i][i],alpha[j][j]); diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 9fbc9acd51..33d28b03bf 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -47,7 +47,7 @@ public: double cut_global; double dt; int freeze_group_bit; - int history; + int use_history; int neighprev; double *onerad_dynamic,*onerad_frozen; @@ -62,11 +62,49 @@ public: int nmax; // allocated size of mass_rigid virtual void allocate(); + int beyond_contact; + + + // comment next line to turn off templating +/*#define TEMPLATED_PAIR_GRANULAR +#ifdef TEMPLATED_PAIR_GRANULAR + template < int Tp_coeff_types, + int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_rolling, int Tp_twisting > + void compute_templated(int eflag, int vflag); +#else +*/ + void compute_untemplated( + int, + int, int, int, + int, int, + int, int); +//#endif private: + int coeff_types; int size_history; - int num_coeffs; - double ***coeffs; + + //Per-type models + int **normal, **damping, **tangential, **rolling, **twisting; + + int normal_global, damping_global; + int tangential_global, rolling_global, twisting_global; + + int tangential_history, rolling_history, twisting_history; + int tangential_history_index; + int rolling_history_index; + int twisting_history_index; + + double *normal_coeffs_one; + double *tangential_coeffs_one; + double *rolling_coeffs_one; + double *twisting_coeffs_one; + + double ***normal_coeffs; + double ***tangential_coeffs; + double ***rolling_coeffs; + double ***twisting_coeffs; double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); From 009d8c8ebf3af1c9d3196192fe2a033af624c6b6 Mon Sep 17 00:00:00 2001 From: dsbolin Date: Fri, 21 Dec 2018 09:29:47 -0700 Subject: [PATCH 013/243] Added parsing to pair_coeff, added for for init_one --- src/GRANULAR/pair_granular.cpp | 174 +++++++++++++++++++++------------ src/GRANULAR/pair_granular.h | 8 +- 2 files changed, 114 insertions(+), 68 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 73fcb19a8c..a94575185a 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -493,8 +493,6 @@ void PairGranular::compute_untemplated vt3 = vr3 - vn3; // relative rotational velocity - // Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - // delta/2, i.e. instead of radi, use distance to center of contact point? wr1 = (radi*omega[i][0] + radj*omega[j][0]); wr2 = (radi*omega[i][1] + radj*omega[j][1]); wr3 = (radi*omega[i][2] + radj*omega[j][2]); @@ -508,7 +506,7 @@ void PairGranular::compute_untemplated // history effects touch[jj] = 1; - history = &allhistory[3*jj]; + history = &allhistory[size_history*jj]; shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -760,9 +758,9 @@ void PairGranular::settings(int narg, char **arg) if (coeff_types == MATERIAL) error->all(FLERR,"Illegal pair_coeff command, 'stiffness' coefficients required for Hooke"); if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); normal_global = HOOKE; - memory->create(normal_coeffs_one, 2, "pair:normal_coeffs_one"); - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0){ @@ -770,21 +768,21 @@ void PairGranular::settings(int narg, char **arg) if (coeff_types == MATERIAL) num_coeffs += 1; if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = HERTZ; - memory->create(normal_coeffs_one, num_coeffs, "pair:normal_coeffs_one"); - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - if (coeff_types == MATERIAL) normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') + memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + if (coeff_types == MATERIAL) normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0){ if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for DMT"); if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = DMT; - memory->create(normal_coeffs_one, 4, "pair:normal_coeffs_one"); - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0){ @@ -792,11 +790,11 @@ void PairGranular::settings(int narg, char **arg) if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for JKR"); beyond_contact = 1; normal_global = JKR; - memory->create(normal_coeffs_one, 4, "pair:normal_coeffs_one"); - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "damp_velocity") == 0){ @@ -820,10 +818,10 @@ void PairGranular::settings(int narg, char **arg) tangential_global = TANGENTIAL_MINDLIN; tangential_history = 1; } - memory->create(tangential_coeffs_one, 3, "pair:tangential_coeffs_one"); - tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt - tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + memory->create(tangential_coeffs_global, 3, "pair:tangential_coeffs_global"); + tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt + tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } else if (strstr(arg[iarg], "rolling") != NULL){ @@ -835,17 +833,17 @@ void PairGranular::settings(int narg, char **arg) rolling_global = ROLLING_SDS; rolling_history = 1; } - memory->create(rolling_coeffs_one, 3, "pair:rolling_coeffs_one"); - rolling_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt - rolling_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - rolling_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + memory->create(rolling_coeffs_global, 3, "pair:rolling_coeffs_global"); + rolling_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt + rolling_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + rolling_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } else if (strstr(arg[iarg], "twisting") != NULL){ if (strstr(arg[iarg], "marshall") != NULL){ twisting_global = TWISTING_MARSHALL; twisting_history = 1; - memory->create(twisting_coeffs_one, 3, "pair:twisting_coeffs_one"); //To be filled later + memory->create(twisting_coeffs_global, 3, "pair:twisting_coeffs_global"); //To be filled later } else{ if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twisting model"); @@ -856,15 +854,60 @@ void PairGranular::settings(int narg, char **arg) twisting_global = TWISTING_SDS; twisting_history = 1; } - memory->create(twisting_coeffs_one, 3, "pair:twisting_coeffs_one"); - twisting_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kt - twisting_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - twisting_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + memory->create(twisting_coeffs_global, 3, "pair:twisting_coeffs_global"); + twisting_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt + twisting_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + twisting_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } } } + //Set all i-i entrie, which may be replaced by pair coeff commands + //It may also make sense to consider removing all of the above, and only + // having the option for pair_coeff to set the parameters, similar to most LAMMPS pair styles + // The reason for the current setup is to keep true to existing pair gran/hooke etc. syntax, + // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. + allocate(); + double damp; + for (int i = 1; i <= atom->ntypes; i++){ + normal[i][i] = normal_global; + damping[i][i] = damping_global; + tangential[i][i] = tangential_global; + rolling[i][i] = rolling_global; + twisting[i][i] = twisting_global; + + if (damping_global == TSUJI){ + double cor = normal_coeffs_global[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_global[1]; + normal_coeffs[i][i][0] = normal_coeffs_global[0]; + normal_coeffs[i][i][1] = damp; + if (coeff_types == MATERIAL) normal_coeffs[i][i][2] = normal_coeffs_global[2]; + if ((normal_global == JKR) || (normal_global == DMT)) + normal_coeffs[i][i][3] = normal_coeffs_global[3]; + + tangential[i][i] = tangential_global; + if (tangential_global != NONE) + for (int k = 0; k < 3; k++) + tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; + + rolling[i][i] = rolling_global; + if (rolling_global != NONE) + for (int k = 0; k < 3; k++) + rolling_coeffs[i][i][k] = rolling_coeffs_global[k]; + + twisting[i][i] = twisting_global; + if (twisting_global != NONE) + for (int k = 0; k < 3; k++) + twisting_coeffs[i][i][k] = twisting_coeffs_local[k]; + + setflag[i][i] = 1; + } + //Additional checks if (tangential_global == -1){ error->all(FLERR, "Illegal pair_style command: must specify tangential model"); @@ -1005,7 +1048,7 @@ void PairGranular::coeff(int narg, char **arg) double damp; if (damping_local == TSUJI){ double cor = normal_coeffs_local[1]; - damp =1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ 27.467*pow(cor,4)-18.022*pow(cor,5)+ 4.8218*pow(cor,6); } @@ -1028,12 +1071,12 @@ void PairGranular::coeff(int narg, char **arg) rolling[i][j] = rolling_local; if (rolling_local != NONE) for (int k = 0; k < 3; k++) - rolling_coeffs[i][j][k] = tangential_coeffs_local[k]; + rolling_coeffs[i][j][k] = rolling_coeffs_local[k]; twisting[i][j] = twisting_local; if (twisting_local != NONE) - for (int k = 0; k < 3; k++) - rolling_coeffs[i][j][k] = tangential_coeffs_local[k]; + for (int k = 0; k < 3; k++) + twisting_coeffs[i][j][k] = twisting_coeffs_local[k]; setflag[i][j] = 1; count++; @@ -1164,36 +1207,39 @@ double PairGranular::init_one(int i, int j) (rolling[i] != rolling[j]) || (twisting[i] != twisting[j])){ - char str[128]; - sprintf(str,"Failed to open FFmpeg pipeline to file %s",filename); - error->one(FLERR,str); + char str[512]; + sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); + error->one(FLERR,str); } - G[i][j] = mix_stiffnessG(G[i][i],E[j][j],G[i][i],G[j][j]); - if (normaldamp[i][j] == TSUJI) { - alpha[i][j] = mix_geom(alpha[i][i],alpha[j][j]); + if (coeff_types == MATERIAL){ + normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); } - else if (normaldamp[i][j] == BRILLIANTOV) { - gamman[i][j] = mix_geom(gamman[i][i],gamman[j][j]); + else{ + normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0];) } - muS[i][j] = mix_geom(muS[i][i],muS[j][j]); - Ecoh[i][j] = mix_geom(Ecoh[i][i],Ecoh[j][j]); - kR[i][j] = mix_geom(kR[i][i],kR[j][j]); - etaR[i][j] = mix_geom(etaR[i][i],etaR[j][j]); - muR[i][j] = mix_geom(muR[i][i],muR[j][j]); - } - E[j][i] = E[i][j]; - G[j][i] = G[i][j]; - normaldamp[j][i] = normaldamp[i][j]; - alpha[j][i] = alpha[i][j]; - gamman[j][i] = gamman[i][j]; - rollingdamp[j][i] = rollingdamp[i][j]; - muS[j][i] = muS[i][j]; - Ecoh[j][i] = Ecoh[i][j]; - kR[j][i] = kR[i][j]; - etaR[j][i] = etaR[i][j]; - muR[j][i] = muR[i][j]; + normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1];) + if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) + normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + + if (tangential[i][i] != NONE){ + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + } + + if (rolling[i][i] != NONE){ + for (int k = 0; k < 3; k++) + rolling_coeffs[i][j][k] = mix_geom(rolling_coeffs[i][i][k], rolling_coeffs[j][j][k]); + } + + if (twisting[i][i] != NONE){ + for (int k = 0; k < 3; k++) + twisting_coeffs[i][j][k] = mix_geom(twisting_coeffs[i][i][k], twisting_coeffs[j][j][k]); + } double cutoff = cut[i][j]; @@ -1559,7 +1605,7 @@ double PairGranular::memory_usage() } /* ---------------------------------------------------------------------- - mixing of stiffness (E) + mixing of Young's modulus (E) ------------------------------------------------------------------------- */ double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) @@ -1570,7 +1616,7 @@ double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double G } /* ---------------------------------------------------------------------- - mixing of stiffness (G) + mixing of shear modulus (G) ------------------------------------------------------------------------- */ double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 33d28b03bf..0ad36d85c7 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -96,10 +96,10 @@ public: int rolling_history_index; int twisting_history_index; - double *normal_coeffs_one; - double *tangential_coeffs_one; - double *rolling_coeffs_one; - double *twisting_coeffs_one; + double *normal_coeffs_global; + double *tangential_coeffs_global; + double *rolling_coeffs_global; + double *twisting_coeffs_global; double ***normal_coeffs; double ***tangential_coeffs; From 71ed60ced31a741b708c114c221257237d2421de Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Fri, 21 Dec 2018 15:41:46 -0700 Subject: [PATCH 014/243] More work on compute method for generalized pair granular --- src/GRANULAR/pair_granular.cpp | 502 +++++++++++++-------------------- src/GRANULAR/pair_granular.h | 22 +- 2 files changed, 199 insertions(+), 325 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index a94575185a..dd124671e0 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -39,10 +39,12 @@ Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), using namespace LAMMPS_NS; using namespace MathConst; -#define ONETHIRD 0.33333333333333333 -#define TWOTHIRDS 0.66666666666666666 -#define POW6ONE 0.550321208149104 //6^(-1/3) -#define POW6TWO 0.30285343213869 //6^(-2/3) +#define PI27SQ 266.47931882941264802866 // 27*PI**2 +#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) +#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) +#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) +#define FOURTHIRDS 1.333333333333333 // 4/3 +#define TWOPI 6.28318530717959 // 2*PI #define EPSILON 1e-10 @@ -97,17 +99,6 @@ PairGranular::~PairGranular() memory->destroy(cutsq); memory->destroy(cut); - memory->destroy(E); - memory->destroy(G); - memory->destroy(normaldamp); - memory->destroy(rollingdamp); - memory->destroy(alpha); - memory->destroy(gamman); - memory->destroy(muS); - memory->destroy(Ecoh); - memory->destroy(kR); - memory->destroy(muR); - memory->destroy(etaR); delete [] onerad_dynamic; delete [] onerad_frozen; @@ -117,215 +108,38 @@ PairGranular::~PairGranular() memory->destroy(mass_rigid); } -void PairGranular::compute(int eflag, int vflag){ - /* -#ifdef TEMPLATED_PAIR_GRANULAR - if (normal == 0){ - if (damping == 0){ - if (tangential == 0){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,0,0,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,0,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,0,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,0,0,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,0,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,0,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,0,0,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,0,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,0,2,2>(eflag, vflag); - } - } - else if (tangential == 1){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,0,1,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,1,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,1,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,0,1,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,1,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,1,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,0,1,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,1,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,1,2,2>(eflag, vflag); - } - } - else if (tangential == 2){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,0,2,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,2,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,2,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,0,2,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,2,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,2,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,0,2,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,0,2,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,0,2,2,2>(eflag, vflag); - } - } - } - else if (damping == 1){ - if (tangential == 0){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,1,0,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,0,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,0,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,1,0,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,0,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,0,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,1,0,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,0,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,0,2,2>(eflag, vflag); - } - } - else if (tangential == 1){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,1,1,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,1,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,1,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,1,1,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,1,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,1,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,1,1,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,1,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,1,2,2>(eflag, vflag); - } - } - else if (tangential == 2){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,1,2,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,2,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,2,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,1,2,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,2,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,2,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,1,2,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,1,2,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,1,2,2,2>(eflag, vflag); - } - } - } - else if (damping == 2){ - if (tangential == 0){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,2,0,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,0,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,0,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,2,0,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,0,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,0,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,2,0,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,0,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,0,2,2>(eflag, vflag); - } - } - else if (tangential == 1){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,2,1,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,1,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,1,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,2,1,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,1,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,1,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,2,1,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,1,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,1,2,2>(eflag, vflag); - } - } - else if (tangential == 2){ - if (rolling == 0){ - if (twisting == 0) compute_templated<0,0,2,2,0,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,2,0,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,2,0,2>(eflag, vflag); - } - else if (rolling == 1){ - if (twisting == 0) compute_templated<0,0,2,2,1,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,2,1,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,2,1,2>(eflag, vflag); - } - else if (rolling == 2){ - if (twisting == 0) compute_templated<0,0,2,2,2,0>(eflag, vflag); - else if (twisting == 1) compute_templated<0,0,2,2,2,1>(eflag, vflag); - else if (twisting == 2) compute_templated<0,0,2,2,2,2>(eflag, vflag); - } - } - } - } - - - } -#else -#endif -*/ - compute_untemplated(Tp_coeff_types, Tp_normal, Tp_damping, Tp_tangential, - Tp_rolling, Tp_twisting, eflag, vflag); -} -/* ---------------------------------------------------------------------- */ -/*#ifdef TEMPLATED_PAIR_GRANULAR -template < int Tp_coeff_types, - int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_rolling, int Tp_twisting > -void PairGranular::compute_templated(int eflag, int vflag) -#else -*/ -void PairGranular::compute_untemplated - (int Tp_coeff_types, - int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_rolling, int Tp_twisting, - int eflag, int vflag) -//#endif +void PairGranular::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; + double radi,radj,radsum,rsq,r,rinv,rsqinv; + double Reff, delta, dR, dR2, sqdR, knfac; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; + + double damp_normal, damp_tangential; + double kt; double Fne, Fdamp, Fntot, Fscrit, Frcrit; //For JKR - double R, R2, coh, delta_pulloff, dist_pulloff, a, E; - double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; + double R2, coh, delta_pulloff, dist_pulloff, a, a2, E; + double delta, t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; double mi,mj,meff,damp,ccel,tor1,tor2,tor3; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + //Rolling double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; + + //Twisting double signtwist, magtwist, magtortwist, Mtcrit; double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; double tortwist1, tortwist2, tortwist3; + double shrmag,rsht; int *ilist,*jlist,*numneigh,**firstneigh; int *touch,**firsttouch; @@ -378,15 +192,6 @@ void PairGranular::compute_untemplated firsttouch = fix_history->firstflag; firsthistory = fix_history->firstvalue; - double coh; - double **cohesion; - double **stiffness; - double **damping; - if (Tp_normal == JKR){ - cohesion = coeffs[normal_coeff_inds[4]]; - } - - for (ii = 0; ii < inum; ii++) { i = ilist[ii]; itype = type[i]; @@ -413,12 +218,13 @@ void PairGranular::compute_untemplated radsum = radi + radj; untouchflag = (rsq >= radsum*radsum); + E = normal_coeffs[itype][jtype][0]; + Reff = radi*radj/(radi+radj); if (normal[itype][jtype] == JKR){ - R = radi*radj/(radi+radj); - R2 = R*R; - coh = cohesion[itype][jtype]; + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/R - 2*sqrt(M_PI*coh*a/E); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum+delta_pulloff; untouchflag = (rsq >= (dist_pulloff)*(dist_pulloff)); } @@ -466,22 +272,52 @@ void PairGranular::compute_untemplated if (mask[i] & freeze_group_bit) meff = mj; if (mask[j] & freeze_group_bit) meff = mi; - //**************************************** - //Normal force = JKR-adjusted Hertzian contact + damping - //**************************************** + delta = radsum - r; + if (normal[itype][jtype] == JKR){ - + dR = delta*Reff; + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); } - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + else if (normal[itype][jtype] != HOOKE){ //HERTZ, DMT + a = sqdR = sqrt(dR); + knfac = FOURTHIRDS*E*sqdR; + Fne = knfac*delta; + } + else{ //Hooke + knfac = FOURTHIRDS*E; + Fne = knfac*delta; + } + + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (damping[itype][jtype] == VELOCITY){ + damp_normal = normal_coeffs[itype][jtype][1]; + } + else if (damping[itype][jtype] == VISCOELASTIC){ + if (normal[itype][jtype] == HOOKE) sqdR = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; + } + else if (damping[itype][jtype] == TSUJI){ + damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + } + + Fdamp = -damp_normal*vnnr; Fntot = Fne + Fdamp; - //if (screen) fprintf(screen,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); - //if (logfile) fprintf(logfile,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); //**************************************** //Tangential force, including history effects @@ -505,54 +341,58 @@ void PairGranular::compute_untemplated vrel = sqrt(vrel); // history effects - touch[jj] = 1; - history = &allhistory[size_history*jj]; - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); + if (tangential_history[itype][jtype]){ + touch[jj] = 1; + history = &allhistory[size_history*jj]; + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); - // Rotate and update displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (historyupdate) { - rsht = history[0]*nx + history[1]*ny + history[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - history[0] -= rsht*nx; - history[1] -= rsht*ny; - history[2] -= rsht*nz; - //Also rescale to preserve magnitude - history[0] *= scalefac; - history[1] *= scalefac; - history[2] *= scalefac; + // Rotate and update displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (historyupdate) { + rsht = history[0]*nx + history[1]*ny + history[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + history[0] -= rsht*nx; + history[1] -= rsht*ny; + history[2] -= rsht*nz; + //Also rescale to preserve magnitude + history[0] *= scalefac; + history[1] *= scalefac; + history[2] *= scalefac; + } + //Update history + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; } - //Update history - history[0] += vtr1*dt; - history[1] += vtr2*dt; - history[2] += vtr3*dt; - } - // tangential forces = history + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; + // tangential forces = history + tangential velocity damping + if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); + kt=tangential_coeffs[itype][jtype][0]*a; - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*history[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*history[1] - eta_T*vtr2; - fs3 = -kt*history[2] - eta_T*vtr3; + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + fs1 = -kt*history[0] - damp_tangential*vtr1; + fs2 = -kt*history[1] - damp_tangential*vtr2; + fs3 = -kt*history[2] - damp_tangential*vtr3; - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + // rescale frictional displacements and forces if needed + if (normal[itype][jtype] == JKR){ + double Fpulloff = -3*M_PI*coh*Reff; + Fscrit = tangential_coeffs[itype][jtype][2] * fabs(Fne + 2*Fpulloff); + } + else{ + Fscrit = tangential_coeffs[itype][jtype][2] * fabs(Fne); + } + // For JKR, use eq 43 of Marshall. For DMT, use Fne instead fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { - //history[0] = (Fcrit/fs) * (history[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //history[1] = (Fcrit/fs) * (history[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //history[2] = (Fcrit/fs) * (history[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - history[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - history[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - history[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); + history[0] = -1.0/kt*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/kt*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/kt*(Fscrit*fs3/fs + damp_tangential*vtr3); fs1 *= Fscrit/fs; fs2 *= Fscrit/fs; fs3 *= Fscrit/fs; @@ -715,6 +555,7 @@ void PairGranular::allocate() setflag[i][j] = 0; memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); memory->create(rolling_coeffs,n+1,n+1,3,"pair:rolling_coeffs"); @@ -770,6 +611,7 @@ void PairGranular::settings(int narg, char **arg) normal_global = HERTZ; memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E + if (coeff_types == STIFFNESS) normal_coeffs_global[0] /= FOURTHIRDS; normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping if (coeff_types == MATERIAL) normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') iarg += num_coeffs+1; @@ -956,6 +798,7 @@ void PairGranular::coeff(int narg, char **arg) if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_local = HERTZ; normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E + if (coeff_types == STIFFNESS) normal_coeffs_local[0] /= FOURTHIRDS; normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping if (coeff_types == MATERIAL) normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') iarg += num_coeffs+1; @@ -1079,6 +922,8 @@ void PairGranular::coeff(int narg, char **arg) twisting_coeffs[i][j][k] = twisting_coeffs_local[k]; setflag[i][j] = 1; + double cut_one; + count++; } } @@ -1100,18 +945,36 @@ void PairGranular::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - // need a granular neigh list + // Determine whether we need a granular neigh list, how large it needs to be + history_flag = tangential_history || rolling_history || twisting_history; + size_history = 3*tangential_history + 3*rolling_history + twisting_history; + + //Determine location of tangential/rolling/twisting histories in array + if (rolling_history){ + if (tangential_history) rolling_history_index = 3; + else rolling_history_index = 0; + } + if (twisting_history){ + if (tangential_history){ + if (rolling_history) twisting_history_index = 6; + else twisting_history_index = 3; + } + else{ + if (rolling_history) twisting_history_index = 3; + else twisting_history_index = 0; + } + } int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->size = 1; - if (history) neighbor->requests[irequest]->history = 1; + if (history_flag) neighbor->requests[irequest]->history = 1; dt = update->dt; // if history is stored: // if first init, create Fix needed for storing history - if (history && fix_history == NULL) { + if (history_flag && fix_history == NULL) { char dnumstr[16]; sprintf(dnumstr,"%d",size_history); char **fixarg = new char*[4]; @@ -1159,13 +1022,15 @@ void PairGranular::init_style() onerad_dynamic[i] = onerad_frozen[i] = 0.0; if (ipour >= 0) { itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[ipour]->extract("radius",itype)); + double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); + if (normal[itype][itype] == JKR) radmax = radmax + 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; } if (idep >= 0) { itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[idep]->extract("radius",itype)); + double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); + if (normal[itype][itype] == JKR) radmax = radmax + 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; } } @@ -1174,11 +1039,18 @@ void PairGranular::init_style() int *type = atom->type; int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (mask[i] & freeze_group_bit) - onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); - else - onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); + for (i = 0; i < nlocal; i++){ + double radius_cut = radius[i]; + if (normal[type[i]][type[i]] == JKR){ + radius_cut = radius[i] + 0.5*pulloff_distance(radius[i], type[i]); + } + if (mask[i] & freeze_group_bit){ + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); + } + else{ + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); + } + } MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, MPI_DOUBLE,MPI_MAX,world); @@ -1187,7 +1059,7 @@ void PairGranular::init_style() // set fix which stores history info - if (size_history > 0) { + if (size_history > 0){ int ifix = modify->find_fix("NEIGH_HISTORY"); if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); fix_history = (FixNeighHistory *) modify->fix[ifix]; @@ -1219,10 +1091,11 @@ double PairGranular::init_one(int i, int j) normal_coeffs[i][i][2], normal_coeffs[j][j][2]); } else{ - normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0];) + normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + if (normal[i][j] == HERTZ) normal_coeffs[i][j][0] /= FOURTHIRDS; } - normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1];) + normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); @@ -1240,32 +1113,31 @@ double PairGranular::init_one(int i, int j) for (int k = 0; k < 3; k++) twisting_coeffs[i][j][k] = mix_geom(twisting_coeffs[i][i][k], twisting_coeffs[j][j][k]); } + } - double cutoff = cut[i][j]; - - // It is likely that cut[i][j] at this point is still 0.0. This can happen when + // It is possible that cut[i][j] at this point is still 0.0. This can happen when // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size - // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only + // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only // if there is no current information about radius/cutoff of type i and j). - // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. + // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - if (cut[i][j] < 0.0) { - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + return cutoff; } @@ -1628,9 +1500,25 @@ double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double G /* ---------------------------------------------------------------------- mixing of everything else - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ double PairGranular::mix_geom(double valii, double valjj) { - return sqrt(valii*valjj); + return sqrt(valii*valjj); } + + +/* ---------------------------------------------------------------------- + Compute pull-off distance (beyond contact) for a given radius and atom type +------------------------------------------------------------------------- */ + +double PairGranular::pulloff_distance(double radius, int itype) +{ + double R, E, coh, a, delta_pulloff; + coh = normal_coeffs[itype][itype][3]; + E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], + normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); + a = cbrt(9*M_PI*coh*R*R/(4*E)); + return a*a/R - 2*sqrt(M_PI*coh*a/E); +} + diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 0ad36d85c7..14cc02675b 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -52,6 +52,7 @@ public: int neighprev; double *onerad_dynamic,*onerad_frozen; double *maxrad_dynamic,*maxrad_frozen; + double **cut; class FixNeighHistory *fix_history; @@ -64,24 +65,7 @@ public: virtual void allocate(); int beyond_contact; - - // comment next line to turn off templating -/*#define TEMPLATED_PAIR_GRANULAR -#ifdef TEMPLATED_PAIR_GRANULAR - template < int Tp_coeff_types, - int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_rolling, int Tp_twisting > - void compute_templated(int eflag, int vflag); -#else -*/ - void compute_untemplated( - int, - int, int, int, - int, int, - int, int); -//#endif - - private: +private: int coeff_types; int size_history; @@ -91,6 +75,7 @@ public: int normal_global, damping_global; int tangential_global, rolling_global, twisting_global; + int history_flag; int tangential_history, rolling_history, twisting_history; int tangential_history_index; int rolling_history_index; @@ -109,6 +94,7 @@ public: double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); double mix_geom(double valii, double valjj); + double pulloff_distance(double radius, int itype); }; } From 7b4d0092b0d8694fddc9820f74a70ac3a5f77a36 Mon Sep 17 00:00:00 2001 From: dsbolin Date: Sat, 22 Dec 2018 14:33:09 -0700 Subject: [PATCH 015/243] Added type- and form-dependent conditionals in PairGranular::compute, still some issues with overall structure of the code. --- src/GRANULAR/pair_granular.cpp | 296 ++++++++++++++++++++------------- 1 file changed, 178 insertions(+), 118 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index dd124671e0..ad7759c83a 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -97,9 +97,19 @@ PairGranular::~PairGranular() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); + memory->destroy(normal_coeffs); + memory->destroy(tangential_coeffs); + memory->destroy(rolling_coeffs); + memory->destroy(twisting_coeffs); + + memory->destroy(normal); + memory->destroy(damping); + memory->destroy(tangential); + memory->destroy(rolling); + memory->destroy(twisting); + delete [] onerad_dynamic; delete [] onerad_frozen; delete [] maxrad_dynamic; @@ -121,7 +131,7 @@ void PairGranular::compute(int eflag, int vflag) double damp_normal, damp_tangential; double kt; - double Fne, Fdamp, Fntot, Fscrit, Frcrit; + double Fne, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; //For JKR double R2, coh, delta_pulloff, dist_pulloff, a, a2, E; @@ -273,9 +283,8 @@ void PairGranular::compute(int eflag, int vflag) if (mask[j] & freeze_group_bit) meff = mi; delta = radsum - r; - + dR = delta*Reff; if (normal[itype][jtype] == JKR){ - dR = delta*Reff; dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -297,8 +306,11 @@ void PairGranular::compute(int eflag, int vflag) a = sqdR = sqrt(dR); knfac = FOURTHIRDS*E*sqdR; Fne = knfac*delta; + if (normal[itype][jtype] == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } else{ //Hooke + a = sqdR = sqrt(dR); knfac = FOURTHIRDS*E; Fne = knfac*delta; } @@ -340,10 +352,29 @@ void PairGranular::compute(int eflag, int vflag) vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - // history effects - if (tangential_history[itype][jtype]){ + // If any history is needed: + if (history_flag){ touch[jj] = 1; history = &allhistory[size_history*jj]; + Fcrit = fabs(Fne); + if (normal[itype][jtype] == JKR){ + Fpulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*Fpulloff); + } + } + + //------------------------------ + //Tangential forces + //------------------------------ + if (tangential[itype][jtype] == MINDLIN){ + k_tangential = tangential_coeffs[itype][jtype][0]*a; + } + else{ + k_tangential = tangential_coeffs[itype][jtype][0]; + } + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + + if (tangential_history[itype][jtype]){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -369,113 +400,138 @@ void PairGranular::compute(int eflag, int vflag) } // tangential forces = history + tangential velocity damping - if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); - kt=tangential_coeffs[itype][jtype][0]*a; - - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - fs1 = -kt*history[0] - damp_tangential*vtr1; - fs2 = -kt*history[1] - damp_tangential*vtr2; - fs3 = -kt*history[2] - damp_tangential*vtr3; + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; // rescale frictional displacements and forces if needed - if (normal[itype][jtype] == JKR){ - double Fpulloff = -3*M_PI*coh*Reff; - Fscrit = tangential_coeffs[itype][jtype][2] * fabs(Fne + 2*Fpulloff); + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; } - else{ - Fscrit = tangential_coeffs[itype][jtype][2] * fabs(Fne); - } - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[0] = -1.0/kt*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/kt*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/kt*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) ft = MIN(fn,fs) / vrel; + else ft = 0.0; + fs1 = -ft*vtr1; + fs2 = -ft*vtr2; + fs3 = -ft*vtr3; } //**************************************** - // Rolling force, including history history effects + // Rolling resistance //**************************************** - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; + if (rolling[itype][jtype] != NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; - // Rolling displacement - rollmag = sqrt(history[3]*history[3] + history[4]*history[4] + history[5]*history[5]); - rolldotn = history[3]*nx + history[4]*ny + history[5]*nz; + if (rolling_history){ + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - if (historyupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - history[3] -= rolldotn*nx; - history[4] -= rolldotn*ny; - history[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - history[3] *= scalefac; - history[4] *= scalefac; - history[5] *= scalefac; + int rhist0 = rolling_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + if (historyupdate) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; + } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; + } + } + + kR = rolling_coeffs[itype][jtype][0]; + eta_R = rolling_coeffs[itype][jtype][1]; + fr1 = -kR*history[rhist0] - eta_R*vrl1; + fr2 = -kR*history[rhist1] - eta_R*vrl2; + fr3 = -kR*history[rhist2] - eta_R*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = rolling_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); + history[rhist1] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); + history[rhist2] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; } - history[3] += vrl1*dt; - history[4] += vrl2*dt; - history[5] += vrl3*dt; } - - k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); - if (rollingdamp[itype][jtype] == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp[itype][jtype] == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*history[3] - eta_R*vrl1; - fr2 = -k_R*history[4] - eta_R*vrl2; - fr3 = -k_R*history[5] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - history[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - history[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; + else{ // + fr = meff*rolling_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(fn,fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; } - //**************************************** // Twisting torque, including history effects //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - history[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*history[6] - eta_Q*magtwist;//M_t torque (eq 30) - - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - //history[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); - history[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 + if (twist[itype][jtype] != NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist[itype][jtype] == MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twisting_coeffs[itype][jtype][0]; + damp_twist = twisting_coeffs[itype][jtype][1]; + mu_twist = twisting_coeffs[itype][jtype][2]; + } + if (twist_history){ + history[twist_history_index] += magtwist*dt; + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; } // Apply forces & torques @@ -484,9 +540,6 @@ void PairGranular::compute(int eflag, int vflag) fy = ny*Fntot + fs2; fz = nz*Fntot + fs3; - //if (screen) fprintf(screen,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); - //if (logfile) fprintf(logfile,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); - f[i][0] += fx; f[i][1] += fy; f[i][2] += fz; @@ -499,21 +552,25 @@ void PairGranular::compute(int eflag, int vflag) torque[i][1] -= radi*tor2; torque[i][2] -= radi*tor3; - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; + if (twist[itype][jtype] != NONE){ + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + } - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); + if (rolling[itype][jtype] != NONE){ + torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = R*(nz*fr1 - nx*fr3); + torroll3 = R*(nx*fr2 - ny*fr1); - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + } if (force->newton_pair || j < nlocal) { f[j][0] -= fx; @@ -524,13 +581,16 @@ void PairGranular::compute(int eflag, int vflag) torque[j][1] -= radj*tor2; torque[j][2] -= radj*tor3; - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; + if (rolling[itype][jtype] != NONE){ + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + } + if (rolling[itype][jtype] != NONE){ + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } } if (evflag) ev_tally_xyz(i,j,nlocal,0, 0.0,0.0,fx,fy,fz,delx,dely,delz); @@ -562,6 +622,7 @@ void PairGranular::allocate() memory->create(twisting_coeffs,n+1,n+1,3,"pair:twisting_coeffs"); memory->create(normal,n+1,n+1,"pair:normal"); + memory->create(damping,n+1,n+1,"pair:damping"); memory->create(tangential,n+1,n+1,"pair:tangential"); memory->create(rolling,n+1,n+1,"pair:rolling"); memory->create(twisting,n+1,n+1,"pair:twisting"); @@ -1137,7 +1198,6 @@ double PairGranular::init_one(int i, int j) } cutoff = cutmax; } - return cutoff; } From dced4c1fca7f30876bc376363289d7ae7c5585c2 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Fri, 4 Jan 2019 17:03:31 -0700 Subject: [PATCH 016/243] More changes, fixed indentation issues --- src/GRANULAR/pair_granular.cpp | 550 +++++++++++++++++---------------- src/GRANULAR/pair_granular.h | 20 +- 2 files changed, 292 insertions(+), 278 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index ad7759c83a..93f8d514b7 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -52,8 +52,8 @@ enum {STIFFNESS, MATERIAL}; enum {VELOCITY, VISCOELASTIC, TSUJI}; enum {HOOKE, HERTZ, DMT, JKR}; enum {TANGENTIAL_MINDLIN, TANGENTIAL_NOHISTORY}; -enum {NONE, TWISTING_NOHISTORY, TWISTING_SDS, TWISTING_MARSHALL}; -enum {NONE, ROLLING_NOHISTORY, ROLLING_SDS}; +enum {NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; +enum {NONE, ROLL_NOHISTORY, ROLL_SDS}; /* ---------------------------------------------------------------------- */ @@ -84,7 +84,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) comm_forward = 1; beyond_contact = 0; - rolling_history_index = twisting_history_index = 0; + roll_history_index = twist_history_index = 0; tangential_history_index = -1; } @@ -101,14 +101,14 @@ PairGranular::~PairGranular() memory->destroy(normal_coeffs); memory->destroy(tangential_coeffs); - memory->destroy(rolling_coeffs); - memory->destroy(twisting_coeffs); + memory->destroy(roll_coeffs); + memory->destroy(twist_coeffs); memory->destroy(normal); memory->destroy(damping); memory->destroy(tangential); - memory->destroy(rolling); - memory->destroy(twisting); + memory->destroy(roll); + memory->destroy(twist); delete [] onerad_dynamic; delete [] onerad_frozen; @@ -123,18 +123,19 @@ void PairGranular::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; double radi,radj,radsum,rsq,r,rinv,rsqinv; - double Reff, delta, dR, dR2, sqdR, knfac; + double Reff, delta, dR, dR2, sqdR; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; - double damp_normal, damp_tangential; - double kt; - double Fne, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; //For JKR - double R2, coh, delta_pulloff, dist_pulloff, a, a2, E; + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double delta, t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3, sqrt4; @@ -142,12 +143,14 @@ void PairGranular::compute(int eflag, int vflag) double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; //Twisting + double k_twist, damp_twist, mu_twist; double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; double tortwist1, tortwist2, tortwist3; double shrmag,rsht; @@ -226,7 +229,6 @@ void PairGranular::compute(int eflag, int vflag) rsq = delx*delx + dely*dely + delz*delz; radj = radius[j]; radsum = radi + radj; - untouchflag = (rsq >= radsum*radsum); E = normal_coeffs[itype][jtype][0]; Reff = radi*radj/(radi+radj); @@ -236,7 +238,10 @@ void PairGranular::compute(int eflag, int vflag) a = cbrt(9.0*M_PI*coh*R2/(4*E)); delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum+delta_pulloff; - untouchflag = (rsq >= (dist_pulloff)*(dist_pulloff)); + untouchflag = (rsq >= dist_pulloff*dist_pulloff); + } + else{ + untouchflag = (rsq >= radsum*radsum); } if (untouchflag){ @@ -247,8 +252,6 @@ void PairGranular::compute(int eflag, int vflag) } else{ r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; nx = delx*rinv; ny = dely*rinv; @@ -301,26 +304,21 @@ void PairGranular::compute(int eflag, int vflag) knfac = FOURTHIRDS*E*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); } - - else if (normal[itype][jtype] != HOOKE){ //HERTZ, DMT - a = sqdR = sqrt(dR); - knfac = FOURTHIRDS*E*sqdR; + else{ + knfac = E; //Hooke Fne = knfac*delta; + if (normal[itype][jtype] != HOOKE) + Fne *= a; if (normal[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } - else{ //Hooke - a = sqdR = sqrt(dR); - knfac = FOURTHIRDS*E; - Fne = knfac*delta; - } //Consider restricting Hooke to only have 'velocity' as an option for damping? if (damping[itype][jtype] == VELOCITY){ damp_normal = normal_coeffs[itype][jtype][1]; } else if (damping[itype][jtype] == VISCOELASTIC){ - if (normal[itype][jtype] == HOOKE) sqdR = sqrt(dR); + if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; } else if (damping[itype][jtype] == TSUJI){ @@ -356,21 +354,20 @@ void PairGranular::compute(int eflag, int vflag) if (history_flag){ touch[jj] = 1; history = &allhistory[size_history*jj]; - Fcrit = fabs(Fne); - if (normal[itype][jtype] == JKR){ - Fpulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*Fpulloff); - } + } + + Fcrit = fabs(Fne); + if (normal[itype][jtype] == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); } //------------------------------ //Tangential forces //------------------------------ - if (tangential[itype][jtype] == MINDLIN){ - k_tangential = tangential_coeffs[itype][jtype][0]*a; - } - else{ - k_tangential = tangential_coeffs[itype][jtype][0]; + k_tangential = tangential_coeffs[itype][jtype][0]; + if (normal[itype][jtype] != HOOKE){ + k_tangential *= a; } damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; @@ -420,18 +417,18 @@ void PairGranular::compute(int eflag, int vflag) } else{ //Classic pair gran/hooke (no history) fs = meff*damp_tangential*vrel; - if (vrel != 0.0) ft = MIN(fn,fs) / vrel; - else ft = 0.0; - fs1 = -ft*vtr1; - fs2 = -ft*vtr2; - fs3 = -ft*vtr3; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; } //**************************************** // Rolling resistance //**************************************** - if (rolling[itype][jtype] != NONE){ + if (roll[itype][jtype] != NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -439,24 +436,26 @@ void PairGranular::compute(int eflag, int vflag) // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) // This is different from the Marshall papers, which use the Bagi/Kuhn formulation // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - if (rolling_history){ + if (roll_history){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + // Rolling displacement rollmag = sqrt(history[rhist0]*history[rhist0] + history[rhist1]*history[rhist1] + history[rhist2]*history[rhist2]); + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - int rhist0 = rolling_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; - if (historyupdate) { + if (historyupdate){ if (fabs(rolldotn) < EPSILON) rolldotn = 0; if (rolldotn > 0){ //Rotate into tangential plane scalefac = rollmag/(rollmag - rolldotn); @@ -472,68 +471,69 @@ void PairGranular::compute(int eflag, int vflag) history[rhist1] += vrl2*dt; history[rhist2] += vrl3*dt; } + + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } } - - kR = rolling_coeffs[itype][jtype][0]; - eta_R = rolling_coeffs[itype][jtype][1]; - fr1 = -kR*history[rhist0] - eta_R*vrl1; - fr2 = -kR*history[rhist1] - eta_R*vrl2; - fr3 = -kR*history[rhist2] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = rolling_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - history[rhist1] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - history[rhist2] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; } } - else{ // - fr = meff*rolling_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(fn,fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; - } //**************************************** // Twisting torque, including history effects //**************************************** if (twist[itype][jtype] != NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist[itype][jtype] == MARSHALL){ + if (twist[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a; } else{ - k_twist = twisting_coeffs[itype][jtype][0]; - damp_twist = twisting_coeffs[itype][jtype][1]; - mu_twist = twisting_coeffs[itype][jtype][2]; + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; } - if (twist_history){ - history[twist_history_index] += magtwist*dt; - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 + if (twist_history){ + history[twist_history_index] += magtwist*dt; + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; } } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; - } - // Apply forces & torques fx = nx*Fntot + fs1; @@ -562,10 +562,10 @@ void PairGranular::compute(int eflag, int vflag) torque[i][2] += tortwist3; } - if (rolling[itype][jtype] != NONE){ - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); + if (roll[itype][jtype] != NONE){ + torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = Reff*(nz*fr1 - nx*fr3); + torroll3 = Reff*(nx*fr2 - ny*fr1); torque[i][0] += torroll1; torque[i][1] += torroll2; @@ -581,12 +581,12 @@ void PairGranular::compute(int eflag, int vflag) torque[j][1] -= radj*tor2; torque[j][2] -= radj*tor3; - if (rolling[itype][jtype] != NONE){ + if (roll[itype][jtype] != NONE){ torque[j][0] -= tortwist1; torque[j][1] -= tortwist2; torque[j][2] -= tortwist3; } - if (rolling[itype][jtype] != NONE){ + if (roll[itype][jtype] != NONE){ torque[j][0] -= torroll1; torque[j][1] -= torroll2; torque[j][2] -= torroll3; @@ -618,14 +618,14 @@ void PairGranular::allocate() memory->create(cut,n+1,n+1,"pair:cut"); memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); - memory->create(rolling_coeffs,n+1,n+1,3,"pair:rolling_coeffs"); - memory->create(twisting_coeffs,n+1,n+1,3,"pair:twisting_coeffs"); + memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); + memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); memory->create(normal,n+1,n+1,"pair:normal"); memory->create(damping,n+1,n+1,"pair:damping"); memory->create(tangential,n+1,n+1,"pair:tangential"); - memory->create(rolling,n+1,n+1,"pair:rolling"); - memory->create(twisting,n+1,n+1,"pair:twisting"); + memory->create(roll,n+1,n+1,"pair:roll"); + memory->create(twist,n+1,n+1,"pair:twist"); onerad_dynamic = new double[n+1]; onerad_frozen = new double[n+1]; @@ -647,9 +647,9 @@ void PairGranular::settings(int narg, char **arg) damping_global = VISCOELASTIC; coeff_types = STIFFNESS; tangential_global = -1; //Needs to be explicitly set, since it requires parameters - rolling_global = NONE; - twisting_global = NONE; - tangential_history = rolling_history = twisting_history = 0; + roll_global = NONE; + twist_global = NONE; + tangential_history = roll_history = twist_history = 0; if (strcmp(arg[iarg], "material") == 0){ coeff_types = MATERIAL; @@ -668,11 +668,11 @@ void PairGranular::settings(int narg, char **arg) else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; if (coeff_types == MATERIAL) num_coeffs += 1; - if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = HERTZ; memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E - if (coeff_types == STIFFNESS) normal_coeffs_global[0] /= FOURTHIRDS; + if (coeff_types == MATERIAL) normal_coeffs_global[0] *= FOURTHIRDS; normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping if (coeff_types == MATERIAL) normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') iarg += num_coeffs+1; @@ -682,7 +682,7 @@ void PairGranular::settings(int narg, char **arg) if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = DMT; memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion @@ -727,58 +727,63 @@ void PairGranular::settings(int narg, char **arg) tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } - else if (strstr(arg[iarg], "rolling") != NULL){ + else if (strstr(arg[iarg], "roll") != NULL){ if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); if (strstr(arg[iarg], "nohistory") != NULL){ - rolling_global = ROLLING_NOHISTORY; + roll_global = ROLL_NOHISTORY; } else{ - rolling_global = ROLLING_SDS; - rolling_history = 1; + roll_global = ROLL_SDS; + roll_history = 1; } - memory->create(rolling_coeffs_global, 3, "pair:rolling_coeffs_global"); - rolling_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt - rolling_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - rolling_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); + roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt + roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } - else if (strstr(arg[iarg], "twisting") != NULL){ + else if (strstr(arg[iarg], "twist") != NULL){ if (strstr(arg[iarg], "marshall") != NULL){ - twisting_global = TWISTING_MARSHALL; - twisting_history = 1; - memory->create(twisting_coeffs_global, 3, "pair:twisting_coeffs_global"); //To be filled later + twist_global = TWIST_MARSHALL; + twist_history = 1; + memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later } else{ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twisting model"); + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); if (strstr(arg[iarg], "nohistory") != NULL){ - twisting_global = TWISTING_NOHISTORY; + twist_global = TWIST_NOHISTORY; } else{ - twisting_global = TWISTING_SDS; - twisting_history = 1; + twist_global = TWIST_SDS; + twist_history = 1; } - memory->create(twisting_coeffs_global, 3, "pair:twisting_coeffs_global"); - twisting_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt - twisting_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - twisting_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); + twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt + twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } } } - //Set all i-i entrie, which may be replaced by pair coeff commands + //Set all i-i entries, which may be replaced by pair coeff commands //It may also make sense to consider removing all of the above, and only // having the option for pair_coeff to set the parameters, similar to most LAMMPS pair styles - // The reason for the current setup is to keep true to existing pair gran/hooke etc. syntax, + // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. + + + //Other option is to have two pair styles, e.g. pair gran and pair gran/multi, + // where gran/multi allows per-type coefficients, pair gran does not (would also + // allow minor speed-up for pair gran) allocate(); double damp; for (int i = 1; i <= atom->ntypes; i++){ normal[i][i] = normal_global; damping[i][i] = damping_global; tangential[i][i] = tangential_global; - rolling[i][i] = rolling_global; - twisting[i][i] = twisting_global; + roll[i][i] = roll_global; + twist[i][i] = twist_global; if (damping_global == TSUJI){ double cor = normal_coeffs_global[1]; @@ -798,15 +803,15 @@ void PairGranular::settings(int narg, char **arg) for (int k = 0; k < 3; k++) tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; - rolling[i][i] = rolling_global; - if (rolling_global != NONE) + roll[i][i] = roll_global; + if (roll_global != NONE) for (int k = 0; k < 3; k++) - rolling_coeffs[i][i][k] = rolling_coeffs_global[k]; + roll_coeffs[i][i][k] = roll_coeffs_global[k]; - twisting[i][i] = twisting_global; - if (twisting_global != NONE) + twist[i][i] = twist_global; + if (twist_global != NONE) for (int k = 0; k < 3; k++) - twisting_coeffs[i][i][k] = twisting_coeffs_local[k]; + twist_coeffs[i][i][k] = twist_coeffs_global[k]; setflag[i][i] = 1; } @@ -823,16 +828,16 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - int normal_local, damping_local, tangential_local, rolling_local, twisting_local; + int normal_local, damping_local, tangential_local, roll_local, twist_local; double *normal_coeffs_local; double *tangential_coeffs_local; - double *rolling_coeffs_local; - double *twisting_coeffs_local; + double *roll_coeffs_local; + double *twist_coeffs_local; normal_coeffs_local = new double[4]; tangential_coeffs_local = new double[4]; - rolling_coeffs_local = new double[4]; - twisting_coeffs_local = new double[4]; + roll_coeffs_local = new double[4]; + twist_coeffs_local = new double[4]; if (narg < 2) error->all(FLERR,"Incorrect args for pair coefficients"); @@ -914,35 +919,35 @@ void PairGranular::coeff(int narg, char **arg) else if (strstr(arg[iarg], "rolling") != NULL){ if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); if (strstr(arg[iarg], "nohistory") != NULL){ - rolling_local = ROLLING_NOHISTORY; + roll_local = ROLL_NOHISTORY; } else{ - rolling_local = ROLLING_SDS; - rolling_history = 1; + roll_local = ROLL_SDS; + roll_history = 1; } - rolling_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt - rolling_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - rolling_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } - else if (strstr(arg[iarg], "twisting") != NULL){ + else if (strstr(arg[iarg], "twist") != NULL){ if (strstr(arg[iarg], "marshall") != NULL){ - twisting_local = TWISTING_MARSHALL; - twisting_history = 1; + twist_local = TWIST_MARSHALL; + twist_history = 1; } else{ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twisting model"); + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); if (strstr(arg[iarg], "nohistory") != NULL){ - twisting_local = TWISTING_NOHISTORY; + twist_local = TWIST_NOHISTORY; } else{ - twisting_local = TWISTING_SDS; - twisting_history = 1; + twist_local = TWIST_SDS; + twist_history = 1; size_history += 1; } - twisting_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt - twisting_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - twisting_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt + twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } } @@ -972,22 +977,27 @@ void PairGranular::coeff(int narg, char **arg) for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; - rolling[i][j] = rolling_local; - if (rolling_local != NONE) + roll[i][j] = roll_local; + if (roll_local != NONE) for (int k = 0; k < 3; k++) - rolling_coeffs[i][j][k] = rolling_coeffs_local[k]; + roll_coeffs[i][j][k] = roll_coeffs_local[k]; - twisting[i][j] = twisting_local; - if (twisting_local != NONE) + twist[i][j] = twist_local; + if (twist_local != NONE) for (int k = 0; k < 3; k++) - twisting_coeffs[i][j][k] = twisting_coeffs_local[k]; + twist_coeffs[i][j][k] = twist_coeffs_local[k]; setflag[i][j] = 1; - double cut_one; count++; } } + + delete[] normal_coeffs_local; + delete[] tangential_coeffs_local; + delete[] roll_coeffs_local; + delete[] twist_coeffs_local; + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } @@ -1007,22 +1017,22 @@ void PairGranular::init_style() error->all(FLERR,"Pair granular requires ghost atoms store velocity"); // Determine whether we need a granular neigh list, how large it needs to be - history_flag = tangential_history || rolling_history || twisting_history; - size_history = 3*tangential_history + 3*rolling_history + twisting_history; + history_flag = tangential_history || roll_history || twist_history; + size_history = 3*tangential_history + 3*roll_history + twist_history; - //Determine location of tangential/rolling/twisting histories in array - if (rolling_history){ - if (tangential_history) rolling_history_index = 3; - else rolling_history_index = 0; + //Determine location of tangential/roll/twist histories in array + if (roll_history){ + if (tangential_history) roll_history_index = 3; + else roll_history_index = 0; } - if (twisting_history){ + if (twist_history){ if (tangential_history){ - if (rolling_history) twisting_history_index = 6; - else twisting_history_index = 3; + if (roll_history) twist_history_index = 6; + else twist_history_index = 3; } else{ - if (rolling_history) twisting_history_index = 3; - else twisting_history_index = 0; + if (roll_history) twist_history_index = 3; + else twist_history_index = 0; } } @@ -1137,8 +1147,8 @@ double PairGranular::init_one(int i, int j) if ((normal[i] != normal[j]) || (damping[i] != damping[j]) || (tangential[i] != tangential[j]) || - (rolling[i] != rolling[j]) || - (twisting[i] != twisting[j])){ + (roll[i] != roll[j]) || + (twist[i] != twist[j])){ char str[512]; sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); @@ -1165,14 +1175,14 @@ double PairGranular::init_one(int i, int j) tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); } - if (rolling[i][i] != NONE){ + if (roll[i][i] != NONE){ for (int k = 0; k < 3; k++) - rolling_coeffs[i][j][k] = mix_geom(rolling_coeffs[i][i][k], rolling_coeffs[j][j][k]); + roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } - if (twisting[i][i] != NONE){ + if (twist[i][i] != NONE){ for (int k = 0; k < 3; k++) - twisting_coeffs[i][j][k] = mix_geom(twisting_coeffs[i][i][k], twisting_coeffs[j][j][k]); + twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } } @@ -1208,24 +1218,20 @@ double PairGranular::init_one(int i, int j) void PairGranular::write_restart(FILE *fp) { - write_restart_settings(fp); - int i,j; for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&E[i][j],sizeof(double),1,fp); - fwrite(&G[i][j],sizeof(double),1,fp); - fwrite(&normaldamp[i][j],sizeof(int),1,fp); - fwrite(&rollingdamp[i][j],sizeof(int),1,fp); - fwrite(&alpha[i][j],sizeof(double),1,fp); - fwrite(&gamman[i][j],sizeof(double),1,fp); - fwrite(&muS[i][j],sizeof(double),1,fp); - fwrite(&Ecoh[i][j],sizeof(double),1,fp); - fwrite(&kR[i][j],sizeof(double),1,fp); - fwrite(&muR[i][j],sizeof(double),1,fp); - fwrite(&etaR[i][j],sizeof(double),1,fp); + fwrite(&normal[i][j],sizeof(int),1,fp); + fwrite(&damping[i][j],sizeof(int),1,fp); + fwrite(&tangential[i][j],sizeof(int),1,fp); + fwrite(&roll[i][j],sizeof(int),1,fp); + fwrite(&twist[i][j],sizeof(int),1,fp); + fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); + fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); + fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); + fwrite(&twist_coeffs[i][j],sizeof(double),3,fp); fwrite(&cut[i][j],sizeof(double),1,fp); } } @@ -1238,9 +1244,7 @@ void PairGranular::write_restart(FILE *fp) void PairGranular::read_restart(FILE *fp) { - read_restart_settings(fp); allocate(); - int i,j; int me = comm->me; for (i = 1; i <= atom->ntypes; i++) { @@ -1249,56 +1253,32 @@ void PairGranular::read_restart(FILE *fp) MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { if (me == 0) { - fread(&E[i][j],sizeof(double),1,fp); - fread(&G[i][j],sizeof(double),1,fp); - fread(&normaldamp[i][j],sizeof(int),1,fp); - fread(&rollingdamp[i][j],sizeof(int),1,fp); - fread(&alpha[i][j],sizeof(double),1,fp); - fread(&gamman[i][j],sizeof(double),1,fp); - fread(&muS[i][j],sizeof(double),1,fp); - fread(&Ecoh[i][j],sizeof(double),1,fp); - fread(&kR[i][j],sizeof(double),1,fp); - fread(&muR[i][j],sizeof(double),1,fp); - fread(&etaR[i][j],sizeof(double),1,fp); + fread(&normal[i][j],sizeof(int),1,fp); + fread(&damping[i][j],sizeof(int),1,fp); + fread(&tangential[i][j],sizeof(int),1,fp); + fread(&roll[i][j],sizeof(int),1,fp); + fread(&twist[i][j],sizeof(int),1,fp); + fread(&normal_coeffs[i][j],sizeof(double),4,fp); + fread(&tangential_coeffs[i][j],sizeof(double),3,fp); + fread(&roll_coeffs[i][j],sizeof(double),3,fp); + fread(&twist_coeffs[i][j],sizeof(double),3,fp); fread(&cut[i][j],sizeof(double),1,fp); } - MPI_Bcast(&E[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&G[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&normaldamp[i][j],1,MPI_INT,0,world); - MPI_Bcast(&rollingdamp[i][j],1,MPI_INT,0,world); - MPI_Bcast(&alpha[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&muS[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&Ecoh[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&kR[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&muR[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&etaR[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&normal[i][j],1,MPI_INT,0,world); + MPI_Bcast(&damping[i][j],1,MPI_INT,0,world); + MPI_Bcast(&tangential[i][j],1,MPI_INT,0,world); + MPI_Bcast(&roll[i][j],1,MPI_INT,0,world); + MPI_Bcast(&twist[i][j],1,MPI_INT,0,world); + MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); + MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&twist_coeffs[i][j],3,MPI_DOUBLE,0,world); MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); } } } } -/* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ - -void PairGranular::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ - -void PairGranular::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&cut_global,sizeof(double),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); -} /* ---------------------------------------------------------------------- */ @@ -1312,40 +1292,76 @@ void PairGranular::reset_dt() double PairGranular::single(int i, int j, int itype, int jtype, double rsq, double factor_coul, double factor_lj, double &fforce) { - // feenableexcept(FE_INVALID | FE_OVERFLOW); double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double overlap, a; - double mi,mj,meff,damp,kn,kt; - double Fdamp,Fne,Fntot,Fscrit; - double eta_N,eta_T; double vtr1,vtr2,vtr3,vrel; - double fs1,fs2,fs3,fs; - double shrmag; - double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; + + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; + + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double delta, t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; + + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; + + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; double *radius = atom->radius; radi = radius[i]; radj = radius[j]; radsum = radi + radj; + Reff = radi*radj/(radi+radj); - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; + bool untouchflag; + if (normal[itype][jtype] == JKR){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum+delta_pulloff; + untouchflag = (rsq >= dist_pulloff*dist_pulloff); + } + else{ + untouchflag = (rsq >= radsum*radsum); + } - int *touch = fix_history->firstflag[i]; - if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| - (rsq >= radsum*radsum && touch[j])){ + if (untouchflag){ fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; + for (int m = 0; m < single_extra; m++) svector[m] = 0.0; return 0.0; } + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + r = sqrt(rsq); + rinv = 1.0/r; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + // relative translational velocity double **v = atom->v; @@ -1574,11 +1590,11 @@ double PairGranular::mix_geom(double valii, double valjj) double PairGranular::pulloff_distance(double radius, int itype) { - double R, E, coh, a, delta_pulloff; + double E, coh, a, delta_pulloff; coh = normal_coeffs[itype][itype][3]; E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); - a = cbrt(9*M_PI*coh*R*R/(4*E)); - return a*a/R - 2*sqrt(M_PI*coh*a/E); + a = cbrt(9*M_PI*coh*radius*radius/(4*E)); + return a*a/radius - 2*sqrt(M_PI*coh*a/E); } diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 14cc02675b..449b4d8474 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -35,8 +35,6 @@ public: double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); void reset_dt(); virtual double single(int, int, int, int, double, double, double, double &); int pack_forward_comm(int, int *, double *, int, int *); @@ -70,26 +68,26 @@ private: int size_history; //Per-type models - int **normal, **damping, **tangential, **rolling, **twisting; + int **normal, **damping, **tangential, **roll, **twist; int normal_global, damping_global; - int tangential_global, rolling_global, twisting_global; + int tangential_global, roll_global, twist_global; int history_flag; - int tangential_history, rolling_history, twisting_history; + int tangential_history, roll_history, twist_history; int tangential_history_index; - int rolling_history_index; - int twisting_history_index; + int roll_history_index; + int twist_history_index; double *normal_coeffs_global; double *tangential_coeffs_global; - double *rolling_coeffs_global; - double *twisting_coeffs_global; + double *roll_coeffs_global; + double *twist_coeffs_global; double ***normal_coeffs; double ***tangential_coeffs; - double ***rolling_coeffs; - double ***twisting_coeffs; + double ***roll_coeffs; + double ***twist_coeffs; double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); From faa716e348d081e989189afc7888f94cf5f1835f Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Mon, 7 Jan 2019 16:27:04 -0700 Subject: [PATCH 017/243] Added PairGranular::single method --- src/GRANULAR/pair_granular.cpp | 317 ++++++++++++++++++++++++--------- src/GRANULAR/pair_granular.h | 1 - 2 files changed, 231 insertions(+), 87 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 93f8d514b7..72b5f7867e 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -61,11 +61,10 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) { single_enable = 1; no_virial_fdotr_compute = 1; - use_history = 1; fix_history = NULL; - single_extra = 10; - svector = new double[10]; + single_extra = 9; + svector = new double[single_extra]; neighprev = 0; @@ -83,6 +82,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) comm_forward = 1; + use_history = 0; beyond_contact = 0; roll_history_index = twist_history_index = 0; tangential_history_index = -1; @@ -351,7 +351,7 @@ void PairGranular::compute(int eflag, int vflag) vrel = sqrt(vrel); // If any history is needed: - if (history_flag){ + if (use_history){ touch[jj] = 1; history = &allhistory[size_history*jj]; } @@ -520,7 +520,9 @@ void PairGranular::compute(int eflag, int vflag) mu_twist = twist_coeffs[itype][jtype][2]; } if (twist_history){ - history[twist_history_index] += magtwist*dt; + if (historyupdate){ + history[twist_history_index] += magtwist*dt; + } magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) signtwist = (magtwist > 0) - (magtwist < 0); Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) @@ -1017,7 +1019,7 @@ void PairGranular::init_style() error->all(FLERR,"Pair granular requires ghost atoms store velocity"); // Determine whether we need a granular neigh list, how large it needs to be - history_flag = tangential_history || roll_history || twist_history; + use_history = tangential_history || roll_history || twist_history; size_history = 3*tangential_history + 3*roll_history + twist_history; //Determine location of tangential/roll/twist histories in array @@ -1038,14 +1040,14 @@ void PairGranular::init_style() int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->size = 1; - if (history_flag) neighbor->requests[irequest]->history = 1; + if (use_history) neighbor->requests[irequest]->history = 1; dt = update->dt; // if history is stored: // if first init, create Fix needed for storing history - if (history_flag && fix_history == NULL) { + if (use_history && fix_history == NULL) { char dnumstr[16]; sprintf(dnumstr,"%d",size_history); char **fixarg = new char*[4]; @@ -1294,8 +1296,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, { double radi,radj,radsum; double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; + double dR, dR2, sqdR; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; double knfac, damp_normal; double k_tangential, damp_tangential; @@ -1307,8 +1312,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, double delta, t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3, sqrt4; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; //Rolling double k_roll, damp_roll; @@ -1371,21 +1374,27 @@ double PairGranular::single(int i, int j, int itype, int jtype, // normal component - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - vnnr = vr1*nx + vr2*ny + vr3*nz; vn1 = nx*vnnr; vn2 = ny*vnnr; vn3 = nz*vnnr; + double *rmass = atom->rmass; + int *mask = atom->mask; + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + // tangential component vt1 = vr1 - vn1; @@ -1419,86 +1428,223 @@ double PairGranular::single(int i, int j, int itype, int jtype, if (mask[i] & freeze_group_bit) meff = mj; if (mask[j] & freeze_group_bit) meff = mi; + delta = radsum - r; + dR = delta*Reff; + if (normal[itype][jtype] == JKR){ + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; //Hooke + Fne = knfac*delta; + if (normal[itype][jtype] != HOOKE) + Fne *= a; + if (normal[itype][jtype] == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; + } - // normal force = JKR - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; - overlap = radsum - r; - olapsq = overlap*overlap; - olapcubed = olapsq*olapsq; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (damping[itype][jtype] == VELOCITY){ + damp_normal = normal_coeffs[itype][jtype][1]; + } + else if (damping[itype][jtype] == VISCOELASTIC){ + if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; + } + else if (damping[itype][jtype] == TSUJI){ + damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + } - Fne = F_C*foverFc; - - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + Fdamp = -damp_normal*vnnr; Fntot = Fne + Fdamp; - // relative velocities + int jnum = list->numneigh[i]; + int *jlist = list->firstneigh[i]; + double *allhistory, *history; + if (use_history){ + allhistory = fix_history->firstvalue[i]; + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + history = &allhistory[size_history*neighprev]; + } + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities vtr1 = vt1 - (nz*wr2-ny*wr3); vtr2 = vt2 - (nx*wr3-nz*wr1); vtr3 = vt3 - (ny*wr1-nx*wr2); vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - // history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allhistory = fix_history->firstvalue[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; + Fcrit = fabs(Fne); + if (normal[itype][jtype] == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); } - double *history = &allhistory[3*neighprev]; - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[itype][jtype][0]; + if (normal[itype][jtype] != HOOKE){ + k_tangential *= a; + } + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - // tangential forces = history + tangential velocity damping - kt=8.0*G[itype][jtype]*a; + if (tangential_history[itype][jtype]){ + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); - eta_T = eta_N; - fs1 = -kt*history[0] - eta_T*vtr1; - fs2 = -kt*history[1] - eta_T*vtr2; - fs3 = -kt*history[2] - eta_T*vtr3; + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); - - if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; } - // set all forces and return no energy + //**************************************** + // Rolling resistance + //**************************************** - fforce = Fntot; + if (roll[itype][jtype] != NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + if (roll_history){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; + } + } + + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (twist[itype][jtype] != NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist[itype][jtype] == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; + } + if (twist_history){ + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; + } + } // set single_extra quantities @@ -1506,12 +1652,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, svector[1] = fs2; svector[2] = fs3; svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; + svector[4] = fr1; + svector[5] = fr2; + svector[6] = fr3; + svector[7] = fr; + svector[8] = magtortwist; return 0.0; } diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 449b4d8474..957a16af8d 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -73,7 +73,6 @@ private: int normal_global, damping_global; int tangential_global, roll_global, twist_global; - int history_flag; int tangential_history, roll_history, twist_history; int tangential_history_index; int roll_history_index; From 18f8f68e67502fd7bc9edeccf24bc1145c199662 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Tue, 8 Jan 2019 16:33:24 -0700 Subject: [PATCH 018/243] Fixed several input parsing issues in pair granular; fixed issue with JKR hysteresis and damping with JKR --- src/GRANULAR/pair_gran_hertz_history.cpp | 2 +- src/GRANULAR/pair_gran_hooke_history.cpp | 5 + src/GRANULAR/pair_granular.cpp | 464 ++++++++++++++--------- src/GRANULAR/pair_granular.h | 2 +- 4 files changed, 282 insertions(+), 191 deletions(-) diff --git a/src/GRANULAR/pair_gran_hertz_history.cpp b/src/GRANULAR/pair_gran_hertz_history.cpp index c96d48de69..d1f3c7bbe1 100644 --- a/src/GRANULAR/pair_gran_hertz_history.cpp +++ b/src/GRANULAR/pair_gran_hertz_history.cpp @@ -36,7 +36,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ PairGranHertzHistory::PairGranHertzHistory(LAMMPS *lmp) : - PairGranHookeHistory(lmp, 3) {} + PairGranHookeHistory(lmp) {} /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index cf30e77ccb..04df3b3d9b 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -44,6 +44,7 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) single_enable = 1; no_virial_fdotr_compute = 1; history = 1; + size_history = 3; fix_history = NULL; single_extra = 10; @@ -348,6 +349,10 @@ void PairGranHookeHistory::settings(int narg, char **arg) { if (narg != 6) error->all(FLERR,"Illegal pair_style command"); + + + + kn = force->numeric(FLERR,arg[0]); if (strcmp(arg[1],"NULL") == 0) kt = kn * 2.0/7.0; else kt = force->numeric(FLERR,arg[1]); diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 72b5f7867e..9ee78686c6 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -48,12 +48,11 @@ using namespace MathConst; #define EPSILON 1e-10 -enum {STIFFNESS, MATERIAL}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {HOOKE, HERTZ, DMT, JKR}; +enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {TANGENTIAL_MINDLIN, TANGENTIAL_NOHISTORY}; -enum {NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; -enum {NONE, ROLL_NOHISTORY, ROLL_SDS}; +enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; +enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; /* ---------------------------------------------------------------------- */ @@ -84,8 +83,10 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) use_history = 0; beyond_contact = 0; + nondefault_history_transfer = 0; + tangential_history_index = 0; roll_history_index = twist_history_index = 0; - tangential_history_index = -1; + } /* ---------------------------------------------------------------------- */ @@ -136,7 +137,7 @@ void PairGranular::compute(int eflag, int vflag) //For JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; - double delta, t0, t1, t2, t3, t4, t5, t6; + double t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3, sqrt4; double mi,mj,meff,damp,ccel,tor1,tor2,tor3; @@ -158,7 +159,7 @@ void PairGranular::compute(int eflag, int vflag) int *touch,**firsttouch; double *history,*allhistory,**firsthistory; - bool untouchflag; + bool touchflag; if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = 0; @@ -232,19 +233,26 @@ void PairGranular::compute(int eflag, int vflag) E = normal_coeffs[itype][jtype][0]; Reff = radi*radj/(radi+radj); + touchflag = false; + if (normal[itype][jtype] == JKR){ - R2 = Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); - dist_pulloff = radsum+delta_pulloff; - untouchflag = (rsq >= dist_pulloff*dist_pulloff); + if (touch[jj]){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum-delta_pulloff; + touchflag = (rsq <= dist_pulloff*dist_pulloff); + } + else{ + touchflag = (rsq <= radsum*radsum); + } } else{ - untouchflag = (rsq >= radsum*radsum); + touchflag = (rsq <= radsum*radsum); } - if (untouchflag){ + if (!touchflag){ // unset non-touching neighbors touch[jj] = 0; history = &allhistory[size_history*jj]; @@ -252,6 +260,7 @@ void PairGranular::compute(int eflag, int vflag) } else{ r = sqrt(rsq); + rinv = 1.0/r; nx = delx*rinv; ny = dely*rinv; @@ -288,6 +297,7 @@ void PairGranular::compute(int eflag, int vflag) delta = radsum - r; dR = delta*Reff; if (normal[itype][jtype] == JKR){ + touch[jj] = 1; dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -308,6 +318,7 @@ void PairGranular::compute(int eflag, int vflag) knfac = E; //Hooke Fne = knfac*delta; if (normal[itype][jtype] != HOOKE) + a = sqdR = sqrt(dR); Fne *= a; if (normal[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; @@ -366,12 +377,9 @@ void PairGranular::compute(int eflag, int vflag) //Tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal[itype][jtype] != HOOKE){ - k_tangential *= a; - } damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - if (tangential_history[itype][jtype]){ + if (tangential_history){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -428,7 +436,7 @@ void PairGranular::compute(int eflag, int vflag) // Rolling resistance //**************************************** - if (roll[itype][jtype] != NONE){ + if (roll[itype][jtype] != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -507,7 +515,7 @@ void PairGranular::compute(int eflag, int vflag) //**************************************** // Twisting torque, including history effects //**************************************** - if (twist[itype][jtype] != NONE){ + if (twist[itype][jtype] != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) if (twist[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 @@ -554,7 +562,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][1] -= radi*tor2; torque[i][2] -= radi*tor3; - if (twist[itype][jtype] != NONE){ + if (twist[itype][jtype] != TWIST_NONE){ tortwist1 = magtortwist * nx; tortwist2 = magtortwist * ny; tortwist3 = magtortwist * nz; @@ -564,7 +572,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][2] += tortwist3; } - if (roll[itype][jtype] != NONE){ + if (roll[itype][jtype] != ROLL_NONE){ torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -583,12 +591,12 @@ void PairGranular::compute(int eflag, int vflag) torque[j][1] -= radj*tor2; torque[j][2] -= radj*tor3; - if (roll[itype][jtype] != NONE){ + if (twist[itype][jtype] != TWIST_NONE){ torque[j][0] -= tortwist1; torque[j][1] -= tortwist2; torque[j][2] -= tortwist3; } - if (roll[itype][jtype] != NONE){ + if (roll[itype][jtype] != ROLL_NONE){ torque[j][0] -= torroll1; torque[j][1] -= torroll2; torque[j][2] -= torroll3; @@ -646,22 +654,21 @@ void PairGranular::settings(int narg, char **arg) int iarg = 0; //Some defaults + normal_global = HERTZ; damping_global = VISCOELASTIC; - coeff_types = STIFFNESS; - tangential_global = -1; //Needs to be explicitly set, since it requires parameters - roll_global = NONE; - twist_global = NONE; + tangential_global = TANGENTIAL_MINDLIN; + roll_global = ROLL_NONE; + twist_global = TWIST_NONE; tangential_history = roll_history = twist_history = 0; - if (strcmp(arg[iarg], "material") == 0){ - coeff_types = MATERIAL; - iarg += 1; - } + int normal_set, tangential_set; + normal_set = tangential_set = 0; + while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ - if (coeff_types == MATERIAL) error->all(FLERR,"Illegal pair_coeff command, 'stiffness' coefficients required for Hooke"); if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); normal_global = HOOKE; + normal_set = 1; memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -669,20 +676,29 @@ void PairGranular::settings(int narg, char **arg) } else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; - if (coeff_types == MATERIAL) num_coeffs += 1; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = HERTZ; + normal_set = 1; memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E - if (coeff_types == MATERIAL) normal_coeffs_global[0] *= FOURTHIRDS; + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - if (coeff_types == MATERIAL) normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = HERTZ_MATERIAL; + normal_set = 1; + memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E (Young's modulus) + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (shear modulus) iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0){ - if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for DMT"); if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); normal_global = DMT; + normal_set = 1; memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -692,9 +708,9 @@ void PairGranular::settings(int narg, char **arg) } else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); - if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_style command, 'material' coefficients required for JKR"); beyond_contact = 1; normal_global = JKR; + normal_set = 1; memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -715,57 +731,80 @@ void PairGranular::settings(int narg, char **arg) iarg += 1; } else if (strstr(arg[iarg], "tangential") != NULL){ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg], "nohistory") != NULL){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ tangential_global = TANGENTIAL_NOHISTORY; + tangential_set = 1; } - else{ + else if (strstr(arg[iarg+1], "mindlin") != NULL){ tangential_global = TANGENTIAL_MINDLIN; tangential_history = 1; + tangential_set = 1; + } + else{ + error->all(FLERR, "Illegal pair_style command, unrecognized sliding friction model"); } memory->create(tangential_coeffs_global, 3, "pair:tangential_coeffs_global"); - tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt - tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; + tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; } else if (strstr(arg[iarg], "roll") != NULL){ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg], "nohistory") != NULL){ - roll_global = ROLL_NOHISTORY; + if (strstr(arg[iarg+1], "none") != NULL){ + roll_global = ROLL_NONE; + iarg += 2; } else{ - roll_global = ROLL_SDS; - roll_history = 1; - } - memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); - roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt - roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; - } - else if (strstr(arg[iarg], "twist") != NULL){ - if (strstr(arg[iarg], "marshall") != NULL){ - twist_global = TWIST_MARSHALL; - twist_history = 1; - memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later - } - else{ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); - if (strstr(arg[iarg], "nohistory") != NULL){ - twist_global = TWIST_NOHISTORY; + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + roll_global = ROLL_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + roll_global = ROLL_SDS; + roll_history = 1; } else{ + error->all(FLERR, "Illegal pair_style command, unrecognized rolling friction model"); + } + memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); + roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else if (strstr(arg[iarg], "twist") != NULL){ + if (strstr(arg[iarg+1], "none") != NULL){ + twist_global = TWIST_NONE; + iarg += 2; + } + else if (strstr(arg[iarg+1], "marshall") != NULL){ + twist_global = TWIST_MARSHALL; + twist_history = 1; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); + memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later + if (strstr(arg[iarg+1], "nohistory") != NULL){ + twist_global = TWIST_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ twist_global = TWIST_SDS; twist_history = 1; } + else{ + error->all(FLERR, "Illegal pair_style command, unrecognized twisting friction model"); + } memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); - twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kt - twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; + twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //ktwist + twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammatwist + twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; } } + else error->all(FLERR, "Illegal pair_style granular command"); } //Set all i-i entries, which may be replaced by pair coeff commands @@ -774,10 +813,9 @@ void PairGranular::settings(int narg, char **arg) // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. - - //Other option is to have two pair styles, e.g. pair gran and pair gran/multi, - // where gran/multi allows per-type coefficients, pair gran does not (would also - // allow minor speed-up for pair gran) + //Other option is to have two pair styles, e.g. pair granular and pair granular/multi, + // where granular/multi allows per-type coefficients, pair granular does not (this would also + // allow minor speed-up by templating pair granular) allocate(); double damp; for (int i = 1; i <= atom->ntypes; i++){ @@ -787,40 +825,38 @@ void PairGranular::settings(int narg, char **arg) roll[i][i] = roll_global; twist[i][i] = twist_global; - if (damping_global == TSUJI){ - double cor = normal_coeffs_global[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); + if (normal_set){ + if (damping_global == TSUJI){ + double cor = normal_coeffs_global[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_global[1]; + normal_coeffs[i][i][0] = normal_coeffs_global[0]; + normal_coeffs[i][i][1] = damp; + if (normal[i][i] != HOOKE && normal[i][i] != HERTZ){ + normal_coeffs[i][i][2] = normal_coeffs_global[2]; + } + if ((normal_global == JKR) || (normal_global == DMT)) + normal_coeffs[i][i][3] = normal_coeffs_global[3]; } - else damp = normal_coeffs_global[1]; - normal_coeffs[i][i][0] = normal_coeffs_global[0]; - normal_coeffs[i][i][1] = damp; - if (coeff_types == MATERIAL) normal_coeffs[i][i][2] = normal_coeffs_global[2]; - if ((normal_global == JKR) || (normal_global == DMT)) - normal_coeffs[i][i][3] = normal_coeffs_global[3]; - - tangential[i][i] = tangential_global; - if (tangential_global != NONE) + if(tangential_set){ + tangential[i][i] = tangential_global; for (int k = 0; k < 3; k++) tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; - + } roll[i][i] = roll_global; - if (roll_global != NONE) + if (roll_global != ROLL_NONE) for (int k = 0; k < 3; k++) roll_coeffs[i][i][k] = roll_coeffs_global[k]; twist[i][i] = twist_global; - if (twist_global != NONE) + if (twist_global != TWIST_NONE && twist_global != TWIST_MARSHALL) for (int k = 0; k < 3; k++) twist_coeffs[i][i][k] = twist_coeffs_global[k]; - setflag[i][i] = 1; - } - - //Additional checks - if (tangential_global == -1){ - error->all(FLERR, "Illegal pair_style command: must specify tangential model"); + if (normal_set && tangential_set) setflag[i][i] = 1; } } @@ -850,10 +886,12 @@ void PairGranular::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + normal_local = tangential_local = roll_local = twist_local = -1; + damping_local = -1; + int iarg = 2; while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ - if (coeff_types == MATERIAL) error->all(FLERR,"Illegal pair_coeff command, 'stiffness' coefficients required for Hooke"); if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); normal_local = HOOKE; normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn @@ -862,20 +900,25 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; - if (coeff_types == MATERIAL) num_coeffs += 1; - if (iarg + offset >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_local = HERTZ; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn or E - if (coeff_types == STIFFNESS) normal_coeffs_local[0] /= FOURTHIRDS; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - if (coeff_types == MATERIAL) normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G (if 'material') + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = HERTZ; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0){ - if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_coeff command, 'material' coefficients required for DMT"); if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_local = DMT; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion @@ -883,7 +926,6 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); - if (coeff_types == STIFFNESS) error->all(FLERR,"Illegal pair_coeff command, 'material' coefficients required for JKR"); beyond_contact = 1; normal_local = JKR; normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E @@ -905,91 +947,128 @@ void PairGranular::coeff(int narg, char **arg) iarg += 1; } else if (strstr(arg[iarg], "tangential") != NULL){ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg], "nohistory") != NULL){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ tangential_local = TANGENTIAL_NOHISTORY; } - else{ + else if (strstr(arg[iarg+1], "mindlin") != NULL){ tangential_local = TANGENTIAL_MINDLIN; tangential_history = 1; } - tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt - tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; + else{ + error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + } + tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; } else if (strstr(arg[iarg], "rolling") != NULL){ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg], "nohistory") != NULL){ - roll_local = ROLL_NOHISTORY; + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strstr(arg[iarg+1], "none") != NULL){ + roll_local = ROLL_NONE; + iarg += 2; } else{ - roll_local = ROLL_SDS; - roll_history = 1; - } - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; - } - else if (strstr(arg[iarg], "twist") != NULL){ - if (strstr(arg[iarg], "marshall") != NULL){ - twist_local = TWIST_MARSHALL; - twist_history = 1; - } - else{ - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (strstr(arg[iarg], "nohistory") != NULL){ - twist_local = TWIST_NOHISTORY; + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + roll_local = ROLL_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + roll_local = ROLL_SDS; + roll_history = 1; } else{ - twist_local = TWIST_SDS; - twist_history = 1; - size_history += 1; + error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } - twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kt - twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. - iarg += 4; + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; } } + else if (strstr(arg[iarg], "twist") != NULL){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strstr(arg[iarg+1], "none") != NULL){ + twist_local = TWIST_NONE; + iarg += 2; + } + else if (strstr(arg[iarg+1], "marshall") != NULL){ + twist_local = TWIST_MARSHALL; + twist_history = 1; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + twist_local = TWIST_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + twist_local = TWIST_SDS; + twist_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); + } + twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else error->all(FLERR, "Illegal pair coeff command"); } int count = 0; double damp; - if (damping_local == TSUJI){ - double cor = normal_coeffs_local[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); + if (damping_local >= 0){ + if (normal_local == -1) + error->all(FLERR, "Illegal pair_coeff command, must specify normal model when setting damping model"); + if (damping_local == TSUJI){ + double cor; + cor = normal_coeffs_local[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_local[1]; } - else damp = normal_coeffs_local[1]; for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - normal[i][j] = normal_local; - normal_coeffs[i][j][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = damp; - if (coeff_types == MATERIAL) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal_local == JKR) || (normal_local == DMT)) + if (normal_local >= 0){ + normal[i][j] = normal_local; + normal_coeffs[i][j][0] = normal_coeffs_local[0]; + if (damping_local == -1){ + damp = normal_coeffs_global[1]; + } + normal_coeffs[i][j][1] = damp; + if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal_local == JKR) || (normal_local == DMT)) normal_coeffs[i][j][3] = normal_coeffs_local[3]; - - tangential[i][j] = tangential_local; - if (tangential_local != NONE) + } + if (damping_local >= 0){ + damping[i][j] = damping_local; + } + if (tangential_local >= 0){ + tangential[i][j] = tangential_local; for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + } + if (roll_local >= 0){ + roll[i][j] = roll_local; + if (roll_local != ROLL_NONE) + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = roll_coeffs_local[k]; + } + if (twist_local >= 0){ + twist[i][j] = twist_local; + if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = twist_coeffs_local[k]; + } - roll[i][j] = roll_local; - if (roll_local != NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs_local[k]; - - twist[i][j] = twist_local; - if (twist_local != NONE) - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs_local[k]; - - setflag[i][j] = 1; + if (normal_local >= 0 && tangential_local >= 0) setflag[i][j] = 1; count++; } @@ -1020,6 +1099,12 @@ void PairGranular::init_style() // Determine whether we need a granular neigh list, how large it needs to be use_history = tangential_history || roll_history || twist_history; + + //For JKR, will need fix/neigh/history to keep track of touch arrays + for (int i = 1; i <= atom->ntypes; i++) + for (int j = 1; j <= atom->ntypes; j++) + if (normal[i][j] == JKR) use_history = 1; + size_history = 3*tangential_history + 3*roll_history + twist_history; //Determine location of tangential/roll/twist histories in array @@ -1145,6 +1230,7 @@ void PairGranular::init_style() double PairGranular::init_one(int i, int j) { + double cutoff; if (setflag[i][j] == 0) { if ((normal[i] != normal[j]) || (damping[i] != damping[j]) || @@ -1157,7 +1243,7 @@ double PairGranular::init_one(int i, int j) error->one(FLERR,str); } - if (coeff_types == MATERIAL){ + if (normal[i][j] != HOOKE && normal[i][j] != HERTZ){ normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], @@ -1165,24 +1251,22 @@ double PairGranular::init_one(int i, int j) } else{ normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); - if (normal[i][j] == HERTZ) normal_coeffs[i][j][0] /= FOURTHIRDS; } normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); - if (tangential[i][i] != NONE){ - for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - } + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - if (roll[i][i] != NONE){ + + if (roll[i][i] != ROLL_NONE){ for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } - if (twist[i][i] != NONE){ + if (twist[i][i] != TWIST_NONE && twist[i][i] != TWIST_MARSHALL){ for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } @@ -1325,6 +1409,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, double tortwist1, tortwist2, tortwist3; double shrmag,rsht; + int jnum; int *ilist,*jlist,*numneigh,**firstneigh; int *touch,**firsttouch; double *history,*allhistory,**firsthistory; @@ -1335,20 +1420,20 @@ double PairGranular::single(int i, int j, int itype, int jtype, radsum = radi + radj; Reff = radi*radj/(radi+radj); - bool untouchflag; + bool touchflag; if (normal[itype][jtype] == JKR){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum+delta_pulloff; - untouchflag = (rsq >= dist_pulloff*dist_pulloff); + touchflag = (rsq <= dist_pulloff*dist_pulloff); } else{ - untouchflag = (rsq >= radsum*radsum); + touchflag = (rsq <= radsum*radsum); } - if (untouchflag){ + if (touchflag){ fforce = 0.0; for (int m = 0; m < single_extra; m++) svector[m] = 0.0; return 0.0; @@ -1412,9 +1497,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // if I or J part of rigid body, use body mass // if I or J is frozen, meff is other particle - double *rmass = atom->rmass; int *type = atom->type; - int *mask = atom->mask; mi = rmass[i]; mj = rmass[j]; @@ -1446,11 +1529,13 @@ double PairGranular::single(int i, int j, int itype, int jtype, a2 = a*a; knfac = FOURTHIRDS*E*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + if (damping[itype][jtype] == VISCOELASTIC) sqdR = sqrt(dR); } else{ - knfac = E; //Hooke + knfac = E; Fne = knfac*delta; if (normal[itype][jtype] != HOOKE) + a = sqdR = sqrt(dR); Fne *= a; if (normal[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; @@ -1462,6 +1547,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, } else if (damping[itype][jtype] == VISCOELASTIC){ if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); + + damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; } else if (damping[itype][jtype] == TSUJI){ @@ -1472,9 +1559,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, Fntot = Fne + Fdamp; - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allhistory, *history; + jnum = list->numneigh[i]; + jlist = list->firstneigh[i]; if (use_history){ allhistory = fix_history->firstvalue[i]; @@ -1522,7 +1608,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - if (tangential_history[itype][jtype]){ + if (tangential_history){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -1558,7 +1644,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // Rolling resistance //**************************************** - if (roll[itype][jtype] != NONE){ + if (roll[itype][jtype] != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -1619,7 +1705,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, //**************************************** // Twisting torque, including history effects //**************************************** - if (twist[itype][jtype] != NONE){ + if (twist[itype][jtype] != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) if (twist[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 957a16af8d..0e6f28c514 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -62,9 +62,9 @@ public: virtual void allocate(); int beyond_contact; + int nondefault_history_transfer; private: - int coeff_types; int size_history; //Per-type models From 29dcdec8756bf714fc76b6e35026082494bea4d3 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Thu, 10 Jan 2019 16:53:50 -0700 Subject: [PATCH 019/243] Separated templated pair granular from pair granular/multi --- src/GRANULAR/pair_granular.cpp | 1069 ++++++++++++--- src/GRANULAR/pair_granular.h | 33 +- src/GRANULAR/pair_granular_multi.cpp | 1837 ++++++++++++++++++++++++++ src/GRANULAR/pair_granular_multi.h | 108 ++ src/fix_neigh_history.cpp | 8 +- src/pair.h | 4 + 6 files changed, 2850 insertions(+), 209 deletions(-) create mode 100644 src/GRANULAR/pair_granular_multi.cpp create mode 100644 src/GRANULAR/pair_granular_multi.h diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 9ee78686c6..c75c80fea5 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -48,9 +48,9 @@ using namespace MathConst; #define EPSILON 1e-10 -enum {VELOCITY, VISCOELASTIC, TSUJI}; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; -enum {TANGENTIAL_MINDLIN, TANGENTIAL_NOHISTORY}; +enum {VELOCITY, VISCOELASTIC, TSUJI}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; @@ -105,12 +105,6 @@ PairGranular::~PairGranular() memory->destroy(roll_coeffs); memory->destroy(twist_coeffs); - memory->destroy(normal); - memory->destroy(damping); - memory->destroy(tangential); - memory->destroy(roll); - memory->destroy(twist); - delete [] onerad_dynamic; delete [] onerad_frozen; delete [] maxrad_dynamic; @@ -119,12 +113,730 @@ PairGranular::~PairGranular() memory->destroy(mass_rigid); } -void PairGranular::compute(int eflag, int vflag) +void PairGranular::compute(int eflag, int vflag){ +#ifdef TEMPLATED_PAIR_GRANULAR + if (normal == HOOKE){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == HERTZ){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == HERTZ_MATERIAL){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == DMT){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == JKR){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,3,2>(eflag, vflag); + } + } + } + } + +#else + compute_untemplated(Tp_normal, Tp_damping, Tp_tangential, + Tp_roll, Tp_twist, + eflag, vflag); +#endif +} + +#ifdef TEMPLATED_PAIR_GRANULAR +template < int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_roll, int Tp_twist > +void PairGranular::compute_templated(int eflag, int vflag) +#else +void PairGranular::compute_untemplated + (int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_roll, int Tp_twist, int eflag, int vflag) +#endif { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; double radi,radj,radsum,rsq,r,rinv,rsqinv; - double Reff, delta, dR, dR2, sqdR; + double Reff, delta, dR, dR2; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3; @@ -235,21 +947,21 @@ void PairGranular::compute(int eflag, int vflag) Reff = radi*radj/(radi+radj); touchflag = false; - if (normal[itype][jtype] == JKR){ + if (Tp_normal == JKR){ if (touch[jj]){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum-delta_pulloff; - touchflag = (rsq <= dist_pulloff*dist_pulloff); + touchflag = (rsq < dist_pulloff*dist_pulloff); } else{ - touchflag = (rsq <= radsum*radsum); + touchflag = (rsq < radsum*radsum); } } else{ - touchflag = (rsq <= radsum*radsum); + touchflag = (rsq < radsum*radsum); } if (!touchflag){ @@ -296,8 +1008,10 @@ void PairGranular::compute(int eflag, int vflag) delta = radsum - r; dR = delta*Reff; - if (normal[itype][jtype] == JKR){ + if (Tp_normal == JKR){ touch[jj] = 1; + R2=Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -317,22 +1031,22 @@ void PairGranular::compute(int eflag, int vflag) else{ knfac = E; //Hooke Fne = knfac*delta; - if (normal[itype][jtype] != HOOKE) - a = sqdR = sqrt(dR); + if (Tp_normal != HOOKE) + a = sqrt(dR); Fne *= a; - if (normal[itype][jtype] == DMT) + if (Tp_normal == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping[itype][jtype] == VELOCITY){ + if (Tp_damping == VELOCITY){ damp_normal = normal_coeffs[itype][jtype][1]; } - else if (damping[itype][jtype] == VISCOELASTIC){ - if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); - damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; + else if (Tp_damping == VISCOELASTIC){ + if (Tp_normal == HOOKE) a = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*a*meff; } - else if (damping[itype][jtype] == TSUJI){ + else if (Tp_damping == TSUJI){ damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); } @@ -367,11 +1081,14 @@ void PairGranular::compute(int eflag, int vflag) history = &allhistory[size_history*jj]; } - Fcrit = fabs(Fne); - if (normal[itype][jtype] == JKR){ + + if (Tp_normal == JKR){ F_pulloff = 3*M_PI*coh*Reff; Fcrit = fabs(Fne + 2*F_pulloff); } + else{ + Fcrit = fabs(Fne); + } //------------------------------ //Tangential forces @@ -379,7 +1096,7 @@ void PairGranular::compute(int eflag, int vflag) k_tangential = tangential_coeffs[itype][jtype][0]; damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - if (tangential_history){ + if (Tp_tangential > 0){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -436,7 +1153,7 @@ void PairGranular::compute(int eflag, int vflag) // Rolling resistance //**************************************** - if (roll[itype][jtype] != ROLL_NONE){ + if (Tp_roll != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -451,7 +1168,7 @@ void PairGranular::compute(int eflag, int vflag) if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - if (roll_history){ + if (Tp_roll > 1){ int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; int rhist2 = rhist1 + 1; @@ -515,9 +1232,9 @@ void PairGranular::compute(int eflag, int vflag) //**************************************** // Twisting torque, including history effects //**************************************** - if (twist[itype][jtype] != TWIST_NONE){ + if (Tp_twist != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist[itype][jtype] == TWIST_MARSHALL){ + if (Tp_twist == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a; @@ -527,7 +1244,7 @@ void PairGranular::compute(int eflag, int vflag) damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - if (twist_history){ + if (Tp_twist > 1){ if (historyupdate){ history[twist_history_index] += magtwist*dt; } @@ -562,7 +1279,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][1] -= radi*tor2; torque[i][2] -= radi*tor3; - if (twist[itype][jtype] != TWIST_NONE){ + if (Tp_twist != TWIST_NONE){ tortwist1 = magtortwist * nx; tortwist2 = magtortwist * ny; tortwist3 = magtortwist * nz; @@ -572,7 +1289,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][2] += tortwist3; } - if (roll[itype][jtype] != ROLL_NONE){ + if (Tp_roll != ROLL_NONE){ torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -591,12 +1308,12 @@ void PairGranular::compute(int eflag, int vflag) torque[j][1] -= radj*tor2; torque[j][2] -= radj*tor3; - if (twist[itype][jtype] != TWIST_NONE){ + if (Tp_twist != TWIST_NONE){ torque[j][0] -= tortwist1; torque[j][1] -= tortwist2; torque[j][2] -= tortwist3; } - if (roll[itype][jtype] != ROLL_NONE){ + if (Tp_roll != ROLL_NONE){ torque[j][0] -= torroll1; torque[j][1] -= torroll2; torque[j][2] -= torroll3; @@ -631,12 +1348,6 @@ void PairGranular::allocate() memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); - memory->create(normal,n+1,n+1,"pair:normal"); - memory->create(damping,n+1,n+1,"pair:damping"); - memory->create(tangential,n+1,n+1,"pair:tangential"); - memory->create(roll,n+1,n+1,"pair:roll"); - memory->create(twist,n+1,n+1,"pair:twist"); - onerad_dynamic = new double[n+1]; onerad_frozen = new double[n+1]; maxrad_dynamic = new double[n+1]; @@ -654,12 +1365,14 @@ void PairGranular::settings(int narg, char **arg) int iarg = 0; //Some defaults - normal_global = HERTZ; - damping_global = VISCOELASTIC; - tangential_global = TANGENTIAL_MINDLIN; - roll_global = ROLL_NONE; - twist_global = TWIST_NONE; - tangential_history = roll_history = twist_history = 0; + normal = HERTZ; + damping = VISCOELASTIC; + tangential = TANGENTIAL_MINDLIN; + roll = ROLL_NONE; + twist = TWIST_NONE; + + tangential_history = 1; + roll_history = twist_history = 0; int normal_set, tangential_set; normal_set = tangential_set = 0; @@ -667,8 +1380,7 @@ void PairGranular::settings(int narg, char **arg) while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); - normal_global = HOOKE; - normal_set = 1; + normal = HOOKE; memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -677,7 +1389,7 @@ void PairGranular::settings(int narg, char **arg) else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = HERTZ; + normal = HERTZ; normal_set = 1; memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn @@ -687,7 +1399,7 @@ void PairGranular::settings(int narg, char **arg) else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = HERTZ_MATERIAL; + normal = HERTZ_MATERIAL; normal_set = 1; memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E (Young's modulus) @@ -697,7 +1409,7 @@ void PairGranular::settings(int narg, char **arg) } else if (strcmp(arg[iarg], "dmt") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = DMT; + normal = DMT; normal_set = 1; memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E @@ -709,7 +1421,7 @@ void PairGranular::settings(int narg, char **arg) else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); beyond_contact = 1; - normal_global = JKR; + normal = JKR; normal_set = 1; memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E @@ -719,25 +1431,25 @@ void PairGranular::settings(int narg, char **arg) iarg += 5; } else if (strcmp(arg[iarg], "damp_velocity") == 0){ - damping_global = VELOCITY; + damping = VELOCITY; iarg += 1; } else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - damping_global = VISCOELASTIC; + damping = VISCOELASTIC; iarg += 1; } else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - damping_global = TSUJI; + damping = TSUJI; iarg += 1; } else if (strstr(arg[iarg], "tangential") != NULL){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); if (strstr(arg[iarg+1], "nohistory") != NULL){ - tangential_global = TANGENTIAL_NOHISTORY; + tangential = TANGENTIAL_NOHISTORY; tangential_set = 1; } else if (strstr(arg[iarg+1], "mindlin") != NULL){ - tangential_global = TANGENTIAL_MINDLIN; + tangential = TANGENTIAL_MINDLIN; tangential_history = 1; tangential_set = 1; } @@ -752,16 +1464,16 @@ void PairGranular::settings(int narg, char **arg) } else if (strstr(arg[iarg], "roll") != NULL){ if (strstr(arg[iarg+1], "none") != NULL){ - roll_global = ROLL_NONE; + roll = ROLL_NONE; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); if (strstr(arg[iarg+1], "nohistory") != NULL){ - roll_global = ROLL_NOHISTORY; + roll = ROLL_NOHISTORY; } else if (strstr(arg[iarg+1], "sds") != NULL){ - roll_global = ROLL_SDS; + roll = ROLL_SDS; roll_history = 1; } else{ @@ -776,11 +1488,11 @@ void PairGranular::settings(int narg, char **arg) } else if (strstr(arg[iarg], "twist") != NULL){ if (strstr(arg[iarg+1], "none") != NULL){ - twist_global = TWIST_NONE; + twist = TWIST_NONE; iarg += 2; } else if (strstr(arg[iarg+1], "marshall") != NULL){ - twist_global = TWIST_MARSHALL; + twist = TWIST_MARSHALL; twist_history = 1; iarg += 2; } @@ -788,10 +1500,10 @@ void PairGranular::settings(int narg, char **arg) if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later if (strstr(arg[iarg+1], "nohistory") != NULL){ - twist_global = TWIST_NOHISTORY; + twist = TWIST_NOHISTORY; } else if (strstr(arg[iarg+1], "sds") != NULL){ - twist_global = TWIST_SDS; + twist = TWIST_SDS; twist_history = 1; } else{ @@ -813,46 +1525,35 @@ void PairGranular::settings(int narg, char **arg) // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. - //Other option is to have two pair styles, e.g. pair granular and pair granular/multi, - // where granular/multi allows per-type coefficients, pair granular does not (this would also - // allow minor speed-up by templating pair granular) allocate(); double damp; - for (int i = 1; i <= atom->ntypes; i++){ - normal[i][i] = normal_global; - damping[i][i] = damping_global; - tangential[i][i] = tangential_global; - roll[i][i] = roll_global; - twist[i][i] = twist_global; + if (damping == TSUJI){ + double cor = normal_coeffs_global[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_global[1]; + for (int i = 1; i <= atom->ntypes; i++){ if (normal_set){ - if (damping_global == TSUJI){ - double cor = normal_coeffs_global[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_global[1]; normal_coeffs[i][i][0] = normal_coeffs_global[0]; normal_coeffs[i][i][1] = damp; - if (normal[i][i] != HOOKE && normal[i][i] != HERTZ){ + if (normal != HOOKE && normal != HERTZ){ normal_coeffs[i][i][2] = normal_coeffs_global[2]; } - if ((normal_global == JKR) || (normal_global == DMT)) + if ((normal == JKR) || (normal == DMT)) normal_coeffs[i][i][3] = normal_coeffs_global[3]; } if(tangential_set){ - tangential[i][i] = tangential_global; for (int k = 0; k < 3; k++) tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; } - roll[i][i] = roll_global; - if (roll_global != ROLL_NONE) + if (roll != ROLL_NONE) for (int k = 0; k < 3; k++) roll_coeffs[i][i][k] = roll_coeffs_global[k]; - twist[i][i] = twist_global; - if (twist_global != TWIST_NONE && twist_global != TWIST_MARSHALL) + if (twist != TWIST_NONE && twist != TWIST_MARSHALL) for (int k = 0; k < 3; k++) twist_coeffs[i][i][k] = twist_coeffs_global[k]; @@ -866,7 +1567,7 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - int normal_local, damping_local, tangential_local, roll_local, twist_local; + int normal_set, damping_set, tangential_set, roll_set, twist_set; double *normal_coeffs_local; double *tangential_coeffs_local; double *roll_coeffs_local; @@ -886,78 +1587,83 @@ void PairGranular::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - normal_local = tangential_local = roll_local = twist_local = -1; - damping_local = -1; + normal_set = damping_set = tangential_set = roll_set = twist_set = 0; int iarg = 2; while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); - normal_local = HOOKE; + if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_set = 1; iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = HERTZ; + if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_set = 1; iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = HERTZ; + if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_set = 1; iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = DMT; + if (normal != DMT) if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + normal_set = 1; iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); beyond_contact = 1; - normal_local = JKR; + if (normal != JKR) if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + normal_set = 1; iarg += 5; } else if (strcmp(arg[iarg], "damp_velocity") == 0){ - damping_local = VELOCITY; + if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); iarg += 1; } else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - damping_local = VISCOELASTIC; + if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); iarg += 1; } else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - damping_local = TSUJI; + if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); iarg += 1; } else if (strstr(arg[iarg], "tangential") != NULL){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); if (strstr(arg[iarg+1], "nohistory") != NULL){ - tangential_local = TANGENTIAL_NOHISTORY; + if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be consistent"); } else if (strstr(arg[iarg+1], "mindlin") != NULL){ - tangential_local = TANGENTIAL_MINDLIN; + if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be consistent");; tangential_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); } + tangential_set = 1; tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. @@ -966,21 +1672,22 @@ void PairGranular::coeff(int narg, char **arg) else if (strstr(arg[iarg], "rolling") != NULL){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strstr(arg[iarg+1], "none") != NULL){ - roll_local = ROLL_NONE; + if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); if (strstr(arg[iarg+1], "nohistory") != NULL){ - roll_local = ROLL_NOHISTORY; + if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); } else if (strstr(arg[iarg+1], "sds") != NULL){ - roll_local = ROLL_SDS; + if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); roll_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } + roll_set =1 ; roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. @@ -990,26 +1697,27 @@ void PairGranular::coeff(int narg, char **arg) else if (strstr(arg[iarg], "twist") != NULL){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strstr(arg[iarg+1], "none") != NULL){ - twist_local = TWIST_NONE; + if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); iarg += 2; } else if (strstr(arg[iarg+1], "marshall") != NULL){ - twist_local = TWIST_MARSHALL; + if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); twist_history = 1; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); if (strstr(arg[iarg+1], "nohistory") != NULL){ - twist_local = TWIST_NOHISTORY; + if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); } else if (strstr(arg[iarg+1], "sds") != NULL){ - twist_local = TWIST_SDS; + if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); twist_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); } + twist_set = 1; twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. @@ -1021,55 +1729,39 @@ void PairGranular::coeff(int narg, char **arg) int count = 0; double damp; - if (damping_local >= 0){ - if (normal_local == -1) - error->all(FLERR, "Illegal pair_coeff command, must specify normal model when setting damping model"); - if (damping_local == TSUJI){ - double cor; - cor = normal_coeffs_local[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_local[1]; + if (damping == TSUJI){ + double cor; + cor = normal_coeffs_local[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); } + else damp = normal_coeffs_local[1]; for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - if (normal_local >= 0){ - normal[i][j] = normal_local; + if (normal_set){ normal_coeffs[i][j][0] = normal_coeffs_local[0]; - if (damping_local == -1){ - damp = normal_coeffs_global[1]; - } normal_coeffs[i][j][1] = damp; - if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal_local == JKR) || (normal_local == DMT)) + if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal == JKR) || (normal == DMT)) normal_coeffs[i][j][3] = normal_coeffs_local[3]; } - if (damping_local >= 0){ - damping[i][j] = damping_local; - } - if (tangential_local >= 0){ - tangential[i][j] = tangential_local; + if (tangential_set){ for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; } - if (roll_local >= 0){ - roll[i][j] = roll_local; - if (roll_local != ROLL_NONE) + if (roll_set){ + if (roll != ROLL_NONE) for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = roll_coeffs_local[k]; } - if (twist_local >= 0){ - twist[i][j] = twist_local; - if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) + if (twist_set){ + if (twist != TWIST_NONE && twist != TWIST_MARSHALL) for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = twist_coeffs_local[k]; } - - if (normal_local >= 0 && tangential_local >= 0) setflag[i][j] = 1; - + setflag[i][j] = 1; count++; } } @@ -1101,9 +1793,7 @@ void PairGranular::init_style() use_history = tangential_history || roll_history || twist_history; //For JKR, will need fix/neigh/history to keep track of touch arrays - for (int i = 1; i <= atom->ntypes; i++) - for (int j = 1; j <= atom->ntypes; j++) - if (normal[i][j] == JKR) use_history = 1; + if (normal == JKR) use_history = 1; size_history = 3*tangential_history + 3*roll_history + twist_history; @@ -1181,13 +1871,13 @@ void PairGranular::init_style() if (ipour >= 0) { itype = i; double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); - if (normal[itype][itype] == JKR) radmax = radmax + 0.5*pulloff_distance(radmax, itype); + if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); onerad_dynamic[i] = radmax; } if (idep >= 0) { itype = i; double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); - if (normal[itype][itype] == JKR) radmax = radmax + 0.5*pulloff_distance(radmax, itype); + if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); onerad_dynamic[i] = radmax; } } @@ -1199,8 +1889,8 @@ void PairGranular::init_style() for (i = 0; i < nlocal; i++){ double radius_cut = radius[i]; - if (normal[type[i]][type[i]] == JKR){ - radius_cut = radius[i] + 0.5*pulloff_distance(radius[i], type[i]); + if (normal == JKR){ + radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); } if (mask[i] & freeze_group_bit){ onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); @@ -1232,18 +1922,8 @@ double PairGranular::init_one(int i, int j) { double cutoff; if (setflag[i][j] == 0) { - if ((normal[i] != normal[j]) || - (damping[i] != damping[j]) || - (tangential[i] != tangential[j]) || - (roll[i] != roll[j]) || - (twist[i] != twist[j])){ - char str[512]; - sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); - error->one(FLERR,str); - } - - if (normal[i][j] != HOOKE && normal[i][j] != HERTZ){ + if (normal != HOOKE && normal != HERTZ){ normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], @@ -1254,19 +1934,19 @@ double PairGranular::init_one(int i, int j) } normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); - if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) + if ((normal == JKR) || (normal == DMT)) normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - if (roll[i][i] != ROLL_NONE){ + if (roll != ROLL_NONE){ for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } - if (twist[i][i] != TWIST_NONE && twist[i][i] != TWIST_MARSHALL){ + if (twist != TWIST_NONE && twist != TWIST_MARSHALL){ for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } @@ -1305,15 +1985,15 @@ double PairGranular::init_one(int i, int j) void PairGranular::write_restart(FILE *fp) { int i,j; + fwrite(&normal,sizeof(int),1,fp); + fwrite(&damping,sizeof(int),1,fp); + fwrite(&tangential,sizeof(int),1,fp); + fwrite(&roll,sizeof(int),1,fp); + fwrite(&twist,sizeof(int),1,fp); for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&normal[i][j],sizeof(int),1,fp); - fwrite(&damping[i][j],sizeof(int),1,fp); - fwrite(&tangential[i][j],sizeof(int),1,fp); - fwrite(&roll[i][j],sizeof(int),1,fp); - fwrite(&twist[i][j],sizeof(int),1,fp); fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); @@ -1333,28 +2013,30 @@ void PairGranular::read_restart(FILE *fp) allocate(); int i,j; int me = comm->me; + if (me == 0){ + fread(&normal,sizeof(int),1,fp); + fread(&damping,sizeof(int),1,fp); + fread(&tangential,sizeof(int),1,fp); + fread(&roll,sizeof(int),1,fp); + fread(&twist,sizeof(int),1,fp); + } + MPI_Bcast(&normal,1,MPI_INT,0,world); + MPI_Bcast(&damping,1,MPI_INT,0,world); + MPI_Bcast(&tangential,1,MPI_INT,0,world); + MPI_Bcast(&roll,1,MPI_INT,0,world); + MPI_Bcast(&twist,1,MPI_INT,0,world); for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { if (me == 0) { - fread(&normal[i][j],sizeof(int),1,fp); - fread(&damping[i][j],sizeof(int),1,fp); - fread(&tangential[i][j],sizeof(int),1,fp); - fread(&roll[i][j],sizeof(int),1,fp); - fread(&twist[i][j],sizeof(int),1,fp); fread(&normal_coeffs[i][j],sizeof(double),4,fp); fread(&tangential_coeffs[i][j],sizeof(double),3,fp); fread(&roll_coeffs[i][j],sizeof(double),3,fp); fread(&twist_coeffs[i][j],sizeof(double),3,fp); fread(&cut[i][j],sizeof(double),1,fp); } - MPI_Bcast(&normal[i][j],1,MPI_INT,0,world); - MPI_Bcast(&damping[i][j],1,MPI_INT,0,world); - MPI_Bcast(&tangential[i][j],1,MPI_INT,0,world); - MPI_Bcast(&roll[i][j],1,MPI_INT,0,world); - MPI_Bcast(&twist[i][j],1,MPI_INT,0,world); MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); @@ -1380,7 +2062,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, { double radi,radj,radsum; double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; - double dR, dR2, sqdR; + double dR, dR2; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; double mi,mj,meff,damp,ccel,tor1,tor2,tor3; @@ -1421,7 +2103,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, Reff = radi*radj/(radi+radj); bool touchflag; - if (normal[itype][jtype] == JKR){ + if (normal == JKR){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); @@ -1513,7 +2195,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, delta = radsum - r; dR = delta*Reff; - if (normal[itype][jtype] == JKR){ + if (normal == JKR){ dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -1529,29 +2211,26 @@ double PairGranular::single(int i, int j, int itype, int jtype, a2 = a*a; knfac = FOURTHIRDS*E*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - if (damping[itype][jtype] == VISCOELASTIC) sqdR = sqrt(dR); } else{ knfac = E; Fne = knfac*delta; - if (normal[itype][jtype] != HOOKE) - a = sqdR = sqrt(dR); + if (normal != HOOKE) + a = sqrt(dR); Fne *= a; - if (normal[itype][jtype] == DMT) + if (normal == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping[itype][jtype] == VELOCITY){ + if (damping == VELOCITY){ damp_normal = normal_coeffs[itype][jtype][1]; } - else if (damping[itype][jtype] == VISCOELASTIC){ - if (normal[itype][jtype] == HOOKE) a = sqdR = sqrt(dR); - - - damp_normal = normal_coeffs[itype][jtype][1]*sqdR*meff; + else if (damping == VISCOELASTIC){ + if (normal == HOOKE) a = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*a*meff; } - else if (damping[itype][jtype] == TSUJI){ + else if (damping == TSUJI){ damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); } @@ -1594,7 +2273,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, vrel = sqrt(vrel); Fcrit = fabs(Fne); - if (normal[itype][jtype] == JKR){ + if (normal == JKR){ F_pulloff = 3*M_PI*coh*Reff; Fcrit = fabs(Fne + 2*F_pulloff); } @@ -1603,7 +2282,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, //Tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal[itype][jtype] != HOOKE){ + if (normal != HOOKE){ k_tangential *= a; } damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; @@ -1644,7 +2323,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // Rolling resistance //**************************************** - if (roll[itype][jtype] != ROLL_NONE){ + if (roll != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -1705,9 +2384,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, //**************************************** // Twisting torque, including history effects //**************************************** - if (twist[itype][jtype] != TWIST_NONE){ + if (twist != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist[itype][jtype] == TWIST_MARSHALL){ + if (twist == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a; diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 0e6f28c514..897316c907 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -28,7 +28,19 @@ class PairGranular : public Pair { public: PairGranular(class LAMMPS *); virtual ~PairGranular(); - virtual void compute(int, int); + + void compute(int, int); + // comment next line to turn off templating +#define TEMPLATED_PAIR_GRANULAR +#ifdef TEMPLATED_PAIR_GRANULAR + template < int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_roll, int Tp_twist> + void compute_templated(int, int); +#else + void compute_untemplated(int, int, int, int, int, + int, int); +#endif + virtual void settings(int, char **); virtual void coeff(int, char **); void init_style(); @@ -61,28 +73,27 @@ public: int nmax; // allocated size of mass_rigid virtual void allocate(); - int beyond_contact; - int nondefault_history_transfer; private: int size_history; - //Per-type models - int **normal, **damping, **tangential, **roll, **twist; - - int normal_global, damping_global; - int tangential_global, roll_global, twist_global; + //Models + int normal, damping, tangential, roll, twist; + //History flags int tangential_history, roll_history, twist_history; - int tangential_history_index; - int roll_history_index; - int twist_history_index; + //Indices of history entries + int tangential_history_index, roll_history_index, twist_history_index; + + //Coefficients declared in pair style command, used as default unless + // overwritten in pair coeff command double *normal_coeffs_global; double *tangential_coeffs_global; double *roll_coeffs_global; double *twist_coeffs_global; + //Per-type coefficients declared in pair coeff command double ***normal_coeffs; double ***tangential_coeffs; double ***roll_coeffs; diff --git a/src/GRANULAR/pair_granular_multi.cpp b/src/GRANULAR/pair_granular_multi.cpp new file mode 100644 index 0000000000..11381444a2 --- /dev/null +++ b/src/GRANULAR/pair_granular_multi.cpp @@ -0,0 +1,1837 @@ +/* ---------------------------------------------------------------------- +http://lammps.sandia.gov, Sandia National Laboratories +Steve Plimpton, sjplimp@sandia.gov + +Copyright (2003) Sandia Corporation. Under the terms of Contract +DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains +certain rights in this software. This software is distributed under +the GNU General Public License. + +See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +Contributing authors: +Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) +Leo Silbert (SNL), Gary Grest (SNL) +----------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_granular_multi.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define PI27SQ 266.47931882941264802866 // 27*PI**2 +#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) +#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) +#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) +#define FOURTHIRDS 1.333333333333333 // 4/3 +#define TWOPI 6.28318530717959 // 2*PI + +#define EPSILON 1e-10 + +enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; +enum {VELOCITY, VISCOELASTIC, TSUJI}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; +enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; +enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; + +/* ---------------------------------------------------------------------- */ + +PairGranularMulti::PairGranularMulti(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + no_virial_fdotr_compute = 1; + fix_history = NULL; + + single_extra = 9; + svector = new double[single_extra]; + + neighprev = 0; + + nmax = 0; + mass_rigid = NULL; + + onerad_dynamic = NULL; + onerad_frozen = NULL; + maxrad_dynamic = NULL; + maxrad_frozen = NULL; + + dt = update->dt; + + // set comm size needed by this Pair if used with fix rigid + + comm_forward = 1; + + use_history = 0; + beyond_contact = 0; + nondefault_history_transfer = 0; + tangential_history_index = 0; + roll_history_index = twist_history_index = 0; + +} + +/* ---------------------------------------------------------------------- */ +PairGranularMulti::~PairGranularMulti() +{ + delete [] svector; + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cut); + + memory->destroy(normal_coeffs); + memory->destroy(tangential_coeffs); + memory->destroy(roll_coeffs); + memory->destroy(twist_coeffs); + + memory->destroy(normal); + memory->destroy(damping); + memory->destroy(tangential); + memory->destroy(roll); + memory->destroy(twist); + + delete [] onerad_dynamic; + delete [] onerad_frozen; + delete [] maxrad_dynamic; + delete [] maxrad_frozen; + } + memory->destroy(mass_rigid); +} + +void PairGranularMulti::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv; + double Reff, delta, dR, dR2; + + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; + + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; + + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; + + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; + + bool touchflag; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int historyupdate = 1; + if (update->setupflag) historyupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *mask = atom->mask; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firsthistory = fix_history->firstvalue; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + radi = radius[i]; + touch = firsttouch[i]; + allhistory = firsthistory[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++){ + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + jtype = type[j]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + + E = normal_coeffs[itype][jtype][0]; + Reff = radi*radj/(radi+radj); + touchflag = false; + + if (normal[itype][jtype] == JKR){ + if (touch[jj]){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum-delta_pulloff; + touchflag = (rsq < dist_pulloff*dist_pulloff); + } + else{ + touchflag = (rsq < radsum*radsum); + } + } + else{ + touchflag = (rsq < radsum*radsum); + } + + if (!touchflag){ + // unset non-touching neighbors + touch[jj] = 0; + history = &allhistory[size_history*jj]; + for (int k = 0; k < size_history; k++) history[k] = 0.0; + } + else{ + r = sqrt(rsq); + rinv = 1.0/r; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + if (normal[itype][jtype] == JKR){ + touch[jj] = 1; + R2=Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; //Hooke + Fne = knfac*delta; + if (normal[itype][jtype] != HOOKE) + a = sqrt(dR); + Fne *= a; + if (normal[itype][jtype] == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; + } + + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (damping[itype][jtype] == VELOCITY){ + damp_normal = normal_coeffs[itype][jtype][1]; + } + else if (damping[itype][jtype] == VISCOELASTIC){ + if (normal[itype][jtype] == HOOKE) a = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + } + else if (damping[itype][jtype] == TSUJI){ + damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + } + + Fdamp = -damp_normal*vnnr; + + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // If any history is needed: + if (use_history){ + touch[jj] = 1; + history = &allhistory[size_history*jj]; + } + + if (normal[itype][jtype] == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); + } + else{ + Fcrit = fabs(Fne); + } + + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[itype][jtype][0]; + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + + if (tangential_history){ + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // Rotate and update displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (historyupdate) { + rsht = history[0]*nx + history[1]*ny + history[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + history[0] -= rsht*nx; + history[1] -= rsht*ny; + history[2] -= rsht*nz; + //Also rescale to preserve magnitude + history[0] *= scalefac; + history[1] *= scalefac; + history[2] *= scalefac; + } + //Update history + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; + } + + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } + + //**************************************** + // Rolling resistance + //**************************************** + + if (roll[itype][jtype] != ROLL_NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + if (roll_history){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + + if (historyupdate){ + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; + } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; + } + + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; + } + } + + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (twist[itype][jtype] != TWIST_NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist[itype][jtype] == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; + } + if (twist[itype][jtype] > 1){ + if (historyupdate){ + history[twist_history_index] += magtwist*dt; + } + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; + } + } + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + if (twist[itype][jtype] != TWIST_NONE){ + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + } + + if (roll[itype][jtype] != ROLL_NONE){ + torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = Reff*(nz*fr1 - nx*fr3); + torroll3 = Reff*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + } + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + if (twist[itype][jtype] != TWIST_NONE){ + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + } + if (roll[itype][jtype] != ROLL_NONE){ + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + + +/* ---------------------------------------------------------------------- +allocate all arrays +------------------------------------------------------------------------- */ + +void PairGranularMulti::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); + memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); + memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); + memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); + + memory->create(normal,n+1,n+1,"pair:normal"); + memory->create(damping,n+1,n+1,"pair:damping"); + memory->create(tangential,n+1,n+1,"pair:tangential"); + memory->create(roll,n+1,n+1,"pair:roll"); + memory->create(twist,n+1,n+1,"pair:twist"); + + onerad_dynamic = new double[n+1]; + onerad_frozen = new double[n+1]; + maxrad_dynamic = new double[n+1]; + maxrad_frozen = new double[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairGranularMulti::settings(int narg, char **arg) +{ + if (narg < 5) error->all(FLERR,"Illegal pair_style command"); + + int iarg = 0; + + //Some defaults + normal_global = HERTZ; + damping_global = VISCOELASTIC; + tangential_global = TANGENTIAL_MINDLIN; + roll_global = ROLL_NONE; + twist_global = TWIST_NONE; + + tangential_history = 1; + roll_history = twist_history = 0; + + int normal_set, tangential_set; + normal_set = tangential_set = 0; + + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); + normal_global = HOOKE; + normal_set = 1; + memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += 3; + } + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = HERTZ; + normal_set = 1; + memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = HERTZ_MATERIAL; + normal_set = 1; + memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E (Young's modulus) + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (shear modulus) + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "dmt") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); + normal_global = DMT; + normal_set = 1; + memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); + beyond_contact = 1; + normal_global = JKR; + normal_set = 1; + memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); + normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "damp_velocity") == 0){ + damping_global = VELOCITY; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ + damping_global = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_tsuji") == 0){ + damping_global = TSUJI; + iarg += 1; + } + else if (strstr(arg[iarg], "tangential") != NULL){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + tangential_global = TANGENTIAL_NOHISTORY; + tangential_set = 1; + } + else if (strstr(arg[iarg+1], "mindlin") != NULL){ + tangential_global = TANGENTIAL_MINDLIN; + tangential_history = 1; + tangential_set = 1; + } + else{ + error->all(FLERR, "Illegal pair_style command, unrecognized sliding friction model"); + } + memory->create(tangential_coeffs_global, 3, "pair:tangential_coeffs_global"); + tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else if (strstr(arg[iarg], "roll") != NULL){ + if (strstr(arg[iarg+1], "none") != NULL){ + roll_global = ROLL_NONE; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + roll_global = ROLL_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + roll_global = ROLL_SDS; + roll_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_style command, unrecognized rolling friction model"); + } + memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); + roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else if (strstr(arg[iarg], "twist") != NULL){ + if (strstr(arg[iarg+1], "none") != NULL){ + twist_global = TWIST_NONE; + iarg += 2; + } + else if (strstr(arg[iarg+1], "marshall") != NULL){ + twist_global = TWIST_MARSHALL; + twist_history = 1; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); + memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later + if (strstr(arg[iarg+1], "nohistory") != NULL){ + twist_global = TWIST_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + twist_global = TWIST_SDS; + twist_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_style command, unrecognized twisting friction model"); + } + memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); + twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //ktwist + twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammatwist + twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else error->all(FLERR, "Illegal pair_style granular command"); + } + + //Set all i-i entries, which may be replaced by pair coeff commands + //It may also make sense to consider removing all of the above, and only + // having the option for pair_coeff to set the parameters, similar to most LAMMPS pair styles + // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, + // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. + + //Other option is to have two pair styles, e.g. pair granular and pair granular/multi, + // where granular/multi allows per-type coefficients, pair granular does not (this would also + // allow minor speed-up by templating pair granular) + allocate(); + double damp; + for (int i = 1; i <= atom->ntypes; i++){ + normal[i][i] = normal_global; + damping[i][i] = damping_global; + tangential[i][i] = tangential_global; + roll[i][i] = roll_global; + twist[i][i] = twist_global; + + if (normal_set){ + if (damping_global == TSUJI){ + double cor = normal_coeffs_global[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_global[1]; + normal_coeffs[i][i][0] = normal_coeffs_global[0]; + normal_coeffs[i][i][1] = damp; + if (normal[i][i] != HOOKE && normal[i][i] != HERTZ){ + normal_coeffs[i][i][2] = normal_coeffs_global[2]; + } + if ((normal_global == JKR) || (normal_global == DMT)) + normal_coeffs[i][i][3] = normal_coeffs_global[3]; + } + if(tangential_set){ + tangential[i][i] = tangential_global; + for (int k = 0; k < 3; k++) + tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; + } + roll[i][i] = roll_global; + if (roll_global != ROLL_NONE) + for (int k = 0; k < 3; k++) + roll_coeffs[i][i][k] = roll_coeffs_global[k]; + + twist[i][i] = twist_global; + if (twist_global != TWIST_NONE && twist_global != TWIST_MARSHALL) + for (int k = 0; k < 3; k++) + twist_coeffs[i][i][k] = twist_coeffs_global[k]; + + if (normal_set && tangential_set) setflag[i][i] = 1; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairGranularMulti::coeff(int narg, char **arg) +{ + int normal_local, damping_local, tangential_local, roll_local, twist_local; + double *normal_coeffs_local; + double *tangential_coeffs_local; + double *roll_coeffs_local; + double *twist_coeffs_local; + + normal_coeffs_local = new double[4]; + tangential_coeffs_local = new double[4]; + roll_coeffs_local = new double[4]; + twist_coeffs_local = new double[4]; + + if (narg < 2) + error->all(FLERR,"Incorrect args for pair coefficients"); + + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + normal_local = tangential_local = roll_local = twist_local = -1; + damping_local = -1; + + int iarg = 2; + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); + normal_local = HOOKE; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += 3; + } + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = HERTZ; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = HERTZ; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "dmt") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + normal_local = DMT; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); + beyond_contact = 1; + normal_local = JKR; + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "damp_velocity") == 0){ + damping_local = VELOCITY; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ + damping_local = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg], "damp_tsuji") == 0){ + damping_local = TSUJI; + iarg += 1; + } + else if (strstr(arg[iarg], "tangential") != NULL){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + tangential_local = TANGENTIAL_NOHISTORY; + } + else if (strstr(arg[iarg+1], "mindlin") != NULL){ + tangential_local = TANGENTIAL_MINDLIN; + tangential_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + } + tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else if (strstr(arg[iarg], "rolling") != NULL){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strstr(arg[iarg+1], "none") != NULL){ + roll_local = ROLL_NONE; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + roll_local = ROLL_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + roll_local = ROLL_SDS; + roll_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); + } + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else if (strstr(arg[iarg], "twist") != NULL){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strstr(arg[iarg+1], "none") != NULL){ + twist_local = TWIST_NONE; + iarg += 2; + } + else if (strstr(arg[iarg+1], "marshall") != NULL){ + twist_local = TWIST_MARSHALL; + twist_history = 1; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); + if (strstr(arg[iarg+1], "nohistory") != NULL){ + twist_local = TWIST_NOHISTORY; + } + else if (strstr(arg[iarg+1], "sds") != NULL){ + twist_local = TWIST_SDS; + twist_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); + } + twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else error->all(FLERR, "Illegal pair coeff command"); + } + + int count = 0; + double damp; + if (damping_local >= 0){ + if (normal_local == -1) + error->all(FLERR, "Illegal pair_coeff command, must specify normal model when setting damping model"); + if (damping_local == TSUJI){ + double cor; + cor = normal_coeffs_local[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_local[1]; + } + + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + if (normal_local >= 0){ + normal[i][j] = normal_local; + normal_coeffs[i][j][0] = normal_coeffs_local[0]; + if (damping_local == -1){ + damp = normal_coeffs_global[1]; + } + normal_coeffs[i][j][1] = damp; + if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal_local == JKR) || (normal_local == DMT)) + normal_coeffs[i][j][3] = normal_coeffs_local[3]; + } + if (damping_local >= 0){ + damping[i][j] = damping_local; + } + if (tangential_local >= 0){ + tangential[i][j] = tangential_local; + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + } + if (roll_local >= 0){ + roll[i][j] = roll_local; + if (roll_local != ROLL_NONE) + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = roll_coeffs_local[k]; + } + if (twist_local >= 0){ + twist[i][j] = twist_local; + if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = twist_coeffs_local[k]; + } + + if (normal_local >= 0 && tangential_local >= 0) setflag[i][j] = 1; + + count++; + } + } + + delete[] normal_coeffs_local; + delete[] tangential_coeffs_local; + delete[] roll_coeffs_local; + delete[] twist_coeffs_local; + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairGranularMulti::init_style() +{ + int i; + + // error and warning checks + + if (!atom->radius_flag || !atom->rmass_flag) + error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair granular requires ghost atoms store velocity"); + + // Determine whether we need a granular neigh list, how large it needs to be + use_history = tangential_history || roll_history || twist_history; + + //For JKR, will need fix/neigh/history to keep track of touch arrays + for (int i = 1; i <= atom->ntypes; i++) + for (int j = 1; j <= atom->ntypes; j++) + if (normal[i][j] == JKR) use_history = 1; + + size_history = 3*tangential_history + 3*roll_history + twist_history; + + //Determine location of tangential/roll/twist histories in array + if (roll_history){ + if (tangential_history) roll_history_index = 3; + else roll_history_index = 0; + } + if (twist_history){ + if (tangential_history){ + if (roll_history) twist_history_index = 6; + else twist_history_index = 3; + } + else{ + if (roll_history) twist_history_index = 3; + else twist_history_index = 0; + } + } + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->size = 1; + if (use_history) neighbor->requests[irequest]->history = 1; + + dt = update->dt; + + // if history is stored: + // if first init, create Fix needed for storing history + + if (use_history && fix_history == NULL) { + char dnumstr[16]; + sprintf(dnumstr,"%d",size_history); + char **fixarg = new char*[4]; + fixarg[0] = (char *) "NEIGH_HISTORY"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "NEIGH_HISTORY"; + fixarg[3] = dnumstr; + modify->add_fix(4,fixarg,1); + delete [] fixarg; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; + fix_history->pair = this; + } + + // check for FixFreeze and set freeze_group_bit + + for (i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"freeze") == 0) break; + if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; + else freeze_group_bit = 0; + + // check for FixRigid so can extract rigid body masses + + fix_rigid = NULL; + for (i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) break; + if (i < modify->nfix) fix_rigid = modify->fix[i]; + + // check for FixPour and FixDeposit so can extract particle radii + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + // set maxrad_dynamic and maxrad_frozen for each type + // include future FixPour and FixDeposit particles as dynamic + + int itype; + for (i = 1; i <= atom->ntypes; i++) { + onerad_dynamic[i] = onerad_frozen[i] = 0.0; + if (ipour >= 0) { + itype = i; + double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); + if (normal[itype][itype] == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; + } + if (idep >= 0) { + itype = i; + double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); + if (normal[itype][itype] == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; + } + } + + double *radius = atom->radius; + int *mask = atom->mask; + int *type = atom->type; + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++){ + double radius_cut = radius[i]; + if (normal[type[i]][type[i]] == JKR){ + radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); + } + if (mask[i] & freeze_group_bit){ + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); + } + else{ + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); + } + } + + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + + // set fix which stores history info + + if (size_history > 0){ + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairGranularMulti::init_one(int i, int j) +{ + double cutoff; + if (setflag[i][j] == 0) { + if ((normal[i][i] != normal[j][j]) || + (damping[i][i] != damping[j][j]) || + (tangential[i][i] != tangential[j][j]) || + (roll[i][i] != roll[j][j]) || + (twist[i][i] != twist[j][j])){ + + char str[512]; + sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); + error->one(FLERR,str); + } + + if (normal[i][j] != HOOKE && normal[i][j] != HERTZ){ + normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + } + else{ + normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + } + + normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); + if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) + normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + + + if (roll[i][i] != ROLL_NONE){ + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); + } + + if (twist[i][i] != TWIST_NONE && twist[i][i] != TWIST_MARSHALL){ + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); + } + } + + // It is possible that cut[i][j] at this point is still 0.0. This can happen when + // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates + // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size + // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only + // if there is no current information about radius/cutoff of type i and j). + // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. + + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); + } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + return cutoff; +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranularMulti::write_restart(FILE *fp) +{ + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&normal[i][j],sizeof(int),1,fp); + fwrite(&damping[i][j],sizeof(int),1,fp); + fwrite(&tangential[i][j],sizeof(int),1,fp); + fwrite(&roll[i][j],sizeof(int),1,fp); + fwrite(&twist[i][j],sizeof(int),1,fp); + fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); + fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); + fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); + fwrite(&twist_coeffs[i][j],sizeof(double),3,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranularMulti::read_restart(FILE *fp) +{ + allocate(); + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&normal[i][j],sizeof(int),1,fp); + fread(&damping[i][j],sizeof(int),1,fp); + fread(&tangential[i][j],sizeof(int),1,fp); + fread(&roll[i][j],sizeof(int),1,fp); + fread(&twist[i][j],sizeof(int),1,fp); + fread(&normal_coeffs[i][j],sizeof(double),4,fp); + fread(&tangential_coeffs[i][j],sizeof(double),3,fp); + fread(&roll_coeffs[i][j],sizeof(double),3,fp); + fread(&twist_coeffs[i][j],sizeof(double),3,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&normal[i][j],1,MPI_INT,0,world); + MPI_Bcast(&damping[i][j],1,MPI_INT,0,world); + MPI_Bcast(&tangential[i][j],1,MPI_INT,0,world); + MPI_Bcast(&roll[i][j],1,MPI_INT,0,world); + MPI_Bcast(&twist[i][j],1,MPI_INT,0,world); + MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); + MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&twist_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } + } +} + + +/* ---------------------------------------------------------------------- */ + +void PairGranularMulti::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- */ + +double PairGranularMulti::single(int i, int j, int itype, int jtype, + double rsq, double factor_coul, double factor_lj, double &fforce) +{ + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; + double dR, dR2; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; + + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double delta, t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; + + + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; + + double shrmag,rsht; + int jnum; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + Reff = radi*radj/(radi+radj); + + bool touchflag; + if (normal[itype][jtype] == JKR){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum+delta_pulloff; + touchflag = (rsq <= dist_pulloff*dist_pulloff); + } + else{ + touchflag = (rsq <= radsum*radsum); + } + + if (touchflag){ + fforce = 0.0; + for (int m = 0; m < single_extra; m++) svector[m] = 0.0; + return 0.0; + } + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + r = sqrt(rsq); + rinv = 1.0/r; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + double *rmass = atom->rmass; + int *mask = atom->mask; + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + int *type = atom->type; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + if (normal[itype][jtype] == JKR){ + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; + Fne = knfac*delta; + if (normal[itype][jtype] != HOOKE) + a = sqrt(dR); + Fne *= a; + if (normal[itype][jtype] == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; + } + + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (damping[itype][jtype] == VELOCITY){ + damp_normal = normal_coeffs[itype][jtype][1]; + } + else if (damping[itype][jtype] == VISCOELASTIC){ + if (normal[itype][jtype] == HOOKE) a = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + } + else if (damping[itype][jtype] == TSUJI){ + damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + } + + Fdamp = -damp_normal*vnnr; + + Fntot = Fne + Fdamp; + + jnum = list->numneigh[i]; + jlist = list->firstneigh[i]; + + if (use_history){ + allhistory = fix_history->firstvalue[i]; + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + history = &allhistory[size_history*neighprev]; + } + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + if (normal[itype][jtype] == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); + } + else{ + Fcrit = fabs(Fne); + } + + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[itype][jtype][0]; + if (normal[itype][jtype] != HOOKE){ + k_tangential *= a; + } + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + + if (tangential_history){ + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } + + //**************************************** + // Rolling resistance + //**************************************** + + if (roll[itype][jtype] != ROLL_NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + if (roll_history){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; + } + } + + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (twist[itype][jtype] != TWIST_NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist[itype][jtype] == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; + } + if (twist_history){ + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; + } + } + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = fr1; + svector[5] = fr2; + svector[6] = fr3; + svector[7] = fr; + svector[8] = magtortwist; + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairGranularMulti::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = mass_rigid[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairGranularMulti::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + mass_rigid[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays + ------------------------------------------------------------------------- */ + +double PairGranularMulti::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + mixing of Young's modulus (E) +------------------------------------------------------------------------- */ + +double PairGranularMulti::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); +} + +/* ---------------------------------------------------------------------- + mixing of shear modulus (G) + ------------------------------------------------------------------------- */ + +double PairGranularMulti::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); +} + +/* ---------------------------------------------------------------------- + mixing of everything else +------------------------------------------------------------------------- */ + +double PairGranularMulti::mix_geom(double valii, double valjj) +{ + return sqrt(valii*valjj); +} + + +/* ---------------------------------------------------------------------- + Compute pull-off distance (beyond contact) for a given radius and atom type +------------------------------------------------------------------------- */ + +double PairGranularMulti::pulloff_distance(double radius, int itype) +{ + double E, coh, a, delta_pulloff; + coh = normal_coeffs[itype][itype][3]; + E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], + normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); + a = cbrt(9*M_PI*coh*radius*radius/(4*E)); + return a*a/radius - 2*sqrt(M_PI*coh*a/E); +} + diff --git a/src/GRANULAR/pair_granular_multi.h b/src/GRANULAR/pair_granular_multi.h new file mode 100644 index 0000000000..e853e564df --- /dev/null +++ b/src/GRANULAR/pair_granular_multi.h @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(granular/multi,PairGranularMulti) + +#else + +#ifndef LMP_PAIR_GRANULAR_MULTI_H +#define LMP_PAIR_GRANULAR_MULTI_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGranularMulti : public Pair { +public: + PairGranularMulti(class LAMMPS *); + virtual ~PairGranularMulti(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void reset_dt(); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double memory_usage(); + + protected: + double cut_global; + double dt; + int freeze_group_bit; + int use_history; + + int neighprev; + double *onerad_dynamic,*onerad_frozen; + double *maxrad_dynamic,*maxrad_frozen; + double **cut; + + class FixNeighHistory *fix_history; + + // storage of rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid + + virtual void allocate(); + +private: + int size_history; + + //Per-type models + int **normal, **damping, **tangential, **roll, **twist; + + int normal_global, damping_global; + int tangential_global, roll_global, twist_global; + + int tangential_history, roll_history, twist_history; + int tangential_history_index; + int roll_history_index; + int twist_history_index; + + double *normal_coeffs_global; + double *tangential_coeffs_global; + double *roll_coeffs_global; + double *twist_coeffs_global; + + double ***normal_coeffs; + double ***tangential_coeffs; + double ***roll_coeffs; + double ***twist_coeffs; + + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); + double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); + double mix_geom(double valii, double valjj); + double pulloff_distance(double radius, int itype); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ diff --git a/src/fix_neigh_history.cpp b/src/fix_neigh_history.cpp index c21b494aa4..e33ebe57dc 100644 --- a/src/fix_neigh_history.cpp +++ b/src/fix_neigh_history.cpp @@ -408,7 +408,8 @@ void FixNeighHistory::pre_exchange_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; + if (pair->nondefault_history_transfer) pair->transfer_history(onevalues, jvalues); + else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } } @@ -520,7 +521,8 @@ void FixNeighHistory::pre_exchange_no_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; + if (pair->nondefault_history_transfer) pair->transfer_history(onevalues, jvalues); + else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } } @@ -604,7 +606,7 @@ void FixNeighHistory::post_neighbor() for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; - rflag = sbmask(j); + rflag = sbmask(j) | pair->beyond_contact; j &= NEIGHMASK; jlist[jj] = j; diff --git a/src/pair.h b/src/pair.h index 27b6d41eef..0911bff706 100644 --- a/src/pair.h +++ b/src/pair.h @@ -98,6 +98,8 @@ class Pair : protected Pointers { enum{GEOMETRIC,ARITHMETIC,SIXTHPOWER}; // mixing options + int beyond_contact, nondefault_history_transfer; //for granular styles + // KOKKOS host/device flag and data masks ExecutionSpace execution_space; @@ -180,6 +182,7 @@ class Pair : protected Pointers { virtual void min_xf_pointers(int, double **, double **) {} virtual void min_xf_get(int) {} virtual void min_x_set(int) {} + virtual void transfer_history(double *, double*) {} // management of callbacks to be run from ev_tally() @@ -202,6 +205,7 @@ class Pair : protected Pointers { double tabinner; // inner cutoff for Coulomb table double tabinner_disp; // inner cutoff for dispersion table + public: // custom data type for accessing Coulomb tables From ef803be08e65999b2b1c657d32ec6187ec774569 Mon Sep 17 00:00:00 2001 From: dsbolin Date: Tue, 15 Jan 2019 10:18:46 -0700 Subject: [PATCH 020/243] Moved all model option syntax for pair granular to pair coeff command; added global cutoff option for pair style granular command; initial write-up of documentation. --- doc/src/pair_granular.txt | 332 +++++++++++++++++++++++ src/GRANULAR/pair_granular.cpp | 392 ++++++++------------------- src/GRANULAR/pair_granular.h | 13 +- src/GRANULAR/pair_granular_multi.cpp | 379 ++++++-------------------- src/GRANULAR/pair_granular_multi.h | 17 +- 5 files changed, 538 insertions(+), 595 deletions(-) create mode 100644 doc/src/pair_granular.txt diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt new file mode 100644 index 0000000000..19c16cc6ea --- /dev/null +++ b/doc/src/pair_granular.txt @@ -0,0 +1,332 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands_all.html) + +:line + +pair_style granular command :h3 +pair_style granular/multi command :h3 + +[Syntax:] + +pair_style style cutoff :pre + +style = {granular} or {granular/multi} :ulb,l +cutoff = global cutoff (optional). See discussion below. + +[Examples:] + +pair_style granular +pair coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair coeff 2 2 hertz 200.0 20.0 tangential mindlin 300.0 50.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall + +pair_style granular/multi +pair coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair coeff 2 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall + + +[Description:] + +The {granular} styles support a variety of options for the normal, tangential, rolling and twisting +forces resulting from contact between two granular particles. The computed force depends on the combination +of choices for these models. + +All model options and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. +Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for +various combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. +In the case of {granular}, coefficients +can vary between particle types, but model choices cannot. For instance, in the first +example above, the stiffness, damping, and tangential friction are different for type 1 - type 1 and type 2 - type 2 interactions, but +both 1-1 and 2-2 interactions must have the same model form, hence all keywords are identical between the two types. Cross-coefficients +for 1-2 interactions for the case of the {hertz} model above are set via simple geometric mixing rules. The {granular/multi} +style removes this restriction at a small cost in computational efficiency, so that different particle types +can potentially interact via different model forms. As shown in the second example, +1-1 interactions are based on a Hertzian contact model and 2-2 interactions are based on a {dmt} model (see below). +In the case that 1-1 and 2-2 interactions have different model forms, mixing of coefficients cannot be +determined, so 1-2 interactions must be explicitly defined via the pair coeff command, otherwise an error results. + +The first required keyword for the pair coeff command is the normal contact model. Currently supported options and +the required arguments are: + +{hooke} : k_n, damping +{hertz} : k_n, damping +{hertz/material} : E, damping, G +{dmt} : E, damping, G, cohesion +{jkr} : E, damping, G, cohesion + +Here, k_n is spring stiffness, damping is a damping constant or a coefficient of restitution, depending on +the choice of damping model (see below), E and G are Young's modulus and shear modulus, in units of pressure, +and cohesion is a surface energy density, in units of energy/length^2. + +For the {hooke} model, the normal component of force is given by: +:c,image(Eqs/hooke_normal.jpg) + +For {hertz}, the normal force is given by: +:c,image{Eqs/hertz_normal.jpg} + +For both [hooke] and [hertz], stiffness for unspecified cross-terms is given by simple geometric mixing +(e.g. if stiffness is specified for type 1 and type 2 particles as k_n_1 and k_n_2, respectively, +type 1 - type 2 contacts use a stiffness given by k_n_{12} = sqrt(k_n_1*k_n_2)) + +For {hertz/material}, the form is the same as above, but coefficients are computed differently, and mixing follows +a different rule based on shear modulus: +:c,image{Eqs/hertz_material_normal.jpg} + +For {dmt}, the normal force is given by: +:c,image{Eqs/dmt_normal.jpg} + +Where gamma is cohesion. + +For {jkr}, the normal force is given by: +:c,image{Eqs/jkr_normal.jpg} + +The same mixing rule for stiffness as for {hertz/material} is used by both the {dmt} and {jkr} models. + +The tangential contact model must also be specified, which follows +the required {tangential} keyword. Currently supported options +and their required arguments are: + +{no_history}: k_t, tangential_damping, friction coefficient +{mindlin}: k_t, tangential_damping, friction coefficient + +For {no_history}, the tangential force is computed according to + +The total force on a particle is the sum of the normal and tangential forces from all interactions. The tangential +force also induces a torque on both particles in a contacting pair. Additionally, rolling and twisting friction +models can also be applied, which may induce additional torques (but no force). The following options are +supported for the rolling friction model + + +The first required keyword +in the pair coeff command is the choice +of normal force contact model, for which current opitons are {hooke}, {hertz} + +The {gran} styles use the following formulas for the frictional force +between two granular particles, as described in +"(Brilliantov)"_#Brilliantov, "(Silbert)"_#Silbert, and +"(Zhang)"_#Zhang3, when the distance r between two particles of radii +Ri and Rj is less than their contact distance d = Ri + Rj. There is +no force between the particles when r > d. + +The two Hookean styles use this formula: + +:c,image(Eqs/pair_gran_hooke.jpg) + +The Hertzian style uses this formula: + +:c,image(Eqs/pair_gran_hertz.jpg) + +In both equations the first parenthesized term is the normal force +between the two particles and the second parenthesized term is the +tangential force. The normal force has 2 terms, a contact force and a +damping force. The tangential force also has 2 terms: a shear force +and a damping force. The shear force is a "history" effect that +accounts for the tangential displacement between the particles for the +duration of the time they are in contact. This term is included in +pair styles {hooke/history} and {hertz/history}, but is not included +in pair style {hooke}. The tangential damping force term is included +in all three pair styles if {dampflag} is set to 1; it is not included +if {dampflag} is set to 0. + +The other quantities in the equations are as follows: + +delta = d - r = overlap distance of 2 particles +Kn = elastic constant for normal contact +Kt = elastic constant for tangential contact +gamma_n = viscoelastic damping constant for normal contact +gamma_t = viscoelastic damping constant for tangential contact +m_eff = Mi Mj / (Mi + Mj) = effective mass of 2 particles of mass Mi and Mj +Delta St = tangential displacement vector between 2 particles \ + which is truncated to satisfy a frictional yield criterion +n_ij = unit vector along the line connecting the centers of the 2 particles +Vn = normal component of the relative velocity of the 2 particles +Vt = tangential component of the relative velocity of the 2 particles :ul + +The Kn, Kt, gamma_n, and gamma_t coefficients are specified as +parameters to the pair_style command. If a NULL is used for Kt, then +a default value is used where Kt = 2/7 Kn. If a NULL is used for +gamma_t, then a default value is used where gamma_t = 1/2 gamma_n. + +The interpretation and units for these 4 coefficients are different in +the Hookean versus Hertzian equations. + +The Hookean model is one where the normal push-back force for two +overlapping particles is a linear function of the overlap distance. +Thus the specified Kn is in units of (force/distance). Note that this +push-back force is independent of absolute particle size (in the +monodisperse case) and of the relative sizes of the two particles (in +the polydisperse case). This model also applies to the other terms in +the force equation so that the specified gamma_n is in units of +(1/time), Kt is in units of (force/distance), and gamma_t is in units +of (1/time). + +The Hertzian model is one where the normal push-back force for two +overlapping particles is proportional to the area of overlap of the +two particles, and is thus a non-linear function of overlap distance. +Thus Kn has units of force per area and is thus specified in units of +(pressure). The effects of absolute particle size (monodispersity) +and relative size (polydispersity) are captured in the radii-dependent +pre-factors. When these pre-factors are carried through to the other +terms in the force equation it means that the specified gamma_n is in +units of (1/(time*distance)), Kt is in units of (pressure), and +gamma_t is in units of (1/(time*distance)). + +Note that in the Hookean case, Kn can be thought of as a linear spring +constant with units of force/distance. In the Hertzian case, Kn is +like a non-linear spring constant with units of force/area or +pressure, and as shown in the "(Zhang)"_#Zhang3 paper, Kn = 4G / +(3(1-nu)) where nu = the Poisson ratio, G = shear modulus = E / +(2(1+nu)), and E = Young's modulus. Similarly, Kt = 4G / (2-nu). +(NOTE: in an earlier version of the manual, we incorrectly stated that +Kt = 8G / (2-nu).) + +Thus in the Hertzian case Kn and Kt can be set to values that +corresponds to properties of the material being modeled. This is also +true in the Hookean case, except that a spring constant must be chosen +that is appropriate for the absolute size of particles in the model. +Since relative particle sizes are not accounted for, the Hookean +styles may not be a suitable model for polydisperse systems. + +NOTE: In versions of LAMMPS before 9Jan09, the equation for Hertzian +interactions did not include the sqrt(RiRj/Ri+Rj) term and thus was +not as accurate for polydisperse systems. For monodisperse systems, +sqrt(RiRj/Ri+Rj) is a constant factor that effectively scales all 4 +coefficients: Kn, Kt, gamma_n, gamma_t. Thus you can set the values +of these 4 coefficients appropriately in the current code to reproduce +the results of a previous Hertzian monodisperse calculation. For +example, for the common case of a monodisperse system with particles +of diameter 1, all 4 of these coefficients should now be set 2x larger +than they were previously. + +Xmu is also specified in the pair_style command and is the upper limit +of the tangential force through the Coulomb criterion Ft = xmu*Fn, +where Ft and Fn are the total tangential and normal force components +in the formulas above. Thus in the Hookean case, the tangential force +between 2 particles grows according to a tangential spring and +dash-pot model until Ft/Fn = xmu and is then held at Ft = Fn*xmu until +the particles lose contact. In the Hertzian case, a similar analogy +holds, though the spring is no longer linear. + +NOTE: Normally, xmu should be specified as a fractional value between +0.0 and 1.0, however LAMMPS allows large values (up to 1.0e4) to allow +for modeling of systems which can sustain very large tangential +forces. + +The effective mass {m_eff} is given by the formula above for two +isolated particles. If either particle is part of a rigid body, its +mass is replaced by the mass of the rigid body in the formula above. +This is determined by searching for a "fix rigid"_fix_rigid.html +command (or its variants). + +For granular styles there are no additional coefficients to set for +each pair of atom types via the "pair_coeff"_pair_coeff.html command. +All settings are global and are made via the pair_style command. +However you must still use the "pair_coeff"_pair_coeff.html for all +pairs of granular atom types. For example the command + +pair_coeff * * :pre + +should be used if all atoms in the simulation interact via a granular +potential (i.e. one of the pair styles above is used). If a granular +potential is used as a sub-style of "pair_style +hybrid"_pair_hybrid.html, then specific atom types can be used in the +pair_coeff command to determine which atoms interact via a granular +potential. + +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Build +package"_Build_package.html doc page for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Run_options.html when you invoke LAMMPS, or you can use the +"suffix"_suffix.html command in your input script. + +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +The "pair_modify"_pair_modify.html mix, shift, table, and tail options +are not relevant for granular pair styles. + +These pair styles write their information to "binary restart +files"_restart.html, so a pair_style command does not need to be +specified in an input script that reads a restart file. + +These pair styles can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. They do not support the +{inner}, {middle}, {outer} keywords. + +The single() function of these pair styles returns 0.0 for the energy +of a pairwise interaction, since energy is not conserved in these +dissipative potentials. It also returns only the normal component of +the pairwise interaction force. However, the single() function also +calculates 10 extra pairwise quantities. The first 3 are the +components of the tangential force between particles I and J, acting +on particle I. The 4th is the magnitude of this tangential force. +The next 3 (5-7) are the components of the relative velocity in the +normal direction (along the line joining the 2 sphere centers). The +last 3 (8-10) the components of the relative velocity in the +tangential direction. + +These extra quantities can be accessed by the "compute +pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., +{p10}. + +:line + +[Restrictions:] + +All the granular pair styles are part of the GRANULAR package. It is +only enabled if LAMMPS was built with that package. See the "Build +package"_Build_package.html doc page for more info. + +These pair styles require that atoms store torque and angular velocity +(omega) as defined by the "atom_style"_atom_style.html. They also +require a per-particle radius is stored. The {sphere} atom style does +all of this. + +This pair style requires you to use the "comm_modify vel +yes"_comm_modify.html command so that velocities are stored by ghost +atoms. + +These pair styles will not restart exactly when using the +"read_restart"_read_restart.html command, though they should provide +statistically similar results. This is because the forces they +compute depend on atom velocities. See the +"read_restart"_read_restart.html command for more details. + +[Related commands:] + +"pair_coeff"_pair_coeff.html + +[Default:] none + +:line + +:link(Brilliantov) +[(Brilliantov)] Brilliantov, Spahn, Hertzsch, Poschel, Phys Rev E, 53, +p 5382-5392 (1996). + +:link(Silbert) +[(Silbert)] Silbert, Ertas, Grest, Halsey, Levine, Plimpton, Phys Rev +E, 64, p 051302 (2001). + +:link(Zhang3) +[(Zhang)] Zhang and Makse, Phys Rev E, 72, p 011301 (2005). diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index c75c80fea5..9fe4bd8415 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -1360,205 +1360,15 @@ void PairGranular::allocate() void PairGranular::settings(int narg, char **arg) { - if (narg < 5) error->all(FLERR,"Illegal pair_style command"); - - int iarg = 0; - - //Some defaults - normal = HERTZ; - damping = VISCOELASTIC; - tangential = TANGENTIAL_MINDLIN; - roll = ROLL_NONE; - twist = TWIST_NONE; - - tangential_history = 1; + if (narg == 1){ + cutoff_global = force->numeric(FLERR,arg[0]) + } + else{ + cutoff_global = -1; //Will be set based on particle sizes, model choice + } + tangential_history = 0; roll_history = twist_history = 0; - - int normal_set, tangential_set; - normal_set = tangential_set = 0; - - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ - if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); - normal = HOOKE; - memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ - int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal = HERTZ; - normal_set = 1; - memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ - int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal = HERTZ_MATERIAL; - normal_set = 1; - memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E (Young's modulus) - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (shear modulus) - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal = DMT; - normal_set = 1; - memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); - beyond_contact = 1; - normal = JKR; - normal_set = 1; - memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "damp_velocity") == 0){ - damping = VELOCITY; - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - damping = VISCOELASTIC; - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - damping = TSUJI; - iarg += 1; - } - else if (strstr(arg[iarg], "tangential") != NULL){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - tangential = TANGENTIAL_NOHISTORY; - tangential_set = 1; - } - else if (strstr(arg[iarg+1], "mindlin") != NULL){ - tangential = TANGENTIAL_MINDLIN; - tangential_history = 1; - tangential_set = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized sliding friction model"); - } - memory->create(tangential_coeffs_global, 3, "pair:tangential_coeffs_global"); - tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - else if (strstr(arg[iarg], "roll") != NULL){ - if (strstr(arg[iarg+1], "none") != NULL){ - roll = ROLL_NONE; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - roll = ROLL_NOHISTORY; - } - else if (strstr(arg[iarg+1], "sds") != NULL){ - roll = ROLL_SDS; - roll_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized rolling friction model"); - } - memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); - roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else if (strstr(arg[iarg], "twist") != NULL){ - if (strstr(arg[iarg+1], "none") != NULL){ - twist = TWIST_NONE; - iarg += 2; - } - else if (strstr(arg[iarg+1], "marshall") != NULL){ - twist = TWIST_MARSHALL; - twist_history = 1; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); - memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later - if (strstr(arg[iarg+1], "nohistory") != NULL){ - twist = TWIST_NOHISTORY; - } - else if (strstr(arg[iarg+1], "sds") != NULL){ - twist = TWIST_SDS; - twist_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized twisting friction model"); - } - memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); - twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //ktwist - twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammatwist - twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else error->all(FLERR, "Illegal pair_style granular command"); - } - - //Set all i-i entries, which may be replaced by pair coeff commands - //It may also make sense to consider removing all of the above, and only - // having the option for pair_coeff to set the parameters, similar to most LAMMPS pair styles - // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, - // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. - - allocate(); - double damp; - if (damping == TSUJI){ - double cor = normal_coeffs_global[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_global[1]; - - for (int i = 1; i <= atom->ntypes; i++){ - if (normal_set){ - normal_coeffs[i][i][0] = normal_coeffs_global[0]; - normal_coeffs[i][i][1] = damp; - if (normal != HOOKE && normal != HERTZ){ - normal_coeffs[i][i][2] = normal_coeffs_global[2]; - } - if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][i][3] = normal_coeffs_global[3]; - } - if(tangential_set){ - for (int k = 0; k < 3; k++) - tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; - } - if (roll != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][i][k] = roll_coeffs_global[k]; - - if (twist != TWIST_NONE && twist != TWIST_MARSHALL) - for (int k = 0; k < 3; k++) - twist_coeffs[i][i][k] = twist_coeffs_global[k]; - - if (normal_set && tangential_set) setflag[i][i] = 1; - } + normal_set = tangential_set = damping_set = roll_set = twist_set = 0; } /* ---------------------------------------------------------------------- @@ -1567,12 +1377,6 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - int normal_set, damping_set, tangential_set, roll_set, twist_set; - double *normal_coeffs_local; - double *tangential_coeffs_local; - double *roll_coeffs_local; - double *twist_coeffs_local; - normal_coeffs_local = new double[4]; tangential_coeffs_local = new double[4]; roll_coeffs_local = new double[4]; @@ -1587,13 +1391,12 @@ void PairGranular::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - normal_set = damping_set = tangential_set = roll_set = twist_set = 0; - int iarg = 2; while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); - if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); + if (!normal_set) normal = HOOKE; + else if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_set = 1; @@ -1602,7 +1405,8 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); + if (!normal_set) normal = HERTZ; + else if (normal_set && normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_set = 1; @@ -1611,7 +1415,8 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); + if (!normal_set) normal = HERTZ/MATERIAL; + else if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G @@ -1620,7 +1425,8 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "dmt") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (normal != DMT) if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); + if (!normal_set) normal = DMT; + else if (normal != DMT) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G @@ -1631,7 +1437,8 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); beyond_contact = 1; - if (normal != JKR) if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be consistent"); + if (!normal_set) normal = JKR; + else if (normal != JKR) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G @@ -1639,25 +1446,32 @@ void PairGranular::coeff(int narg, char **arg) normal_set = 1; iarg += 5; } - else if (strcmp(arg[iarg], "damp_velocity") == 0){ - if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be consistent"); - iarg += 1; - } - else if (strstr(arg[iarg], "tangential") != NULL){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be consistent"); + else if (strcmp(arg[iarg], "damp") == 0){ + if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); + if (strcmp(arg[iarg+1]), "velocity") == 0){ + if (!damping_set) damping = VELOCITY; + else if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); } - else if (strstr(arg[iarg+1], "mindlin") != NULL){ - if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be consistent");; + else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + if (!damping_set) damping = VISCOELASTIC; + else if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "tsuji") == 0){ + if (!damping_set) damping = TSUJI; + if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + } + damping_set = 1; + iarg += 1; + } + else if (strcmp(arg[iarg], "tangential") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!tangential_set) tangential = TANGENTIAL_NOHISTORY; + else if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "mindlin") == 0){ + if (!tangential_set) tangential = TANGENTIAL_MINDLIN; + else if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types");; tangential_history = 1; } else{ @@ -1669,19 +1483,22 @@ void PairGranular::coeff(int narg, char **arg) tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; } - else if (strstr(arg[iarg], "rolling") != NULL){ + else if (strcmp(arg[iarg], "rolling") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strstr(arg[iarg+1], "none") != NULL){ - if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); + if (strcmp(arg[iarg+1], "none") == 0){ + if (!roll_set) roll = ROLL_NONE; + else if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); + if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!roll_set) roll = ROLL_NOHISTORY; + else if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); } - else if (strstr(arg[iarg+1], "sds") != NULL){ - if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be consistent"); + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (!roll_set) roll = ROLL_SDS; + else if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); roll_history = 1; } else{ @@ -1694,24 +1511,28 @@ void PairGranular::coeff(int narg, char **arg) iarg += 5; } } - else if (strstr(arg[iarg], "twist") != NULL){ + else if (strcmp(arg[iarg], "twisting") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strstr(arg[iarg+1], "none") != NULL){ - if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); + if (strcmp(arg[iarg+1], "none") == 0){ + if (!twist_set) twist = TWIST_NOHISTORY; + else if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); iarg += 2; } - else if (strstr(arg[iarg+1], "marshall") != NULL){ - if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); + else if (strcmp(arg[iarg+1], "marshall") == 0){ + if (!twist_set) twist = TWIST_MARSHALL; + else if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); twist_history = 1; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); + if (!twist_set) twist = TWIST_NOHISTORY; + else if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); } - else if (strstr(arg[iarg+1], "sds") != NULL){ - if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be consistent"); + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (!twist_set) twist = TWIST_SDS; + else if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); twist_history = 1; } else{ @@ -1727,6 +1548,15 @@ void PairGranular::coeff(int narg, char **arg) else error->all(FLERR, "Illegal pair coeff command"); } + //It is an error not to specify normal or tangential model + if (!normal_set) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); + if (!tangential_set) error->all(FLERR, "Illegal pair coeff command, must specify tangential contact model"); + + //If unspecified, set damping to VISCOELASTIC, twist/roll to NONE (cannot be changed by subsequent pair_coeff commands) + if (!damping_set) damping = VISCOELASTIC; + if (!roll_set) roll = ROLL_NONE; + if (!twist_set) twist = TWIST_NONE; + int count = 0; double damp; if (damping == TSUJI){ @@ -1740,37 +1570,28 @@ void PairGranular::coeff(int narg, char **arg) for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - if (normal_set){ - normal_coeffs[i][j][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = damp; - if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = normal_coeffs_local[3]; - } - if (tangential_set){ + normal_coeffs[i][j][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = damp; + if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal == JKR) || (normal == DMT)) + normal_coeffs[i][j][3] = normal_coeffs_local[3]; + + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + + if (roll != ROLL_NONE) for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; - } - if (roll_set){ - if (roll != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs_local[k]; - } - if (twist_set){ - if (twist != TWIST_NONE && twist != TWIST_MARSHALL) - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs_local[k]; - } + roll_coeffs[i][j][k] = roll_coeffs_local[k]; + + if (twist != TWIST_NONE && twist != TWIST_MARSHALL) + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = twist_coeffs_local[k]; + setflag[i][j] = 1; count++; } } - delete[] normal_coeffs_local; - delete[] tangential_coeffs_local; - delete[] roll_coeffs_local; - delete[] twist_coeffs_local; - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } @@ -1959,20 +1780,25 @@ double PairGranular::init_one(int i, int j) // if there is no current information about radius/cutoff of type i and j). // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + if (cutoff_global < 0){ + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); } - cutoff = cutmax; + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + else{ + cutoff = cutoff_global; } return cutoff; } diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 897316c907..f3a9d4dcbe 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -86,19 +86,18 @@ private: //Indices of history entries int tangential_history_index, roll_history_index, twist_history_index; - //Coefficients declared in pair style command, used as default unless - // overwritten in pair coeff command - double *normal_coeffs_global; - double *tangential_coeffs_global; - double *roll_coeffs_global; - double *twist_coeffs_global; + //Flags for whether model choices have been set + int normal_set, tangential_set, damping_set, roll_set, twist_set; - //Per-type coefficients declared in pair coeff command + //Per-type coefficients, set in pair coeff command double ***normal_coeffs; double ***tangential_coeffs; double ***roll_coeffs; double ***twist_coeffs; + //Optional user-specified global cutoff + double global_cutoff; + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); double mix_geom(double valii, double valjj); diff --git a/src/GRANULAR/pair_granular_multi.cpp b/src/GRANULAR/pair_granular_multi.cpp index 11381444a2..5fee363872 100644 --- a/src/GRANULAR/pair_granular_multi.cpp +++ b/src/GRANULAR/pair_granular_multi.cpp @@ -654,217 +654,15 @@ void PairGranularMulti::allocate() void PairGranularMulti::settings(int narg, char **arg) { - if (narg < 5) error->all(FLERR,"Illegal pair_style command"); + if (narg == 1){ + cutoff_global = force->numeric(FLERR,arg[0]) + } + else{ + cutoff_global = -1; //Will be set based on particle sizes, model choice + } - int iarg = 0; - - //Some defaults - normal_global = HERTZ; - damping_global = VISCOELASTIC; - tangential_global = TANGENTIAL_MINDLIN; - roll_global = ROLL_NONE; - twist_global = TWIST_NONE; - - tangential_history = 1; + tangential_history = 0; roll_history = twist_history = 0; - - int normal_set, tangential_set; - normal_set = tangential_set = 0; - - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ - if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hooke option"); - normal_global = HOOKE; - normal_set = 1; - memory->create(normal_coeffs_global, 2, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ - int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = HERTZ; - normal_set = 1; - memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ - int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = HERTZ_MATERIAL; - normal_set = 1; - memory->create(normal_coeffs_global, num_coeffs, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E (Young's modulus) - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G (shear modulus) - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for Hertz option"); - normal_global = DMT; - normal_set = 1; - memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //4/3 E - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for JKR option"); - beyond_contact = 1; - normal_global = JKR; - normal_set = 1; - memory->create(normal_coeffs_global, 4, "pair:normal_coeffs_global"); - normal_coeffs_global[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_global[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_global[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_global[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "damp_velocity") == 0){ - damping_global = VELOCITY; - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - damping_global = VISCOELASTIC; - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - damping_global = TSUJI; - iarg += 1; - } - else if (strstr(arg[iarg], "tangential") != NULL){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - tangential_global = TANGENTIAL_NOHISTORY; - tangential_set = 1; - } - else if (strstr(arg[iarg+1], "mindlin") != NULL){ - tangential_global = TANGENTIAL_MINDLIN; - tangential_history = 1; - tangential_set = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized sliding friction model"); - } - memory->create(tangential_coeffs_global, 3, "pair:tangential_coeffs_global"); - tangential_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - else if (strstr(arg[iarg], "roll") != NULL){ - if (strstr(arg[iarg+1], "none") != NULL){ - roll_global = ROLL_NONE; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ - roll_global = ROLL_NOHISTORY; - } - else if (strstr(arg[iarg+1], "sds") != NULL){ - roll_global = ROLL_SDS; - roll_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized rolling friction model"); - } - memory->create(roll_coeffs_global, 3, "pair:roll_coeffs_global"); - roll_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else if (strstr(arg[iarg], "twist") != NULL){ - if (strstr(arg[iarg+1], "none") != NULL){ - twist_global = TWIST_NONE; - iarg += 2; - } - else if (strstr(arg[iarg+1], "marshall") != NULL){ - twist_global = TWIST_MARSHALL; - twist_history = 1; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_style command, not enough parameters provided for twist model"); - memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); //To be filled later - if (strstr(arg[iarg+1], "nohistory") != NULL){ - twist_global = TWIST_NOHISTORY; - } - else if (strstr(arg[iarg+1], "sds") != NULL){ - twist_global = TWIST_SDS; - twist_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_style command, unrecognized twisting friction model"); - } - memory->create(twist_coeffs_global, 3, "pair:twist_coeffs_global"); - twist_coeffs_global[0] = force->numeric(FLERR,arg[iarg+2]); //ktwist - twist_coeffs_global[1] = force->numeric(FLERR,arg[iarg+3]); //gammatwist - twist_coeffs_global[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else error->all(FLERR, "Illegal pair_style granular command"); - } - - //Set all i-i entries, which may be replaced by pair coeff commands - //It may also make sense to consider removing all of the above, and only - // having the option for pair_coeff to set the parameters, similar to most LAMMPS pair styles - // The reason for the current setup is to remain true to existing pair gran/hooke etc. syntax, - // where coeffs are set in the pair_style command, and a pair_coeff * * command is issued. - - //Other option is to have two pair styles, e.g. pair granular and pair granular/multi, - // where granular/multi allows per-type coefficients, pair granular does not (this would also - // allow minor speed-up by templating pair granular) - allocate(); - double damp; - for (int i = 1; i <= atom->ntypes; i++){ - normal[i][i] = normal_global; - damping[i][i] = damping_global; - tangential[i][i] = tangential_global; - roll[i][i] = roll_global; - twist[i][i] = twist_global; - - if (normal_set){ - if (damping_global == TSUJI){ - double cor = normal_coeffs_global[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_global[1]; - normal_coeffs[i][i][0] = normal_coeffs_global[0]; - normal_coeffs[i][i][1] = damp; - if (normal[i][i] != HOOKE && normal[i][i] != HERTZ){ - normal_coeffs[i][i][2] = normal_coeffs_global[2]; - } - if ((normal_global == JKR) || (normal_global == DMT)) - normal_coeffs[i][i][3] = normal_coeffs_global[3]; - } - if(tangential_set){ - tangential[i][i] = tangential_global; - for (int k = 0; k < 3; k++) - tangential_coeffs[i][i][k] = tangential_coeffs_global[k]; - } - roll[i][i] = roll_global; - if (roll_global != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][i][k] = roll_coeffs_global[k]; - - twist[i][i] = twist_global; - if (twist_global != TWIST_NONE && twist_global != TWIST_MARSHALL) - for (int k = 0; k < 3; k++) - twist_coeffs[i][i][k] = twist_coeffs_global[k]; - - if (normal_set && tangential_set) setflag[i][i] = 1; - } } /* ---------------------------------------------------------------------- @@ -874,10 +672,6 @@ void PairGranularMulti::settings(int narg, char **arg) void PairGranularMulti::coeff(int narg, char **arg) { int normal_local, damping_local, tangential_local, roll_local, twist_local; - double *normal_coeffs_local; - double *tangential_coeffs_local; - double *roll_coeffs_local; - double *twist_coeffs_local; normal_coeffs_local = new double[4]; tangential_coeffs_local = new double[4]; @@ -893,8 +687,10 @@ void PairGranularMulti::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - normal_local = tangential_local = roll_local = twist_local = -1; - damping_local = -1; + //Defaults + normal_local = tangential_local = -1; + roll_local = twist_local = 0; + damping_local = VISCOELASTIC; int iarg = 2; while (iarg < narg){ @@ -941,24 +737,27 @@ void PairGranularMulti::coeff(int narg, char **arg) normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } - else if (strcmp(arg[iarg], "damp_velocity") == 0){ - damping_local = VELOCITY; - iarg += 1; + else if (strcmp(arg[iarg], "damp") == 0){ + if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); + if (strcmp(arg[iarg+1]), "velocity") == 0){ + damping_local = VELOCITY; + iarg += 1; + } + else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + damping_local = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg], "tsuji") == 0){ + damping_local = TSUJI; + iarg += 1; + } } - else if (strcmp(arg[iarg], "damp_viscoelastic") == 0){ - damping_local = VISCOELASTIC; - iarg += 1; - } - else if (strcmp(arg[iarg], "damp_tsuji") == 0){ - damping_local = TSUJI; - iarg += 1; - } - else if (strstr(arg[iarg], "tangential") != NULL){ + else if (strcmp(arg[iarg], "tangential") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ + if (strcmp(arg[iarg+1], "nohistory") == 0){ tangential_local = TANGENTIAL_NOHISTORY; } - else if (strstr(arg[iarg+1], "mindlin") != NULL){ + else if (strcmp(arg[iarg+1], "mindlin") == 0){ tangential_local = TANGENTIAL_MINDLIN; tangential_history = 1; } @@ -970,18 +769,18 @@ void PairGranularMulti::coeff(int narg, char **arg) tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; } - else if (strstr(arg[iarg], "rolling") != NULL){ + else if (strcmp(arg[iarg], "rolling") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strstr(arg[iarg+1], "none") != NULL){ + if (strcmp(arg[iarg+1], "none") == 0){ roll_local = ROLL_NONE; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ + if (strcmp(arg[iarg+1], "nohistory") == 0){ roll_local = ROLL_NOHISTORY; } - else if (strstr(arg[iarg+1], "sds") != NULL){ + else if (strcmp(arg[iarg+1], "sds") == 0){ roll_local = ROLL_SDS; roll_history = 1; } @@ -994,23 +793,23 @@ void PairGranularMulti::coeff(int narg, char **arg) iarg += 5; } } - else if (strstr(arg[iarg], "twist") != NULL){ + else if (strcmp(arg[iarg], "twisting") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strstr(arg[iarg+1], "none") != NULL){ + if (strcmp(arg[iarg+1], "none") == 0){ twist_local = TWIST_NONE; iarg += 2; } - else if (strstr(arg[iarg+1], "marshall") != NULL){ + else if (strcmp(arg[iarg+1], "marshall") == 0){ twist_local = TWIST_MARSHALL; twist_history = 1; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (strstr(arg[iarg+1], "nohistory") != NULL){ + if (strcmp(arg[iarg+1], "nohistory") == 0){ twist_local = TWIST_NOHISTORY; } - else if (strstr(arg[iarg+1], "sds") != NULL){ + else if (strcmp(arg[iarg+1], "sds") == 0){ twist_local = TWIST_SDS; twist_history = 1; } @@ -1026,66 +825,49 @@ void PairGranularMulti::coeff(int narg, char **arg) else error->all(FLERR, "Illegal pair coeff command"); } + //It is an error not to specify normal or tangential model + if ((normal_set < 0) || (tangential_set < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model");)) + int count = 0; double damp; - if (damping_local >= 0){ - if (normal_local == -1) - error->all(FLERR, "Illegal pair_coeff command, must specify normal model when setting damping model"); - if (damping_local == TSUJI){ - double cor; - cor = normal_coeffs_local[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_local[1]; + if (damping_local == TSUJI){ + double cor; + cor = normal_coeffs_local[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); } + else damp = normal_coeffs_local[1]; for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - if (normal_local >= 0){ - normal[i][j] = normal_local; - normal_coeffs[i][j][0] = normal_coeffs_local[0]; - if (damping_local == -1){ - damp = normal_coeffs_global[1]; - } - normal_coeffs[i][j][1] = damp; - if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal_local == JKR) || (normal_local == DMT)) - normal_coeffs[i][j][3] = normal_coeffs_local[3]; - } - if (damping_local >= 0){ - damping[i][j] = damping_local; - } - if (tangential_local >= 0){ - tangential[i][j] = tangential_local; + normal[i][j] = normal_local; + normal_coeffs[i][j][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = damp; + if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal_local == JKR) || (normal_local == DMT)) + normal_coeffs[i][j][3] = normal_coeffs_local[3]; + + damping[i][j] = damping_local; + + tangential[i][j] = tangential_local; for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; - } - if (roll_local >= 0){ - roll[i][j] = roll_local; - if (roll_local != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs_local[k]; - } - if (twist_local >= 0){ - twist[i][j] = twist_local; + + roll[i][j] = roll_local; + if (roll_local != ROLL_NONE) + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = roll_coeffs_local[k]; + + twist[i][j] = twist_local; if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = twist_coeffs_local[k]; - } - - if (normal_local >= 0 && tangential_local >= 0) setflag[i][j] = 1; + setflag[i][j] = 1; count++; } } - - delete[] normal_coeffs_local; - delete[] tangential_coeffs_local; - delete[] roll_coeffs_local; - delete[] twist_coeffs_local; - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } @@ -1286,20 +1068,25 @@ double PairGranularMulti::init_one(int i, int j) // if there is no current information about radius/cutoff of type i and j). // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + if (cutoff_global < 0){ + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); } - cutoff = cutmax; + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + else{ + cutoff = cutoff_global; } return cutoff; } diff --git a/src/GRANULAR/pair_granular_multi.h b/src/GRANULAR/pair_granular_multi.h index e853e564df..95beb950f4 100644 --- a/src/GRANULAR/pair_granular_multi.h +++ b/src/GRANULAR/pair_granular_multi.h @@ -65,27 +65,26 @@ public: private: int size_history; - //Per-type models + //Models int **normal, **damping, **tangential, **roll, **twist; - int normal_global, damping_global; - int tangential_global, roll_global, twist_global; - + //History flags int tangential_history, roll_history, twist_history; + + //Indices of history entries int tangential_history_index; int roll_history_index; int twist_history_index; - double *normal_coeffs_global; - double *tangential_coeffs_global; - double *roll_coeffs_global; - double *twist_coeffs_global; - + //Per-type coefficients, set in pair coeff command double ***normal_coeffs; double ***tangential_coeffs; double ***roll_coeffs; double ***twist_coeffs; + //Optional user-specified global cutoff + double cutoff_global; + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); double mix_geom(double valii, double valjj); From 6e4e244e65ac89f4fc248442c85b451c2ce9080e Mon Sep 17 00:00:00 2001 From: dsbolin Date: Tue, 15 Jan 2019 13:31:16 -0700 Subject: [PATCH 021/243] More doc page additions --- doc/src/pair_granular.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 19c16cc6ea..35b64bf29d 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -92,7 +92,11 @@ and their required arguments are: {no_history}: k_t, tangential_damping, friction coefficient {mindlin}: k_t, tangential_damping, friction coefficient -For {no_history}, the tangential force is computed according to +For {no_history}, the tangential force is computed according to: +:c,image{Eqs/tangential_nohistory.jpg} + +For {mindlin}, tangential force is: +:c,image{Eqs/tangential_mindlin.jpg} The total force on a particle is the sum of the normal and tangential forces from all interactions. The tangential force also induces a torque on both particles in a contacting pair. Additionally, rolling and twisting friction From 26eb17aa506f0c39995533e6b14255c6d4f83537 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Tue, 15 Jan 2019 16:42:06 -0700 Subject: [PATCH 022/243] Fixed tangential damping in pair granular; fixed order of template arguments, so that pair gran and gran/multi now produce identical results for same settings (as they should) --- src/GRANULAR/pair_granular.cpp | 41 ++++++++++++++-------------- src/GRANULAR/pair_granular.h | 2 +- src/GRANULAR/pair_granular_multi.cpp | 28 +++++++++---------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 9fe4bd8415..c2f202ac9c 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -825,12 +825,12 @@ void PairGranular::compute(int eflag, int vflag){ #ifdef TEMPLATED_PAIR_GRANULAR template < int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_roll, int Tp_twist > + int Tp_twist, int Tp_roll > void PairGranular::compute_templated(int eflag, int vflag) #else void PairGranular::compute_untemplated (int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_roll, int Tp_twist, int eflag, int vflag) + int Tp_twist, int Tp_roll, int eflag, int vflag) #endif { int i,j,ii,jj,inum,jnum,itype,jtype; @@ -1040,17 +1040,17 @@ void PairGranular::compute_untemplated //Consider restricting Hooke to only have 'velocity' as an option for damping? if (Tp_damping == VELOCITY){ - damp_normal = normal_coeffs[itype][jtype][1]; + damp_normal = 1; } else if (Tp_damping == VISCOELASTIC){ if (Tp_normal == HOOKE) a = sqrt(dR); - damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + damp_normal = a*meff; } else if (Tp_damping == TSUJI){ - damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + damp_normal = sqrt(meff*knfac); } - Fdamp = -damp_normal*vnnr; + Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; Fntot = Fne + Fdamp; @@ -1197,7 +1197,6 @@ void PairGranular::compute_untemplated history[rhist2] += vrl3*dt; } - k_roll = roll_coeffs[itype][jtype][0]; damp_roll = roll_coeffs[itype][jtype][1]; fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; @@ -1361,7 +1360,7 @@ void PairGranular::allocate() void PairGranular::settings(int narg, char **arg) { if (narg == 1){ - cutoff_global = force->numeric(FLERR,arg[0]) + cutoff_global = force->numeric(FLERR,arg[0]); } else{ cutoff_global = -1; //Will be set based on particle sizes, model choice @@ -1377,10 +1376,10 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - normal_coeffs_local = new double[4]; - tangential_coeffs_local = new double[4]; - roll_coeffs_local = new double[4]; - twist_coeffs_local = new double[4]; + double normal_coeffs_local[4]; + double tangential_coeffs_local[4]; + double roll_coeffs_local[4]; + double twist_coeffs_local[4]; if (narg < 2) error->all(FLERR,"Incorrect args for pair coefficients"); @@ -1415,7 +1414,7 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = HERTZ/MATERIAL; + if (!normal_set) normal = HERTZ_MATERIAL; else if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -1448,7 +1447,7 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "damp") == 0){ if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1]), "velocity") == 0){ + if (strcmp(arg[iarg+1], "velocity") == 0){ if (!damping_set) damping = VELOCITY; else if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); } @@ -1461,7 +1460,7 @@ void PairGranular::coeff(int narg, char **arg) if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); } damping_set = 1; - iarg += 1; + iarg += 2; } else if (strcmp(arg[iarg], "tangential") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); @@ -1505,16 +1504,16 @@ void PairGranular::coeff(int narg, char **arg) error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } roll_set =1 ; - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; } } else if (strcmp(arg[iarg], "twisting") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0){ - if (!twist_set) twist = TWIST_NOHISTORY; + if (!twist_set) twist = TWIST_NONE; else if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); iarg += 2; } @@ -1522,12 +1521,13 @@ void PairGranular::coeff(int narg, char **arg) if (!twist_set) twist = TWIST_MARSHALL; else if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); twist_history = 1; + twist_set = 1; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (!twist_set) twist = TWIST_NOHISTORY; else if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!twist_set) twist = TWIST_NOHISTORY; if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); } else if (strcmp(arg[iarg+1], "sds") == 0){ @@ -1556,6 +1556,7 @@ void PairGranular::coeff(int narg, char **arg) if (!damping_set) damping = VISCOELASTIC; if (!roll_set) roll = ROLL_NONE; if (!twist_set) twist = TWIST_NONE; + damping_set = roll_set = twist_set = 1; int count = 0; double damp; diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index f3a9d4dcbe..f39f31e4cb 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -96,7 +96,7 @@ private: double ***twist_coeffs; //Optional user-specified global cutoff - double global_cutoff; + double cutoff_global; double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); diff --git a/src/GRANULAR/pair_granular_multi.cpp b/src/GRANULAR/pair_granular_multi.cpp index 5fee363872..09b8ea9709 100644 --- a/src/GRANULAR/pair_granular_multi.cpp +++ b/src/GRANULAR/pair_granular_multi.cpp @@ -329,17 +329,17 @@ void PairGranularMulti::compute(int eflag, int vflag) //Consider restricting Hooke to only have 'velocity' as an option for damping? if (damping[itype][jtype] == VELOCITY){ - damp_normal = normal_coeffs[itype][jtype][1]; + damp_normal = 1; } else if (damping[itype][jtype] == VISCOELASTIC){ if (normal[itype][jtype] == HOOKE) a = sqrt(dR); - damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + damp_normal = a*meff; } else if (damping[itype][jtype] == TSUJI){ - damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + damp_normal = sqrt(meff*knfac); } - Fdamp = -damp_normal*vnnr; + Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; Fntot = Fne + Fdamp; @@ -655,7 +655,7 @@ void PairGranularMulti::allocate() void PairGranularMulti::settings(int narg, char **arg) { if (narg == 1){ - cutoff_global = force->numeric(FLERR,arg[0]) + cutoff_global = force->numeric(FLERR,arg[0]); } else{ cutoff_global = -1; //Will be set based on particle sizes, model choice @@ -673,10 +673,10 @@ void PairGranularMulti::coeff(int narg, char **arg) { int normal_local, damping_local, tangential_local, roll_local, twist_local; - normal_coeffs_local = new double[4]; - tangential_coeffs_local = new double[4]; - roll_coeffs_local = new double[4]; - twist_coeffs_local = new double[4]; + double normal_coeffs_local[4]; + double tangential_coeffs_local[4]; + double roll_coeffs_local[4]; + double twist_coeffs_local[4]; if (narg < 2) error->all(FLERR,"Incorrect args for pair coefficients"); @@ -739,7 +739,7 @@ void PairGranularMulti::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "damp") == 0){ if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1]), "velocity") == 0){ + if (strcmp(arg[iarg+1], "velocity") == 0){ damping_local = VELOCITY; iarg += 1; } @@ -787,9 +787,9 @@ void PairGranularMulti::coeff(int narg, char **arg) else{ error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; } } @@ -826,7 +826,7 @@ void PairGranularMulti::coeff(int narg, char **arg) } //It is an error not to specify normal or tangential model - if ((normal_set < 0) || (tangential_set < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model");)) + if ((normal_local < 0) || (tangential_local < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); int count = 0; double damp; From 9de0262155461bcaee5132df2c0719486812d5d3 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Jan 2019 14:49:52 -0700 Subject: [PATCH 023/243] added rendezvous via all2all --- src/RIGID/fix_rigid_small.cpp | 5 +- src/RIGID/fix_shake.cpp | 30 ++-- src/comm.cpp | 318 +++++++++++++++++++++++++++++++--- src/comm.h | 12 +- src/irregular.cpp | 185 +++++++++++++++++++- src/irregular.h | 2 + src/special.cpp | 119 +++++++------ 7 files changed, 566 insertions(+), 105 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index e20c64487b..957438fc55 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1576,8 +1576,9 @@ void FixRigidSmall::create_bodies(tagint *bodyID) // func = compute bbox of each body, find atom closest to geometric center char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_body,buf,sizeof(OutRvous), + int nreturn = comm->rendezvous(1,ncount,(char *) inbuf,sizeof(InRvous), + 0,proclist, + rendezvous_body,0,buf,sizeof(OutRvous), (void *) this); OutRvous *outbuf = (OutRvous *) buf; diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 51121f0853..35153de839 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1068,9 +1068,9 @@ void FixShake::atom_owners() // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(IDRvous), - rendezvous_ids,buf,0,(void *) this); + comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), + 0,proclist, + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -1174,9 +1174,10 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner 4 values char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PartnerInfo), - rendezvous_partners_info,buf,sizeof(PartnerInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PartnerInfo), + 0,proclist, + rendezvous_partners_info, + 0,buf,sizeof(PartnerInfo), (void *) this); PartnerInfo *outbuf = (PartnerInfo *) buf; @@ -1194,7 +1195,8 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, partner_type[i][j] = outbuf[m].type; partner_massflag[i][j] = outbuf[m].massflag; - // only set partner_bondtype if my atom did not set it when setting up rendezvous + // only set partner_bondtype if my atom did not set it + // when setting up rendezvous // if this proc set it, then sender of this datum set outbuf.bondtype = 0 if (partner_bondtype[i][j] == 0) @@ -1261,9 +1263,9 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner nshake char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(NShakeInfo), - rendezvous_nshake,buf,sizeof(NShakeInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), + 0,proclist, + rendezvous_nshake,0,buf,sizeof(NShakeInfo), (void *) this); NShakeInfo *outbuf = (NShakeInfo *) buf; @@ -1354,9 +1356,9 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned shake info char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(ShakeInfo), - rendezvous_shake,buf,sizeof(ShakeInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), + 0,proclist, + rendezvous_shake,0,buf,sizeof(ShakeInfo), (void *) this); ShakeInfo *outbuf = (ShakeInfo *) buf; @@ -1412,7 +1414,7 @@ int FixShake::rendezvous_ids(int n, char *inbuf, fsptr->atomIDs = atomIDs; fsptr->procowner = procowner; - // flag = 0: no 2nd irregular comm needed in comm->rendezvous + // flag = 0: no second comm needed in rendezvous flag = 0; return 0; diff --git a/src/comm.cpp b/src/comm.cpp index 9bdaf0798a..39d4311aa2 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -729,34 +729,78 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, /* ---------------------------------------------------------------------- rendezvous communication operation three stages: - first Irregular converts inbuf from caller decomp to rvous decomp + first comm sends inbuf from caller decomp to rvous decomp callback operates on data in rendevous decomp - last Irregular converts outbuf from rvous decomp back to caller decomp + second comm sends outbuf from rvous decomp back to caller decomp inputs: - n = # of input datums - proclist = proc that owns each input datum in rendezvous decomposition - inbuf = list of input datums - insize = size in bytes of each input datum + which = perform (0) irregular or (1) MPI_All2allv communication + n = # of datums in inbuf + inbuf = vector of input datums + insize = byte size of each input datum + inorder = 0 for inbuf in random proc order, 1 for datums ordered by proc + procs: inorder 0 = proc to send each datum to, 1 = # of datums/proc, callback = caller function to invoke in rendezvous decomposition + takes input datums, returns output datums + outorder = same as inorder, but for datums returned by callback() + ptr = pointer to caller class, passed to callback() outputs: nout = # of output datums (function return) - outbuf = list of output datums - outsize = size in bytes of each output datum + outbuf = vector of output datums + outsize = byte size of each output datum + callback inputs: + nrvous = # of rvous decomp datums in inbuf_rvous + inbuf_rvous = vector of rvous decomp input datums + ptr = pointer to caller class + callback outputs: + nrvous_out = # of rvous decomp output datums (function return) + flag = 0 for no second comm, 1 for outbuf_rvous = inbuf_rvous, + 2 for second comm with new outbuf_rvous + procs_rvous = outorder 0 = proc to send each datum to, 1 = # of datums/proc + allocated + outbuf_rvous = vector of rvous decomp output datums + NOTE: could use MPI_INT or MPI_DOUBLE insead of MPI_CHAR + to avoid checked-for overflow in MPI_Alltoallv? ------------------------------------------------------------------------- */ -int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, - int (*callback)(int, char *, int &, int *&, char *&, void *), - char *&outbuf, int outsize, void *ptr) +int Comm:: +rendezvous(int which, int n, char *inbuf, int insize, + int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, int outsize, void *ptr) { - // comm inbuf from caller decomposition to rendezvous decomposition + int nout; + if (which == 0) + nout = rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr); + else + nout = rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr); + + return nout; +} + +/* ---------------------------------------------------------------------- */ + +int Comm:: +rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, + int outsize, void *ptr) +{ + // irregular comm of inbuf from caller decomp to rendezvous decomp + Irregular *irregular = new Irregular(lmp); - int n_rvous = irregular->create_data(n,proclist); // add sort - char *inbuf_rvous = (char *) memory->smalloc((bigint) n_rvous*insize, - "rendezvous:inbuf_rvous"); + int nrvous; + if (inorder) nrvous = irregular->create_data_grouped(n,procs); + else nrvous = irregular->create_data(n,procs); + + char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, + "rendezvous:inbuf"); irregular->exchange_data(inbuf,insize,inbuf_rvous); + bigint irregular1_bytes = 0; //irregular->irregular_bytes; irregular->destroy_data(); delete irregular; @@ -764,29 +808,253 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, // callback() allocates/populates proclist_rvous and outbuf_rvous int flag; - int *proclist_rvous; + int *procs_rvous; char *outbuf_rvous; - - int nout_rvous = - callback(n_rvous,inbuf_rvous,flag,proclist_rvous,outbuf_rvous,ptr); + int nrvous_out = callback(nrvous,inbuf_rvous,flag, + procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd comm stage - // comm outbuf from rendezvous decomposition back to caller + // irregular comm of outbuf from rendezvous decomp back to caller decomp // caller will free outbuf irregular = new Irregular(lmp); - int nout = irregular->create_data(nout_rvous,proclist_rvous); - outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + int nout; + if (outorder) + nout = irregular->create_data_grouped(nrvous_out,procs_rvous); + else nout = irregular->create_data(nrvous_out,procs_rvous); + + outbuf = (char *) memory->smalloc((bigint) nout*outsize, + "rendezvous:outbuf"); irregular->exchange_data(outbuf_rvous,outsize,outbuf); - + + bigint irregular2_bytes = 0; //irregular->irregular_bytes; irregular->destroy_data(); delete irregular; - memory->destroy(proclist_rvous); + + memory->destroy(procs_rvous); memory->sfree(outbuf_rvous); + // approximate memory tally + + bigint rvous_bytes = 0; + rvous_bytes += n*insize; // inbuf + rvous_bytes += nout*outsize; // outbuf + rvous_bytes += nrvous*insize; // inbuf_rvous + rvous_bytes += nrvous_out*outsize; // outbuf_rvous + rvous_bytes += nrvous_out*sizeof(int); // procs_rvous + rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms + + // return number of output datums + + return nout; +} + +/* ---------------------------------------------------------------------- */ + +int Comm:: +rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, int outsize, void *ptr) +{ + int iproc; + bigint all2all1_bytes,all2all2_bytes; + int *sendcount,*sdispls,*recvcount,*rdispls; + int *procs_a2a; + bigint *offsets; + char *inbuf_a2a,*outbuf_a2a; + + // create procs and inbuf for All2all if necesary + + if (!inorder) { + memory->create(procs_a2a,nprocs,"rendezvous:procs"); + inbuf_a2a = (char *) memory->smalloc((bigint) n*insize, + "rendezvous:inbuf"); + memory->create(offsets,nprocs,"rendezvous:offsets"); + + for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; + for (int i = 0; i < n; i++) procs_a2a[procs[i]]++; + + offsets[0] = 0; + for (int i = 1; i < nprocs; i++) + offsets[i] = offsets[i-1] + insize*procs_a2a[i-1]; + + bigint offset = 0; + for (int i = 0; i < n; i++) { + iproc = procs[i]; + memcpy(&inbuf_a2a[offsets[iproc]],&inbuf[offset],insize); + offsets[iproc] += insize; + offset += insize; + } + + all2all1_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + n*insize; + + } else { + procs_a2a = procs; + inbuf_a2a = inbuf; + all2all1_bytes = 0; + } + + // create args for MPI_Alltoallv() on input data + + memory->create(sendcount,nprocs,"rendezvous:sendcount"); + memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); + + memory->create(recvcount,nprocs,"rendezvous:recvcount"); + MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); + + memory->create(sdispls,nprocs,"rendezvous:sdispls"); + memory->create(rdispls,nprocs,"rendezvous:rdispls"); + sdispls[0] = rdispls[0] = 0; + for (int i = 1; i < nprocs; i++) { + sdispls[i] = sdispls[i-1] + sendcount[i-1]; + rdispls[i] = rdispls[i-1] + recvcount[i-1]; + } + int nrvous = rdispls[nprocs-1] + recvcount[nprocs-1]; + + // test for overflow of input data due to imbalance or insize + // means that individual sdispls or rdispls values overflow + + int overflow = 0; + if ((bigint) n*insize > MAXSMALLINT) overflow = 1; + if ((bigint) nrvous*insize > MAXSMALLINT) overflow = 1; + int overflowall; + MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); + if (overflowall) error->all(FLERR,"Overflow input size in rendezvous_a2a"); + + for (int i = 0; i < nprocs; i++) { + sendcount[i] *= insize; + sdispls[i] *= insize; + recvcount[i] *= insize; + rdispls[i] *= insize; + } + + // all2all comm of inbuf from caller decomp to rendezvous decomp + + char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, + "rendezvous:inbuf"); + + MPI_Alltoallv(inbuf_a2a,sendcount,sdispls,MPI_CHAR, + inbuf_rvous,recvcount,rdispls,MPI_CHAR,world); + + if (!inorder) { + memory->destroy(procs_a2a); + memory->sfree(inbuf_a2a); + memory->destroy(offsets); + } + + // peform rendezvous computation via callback() + // callback() allocates/populates proclist_rvous and outbuf_rvous + + int flag; + int *procs_rvous; + char *outbuf_rvous; + + int nrvous_out = callback(nrvous,inbuf_rvous,flag, + procs_rvous,outbuf_rvous,ptr); + + if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + + // create procs and outbuf for All2all if necesary + + if (!outorder) { + memory->create(procs_a2a,nprocs,"rendezvous_a2a:procs"); + + outbuf_a2a = (char *) memory->smalloc((bigint) nrvous_out*outsize, + "rendezvous:outbuf"); + memory->create(offsets,nprocs,"rendezvous:offsets"); + + for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; + for (int i = 0; i < nrvous_out; i++) procs_a2a[procs_rvous[i]]++; + + offsets[0] = 0; + for (int i = 1; i < nprocs; i++) + offsets[i] = offsets[i-1] + outsize*procs_a2a[i-1]; + + bigint offset = 0; + for (int i = 0; i < nrvous_out; i++) { + iproc = procs_rvous[i]; + memcpy(&outbuf_a2a[offsets[iproc]],&outbuf_rvous[offset],outsize); + offsets[iproc] += outsize; + offset += outsize; + } + + all2all2_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + + nrvous_out*outsize; + + } else { + procs_a2a = procs_rvous; + outbuf_a2a = outbuf_rvous; + all2all2_bytes = 0; + } + + // comm outbuf from rendezvous decomposition back to caller + + memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); + + MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); + + sdispls[0] = rdispls[0] = 0; + for (int i = 1; i < nprocs; i++) { + sdispls[i] = sdispls[i-1] + sendcount[i-1]; + rdispls[i] = rdispls[i-1] + recvcount[i-1]; + } + int nout = rdispls[nprocs-1] + recvcount[nprocs-1]; + + // test for overflow of outbuf due to imbalance or outsize + // means that individual sdispls or rdispls values overflow + + overflow = 0; + if ((bigint) nrvous*outsize > MAXSMALLINT) overflow = 1; + if ((bigint) nout*outsize > MAXSMALLINT) overflow = 1; + MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); + if (overflowall) error->all(FLERR,"Overflow output in rendezvous_a2a"); + + for (int i = 0; i < nprocs; i++) { + sendcount[i] *= outsize; + sdispls[i] *= outsize; + recvcount[i] *= outsize; + rdispls[i] *= outsize; + } + + // all2all comm of outbuf from rendezvous decomp back to caller decomp + // caller will free outbuf + + outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + + MPI_Alltoallv(outbuf_a2a,sendcount,sdispls,MPI_CHAR, + outbuf,recvcount,rdispls,MPI_CHAR,world); + + memory->destroy(procs_rvous); + memory->sfree(outbuf_rvous); + + if (!outorder) { + memory->destroy(procs_a2a); + memory->sfree(outbuf_a2a); + memory->destroy(offsets); + } + + // clean up + + memory->destroy(sendcount); + memory->destroy(recvcount); + memory->destroy(sdispls); + memory->destroy(rdispls); + + // approximate memory tally + + bigint rvous_bytes = 0; + rvous_bytes += n*insize; // inbuf + rvous_bytes += nout*outsize; // outbuf + rvous_bytes += nrvous*insize; // inbuf_rvous + rvous_bytes += nrvous_out*outsize; // outbuf_rvous + rvous_bytes += nrvous_out*sizeof(int); // procs_rvous + rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors + rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops + // return number of datums return nout; diff --git a/src/comm.h b/src/comm.h index a1bac53ac8..807da9bf0d 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,9 +109,9 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); - int rendezvous(int, int *, char *, int, + int rendezvous(int, int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - char *&, int, void *); + int, char *&, int, void *); int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); @@ -146,6 +146,14 @@ class Comm : protected Pointers { int ncores; // # of cores per node int coregrid[3]; // 3d grid of cores within a node int user_coregrid[3]; // user request for cores in each dim + + int rendezvous_irregular(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), + int, char *&, int, void *); + int rendezvous_all2all(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), + int, char *&, int, void *); + public: enum{MULTIPLE}; }; diff --git a/src/irregular.cpp b/src/irregular.cpp index 60025249cf..77278ec4c5 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -622,6 +622,7 @@ int Irregular::create_data(int n, int *proclist, int sortflag) num_send = new int[nsend_proc]; index_send = new int[n-work1[me]]; index_self = new int[work1[me]]; + maxindex = n; // proc_send = procs I send to // num_send = # of datums I send to each proc @@ -679,8 +680,182 @@ int Irregular::create_data(int n, int *proclist, int sortflag) // receive incoming messages // proc_recv = procs I recv from - // num_recv = total size of message each proc sends me - // nrecvdatum = total size of data I recv + // num_recv = # of datums each proc sends me + // nrecvdatum = total # of datums I recv + + int nrecvdatum = 0; + for (i = 0; i < nrecv_proc; i++) { + MPI_Recv(&num_recv[i],1,MPI_INT,MPI_ANY_SOURCE,0,world,status); + proc_recv[i] = status->MPI_SOURCE; + nrecvdatum += num_recv[i]; + } + nrecvdatum += num_self; + + // sort proc_recv and num_recv by proc ID if requested + // useful for debugging to insure reproducible ordering of received datums + + if (sortflag) { + int *order = new int[nrecv_proc]; + int *proc_recv_ordered = new int[nrecv_proc]; + int *num_recv_ordered = new int[nrecv_proc]; + + for (i = 0; i < nrecv_proc; i++) order[i] = i; + +#if defined(LMP_QSORT) + proc_recv_copy = proc_recv; + qsort(order,nrecv_proc,sizeof(int),compare_standalone); +#else + merge_sort(order,nrecv_proc,(void *)proc_recv,compare_standalone); +#endif + + int j; + for (i = 0; i < nrecv_proc; i++) { + j = order[i]; + proc_recv_ordered[i] = proc_recv[j]; + num_recv_ordered[i] = num_recv[j]; + } + + memcpy(proc_recv,proc_recv_ordered,nrecv_proc*sizeof(int)); + memcpy(num_recv,num_recv_ordered,nrecv_proc*sizeof(int)); + delete [] order; + delete [] proc_recv_ordered; + delete [] num_recv_ordered; + } + + // barrier to insure all MPI_ANY_SOURCE messages are received + // else another proc could proceed to exchange_data() and send to me + + MPI_Barrier(world); + + // return # of datums I will receive + + return nrecvdatum; +} + +/* ---------------------------------------------------------------------- + create communication plan based on list of datums of uniform size + n = # of datums to send + procs = how many datums to send to each proc, must include self + sort = flag for sorting order of received messages by proc ID + return total # of datums I will recv, including any to self +------------------------------------------------------------------------- */ + +int Irregular::create_data_grouped(int n, int *procs, int sortflag) +{ + int i,j,k,m; + + // setup for collective comm + // work1 = # of datums I send to each proc, set self to 0 + // work2 = 1 for all procs, used for ReduceScatter + + for (i = 0; i < nprocs; i++) { + work1[i] = procs[i]; + work2[i] = 1; + } + work1[me] = 0; + + // nrecv_proc = # of procs I receive messages from, not including self + // options for performing ReduceScatter operation + // some are more efficient on some machines at big sizes + +#ifdef LAMMPS_RS_ALLREDUCE_INPLACE + MPI_Allreduce(MPI_IN_PLACE,work1,nprocs,MPI_INT,MPI_SUM,world); + nrecv_proc = work1[me]; +#else +#ifdef LAMMPS_RS_ALLREDUCE + MPI_Allreduce(work1,work2,nprocs,MPI_INT,MPI_SUM,world); + nrecv_proc = work2[me]; +#else + MPI_Reduce_scatter(work1,&nrecv_proc,work2,MPI_INT,MPI_SUM,world); +#endif +#endif + + // allocate receive arrays + + proc_recv = new int[nrecv_proc]; + num_recv = new int[nrecv_proc]; + request = new MPI_Request[nrecv_proc]; + status = new MPI_Status[nrecv_proc]; + + // work1 = # of datums I send to each proc, including self + // nsend_proc = # of procs I send messages to, not including self + + for (i = 0; i < nprocs; i++) work1[i] = procs[i]; + + nsend_proc = 0; + for (i = 0; i < nprocs; i++) + if (work1[i]) nsend_proc++; + if (work1[me]) nsend_proc--; + + // allocate send and self arrays + + proc_send = new int[nsend_proc]; + num_send = new int[nsend_proc]; + index_send = new int[n-work1[me]]; + index_self = new int[work1[me]]; + maxindex = n; + + // proc_send = procs I send to + // num_send = # of datums I send to each proc + // num_self = # of datums I copy to self + // to balance pattern of send messages: + // each proc begins with iproc > me, continues until iproc = me + // reset work1 to store which send message each proc corresponds to + + int iproc = me; + int isend = 0; + for (i = 0; i < nprocs; i++) { + iproc++; + if (iproc == nprocs) iproc = 0; + if (iproc == me) { + num_self = work1[iproc]; + work1[iproc] = 0; + } else if (work1[iproc] > 0) { + proc_send[isend] = iproc; + num_send[isend] = work1[iproc]; + work1[iproc] = isend; + isend++; + } + } + + // work2 = offsets into index_send for each proc I send to + // m = ptr into index_self + // index_send = list of which datums to send to each proc + // 1st N1 values are datum indices for 1st proc, + // next N2 values are datum indices for 2nd proc, etc + // index_self = list of which datums to copy to self + + work2[0] = 0; + for (i = 1; i < nsend_proc; i++) work2[i] = work2[i-1] + num_send[i-1]; + + m = 0; + i = 0; + for (iproc = 0; iproc < nprocs; iproc++) { + k = procs[iproc]; + for (j = 0; j < k; j++) { + if (iproc == me) index_self[m++] = i++; + else { + isend = work1[iproc]; + index_send[work2[isend]++] = i++; + } + } + } + + // tell receivers how much data I send + // sendmax_proc = largest # of datums I send in a single message + + sendmax_proc = 0; + for (i = 0; i < nsend_proc; i++) { + MPI_Request tmpReq; // Use non-blocking send to avoid possible deadlock + MPI_Isend(&num_send[i],1,MPI_INT,proc_send[i],0,world,&tmpReq); + MPI_Request_free(&tmpReq); // the MPI_Barrier below marks completion + sendmax_proc = MAX(sendmax_proc,num_send[i]); + } + + // receive incoming messages + // proc_recv = procs I recv from + // num_recv = # of datums each proc sends me + // nrecvdatum = total # of datums I recv int nrecvdatum = 0; for (i = 0; i < nrecv_proc; i++) { @@ -789,6 +964,12 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) // wait on all incoming messages if (nrecv_proc) MPI_Waitall(nrecv_proc,request,status); + + // approximate memory tally + + bigint irregular_bytes = 2*nprocs*sizeof(int); + irregular_bytes += maxindex*sizeof(int); + irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- diff --git a/src/irregular.h b/src/irregular.h index 1f74fe801b..d56bcb253d 100644 --- a/src/irregular.h +++ b/src/irregular.h @@ -33,6 +33,7 @@ class Irregular : protected Pointers { int *procassign = NULL); int migrate_check(); int create_data(int, int *, int sortflag = 0); + int create_data_grouped(int, int *, int sortflag = 0); void exchange_data(char *, int, char *); void destroy_data(); bigint memory_usage(); @@ -48,6 +49,7 @@ class Irregular : protected Pointers { double *dbuf; // double buf for largest single atom send int maxbuf; // size of char buf in bytes char *buf; // char buf for largest single data send + int maxindex; // combined size of index_send + index_self int *mproclist,*msizes; // persistent vectors in migrate_atoms int maxlocal; // allocated size of mproclist and msizes diff --git a/src/special.cpp b/src/special.cpp index b0d5bc7dca..34685d8c65 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -172,10 +172,9 @@ void Special::atom_owners() IDRvous *idbuf = (IDRvous *) memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); - // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID + // setup input buf for rendezvous comm // one datum for each owned atom: datum = owning proc, atomID + // each proc assigned every 1/Pth atom for (int i = 0; i < nlocal; i++) { proclist[i] = tag[i] % nprocs; @@ -184,19 +183,18 @@ void Special::atom_owners() } // perform rendezvous operation - // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(IDRvous), - rendezvous_ids,buf,0,(void *) this); + comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); } /* ---------------------------------------------------------------------- - onetwo build + onetwo build when newton_bond flag on + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onetwo_build_newton() @@ -225,9 +223,8 @@ void Special::onetwo_build_newton() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = atomID % nprocs - // one datum for each bond partner: bond partner ID, atomID + // one datum for each unowned bond partner: bond partner ID, atomID + // owning proc for each datum = bond partner ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -242,19 +239,19 @@ void Special::onetwo_build_newton() } // perform rendezvous operation - // each proc owns random subset of atoms char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[0] and onetwo for all owned atoms based on output info + // set nspecial[0] and onetwo for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-2 neighbors for (i = 0; i < nlocal; i++) { @@ -327,8 +324,8 @@ void Special::onetwo_build_newton_off() } /* ---------------------------------------------------------------------- - onetwo build with newton_bond flag off - no need for rendezvous comm + onethree build + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onethree_build() @@ -355,10 +352,10 @@ void Special::onethree_build() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onetwo pair: datum = atomID1, atomID2 + // datums = pairs of onetwo partners where either is unknown + // these pairs are onethree neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onetwo ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -377,20 +374,19 @@ void Special::onethree_build() } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onethree lists char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[1] and onethree for all owned atoms based on output info + // set nspecial[1] and onethree for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-3 neighbors for (i = 0; i < nlocal; i++) { @@ -434,7 +430,8 @@ void Special::onethree_build() } /* ---------------------------------------------------------------------- - remove duplicates within each of onetwo, onethree, onefour individually + onefour build + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onefour_build() @@ -446,7 +443,6 @@ void Special::onefour_build() int nlocal = atom->nlocal; // nsend = # of my datums to send - // include nlocal datums with owner of each atom int nsend = 0; for (i = 0; i < nlocal; i++) { @@ -462,10 +458,10 @@ void Special::onefour_build() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 + // datums = pairs of onethree and onetwo partners where onethree is unknown + // these pairs are onefour neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onethree ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -483,20 +479,19 @@ void Special::onefour_build() } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onefour lists char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[2] and onefour for all owned atoms based on output info + // set nspecial[2] and onefour for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-4 neighbors for (i = 0; i < nlocal; i++) { @@ -780,6 +775,7 @@ void Special::combine() trim list of 1-3 neighbors by checking defined angles delete a 1-3 neigh if they are not end atoms of a defined angle and if they are not 1,3 or 2,4 atoms of a defined dihedral + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::angle_trim() @@ -849,6 +845,10 @@ void Special::angle_trim() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm + // datums = pairs of onetwo partners where either is unknown + // these pairs are onethree neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onetwo ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -902,14 +902,11 @@ void Special::angle_trim() } // perform rendezvous operation - // each proc owns random subset of atoms - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -931,6 +928,8 @@ void Special::angle_trim() flag[i][j] = 0; // reset nspecial[1] and onethree for all owned atoms based on output info + // based on owned info plus rendezvous output info + // output datums = pairs of atoms that are 1-3 neighbors for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { @@ -1036,8 +1035,9 @@ void Special::angle_trim() } /* ---------------------------------------------------------------------- - trim list of 1-4 neighbors by checking defined dihedrals + trim list of 1-4 neighbors by checking all defined dihedrals delete a 1-4 neigh if they are not end atoms of a defined dihedral + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::dihedral_trim() @@ -1068,12 +1068,11 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, rendezvous dihedral 1-4 pairs + // if dihedrals are defined, rendezvous the dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { // nsend = # of my datums to send - // latter is only for dihedrals where I own atom2 (newton bond off) int nsend = 0; for (i = 0; i < nlocal; i++) { @@ -1092,6 +1091,11 @@ void Special::dihedral_trim() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm + // datums = pairs of onefour atom IDs in a dihedral defined for my atoms + // only dihedrals where I own atom2 (in case newton_bond off) + // datum = atom1 ID and atom4 ID + // send the datum twice, to owner of atom1 ID and atom4 ID + // owning procs for each datum = atom1 or atom4 ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -1117,21 +1121,18 @@ void Special::dihedral_trim() } // perform rendezvous operation - // each proc owns random subset of atoms - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // flag all onefour atoms to keep + // flag all of my onefour IDs to keep int max = 0; for (i = 0; i < nlocal; i++) @@ -1145,8 +1146,6 @@ void Special::dihedral_trim() for (j = 0; j < nspecial[i][2]; j++) flag[i][j] = 0; - // reset nspecial[2] and onefour for all owned atoms based on output info - for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { if (tag[i] != dihedral_atom2[i][j]) continue; @@ -1251,7 +1250,7 @@ int Special::rendezvous_ids(int n, char *inbuf, sptr->procowner = procowner; sptr->atomIDs = atomIDs; - // flag = 0: no 2nd irregular comm needed in comm->rendezvous + // flag = 0: no second comm needed in rendezvous flag = 0; return 0; @@ -1272,7 +1271,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // clear atom map so it can be here as a hash table + // clear atom map so it can be used here as a hash table // faster than an STL map for large atom counts atom->map_clear(); From 4ce68cf5fd776bd52a07befb93de7f197be49b69 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Jan 2019 16:01:10 -0700 Subject: [PATCH 024/243] added diagnostic info for memory and balance info --- src/RIGID/fix_shake.cpp | 8 +- src/comm.cpp | 185 ++++++++++++++++++++++++++++++++++++---- src/comm.h | 6 +- src/irregular.cpp | 7 +- src/special.cpp | 12 +-- 5 files changed, 184 insertions(+), 34 deletions(-) diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 35153de839..46e478064c 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1070,7 +1070,7 @@ void FixShake::atom_owners() char *buf; comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, - rendezvous_ids,0,buf,0,(void *) this); + rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); memory->sfree(idbuf); @@ -1178,7 +1178,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), - (void *) this); + (void *) this,1); PartnerInfo *outbuf = (PartnerInfo *) buf; memory->destroy(proclist); @@ -1266,7 +1266,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), - (void *) this); + (void *) this,1); NShakeInfo *outbuf = (NShakeInfo *) buf; memory->destroy(proclist); @@ -1359,7 +1359,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), - (void *) this); + (void *) this,1); ShakeInfo *outbuf = (ShakeInfo *) buf; memory->destroy(proclist); diff --git a/src/comm.cpp b/src/comm.cpp index 39d4311aa2..54476078be 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -766,18 +766,14 @@ int Comm:: rendezvous(int which, int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr) + int outorder, char *&outbuf, int outsize, void *ptr, int statflag) { - int nout; - if (which == 0) - nout = rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr); + return rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr,statflag); else - nout = rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr); - - return nout; + return rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr,statflag); } /* ---------------------------------------------------------------------- */ @@ -786,7 +782,7 @@ int Comm:: rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), int outorder, char *&outbuf, - int outsize, void *ptr) + int outsize, void *ptr, int statflag) { // irregular comm of inbuf from caller decomp to rendezvous decomp @@ -837,8 +833,82 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(procs_rvous); memory->sfree(outbuf_rvous); - // approximate memory tally + // return number of output datums + if (!statflag) return nout; + + // memory info for caller and rendezvous decompositions + + bigint size_in_all,size_in_max,size_in_min; + bigint size_out_all,size_out_max,size_out_min; + bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; + bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + + bigint size = (bigint) n*insize; + MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nout*outsize; + MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous*insize; + MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous_out*insize; + MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + int mbytes = 1024*1024; + + if (me == 0) { + if (screen) { + fprintf(screen,"Rendezvous balance and memory info:\n"); + fprintf(screen," input datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_in_all/insize,1.0*size_in_all/nprocs/insize, + size_in_max/insize,size_in_min/insize); + fprintf(screen," input data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, + 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); + fprintf(screen," output datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + fprintf(screen," output data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, + 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); + fprintf(screen," input rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, + size_inrvous_max/insize,size_inrvous_min/insize); + fprintf(screen," input rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, + 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); + fprintf(screen," output rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + fprintf(screen," output rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, + 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + } + } + + /* bigint rvous_bytes = 0; rvous_bytes += n*insize; // inbuf rvous_bytes += nout*outsize; // outbuf @@ -846,8 +916,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, rvous_bytes += nrvous_out*outsize; // outbuf_rvous rvous_bytes += nrvous_out*sizeof(int); // procs_rvous rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms - - // return number of output datums + */ return nout; } @@ -857,7 +926,8 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, int Comm:: rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr) + int outorder, char *&outbuf, int outsize, void *ptr, + int statflag) { int iproc; bigint all2all1_bytes,all2all2_bytes; @@ -956,7 +1026,13 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + if (flag == 0) { + memory->destroy(sendcount); + memory->destroy(recvcount); + memory->destroy(sdispls); + memory->destroy(rdispls); + return 0; // all nout_rvous are 0, no 2nd irregular + } // create procs and outbuf for All2all if necesary @@ -1044,8 +1120,82 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(sdispls); memory->destroy(rdispls); - // approximate memory tally + // return number of output datums + if (!statflag) return nout; + + // memory info for caller and rendezvous decompositions + + bigint size_in_all,size_in_max,size_in_min; + bigint size_out_all,size_out_max,size_out_min; + bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; + bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + + bigint size = (bigint) n*insize; + MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nout*outsize; + MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous*insize; + MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous_out*insize; + MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + int mbytes = 1024*1024; + + if (me == 0) { + if (screen) { + fprintf(screen,"Rendezvous balance and memory info:\n"); + fprintf(screen," input datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_in_all/insize,1.0*size_in_all/nprocs/insize, + size_in_max/insize,size_in_min/insize); + fprintf(screen," input data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, + 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); + fprintf(screen," output datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + fprintf(screen," output data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, + 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); + fprintf(screen," input rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, + size_inrvous_max/insize,size_inrvous_min/insize); + fprintf(screen," input rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, + 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); + fprintf(screen," output rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + fprintf(screen," output rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, + 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + } + } + + /* bigint rvous_bytes = 0; rvous_bytes += n*insize; // inbuf rvous_bytes += nout*outsize; // outbuf @@ -1054,8 +1204,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, rvous_bytes += nrvous_out*sizeof(int); // procs_rvous rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops - - // return number of datums + */ return nout; } diff --git a/src/comm.h b/src/comm.h index 807da9bf0d..89889e3ebe 100644 --- a/src/comm.h +++ b/src/comm.h @@ -111,7 +111,7 @@ class Comm : protected Pointers { void *, void *, int self = 1); int rendezvous(int, int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int statflag=0); int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); @@ -149,10 +149,10 @@ class Comm : protected Pointers { int rendezvous_irregular(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int); int rendezvous_all2all(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int); public: enum{MULTIPLE}; diff --git a/src/irregular.cpp b/src/irregular.cpp index 77278ec4c5..c27a8c8e18 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -966,10 +966,11 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) if (nrecv_proc) MPI_Waitall(nrecv_proc,request,status); // approximate memory tally + // DEBUG lines - bigint irregular_bytes = 2*nprocs*sizeof(int); - irregular_bytes += maxindex*sizeof(int); - irregular_bytes += maxbuf; + //bigint irregular_bytes = 2*nprocs*sizeof(int); + //irregular_bytes += maxindex*sizeof(int); + //irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- diff --git a/src/special.cpp b/src/special.cpp index 34685d8c65..5e0f865488 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -186,7 +186,7 @@ void Special::atom_owners() char *buf; comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, - rendezvous_ids,0,buf,0,(void *) this); + rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); memory->sfree(idbuf); @@ -244,7 +244,7 @@ void Special::onetwo_build_newton() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -379,7 +379,7 @@ void Special::onethree_build() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -484,7 +484,7 @@ void Special::onefour_build() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -907,7 +907,7 @@ void Special::angle_trim() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1126,7 +1126,7 @@ void Special::dihedral_trim() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); From a278df586d72850c71a318b550d8f3f9de69e5f0 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 24 Jan 2019 09:56:21 -0700 Subject: [PATCH 025/243] cleanup up rendezvous diagnostic output --- src/RIGID/fix_rigid_small.cpp | 19 +++- src/RIGID/fix_shake.cpp | 10 ++- src/comm.cpp | 163 +++++++++------------------------- src/comm.h | 1 + src/special.cpp | 14 +-- 5 files changed, 73 insertions(+), 134 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 957438fc55..bee5570316 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -28,6 +28,7 @@ #include "modify.h" #include "group.h" #include "comm.h" +#include "neighbor.h" #include "force.h" #include "input.h" #include "output.h" @@ -44,6 +45,8 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; +#define RVOUS 1 // 0 for irregular, 1 for all2all + #define MAXLINE 1024 #define CHUNK 1024 #define ATTRIBUTE_PERBODY 20 @@ -585,12 +588,22 @@ void FixRigidSmall::init() if (rflag && (modify->fmask[i] & POST_FORCE) && !modify->fix[i]->rigid_flag) { char str[128]; - snprintf(str,128,"Fix %s alters forces after fix rigid",modify->fix[i]->id); + snprintf(str,128,"Fix %s alters forces after fix rigid", + modify->fix[i]->id); error->warning(FLERR,str); } } } + // error if maxextent > comm->cutghost + // NOTE: could just warn if an override flag set + // NOTE: this could fail for comm multi mode if user sets a wrong cutoff + // for atom types in rigid bodies - need a more careful test + + double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); + if (maxextent > cutghost) + error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); + // error if npt,nph fix comes before rigid fix for (i = 0; i < modify->nfix; i++) { @@ -1576,10 +1589,10 @@ void FixRigidSmall::create_bodies(tagint *bodyID) // func = compute bbox of each body, find atom closest to geometric center char *buf; - int nreturn = comm->rendezvous(1,ncount,(char *) inbuf,sizeof(InRvous), + int nreturn = comm->rendezvous(RVOUS,ncount,(char *) inbuf,sizeof(InRvous), 0,proclist, rendezvous_body,0,buf,sizeof(OutRvous), - (void *) this); + (void *) this,1); OutRvous *outbuf = (OutRvous *) buf; memory->destroy(proclist); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 46e478064c..2d3244885d 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -39,6 +39,8 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; +#define RVOUS 1 // 0 for irregular, 1 for all2all + #define BIG 1.0e20 #define MASSDELTA 0.1 @@ -1068,7 +1070,7 @@ void FixShake::atom_owners() // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), + comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, rendezvous_ids,0,buf,0,(void *) this,1); @@ -1174,7 +1176,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner 4 values char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PartnerInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PartnerInfo), 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), @@ -1263,7 +1265,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner nshake char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), (void *) this,1); @@ -1356,7 +1358,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned shake info char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), (void *) this,1); diff --git a/src/comm.cpp b/src/comm.cpp index 54476078be..e8a796036c 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -796,7 +796,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, "rendezvous:inbuf"); irregular->exchange_data(inbuf,insize,inbuf_rvous); - bigint irregular1_bytes = 0; //irregular->irregular_bytes; + bigint irregular1_bytes = irregular->memory_usage(); irregular->destroy_data(); delete irregular; @@ -826,7 +826,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, "rendezvous:outbuf"); irregular->exchange_data(outbuf_rvous,outsize,outbuf); - bigint irregular2_bytes = 0; //irregular->irregular_bytes; + bigint irregular2_bytes = irregular->memory_usage(); irregular->destroy_data(); delete irregular; @@ -834,90 +834,11 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, memory->sfree(outbuf_rvous); // return number of output datums + // last arg to stats() = memory for procs_rvous + irregular comm - if (!statflag) return nout; - - // memory info for caller and rendezvous decompositions - - bigint size_in_all,size_in_max,size_in_min; - bigint size_out_all,size_out_max,size_out_min; - bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; - bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; - - bigint size = (bigint) n*insize; - MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nout*outsize; - MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous*insize; - MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous_out*insize; - MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - int mbytes = 1024*1024; - - if (me == 0) { - if (screen) { - fprintf(screen,"Rendezvous balance and memory info:\n"); - fprintf(screen," input datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_in_all/insize,1.0*size_in_all/nprocs/insize, - size_in_max/insize,size_in_min/insize); - fprintf(screen," input data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, - 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_out_all/outsize,1.0*size_out_all/nprocs/outsize, - size_out_max/outsize,size_out_min/outsize); - fprintf(screen," output data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, - 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); - fprintf(screen," input rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, - size_inrvous_max/insize,size_inrvous_min/insize); - fprintf(screen," input rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, - 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, - size_outrvous_max/outsize,size_outrvous_min/outsize); - fprintf(screen," output rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, - 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); - } - } - - /* - bigint rvous_bytes = 0; - rvous_bytes += n*insize; // inbuf - rvous_bytes += nout*outsize; // outbuf - rvous_bytes += nrvous*insize; // inbuf_rvous - rvous_bytes += nrvous_out*outsize; // outbuf_rvous - rvous_bytes += nrvous_out*sizeof(int); // procs_rvous - rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms - */ - + if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + MAX(irregular1_bytes,irregular2_bytes)); return nout; } @@ -1121,15 +1042,28 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(rdispls); // return number of output datums + // last arg to stats() = mem for procs_rvous + per-proc vecs + reordering ops - if (!statflag) return nout; + if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + 4*nprocs*sizeof(int) + + MAX(all2all1_bytes,all2all2_bytes)); + return nout; +} - // memory info for caller and rendezvous decompositions +/* ---------------------------------------------------------------------- + print balance and memory info for rendezvous operation + useful for debugging +------------------------------------------------------------------------- */ +void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, + int insize, int outsize, bigint commsize) +{ bigint size_in_all,size_in_max,size_in_min; bigint size_out_all,size_out_max,size_out_min; bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + bigint size_comm_all,size_comm_max,size_comm_min; bigint size = (bigint) n*insize; MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); @@ -1151,62 +1085,49 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + size = commsize; + MPI_Allreduce(&size,&size_comm_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_comm_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_comm_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + int mbytes = 1024*1024; if (me == 0) { if (screen) { - fprintf(screen,"Rendezvous balance and memory info:\n"); - fprintf(screen," input datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen,"Rendezvous balance and memory info: (tot,ave,max,min) \n"); + fprintf(screen," input datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_in_all/insize,1.0*size_in_all/nprocs/insize, size_in_max/insize,size_in_min/insize); - fprintf(screen," input data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," input data (MB): %g %g %g %g\n", 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_out_all/outsize,1.0*size_out_all/nprocs/outsize, size_out_max/outsize,size_out_min/outsize); - fprintf(screen," output data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," output data (MB): %g %g %g %g\n", 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); - fprintf(screen," input rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," input rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, size_inrvous_max/insize,size_inrvous_min/insize); - fprintf(screen," input rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," input rvous data (MB): %g %g %g %g\n", 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, size_outrvous_max/outsize,size_outrvous_min/outsize); - fprintf(screen," output rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," output rvous data (MB): %g %g %g %g\n", 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + fprintf(screen," rvous comm (MB): %g %g %g %g\n", + 1.0*size_comm_all/mbytes,1.0*size_comm_all/nprocs/mbytes, + 1.0*size_comm_max/mbytes,1.0*size_comm_min/mbytes); } } - - /* - bigint rvous_bytes = 0; - rvous_bytes += n*insize; // inbuf - rvous_bytes += nout*outsize; // outbuf - rvous_bytes += nrvous*insize; // inbuf_rvous - rvous_bytes += nrvous_out*outsize; // outbuf_rvous - rvous_bytes += nrvous_out*sizeof(int); // procs_rvous - rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors - rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops - */ - - return nout; } /* ---------------------------------------------------------------------- diff --git a/src/comm.h b/src/comm.h index 89889e3ebe..9c0112b4c4 100644 --- a/src/comm.h +++ b/src/comm.h @@ -153,6 +153,7 @@ class Comm : protected Pointers { int rendezvous_all2all(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), int, char *&, int, void *, int); + void rendezvous_stats(int, int, int, int, int, int, bigint); public: enum{MULTIPLE}; diff --git a/src/special.cpp b/src/special.cpp index 5e0f865488..a0739d6ccc 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -27,6 +27,8 @@ using namespace LAMMPS_NS; +#define RVOUS 1 // 0 for irregular, 1 for all2all + /* ---------------------------------------------------------------------- */ Special::Special(LAMMPS *lmp) : Pointers(lmp) @@ -185,7 +187,7 @@ void Special::atom_owners() // perform rendezvous operation char *buf; - comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, + comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); @@ -241,7 +243,7 @@ void Special::onetwo_build_newton() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -376,7 +378,7 @@ void Special::onethree_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -481,7 +483,7 @@ void Special::onefour_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -904,7 +906,7 @@ void Special::angle_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -1123,7 +1125,7 @@ void Special::dihedral_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); From e195d6faee7346034d234b620bae670c52a11425 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 30 Jan 2019 08:37:04 -0700 Subject: [PATCH 026/243] Fixed issue with not setting i-j, j-i coefficients correctly --- src/GRANULAR/pair_granular.cpp | 28 ++++++++++---------- src/GRANULAR/pair_granular_multi.cpp | 38 ++++++++++++++-------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index c2f202ac9c..82a470f83b 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -1571,22 +1571,22 @@ void PairGranular::coeff(int narg, char **arg) for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - normal_coeffs[i][j][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = damp; + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = normal_coeffs_local[3]; + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; if (roll != ROLL_NONE) for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs_local[k]; + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; if (twist != TWIST_NONE && twist != TWIST_MARSHALL) for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs_local[k]; + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; setflag[i][j] = 1; count++; @@ -1746,31 +1746,31 @@ double PairGranular::init_one(int i, int j) if (setflag[i][j] == 0) { if (normal != HOOKE && normal != HERTZ){ - normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); } else{ - normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); } - normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); if (roll != ROLL_NONE){ for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } if (twist != TWIST_NONE && twist != TWIST_MARSHALL){ for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } } diff --git a/src/GRANULAR/pair_granular_multi.cpp b/src/GRANULAR/pair_granular_multi.cpp index 09b8ea9709..07a6cab3dd 100644 --- a/src/GRANULAR/pair_granular_multi.cpp +++ b/src/GRANULAR/pair_granular_multi.cpp @@ -841,28 +841,28 @@ void PairGranularMulti::coeff(int narg, char **arg) for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - normal[i][j] = normal_local; - normal_coeffs[i][j][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = damp; + normal[i][j] = normal[j][i] = normal_local; + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; if ((normal_local == JKR) || (normal_local == DMT)) - normal_coeffs[i][j][3] = normal_coeffs_local[3]; + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; - damping[i][j] = damping_local; + damping[i][j] = damping[j][i] = damping_local; - tangential[i][j] = tangential_local; + tangential[i][j] = tangential[j][i] = tangential_local; for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs_local[k]; + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; - roll[i][j] = roll_local; + roll[i][j] = roll[j][i] = roll_local; if (roll_local != ROLL_NONE) for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs_local[k]; + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; - twist[i][j] = twist_local; + twist[i][j] = twist[j][i] = twist_local; if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs_local[k]; + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; setflag[i][j] = 1; count++; @@ -1033,31 +1033,31 @@ double PairGranularMulti::init_one(int i, int j) } if (normal[i][j] != HOOKE && normal[i][j] != HERTZ){ - normal_coeffs[i][j][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - normal_coeffs[i][j][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], normal_coeffs[i][i][2], normal_coeffs[j][j][2]); } else{ - normal_coeffs[i][j][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); } - normal_coeffs[i][j][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) - normal_coeffs[i][j][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + tangential_coeffs[i][j][k] = normal_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); if (roll[i][i] != ROLL_NONE){ for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } if (twist[i][i] != TWIST_NONE && twist[i][i] != TWIST_MARSHALL){ for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } } From 9915a6725f3c8ec3e66a86d8d49c1eb502d599db Mon Sep 17 00:00:00 2001 From: Theophile Chirac Date: Mon, 4 Feb 2019 17:21:59 +0100 Subject: [PATCH 027/243] Commit JT 020419 - correct in magelec (if iiall(FLERR,"Incorrect args in pair_style command"); - } /* ---------------------------------------------------------------------- @@ -287,7 +286,7 @@ void PairSpinMagelec::compute(int eflag, int vflag) // compute me interaction if (rsq <= local_cut2) { - compute_magelec(i,j,rsq,eij,fmi,spj); + compute_magelec(i,j,eij,fmi,spj); if (lattice_flag) { compute_magelec_mech(i,j,fi,spi,spj); } @@ -332,55 +331,63 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype; + int i,j,inum,jnum,itype,jtype; int *ilist,*jlist,*numneigh,**firstneigh; double rsq, inorm; + inum = list->inum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - i = ilist[ii]; - itype = type[i]; + // compute pair if - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; + if (ii < inum) { - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (int jj = 0; jj < jnum; jj++) { - - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - local_cut2 = cut_spin_magelec[itype][jtype]*cut_spin_magelec[itype][jtype]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - - delx = xi[0] - x[j][0]; - dely = xi[1] - x[j][1]; - delz = xi[2] - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - inorm = 1.0/sqrt(rsq); - eij[0] = -inorm*delx; - eij[1] = -inorm*dely; - eij[2] = -inorm*delz; - - if (rsq <= local_cut2) { - compute_magelec(i,j,rsq,eij,fmi,spj); + i = ilist[ii]; + itype = type[i]; + + xi[0] = xi[1] = xi[2] = 0.0; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (int jj = 0; jj < jnum; jj++) { + + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + local_cut2 = cut_spin_magelec[itype][jtype]*cut_spin_magelec[itype][jtype]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + inorm = 1.0/sqrt(rsq); + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; + + if (rsq <= local_cut2) { + compute_magelec(i,j,eij,fmi,spj); + } + } + } - } } /* ---------------------------------------------------------------------- */ -void PairSpinMagelec::compute_magelec(int i, int j, double /*rsq*/, double eij[3], double fmi[3], double spj[3]) +void PairSpinMagelec::compute_magelec(int i, int j, double eij[3], double fmi[3], double spj[3]) { int *type = atom->type; int itype, jtype; diff --git a/src/SPIN/pair_spin_magelec.h b/src/SPIN/pair_spin_magelec.h index ce13476271..5e72a4c35e 100644 --- a/src/SPIN/pair_spin_magelec.h +++ b/src/SPIN/pair_spin_magelec.h @@ -37,7 +37,7 @@ class PairSpinMagelec : public PairSpin { void compute(int, int); void compute_single_pair(int, double *); - void compute_magelec(int, int, double, double *, double *, double *); + void compute_magelec(int, int, double *, double *, double *); void compute_magelec_mech(int, int, double *, double *, double *); void write_restart(FILE *); From b7413226e0a42db8fa5030a3aecb944760a05bcf Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 11 Feb 2019 21:37:06 -0700 Subject: [PATCH 028/243] Several changes to new consolidated granular code: - Normal contact models take Young's modulus and Poisson's ratio (instead of Young's and shear modulus) - Mixing of Young's moduli corrected - Changes to cutoffs corrected for JKR pulloff distance - Renamed 'mindlin' to 'linear_history' - Progress on doc page --- doc/src/pair_granular.txt | 423 ++---- doc/src/pairs.txt | 1 + src/GRANULAR/pair_granular.cpp | 1168 ++++------------ src/GRANULAR/pair_granular.h | 53 +- src/pair_granular.cpp | 2337 ++++++++++++++++++++++++++++++++ src/pair_granular.h | 120 ++ 6 files changed, 2868 insertions(+), 1234 deletions(-) create mode 100644 src/pair_granular.cpp create mode 100644 src/pair_granular.h diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 35b64bf29d..8bf4f20d5d 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -1,3 +1,10 @@ + + + "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) @@ -14,323 +21,185 @@ pair_style granular/multi command :h3 pair_style style cutoff :pre style = {granular} or {granular/multi} :ulb,l -cutoff = global cutoff (optional). See discussion below. +cutoff = global cutoff (optional). See discussion below. :l +:ule [Examples:] pair_style granular -pair coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair coeff 2 2 hertz 200.0 20.0 tangential mindlin 300.0 50.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall +pair_coeff * * hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.4 :pre + +pair_style granular +pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 hertz 200.0 20.0 tangential mindlin 300.0 50.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre pair_style granular/multi -pair coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair coeff 2 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall -pair coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair_coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre [Description:] The {granular} styles support a variety of options for the normal, tangential, rolling and twisting -forces resulting from contact between two granular particles. The computed force depends on the combination -of choices for these models. +forces resulting from contact between two granular particles. This expands on the options offered +by the "pair gran/*"_pair_gran.html options. The total computed forces and torques depend on the combination +of choices for these various modes of motion. All model options and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for various combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. -In the case of {granular}, coefficients -can vary between particle types, but model choices cannot. For instance, in the first -example above, the stiffness, damping, and tangential friction are different for type 1 - type 1 and type 2 - type 2 interactions, but -both 1-1 and 2-2 interactions must have the same model form, hence all keywords are identical between the two types. Cross-coefficients -for 1-2 interactions for the case of the {hertz} model above are set via simple geometric mixing rules. The {granular/multi} +For {pair_style granular}, coefficients can vary between particle types, but model choices +cannot. For instance, in the first +example above, the stiffness, damping, and tangential friction are different for +type 1 - type 1 and type 2 - type 2 interactions, but +both 1-1 and 2-2 interactions must have the same model form, hence all keywords are +identical between the two types. Cross-coefficients +for 1-2 interactions for the case of the {hertz} model above are set via simple +geometric mixing rules. The {granular/multi} style removes this restriction at a small cost in computational efficiency, so that different particle types can potentially interact via different model forms. As shown in the second example, 1-1 interactions are based on a Hertzian contact model and 2-2 interactions are based on a {dmt} model (see below). In the case that 1-1 and 2-2 interactions have different model forms, mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the pair coeff command, otherwise an error results. -The first required keyword for the pair coeff command is the normal contact model. Currently supported options and -the required arguments are: +:line -{hooke} : k_n, damping -{hertz} : k_n, damping +The first required keyword for the {pair_coeff} command is the normal contact model. Currently supported options +for normal contact models and their required arguments are: + +{hooke} : \(k_n\), damping +{hertz} : \(k_n\), damping {hertz/material} : E, damping, G {dmt} : E, damping, G, cohesion -{jkr} : E, damping, G, cohesion +{jkr} : E, damping, G, cohesion :ol -Here, k_n is spring stiffness, damping is a damping constant or a coefficient of restitution, depending on +Here, \(k_n\) is spring stiffness, damping is a damping constant or a coefficient of restitution, depending on the choice of damping model (see below), E and G are Young's modulus and shear modulus, in units of pressure, and cohesion is a surface energy density, in units of energy/length^2. -For the {hooke} model, the normal component of force is given by: -:c,image(Eqs/hooke_normal.jpg) +For the {hooke} model, the normal (elastic) component of force between two particles {i} and {j} is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} +\end\{equation\} -For {hertz}, the normal force is given by: -:c,image{Eqs/hertz_normal.jpg} +Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, +\(R_i, R_j\) are the particle radii, +\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_j - \mathbf\{r\}_i\) is the vector separating the +two particle centers +and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). -For both [hooke] and [hertz], stiffness for unspecified cross-terms is given by simple geometric mixing -(e.g. if stiffness is specified for type 1 and type 2 particles as k_n_1 and k_n_2, respectively, -type 1 - type 2 contacts use a stiffness given by k_n_{12} = sqrt(k_n_1*k_n_2)) +For the {hertz} model, the normal component of force is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hertz\} = k_N R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} +\end\{equation\} -For {hertz/material}, the form is the same as above, but coefficients are computed differently, and mixing follows -a different rule based on shear modulus: -:c,image{Eqs/hertz_material_normal.jpg} +Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. -For {dmt}, the normal force is given by: -:c,image{Eqs/dmt_normal.jpg} +For the {hertz/material} model, the force is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hertz/material\} = \frac\{4\}\{3\} E_\{eff\} R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} +\end\{equation\} -Where gamma is cohesion. +Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) +is the effectve Young's modulus, +with \(\nu_i, \nu_j \) the Poisson ratios of the particles, which are related to the +input shear and Young's moduli by \(\nu_i = E_i/2G_i - 1\). Thus, if the elastic and shear moduli of the +two particles are the same, the {hertz/material} +model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) -For {jkr}, the normal force is given by: -:c,image{Eqs/jkr_normal.jpg} +The {dmt} model corresponds to the Derjaguin-Muller-Toporov model, +where the force is simply Hertz with an additional attractive cohesion term: +\begin\{equation\} +\mathbf\{F\}_\{ne, dmt\} = \left(\frac\{4\}\{3\} E R^\{1/2\}\delta_\{ij\}^\{3/2\} - 4\pi\gamma R\right)\mathbf\{n\} +\end\{equation\} -The same mixing rule for stiffness as for {hertz/material} is used by both the {dmt} and {jkr} models. +The {jkr} model is the Johnson-Kendall-Roberts model, where the force is computed as: +\begin\{equation\} +\label\{eq:force_jkr\} +\mathbf\{F\}_\{ne, jkr\} = \left(\frac\{4Ea^3\}\{3R\} - 2\pi a^2\sqrt\{\frac\{4\gamma E\}\{\pi a\}\}\right)\mathbf\{n\} +\end\{equation\} + +Here, {a} is the radius of the contact zone, related to the overlap \(\delta\) according to: +\begin\{equation\} +\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\} +\end\{equation\} -The tangential contact model must also be specified, which follows -the required {tangential} keyword. Currently supported options -and their required arguments are: +LAMMPS internally inverts the equation above to solve for {a} in terms of \(\delta\), then solves for +the force in the previous equation. Additionally, note that the JKR model allows for a tensile force beyond +contact (i.e. for \(\delta < 0\)), up to a maximum tensile force of \(-3\pi\gamma R\) (also known as +the 'pull-off' force). +Note that this is a hysteretic effect, where particles that are not contacting initially +will not experience force until they come into contact \(\delta \geq 0\); as they move apart +and (\(\delta < 0\)), they experience a tensile force up to \(-3\pi\gamma R\), +at which point they will lose contact. -{no_history}: k_t, tangential_damping, friction coefficient -{mindlin}: k_t, tangential_damping, friction coefficient +In addition to the above options, the normal force is augmented by a damping term. The optional +{damping} keyword to the {pair_coeff} command followed by the model choice determines the form of the damping. +The damping coefficient that was specified for the normal model +settings is used in computing the damping term, as described below. Note this damping parameter +may be interpreted differently depending on the model choice. +The options for the damping model currently supported are: + +{velocity} +{viscoelastic} +{tsuji} :ol + +If the {damping} keyword is not specified, the {viscoelastic} model is used by default. + +For {damping velocity}, the normal damping is simply proportional to the velocity: +\begin\{equation\} +F_\{N,damp\} = -\gamma_N\mathbf\{v\}_\{N,rel\} +\end\{equation\} + +Here, \(\gamma_N\) is the damping coefficient, in units of {mass}/{time}, +\(\mathbf\{v\}_\{N,rel\} = (\mathbf\{v\}_i - \mathbf\{v\}_j) \cdot \mathbf\{n\}\) +is the component of relative velocity along the direction of the vector \(\mathbf\{n\}\) that connects the centers of +particles {i} and {j}. + +The {damping viscoelastic} model is based on the viscoelastic treatment of "(Brilliantov et al)"_#Brill1996, +where the normal damping is given by: +\begin\{equation\} +F_\{N,damp\} = -\gamma_N a m_\{eff\} \mathbf\{v\}_\{N,rel\} +\end\{equation\} + +Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\) +for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). +In this case, \(\gamma_N\) is the damping coefficient, in units of 1/({time}*{distance}). + +The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the + + :line + +Following the normal contact model settings, the {pair_coeff} command requires specification +of the tangential contact model. The required keyword {tangential} is expected, followed by the model choice and associated +parameters. Currently supported tangential model choices and their expected parameters are as follows: -For {no_history}, the tangential force is computed according to: -:c,image{Eqs/tangential_nohistory.jpg} +{nohistory} : \(\gamma_t\), \(\mu_s\) +{history} : \(k_t\), \(\gamma_t\), \(\mu_s\) :ol -For {mindlin}, tangential force is: -:c,image{Eqs/tangential_mindlin.jpg} +Here, \(\gamma_t\) is the tangential damping coefficient, \(\mu_s\) is the tangential (or sliding) friction +coefficient, and \(k_t\) is the tangential stiffness. -The total force on a particle is the sum of the normal and tangential forces from all interactions. The tangential -force also induces a torque on both particles in a contacting pair. Additionally, rolling and twisting friction -models can also be applied, which may induce additional torques (but no force). The following options are -supported for the rolling friction model +For {nohistory}, a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior +of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_s \|\mathbf\{F\}_n\|, \gamma_t m_\{eff\}\|\mathbf\{v\}_\{t, rel\}\|) \mathbf\{t\} +\end\{equation\} + +Where \(\|\mathbf\{F\}_n\) is the magnitude of the normal force, +\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\) is the relative tangential +velocity at the point of contact, \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_n - \) + + + :link(Brill1996) +[(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). +Model for collisions in granular gases. Physical review E, 53(5), 5382. -The first required keyword -in the pair coeff command is the choice -of normal force contact model, for which current opitons are {hooke}, {hertz} + :link(Tsuji1992) + [(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of + cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. -The {gran} styles use the following formulas for the frictional force -between two granular particles, as described in -"(Brilliantov)"_#Brilliantov, "(Silbert)"_#Silbert, and -"(Zhang)"_#Zhang3, when the distance r between two particles of radii -Ri and Rj is less than their contact distance d = Ri + Rj. There is -no force between the particles when r > d. - -The two Hookean styles use this formula: - -:c,image(Eqs/pair_gran_hooke.jpg) - -The Hertzian style uses this formula: - -:c,image(Eqs/pair_gran_hertz.jpg) - -In both equations the first parenthesized term is the normal force -between the two particles and the second parenthesized term is the -tangential force. The normal force has 2 terms, a contact force and a -damping force. The tangential force also has 2 terms: a shear force -and a damping force. The shear force is a "history" effect that -accounts for the tangential displacement between the particles for the -duration of the time they are in contact. This term is included in -pair styles {hooke/history} and {hertz/history}, but is not included -in pair style {hooke}. The tangential damping force term is included -in all three pair styles if {dampflag} is set to 1; it is not included -if {dampflag} is set to 0. - -The other quantities in the equations are as follows: - -delta = d - r = overlap distance of 2 particles -Kn = elastic constant for normal contact -Kt = elastic constant for tangential contact -gamma_n = viscoelastic damping constant for normal contact -gamma_t = viscoelastic damping constant for tangential contact -m_eff = Mi Mj / (Mi + Mj) = effective mass of 2 particles of mass Mi and Mj -Delta St = tangential displacement vector between 2 particles \ - which is truncated to satisfy a frictional yield criterion -n_ij = unit vector along the line connecting the centers of the 2 particles -Vn = normal component of the relative velocity of the 2 particles -Vt = tangential component of the relative velocity of the 2 particles :ul - -The Kn, Kt, gamma_n, and gamma_t coefficients are specified as -parameters to the pair_style command. If a NULL is used for Kt, then -a default value is used where Kt = 2/7 Kn. If a NULL is used for -gamma_t, then a default value is used where gamma_t = 1/2 gamma_n. - -The interpretation and units for these 4 coefficients are different in -the Hookean versus Hertzian equations. - -The Hookean model is one where the normal push-back force for two -overlapping particles is a linear function of the overlap distance. -Thus the specified Kn is in units of (force/distance). Note that this -push-back force is independent of absolute particle size (in the -monodisperse case) and of the relative sizes of the two particles (in -the polydisperse case). This model also applies to the other terms in -the force equation so that the specified gamma_n is in units of -(1/time), Kt is in units of (force/distance), and gamma_t is in units -of (1/time). - -The Hertzian model is one where the normal push-back force for two -overlapping particles is proportional to the area of overlap of the -two particles, and is thus a non-linear function of overlap distance. -Thus Kn has units of force per area and is thus specified in units of -(pressure). The effects of absolute particle size (monodispersity) -and relative size (polydispersity) are captured in the radii-dependent -pre-factors. When these pre-factors are carried through to the other -terms in the force equation it means that the specified gamma_n is in -units of (1/(time*distance)), Kt is in units of (pressure), and -gamma_t is in units of (1/(time*distance)). - -Note that in the Hookean case, Kn can be thought of as a linear spring -constant with units of force/distance. In the Hertzian case, Kn is -like a non-linear spring constant with units of force/area or -pressure, and as shown in the "(Zhang)"_#Zhang3 paper, Kn = 4G / -(3(1-nu)) where nu = the Poisson ratio, G = shear modulus = E / -(2(1+nu)), and E = Young's modulus. Similarly, Kt = 4G / (2-nu). -(NOTE: in an earlier version of the manual, we incorrectly stated that -Kt = 8G / (2-nu).) - -Thus in the Hertzian case Kn and Kt can be set to values that -corresponds to properties of the material being modeled. This is also -true in the Hookean case, except that a spring constant must be chosen -that is appropriate for the absolute size of particles in the model. -Since relative particle sizes are not accounted for, the Hookean -styles may not be a suitable model for polydisperse systems. - -NOTE: In versions of LAMMPS before 9Jan09, the equation for Hertzian -interactions did not include the sqrt(RiRj/Ri+Rj) term and thus was -not as accurate for polydisperse systems. For monodisperse systems, -sqrt(RiRj/Ri+Rj) is a constant factor that effectively scales all 4 -coefficients: Kn, Kt, gamma_n, gamma_t. Thus you can set the values -of these 4 coefficients appropriately in the current code to reproduce -the results of a previous Hertzian monodisperse calculation. For -example, for the common case of a monodisperse system with particles -of diameter 1, all 4 of these coefficients should now be set 2x larger -than they were previously. - -Xmu is also specified in the pair_style command and is the upper limit -of the tangential force through the Coulomb criterion Ft = xmu*Fn, -where Ft and Fn are the total tangential and normal force components -in the formulas above. Thus in the Hookean case, the tangential force -between 2 particles grows according to a tangential spring and -dash-pot model until Ft/Fn = xmu and is then held at Ft = Fn*xmu until -the particles lose contact. In the Hertzian case, a similar analogy -holds, though the spring is no longer linear. - -NOTE: Normally, xmu should be specified as a fractional value between -0.0 and 1.0, however LAMMPS allows large values (up to 1.0e4) to allow -for modeling of systems which can sustain very large tangential -forces. - -The effective mass {m_eff} is given by the formula above for two -isolated particles. If either particle is part of a rigid body, its -mass is replaced by the mass of the rigid body in the formula above. -This is determined by searching for a "fix rigid"_fix_rigid.html -command (or its variants). - -For granular styles there are no additional coefficients to set for -each pair of atom types via the "pair_coeff"_pair_coeff.html command. -All settings are global and are made via the pair_style command. -However you must still use the "pair_coeff"_pair_coeff.html for all -pairs of granular atom types. For example the command - -pair_coeff * * :pre - -should be used if all atoms in the simulation interact via a granular -potential (i.e. one of the pair styles above is used). If a granular -potential is used as a sub-style of "pair_style -hybrid"_pair_hybrid.html, then specific atom types can be used in the -pair_coeff command to determine which atoms interact via a granular -potential. - -:line - -Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the "Speed packages"_Speed_packages.html doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, -USER-OMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the "Build -package"_Build_package.html doc page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the "-suffix command-line -switch"_Run_options.html when you invoke LAMMPS, or you can use the -"suffix"_suffix.html command in your input script. - -See the "Speed packages"_Speed_packages.html doc page for more -instructions on how to use the accelerated styles effectively. - -:line - -[Mixing, shift, table, tail correction, restart, rRESPA info]: - -The "pair_modify"_pair_modify.html mix, shift, table, and tail options -are not relevant for granular pair styles. - -These pair styles write their information to "binary restart -files"_restart.html, so a pair_style command does not need to be -specified in an input script that reads a restart file. - -These pair styles can only be used via the {pair} keyword of the -"run_style respa"_run_style.html command. They do not support the -{inner}, {middle}, {outer} keywords. - -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. It also returns only the normal component of -the pairwise interaction force. However, the single() function also -calculates 10 extra pairwise quantities. The first 3 are the -components of the tangential force between particles I and J, acting -on particle I. The 4th is the magnitude of this tangential force. -The next 3 (5-7) are the components of the relative velocity in the -normal direction (along the line joining the 2 sphere centers). The -last 3 (8-10) the components of the relative velocity in the -tangential direction. - -These extra quantities can be accessed by the "compute -pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., -{p10}. - -:line - -[Restrictions:] - -All the granular pair styles are part of the GRANULAR package. It is -only enabled if LAMMPS was built with that package. See the "Build -package"_Build_package.html doc page for more info. - -These pair styles require that atoms store torque and angular velocity -(omega) as defined by the "atom_style"_atom_style.html. They also -require a per-particle radius is stored. The {sphere} atom style does -all of this. - -This pair style requires you to use the "comm_modify vel -yes"_comm_modify.html command so that velocities are stored by ghost -atoms. - -These pair styles will not restart exactly when using the -"read_restart"_read_restart.html command, though they should provide -statistically similar results. This is because the forces they -compute depend on atom velocities. See the -"read_restart"_read_restart.html command for more details. - -[Related commands:] - -"pair_coeff"_pair_coeff.html - -[Default:] none - -:line - -:link(Brilliantov) -[(Brilliantov)] Brilliantov, Spahn, Hertzsch, Poschel, Phys Rev E, 53, -p 5382-5392 (1996). - -:link(Silbert) -[(Silbert)] Silbert, Ertas, Grest, Halsey, Levine, Plimpton, Phys Rev -E, 64, p 051302 (2001). - -:link(Zhang3) -[(Zhang)] Zhang and Makse, Phys Rev E, 72, p 011301 (2005). + + \ No newline at end of file diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index ca79051053..3cd20c728d 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -41,6 +41,7 @@ Pair Styles :h1 pair_gauss pair_gayberne pair_gran + pair_granular pair_gromacs pair_gw pair_hbond_dreiding diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 82a470f83b..3713b9251c 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -11,8 +11,9 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- -Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), - Jeremy Lechman (SNL), Dan Bolintineanu (SNL), Ishan Srivastava (SNL) +Contributing authors: +Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) +Leo Silbert (SNL), Gary Grest (SNL) ----------------------------------------------------------------------- */ #include @@ -50,7 +51,7 @@ using namespace MathConst; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN}; enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; @@ -98,13 +99,24 @@ PairGranular::~PairGranular() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); + memory->destroy(cutoff_type); memory->destroy(normal_coeffs); memory->destroy(tangential_coeffs); memory->destroy(roll_coeffs); memory->destroy(twist_coeffs); + memory->destroy(Emod); + memory->destroy(poiss); + + memory->destroy(normal_model); + memory->destroy(damping_model); + memory->destroy(tangential_model); + memory->destroy(roll_model); + memory->destroy(twist_model); + + + delete [] onerad_dynamic; delete [] onerad_frozen; delete [] maxrad_dynamic; @@ -113,725 +125,7 @@ PairGranular::~PairGranular() memory->destroy(mass_rigid); } -void PairGranular::compute(int eflag, int vflag){ -#ifdef TEMPLATED_PAIR_GRANULAR - if (normal == HOOKE){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == HERTZ){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == HERTZ_MATERIAL){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == DMT){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == JKR){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,3,2>(eflag, vflag); - } - } - } - } - -#else - compute_untemplated(Tp_normal, Tp_damping, Tp_tangential, - Tp_roll, Tp_twist, - eflag, vflag); -#endif -} - -#ifdef TEMPLATED_PAIR_GRANULAR -template < int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_twist, int Tp_roll > -void PairGranular::compute_templated(int eflag, int vflag) -#else -void PairGranular::compute_untemplated - (int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_twist, int Tp_roll, int eflag, int vflag) -#endif +void PairGranular::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; @@ -847,14 +141,14 @@ void PairGranular::compute_untemplated double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; double fs, fs1, fs2, fs3; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + //For JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3, sqrt4; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - //Rolling double k_roll, damp_roll; double roll1, roll2, roll3, torroll1, torroll2, torroll3; @@ -947,7 +241,7 @@ void PairGranular::compute_untemplated Reff = radi*radj/(radi+radj); touchflag = false; - if (Tp_normal == JKR){ + if (normal_model[itype][jtype] == JKR){ if (touch[jj]){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; @@ -1008,7 +302,7 @@ void PairGranular::compute_untemplated delta = radsum - r; dR = delta*Reff; - if (Tp_normal == JKR){ + if (normal_model[itype][jtype] == JKR){ touch[jj] = 1; R2=Reff*Reff; coh = normal_coeffs[itype][jtype][3]; @@ -1031,22 +325,21 @@ void PairGranular::compute_untemplated else{ knfac = E; //Hooke Fne = knfac*delta; - if (Tp_normal != HOOKE) - a = sqrt(dR); + a = sqrt(dR); + if (normal_model[itype][jtype] != HOOKE) Fne *= a; - if (Tp_normal == DMT) + if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (Tp_damping == VELOCITY){ + if (damping_model[itype][jtype] == VELOCITY){ damp_normal = 1; } - else if (Tp_damping == VISCOELASTIC){ - if (Tp_normal == HOOKE) a = sqrt(dR); + else if (damping_model[itype][jtype] == VISCOELASTIC){ damp_normal = a*meff; } - else if (Tp_damping == TSUJI){ + else if (damping_model[itype][jtype] == TSUJI){ damp_normal = sqrt(meff*knfac); } @@ -1081,8 +374,7 @@ void PairGranular::compute_untemplated history = &allhistory[size_history*jj]; } - - if (Tp_normal == JKR){ + if (normal_model[itype][jtype] == JKR){ F_pulloff = 3*M_PI*coh*Reff; Fcrit = fabs(Fne + 2*F_pulloff); } @@ -1096,7 +388,7 @@ void PairGranular::compute_untemplated k_tangential = tangential_coeffs[itype][jtype][0]; damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - if (Tp_tangential > 0){ + if (tangential_history){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -1153,7 +445,7 @@ void PairGranular::compute_untemplated // Rolling resistance //**************************************** - if (Tp_roll != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -1168,7 +460,7 @@ void PairGranular::compute_untemplated if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - if (Tp_roll > 1){ + if (roll_history){ int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; int rhist2 = rhist1 + 1; @@ -1197,6 +489,7 @@ void PairGranular::compute_untemplated history[rhist2] += vrl3*dt; } + k_roll = roll_coeffs[itype][jtype][0]; damp_roll = roll_coeffs[itype][jtype][1]; fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; @@ -1231,9 +524,9 @@ void PairGranular::compute_untemplated //**************************************** // Twisting torque, including history effects //**************************************** - if (Tp_twist != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (Tp_twist == TWIST_MARSHALL){ + if (twist_model[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a; @@ -1243,7 +536,7 @@ void PairGranular::compute_untemplated damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - if (Tp_twist > 1){ + if (twist_model[itype][jtype] > 1){ if (historyupdate){ history[twist_history_index] += magtwist*dt; } @@ -1278,7 +571,7 @@ void PairGranular::compute_untemplated torque[i][1] -= radi*tor2; torque[i][2] -= radi*tor3; - if (Tp_twist != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE){ tortwist1 = magtortwist * nx; tortwist2 = magtortwist * ny; tortwist3 = magtortwist * nz; @@ -1288,7 +581,7 @@ void PairGranular::compute_untemplated torque[i][2] += tortwist3; } - if (Tp_roll != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE){ torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -1307,12 +600,12 @@ void PairGranular::compute_untemplated torque[j][1] -= radj*tor2; torque[j][2] -= radj*tor3; - if (Tp_twist != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE){ torque[j][0] -= tortwist1; torque[j][1] -= tortwist2; torque[j][2] -= tortwist3; } - if (Tp_roll != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE){ torque[j][0] -= torroll1; torque[j][1] -= torroll2; torque[j][2] -= torroll3; @@ -1341,12 +634,21 @@ void PairGranular::allocate() setflag[i][j] = 0; memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(cutoff_type,n+1,n+1,"pair:cutoff_type"); memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); + memory->create(Emod,n+1,n+1,"pair:Emod"); + memory->create(poiss,n+1,n+1,"pair:poiss"); + + memory->create(normal_model,n+1,n+1,"pair:normal_model"); + memory->create(damping_model,n+1,n+1,"pair:damping_model"); + memory->create(tangential_model,n+1,n+1,"pair:tangential_model"); + memory->create(roll_model,n+1,n+1,"pair:roll_model"); + memory->create(twist_model,n+1,n+1,"pair:twist_model"); + onerad_dynamic = new double[n+1]; onerad_frozen = new double[n+1]; maxrad_dynamic = new double[n+1]; @@ -1365,9 +667,9 @@ void PairGranular::settings(int narg, char **arg) else{ cutoff_global = -1; //Will be set based on particle sizes, model choice } - tangential_history = 0; + + normal_history = tangential_history = 0; roll_history = twist_history = 0; - normal_set = tangential_set = damping_set = roll_set = twist_set = 0; } /* ---------------------------------------------------------------------- @@ -1376,10 +678,15 @@ void PairGranular::settings(int narg, char **arg) void PairGranular::coeff(int narg, char **arg) { - double normal_coeffs_local[4]; - double tangential_coeffs_local[4]; - double roll_coeffs_local[4]; - double twist_coeffs_local[4]; + int normal_model_one, damping_model_one; + int tangential_model_one, roll_model_one, twist_model_one; + + double normal_coeffs_one[4]; + double tangential_coeffs_one[4]; + double roll_coeffs_one[4]; + double twist_coeffs_one[4]; + + double cutoff_one = -1; if (narg < 2) error->all(FLERR,"Incorrect args for pair coefficients"); @@ -1390,209 +697,200 @@ void PairGranular::coeff(int narg, char **arg) force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + //Defaults + normal_model_one = tangential_model_one = -1; + roll_model_one = twist_model_one = 0; + damping_model_one = VISCOELASTIC; + int iarg = 2; while (iarg < narg){ if (strcmp(arg[iarg], "hooke") == 0){ if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); - if (!normal_set) normal = HOOKE; - else if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_set = 1; + normal_model_one = HOOKE; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0){ int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = HERTZ; - else if (normal_set && normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_set = 1; + normal_model_one = HERTZ; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = HERTZ_MATERIAL; - else if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_set = 1; + normal_model_one = HERTZ; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = DMT; - else if (normal != DMT) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion - normal_set = 1; + normal_model_one = DMT; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); beyond_contact = 1; - if (!normal_set) normal = JKR; - else if (normal != JKR) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion - normal_set = 1; + normal_model_one = JKR; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "damp") == 0){ if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0){ - if (!damping_set) damping = VELOCITY; - else if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + damping_model_one = VELOCITY; + iarg += 1; } else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ - if (!damping_set) damping = VISCOELASTIC; - else if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + damping_model_one = VISCOELASTIC; + iarg += 1; } - else if (strcmp(arg[iarg+1], "tsuji") == 0){ - if (!damping_set) damping = TSUJI; - if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + else if (strcmp(arg[iarg], "tsuji") == 0){ + damping_model_one = TSUJI; + iarg += 1; } - damping_set = 1; - iarg += 2; } else if (strcmp(arg[iarg], "tangential") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!tangential_set) tangential = TANGENTIAL_NOHISTORY; - else if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types"); + if (strcmp(arg[iarg+1], "linear_nohistory") == 0){ + tangential_model_one = TANGENTIAL_NOHISTORY; } - else if (strcmp(arg[iarg+1], "mindlin") == 0){ - if (!tangential_set) tangential = TANGENTIAL_MINDLIN; - else if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types");; + else if (strcmp(arg[iarg+1], "linear_history") == 0){ + tangential_model_one = TANGENTIAL_HISTORY; tangential_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); } - tangential_set = 1; - tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; } else if (strcmp(arg[iarg], "rolling") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0){ - if (!roll_set) roll = ROLL_NONE; - else if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + roll_model_one = ROLL_NONE; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!roll_set) roll = ROLL_NOHISTORY; - else if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + roll_model_one = ROLL_NOHISTORY; } else if (strcmp(arg[iarg+1], "sds") == 0){ - if (!roll_set) roll = ROLL_SDS; - else if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + roll_model_one = ROLL_SDS; roll_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } - roll_set =1 ; - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. + roll_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; } } else if (strcmp(arg[iarg], "twisting") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0){ - if (!twist_set) twist = TWIST_NONE; - else if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + twist_model_one = TWIST_NONE; iarg += 2; } else if (strcmp(arg[iarg+1], "marshall") == 0){ - if (!twist_set) twist = TWIST_MARSHALL; - else if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + twist_model_one = TWIST_MARSHALL; twist_history = 1; - twist_set = 1; iarg += 2; } else{ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - else if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!twist_set) twist = TWIST_NOHISTORY; - if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + if (strcmp(arg[iarg+1], "nohistory") == 0){ + twist_model_one = TWIST_NOHISTORY; } else if (strcmp(arg[iarg+1], "sds") == 0){ - if (!twist_set) twist = TWIST_SDS; - else if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + twist_model_one = TWIST_SDS; twist_history = 1; } else{ error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); } - twist_set = 1; - twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; } } + else if (strcmp(arg[iarg], "cutoff") == 0){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + cutoff_one = force->numeric(FLERR,arg[iarg+1]); + } else error->all(FLERR, "Illegal pair coeff command"); } //It is an error not to specify normal or tangential model - if (!normal_set) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); - if (!tangential_set) error->all(FLERR, "Illegal pair coeff command, must specify tangential contact model"); - - //If unspecified, set damping to VISCOELASTIC, twist/roll to NONE (cannot be changed by subsequent pair_coeff commands) - if (!damping_set) damping = VISCOELASTIC; - if (!roll_set) roll = ROLL_NONE; - if (!twist_set) twist = TWIST_NONE; - damping_set = roll_set = twist_set = 1; + if ((normal_model_one < 0) || (tangential_model_one < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); int count = 0; double damp; - if (damping == TSUJI){ + if (damping_model_one == TSUJI){ double cor; - cor = normal_coeffs_local[1]; + cor = normal_coeffs_one[1]; damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ 27.467*pow(cor,4)-18.022*pow(cor,5)+ 4.8218*pow(cor,6); } - else damp = normal_coeffs_local[1]; + else damp = normal_coeffs_one[1]; for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; + normal_model[i][j] = normal_model[j][i] = normal_model_one; normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; - if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; + if (normal_model_one != HERTZ && normal_model_one != HOOKE){ + Emod[i][j] = Emod[j][i] = normal_coeffs_one[0]; + poiss[i][j] = poiss[j][i] = normal_coeffs_one[2]; + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); + } + else{ + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_one[0]; + } + if ((normal_model_one == JKR) || (normal_model_one == DMT)) + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_one[3]; + damping_model[i][j] = damping_model[j][i] = damping_model_one; + + tangential_model[i][j] = tangential_model[j][i] = tangential_model_one; for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_one[k]; - if (roll != ROLL_NONE) + roll_model[i][j] = roll_model[j][i] = roll_model_one; + if (roll_model_one != ROLL_NONE) for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_one[k]; - if (twist != TWIST_NONE && twist != TWIST_MARSHALL) + twist_model[i][j] = twist_model[j][i] = twist_model_one; + if (twist_model_one != TWIST_NONE && twist_model_one != TWIST_MARSHALL) for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_one[k]; + + + cutoff_type[i][j] = cutoff_type[j][i] = cutoff_one; setflag[i][j] = 1; count++; } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } @@ -1615,7 +913,9 @@ void PairGranular::init_style() use_history = tangential_history || roll_history || twist_history; //For JKR, will need fix/neigh/history to keep track of touch arrays - if (normal == JKR) use_history = 1; + for (int i = 1; i <= atom->ntypes; i++) + for (int j = 1; j <= atom->ntypes; j++) + if (normal_model[i][j] == JKR) use_history = 1; size_history = 3*tangential_history + 3*roll_history + twist_history; @@ -1693,13 +993,11 @@ void PairGranular::init_style() if (ipour >= 0) { itype = i; double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); - if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); onerad_dynamic[i] = radmax; } if (idep >= 0) { itype = i; double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); - if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); onerad_dynamic[i] = radmax; } } @@ -1711,9 +1009,6 @@ void PairGranular::init_style() for (i = 0; i < nlocal; i++){ double radius_cut = radius[i]; - if (normal == JKR){ - radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); - } if (mask[i] & freeze_group_bit){ onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); } @@ -1743,32 +1038,38 @@ void PairGranular::init_style() double PairGranular::init_one(int i, int j) { double cutoff; - if (setflag[i][j] == 0) { - if (normal != HOOKE && normal != HERTZ){ - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + if (setflag[i][j] == 0){ + if ((normal_model[i][i] != normal_model[j][j]) || + (damping_model[i][i] != damping_model[j][j]) || + (tangential_model[i][i] != tangential_model[j][j]) || + (roll_model[i][i] != roll_model[j][j]) || + (twist_model[i][i] != twist_model[j][j])){ + + char str[512]; + sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); + error->one(FLERR,str); } - else{ + + if (normal_model[i][j] == HERTZ || normal_model[i][j] == HOOKE) normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); - } + else + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(Emod[i][i], Emod[j][j], poiss[i][i], poiss[j][j]); normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); - if ((normal == JKR) || (normal == DMT)) + if ((normal_model[i][j] == JKR) || (normal_model[i][j] == DMT)) normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - if (roll != ROLL_NONE){ + if (roll_model[i][j] != ROLL_NONE){ for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } - if (twist != TWIST_NONE && twist != TWIST_MARSHALL){ + if (twist_model[i][j] != TWIST_NONE && twist_model[i][j] != TWIST_MARSHALL){ for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } @@ -1780,22 +1081,40 @@ double PairGranular::init_one(int i, int j) // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only // if there is no current information about radius/cutoff of type i and j). // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - + double pulloff; if (cutoff_global < 0){ - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + if (cutoff_type[i][j] < 0){ + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + if (normal_model[i][j] == JKR){ + pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_dynamic[j], i, j); + cutoff += pulloff; + } + else{ + pulloff = 0; + } + + if (normal_model[i][j] == JKR) + pulloff = pulloff_distance(maxrad_frozen[i], maxrad_dynamic[j], i, j); + cutoff = MAX(cutoff, maxrad_frozen[i]+maxrad_dynamic[j]+pulloff); + + if (normal_model[i][j] == JKR) + pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_frozen[j], i, j); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]+pulloff); } - cutoff = cutmax; + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + else{ + cutoff = cutoff_type[i][j]; } } else{ @@ -1804,7 +1123,6 @@ double PairGranular::init_one(int i, int j) return cutoff; } - /* ---------------------------------------------------------------------- proc 0 writes to restart file ------------------------------------------------------------------------- */ @@ -1812,15 +1130,15 @@ double PairGranular::init_one(int i, int j) void PairGranular::write_restart(FILE *fp) { int i,j; - fwrite(&normal,sizeof(int),1,fp); - fwrite(&damping,sizeof(int),1,fp); - fwrite(&tangential,sizeof(int),1,fp); - fwrite(&roll,sizeof(int),1,fp); - fwrite(&twist,sizeof(int),1,fp); for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { + fwrite(&normal_model[i][j],sizeof(int),1,fp); + fwrite(&damping_model[i][j],sizeof(int),1,fp); + fwrite(&tangential_model[i][j],sizeof(int),1,fp); + fwrite(&roll_model[i][j],sizeof(int),1,fp); + fwrite(&twist_model[i][j],sizeof(int),1,fp); fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); @@ -1840,30 +1158,28 @@ void PairGranular::read_restart(FILE *fp) allocate(); int i,j; int me = comm->me; - if (me == 0){ - fread(&normal,sizeof(int),1,fp); - fread(&damping,sizeof(int),1,fp); - fread(&tangential,sizeof(int),1,fp); - fread(&roll,sizeof(int),1,fp); - fread(&twist,sizeof(int),1,fp); - } - MPI_Bcast(&normal,1,MPI_INT,0,world); - MPI_Bcast(&damping,1,MPI_INT,0,world); - MPI_Bcast(&tangential,1,MPI_INT,0,world); - MPI_Bcast(&roll,1,MPI_INT,0,world); - MPI_Bcast(&twist,1,MPI_INT,0,world); for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { if (me == 0) { + fread(&normal_model[i][j],sizeof(int),1,fp); + fread(&damping_model[i][j],sizeof(int),1,fp); + fread(&tangential_model[i][j],sizeof(int),1,fp); + fread(&roll_model[i][j],sizeof(int),1,fp); + fread(&twist_model[i][j],sizeof(int),1,fp); fread(&normal_coeffs[i][j],sizeof(double),4,fp); fread(&tangential_coeffs[i][j],sizeof(double),3,fp); fread(&roll_coeffs[i][j],sizeof(double),3,fp); fread(&twist_coeffs[i][j],sizeof(double),3,fp); fread(&cut[i][j],sizeof(double),1,fp); } + MPI_Bcast(&normal_model[i][j],1,MPI_INT,0,world); + MPI_Bcast(&damping_model[i][j],1,MPI_INT,0,world); + MPI_Bcast(&tangential_model[i][j],1,MPI_INT,0,world); + MPI_Bcast(&roll_model[i][j],1,MPI_INT,0,world); + MPI_Bcast(&twist_model[i][j],1,MPI_INT,0,world); MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); @@ -1930,7 +1246,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, Reff = radi*radj/(radi+radj); bool touchflag; - if (normal == JKR){ + if (normal_model[itype][jtype] == JKR){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); @@ -2022,7 +1338,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, delta = radsum - r; dR = delta*Reff; - if (normal == JKR){ + if (normal_model[itype][jtype] == JKR){ dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -2042,22 +1358,21 @@ double PairGranular::single(int i, int j, int itype, int jtype, else{ knfac = E; Fne = knfac*delta; - if (normal != HOOKE) - a = sqrt(dR); + a = sqrt(dR); + if (normal_model[itype][jtype] != HOOKE) Fne *= a; - if (normal == DMT) + if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping == VELOCITY){ + if (damping_model[itype][jtype] == VELOCITY){ damp_normal = normal_coeffs[itype][jtype][1]; } - else if (damping == VISCOELASTIC){ - if (normal == HOOKE) a = sqrt(dR); + else if (damping_model[itype][jtype] == VISCOELASTIC){ damp_normal = normal_coeffs[itype][jtype][1]*a*meff; } - else if (damping == TSUJI){ + else if (damping_model[itype][jtype] == TSUJI){ damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); } @@ -2099,17 +1414,19 @@ double PairGranular::single(int i, int j, int itype, int jtype, vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - Fcrit = fabs(Fne); - if (normal == JKR){ + if (normal_model[itype][jtype] == JKR){ F_pulloff = 3*M_PI*coh*Reff; Fcrit = fabs(Fne + 2*F_pulloff); } + else{ + Fcrit = fabs(Fne); + } //------------------------------ //Tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal != HOOKE){ + if (normal_model[itype][jtype] != HOOKE){ k_tangential *= a; } damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; @@ -2150,7 +1467,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // Rolling resistance //**************************************** - if (roll != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE){ relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -2211,9 +1528,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, //**************************************** // Twisting torque, including history effects //**************************************** - if (twist != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist == TWIST_MARSHALL){ + if (twist_model[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a; @@ -2293,22 +1610,18 @@ double PairGranular::memory_usage() mixing of Young's modulus (E) ------------------------------------------------------------------------- */ -double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) +double PairGranular::mix_stiffnessE(double Eii, double Ejj, double poisii, double poisjj) { - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); + return 1/((1-poisii*poisii)/Eii+(1-poisjj*poisjj)/Ejj); } /* ---------------------------------------------------------------------- mixing of shear modulus (G) - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------ */ -double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) +double PairGranular::mix_stiffnessG(double Gii, double Gjj, double poisii, double poisjj) { - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); + return 1/((2.0 -poisii)/Gii+(2.0-poisjj)/Gjj); } /* ---------------------------------------------------------------------- @@ -2325,13 +1638,14 @@ double PairGranular::mix_geom(double valii, double valjj) Compute pull-off distance (beyond contact) for a given radius and atom type ------------------------------------------------------------------------- */ -double PairGranular::pulloff_distance(double radius, int itype) +double PairGranular::pulloff_distance(double radi, double radj, int itype, int jtype) { - double E, coh, a, delta_pulloff; + double E, coh, a, delta_pulloff, Reff; + Reff = radi*radj/(radi+radj); + if (Reff <= 0) return 0; coh = normal_coeffs[itype][itype][3]; - E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], - normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); - a = cbrt(9*M_PI*coh*radius*radius/(4*E)); - return a*a/radius - 2*sqrt(M_PI*coh*a/E); + E = normal_coeffs[itype][jtype][0]; + a = cbrt(9*M_PI*coh*Reff/(4*E)); + return a*a/Reff - 2*sqrt(M_PI*coh*a/E); } diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index f39f31e4cb..625ff17c72 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -21,40 +21,28 @@ PairStyle(granular,PairGranular) #define LMP_PAIR_GRANULAR_H #include "pair.h" +#include "pair_granular.h" namespace LAMMPS_NS { -class PairGranular : public Pair { +class PairGranular : public Pair{ public: PairGranular(class LAMMPS *); - virtual ~PairGranular(); - + ~PairGranular(); void compute(int, int); - // comment next line to turn off templating -#define TEMPLATED_PAIR_GRANULAR -#ifdef TEMPLATED_PAIR_GRANULAR - template < int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_roll, int Tp_twist> - void compute_templated(int, int); -#else - void compute_untemplated(int, int, int, int, int, - int, int); -#endif - - virtual void settings(int, char **); - virtual void coeff(int, char **); + void settings(int, char **); + void coeff(int, char **); void init_style(); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); void reset_dt(); - virtual double single(int, int, int, int, double, double, double, double &); + double single(int, int, int, int, double, double, double, double &); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); double memory_usage(); protected: - double cut_global; double dt; int freeze_group_bit; int use_history; @@ -72,22 +60,26 @@ public: double *mass_rigid; // rigid mass for owned+ghost atoms int nmax; // allocated size of mass_rigid - virtual void allocate(); + void allocate(); private: int size_history; - //Models - int normal, damping, tangential, roll, twist; + //Models choices + int **normal_model, **damping_model; + double **tangential_model, **roll_model, **twist_model; //History flags - int tangential_history, roll_history, twist_history; + int normal_history, tangential_history, roll_history, twist_history; //Indices of history entries - int tangential_history_index, roll_history_index, twist_history_index; + int normal_history_index; + int tangential_history_index; + int roll_history_index; + int twist_history_index; - //Flags for whether model choices have been set - int normal_set, tangential_set, damping_set, roll_set, twist_set; + //Per-type material coefficients + double **Emod, **poiss, **Gmod; //Per-type coefficients, set in pair coeff command double ***normal_coeffs; @@ -95,13 +87,14 @@ private: double ***roll_coeffs; double ***twist_coeffs; - //Optional user-specified global cutoff + //Optional user-specified global cutoff, per-type user-specified cutoffs + double **cutoff_type; double cutoff_global; - double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); - double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); - double mix_geom(double valii, double valjj); - double pulloff_distance(double radius, int itype); + double mix_stiffnessE(double, double, double, double); + double mix_stiffnessG(double, double, double, double); + double mix_geom(double, double); + double pulloff_distance(double, double, int, int); }; } diff --git a/src/pair_granular.cpp b/src/pair_granular.cpp new file mode 100644 index 0000000000..82a470f83b --- /dev/null +++ b/src/pair_granular.cpp @@ -0,0 +1,2337 @@ +/* ---------------------------------------------------------------------- +http://lammps.sandia.gov, Sandia National Laboratories +Steve Plimpton, sjplimp@sandia.gov + +Copyright (2003) Sandia Corporation. Under the terms of Contract +DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains +certain rights in this software. This software is distributed under +the GNU General Public License. + +See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), + Jeremy Lechman (SNL), Dan Bolintineanu (SNL), Ishan Srivastava (SNL) +----------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_granular.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "fix_neigh_history.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define PI27SQ 266.47931882941264802866 // 27*PI**2 +#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) +#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) +#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) +#define FOURTHIRDS 1.333333333333333 // 4/3 +#define TWOPI 6.28318530717959 // 2*PI + +#define EPSILON 1e-10 + +enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; +enum {VELOCITY, VISCOELASTIC, TSUJI}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; +enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; +enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; + +/* ---------------------------------------------------------------------- */ + +PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + no_virial_fdotr_compute = 1; + fix_history = NULL; + + single_extra = 9; + svector = new double[single_extra]; + + neighprev = 0; + + nmax = 0; + mass_rigid = NULL; + + onerad_dynamic = NULL; + onerad_frozen = NULL; + maxrad_dynamic = NULL; + maxrad_frozen = NULL; + + dt = update->dt; + + // set comm size needed by this Pair if used with fix rigid + + comm_forward = 1; + + use_history = 0; + beyond_contact = 0; + nondefault_history_transfer = 0; + tangential_history_index = 0; + roll_history_index = twist_history_index = 0; + +} + +/* ---------------------------------------------------------------------- */ +PairGranular::~PairGranular() +{ + delete [] svector; + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cut); + + memory->destroy(normal_coeffs); + memory->destroy(tangential_coeffs); + memory->destroy(roll_coeffs); + memory->destroy(twist_coeffs); + + delete [] onerad_dynamic; + delete [] onerad_frozen; + delete [] maxrad_dynamic; + delete [] maxrad_frozen; + } + memory->destroy(mass_rigid); +} + +void PairGranular::compute(int eflag, int vflag){ +#ifdef TEMPLATED_PAIR_GRANULAR + if (normal == HOOKE){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<0,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<0,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<0,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<0,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<0,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == HERTZ){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<1,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<1,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<1,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<1,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<1,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == HERTZ_MATERIAL){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<2,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<2,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<2,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<2,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<2,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == DMT){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<3,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<3,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<3,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<3,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<3,2,1,3,2>(eflag, vflag); + } + } + } + } + else if (normal == JKR){ + if (damping == VELOCITY){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,0,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,0,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,0,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,0,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,0,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,0,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,0,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,0,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,0,1,3,2>(eflag, vflag); + } + } + } + else if (damping == VISCOELASTIC){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,1,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,1,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,1,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,1,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,1,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,1,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,1,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,1,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,1,1,3,2>(eflag, vflag); + } + } + } + else if (damping == TSUJI){ + if (tangential == TANGENTIAL_NOHISTORY){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,2,0,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,2,0,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,2,0,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,2,0,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,0,3,2>(eflag, vflag); + } + } + else if (tangential == TANGENTIAL_MINDLIN){ + if (twist == TWIST_NONE){ + if (roll == ROLL_NONE) compute_templated<4,2,1,0,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,0,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,0,2>(eflag, vflag); + } + else if (twist == TWIST_NOHISTORY){ + if (roll == ROLL_NONE) compute_templated<4,2,1,1,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,1,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,1,2>(eflag, vflag); + } + else if (twist == TWIST_SDS){ + if (roll == ROLL_NONE) compute_templated<4,2,1,2,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,2,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,2,2>(eflag, vflag); + } + else if (twist == TWIST_MARSHALL){ + if (roll == ROLL_NONE) compute_templated<4,2,1,3,0>(eflag, vflag); + else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,3,1>(eflag, vflag); + else if (roll == ROLL_SDS) compute_templated<4,2,1,3,2>(eflag, vflag); + } + } + } + } + +#else + compute_untemplated(Tp_normal, Tp_damping, Tp_tangential, + Tp_roll, Tp_twist, + eflag, vflag); +#endif +} + +#ifdef TEMPLATED_PAIR_GRANULAR +template < int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_twist, int Tp_roll > +void PairGranular::compute_templated(int eflag, int vflag) +#else +void PairGranular::compute_untemplated + (int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_twist, int Tp_roll, int eflag, int vflag) +#endif +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,rsq,r,rinv,rsqinv; + double Reff, delta, dR, dR2; + + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; + + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; + + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; + + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; + + bool touchflag; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int historyupdate = 1; + if (update->setupflag) historyupdate = 0; + + // update rigid body info for owned & ghost atoms if using FixRigid masses + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (fix_rigid && neighbor->ago == 0){ + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"pair:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + comm->forward_comm_pair(this); + } + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + int *mask = atom->mask; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + firsttouch = fix_history->firstflag; + firsthistory = fix_history->firstvalue; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + radi = radius[i]; + touch = firsttouch[i]; + allhistory = firsthistory[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++){ + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + jtype = type[j]; + rsq = delx*delx + dely*dely + delz*delz; + radj = radius[j]; + radsum = radi + radj; + + E = normal_coeffs[itype][jtype][0]; + Reff = radi*radj/(radi+radj); + touchflag = false; + + if (Tp_normal == JKR){ + if (touch[jj]){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum-delta_pulloff; + touchflag = (rsq < dist_pulloff*dist_pulloff); + } + else{ + touchflag = (rsq < radsum*radsum); + } + } + else{ + touchflag = (rsq < radsum*radsum); + } + + if (!touchflag){ + // unset non-touching neighbors + touch[jj] = 0; + history = &allhistory[size_history*jj]; + for (int k = 0; k < size_history; k++) history[k] = 0.0; + } + else{ + r = sqrt(rsq); + rinv = 1.0/r; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + if (Tp_normal == JKR){ + touch[jj] = 1; + R2=Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; //Hooke + Fne = knfac*delta; + if (Tp_normal != HOOKE) + a = sqrt(dR); + Fne *= a; + if (Tp_normal == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; + } + + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (Tp_damping == VELOCITY){ + damp_normal = 1; + } + else if (Tp_damping == VISCOELASTIC){ + if (Tp_normal == HOOKE) a = sqrt(dR); + damp_normal = a*meff; + } + else if (Tp_damping == TSUJI){ + damp_normal = sqrt(meff*knfac); + } + + Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; + + Fntot = Fne + Fdamp; + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + // If any history is needed: + if (use_history){ + touch[jj] = 1; + history = &allhistory[size_history*jj]; + } + + + if (Tp_normal == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); + } + else{ + Fcrit = fabs(Fne); + } + + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[itype][jtype][0]; + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + + if (Tp_tangential > 0){ + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // Rotate and update displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (historyupdate) { + rsht = history[0]*nx + history[1]*ny + history[2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + history[0] -= rsht*nx; + history[1] -= rsht*ny; + history[2] -= rsht*nz; + //Also rescale to preserve magnitude + history[0] *= scalefac; + history[1] *= scalefac; + history[2] *= scalefac; + } + //Update history + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; + } + + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } + + //**************************************** + // Rolling resistance + //**************************************** + + if (Tp_roll != ROLL_NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + if (Tp_roll > 1){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + + if (historyupdate){ + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; + } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; + } + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; + } + } + + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (Tp_twist != TWIST_NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (Tp_twist == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; + } + if (Tp_twist > 1){ + if (historyupdate){ + history[twist_history_index] += magtwist*dt; + } + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; + } + } + // Apply forces & torques + + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[i][0] -= radi*tor1; + torque[i][1] -= radi*tor2; + torque[i][2] -= radi*tor3; + + if (Tp_twist != TWIST_NONE){ + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[i][0] += tortwist1; + torque[i][1] += tortwist2; + torque[i][2] += tortwist3; + } + + if (Tp_roll != ROLL_NONE){ + torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = Reff*(nz*fr1 - nx*fr3); + torroll3 = Reff*(nx*fr2 - ny*fr1); + + torque[i][0] += torroll1; + torque[i][1] += torroll2; + torque[i][2] += torroll3; + } + + if (force->newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + + torque[j][0] -= radj*tor1; + torque[j][1] -= radj*tor2; + torque[j][2] -= radj*tor3; + + if (Tp_twist != TWIST_NONE){ + torque[j][0] -= tortwist1; + torque[j][1] -= tortwist2; + torque[j][2] -= tortwist3; + } + if (Tp_roll != ROLL_NONE){ + torque[j][0] -= torroll1; + torque[j][1] -= torroll2; + torque[j][2] -= torroll3; + } + } + if (evflag) ev_tally_xyz(i,j,nlocal,0, + 0.0,0.0,fx,fy,fz,delx,dely,delz); + } + } + } +} + + +/* ---------------------------------------------------------------------- +allocate all arrays +------------------------------------------------------------------------- */ + +void PairGranular::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); + memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); + memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); + memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); + + onerad_dynamic = new double[n+1]; + onerad_frozen = new double[n+1]; + maxrad_dynamic = new double[n+1]; + maxrad_frozen = new double[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairGranular::settings(int narg, char **arg) +{ + if (narg == 1){ + cutoff_global = force->numeric(FLERR,arg[0]); + } + else{ + cutoff_global = -1; //Will be set based on particle sizes, model choice + } + tangential_history = 0; + roll_history = twist_history = 0; + normal_set = tangential_set = damping_set = roll_set = twist_set = 0; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairGranular::coeff(int narg, char **arg) +{ + double normal_coeffs_local[4]; + double tangential_coeffs_local[4]; + double roll_coeffs_local[4]; + double twist_coeffs_local[4]; + + if (narg < 2) + error->all(FLERR,"Incorrect args for pair coefficients"); + + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + int iarg = 2; + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); + if (!normal_set) normal = HOOKE; + else if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_set = 1; + iarg += 3; + } + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (!normal_set) normal = HERTZ; + else if (normal_set && normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_set = 1; + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (!normal_set) normal = HERTZ_MATERIAL; + else if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_set = 1; + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "dmt") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (!normal_set) normal = DMT; + else if (normal != DMT) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + normal_set = 1; + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); + beyond_contact = 1; + if (!normal_set) normal = JKR; + else if (normal != JKR) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); + normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G + normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + normal_set = 1; + iarg += 5; + } + else if (strcmp(arg[iarg], "damp") == 0){ + if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); + if (strcmp(arg[iarg+1], "velocity") == 0){ + if (!damping_set) damping = VELOCITY; + else if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + if (!damping_set) damping = VISCOELASTIC; + else if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "tsuji") == 0){ + if (!damping_set) damping = TSUJI; + if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); + } + damping_set = 1; + iarg += 2; + } + else if (strcmp(arg[iarg], "tangential") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!tangential_set) tangential = TANGENTIAL_NOHISTORY; + else if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "mindlin") == 0){ + if (!tangential_set) tangential = TANGENTIAL_MINDLIN; + else if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types");; + tangential_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + } + tangential_set = 1; + tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else if (strcmp(arg[iarg], "rolling") == 0){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strcmp(arg[iarg+1], "none") == 0){ + if (!roll_set) roll = ROLL_NONE; + else if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); + if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!roll_set) roll = ROLL_NOHISTORY; + else if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (!roll_set) roll = ROLL_SDS; + else if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); + roll_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); + } + roll_set =1 ; + roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. + iarg += 5; + } + } + else if (strcmp(arg[iarg], "twisting") == 0){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (strcmp(arg[iarg+1], "none") == 0){ + if (!twist_set) twist = TWIST_NONE; + else if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + iarg += 2; + } + else if (strcmp(arg[iarg+1], "marshall") == 0){ + if (!twist_set) twist = TWIST_MARSHALL; + else if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + twist_history = 1; + twist_set = 1; + iarg += 2; + } + else{ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); + else if (strcmp(arg[iarg+1], "nohistory") == 0){ + if (!twist_set) twist = TWIST_NOHISTORY; + if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + } + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (!twist_set) twist = TWIST_SDS; + else if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); + twist_history = 1; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); + } + twist_set = 1; + twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + } + else error->all(FLERR, "Illegal pair coeff command"); + } + + //It is an error not to specify normal or tangential model + if (!normal_set) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); + if (!tangential_set) error->all(FLERR, "Illegal pair coeff command, must specify tangential contact model"); + + //If unspecified, set damping to VISCOELASTIC, twist/roll to NONE (cannot be changed by subsequent pair_coeff commands) + if (!damping_set) damping = VISCOELASTIC; + if (!roll_set) roll = ROLL_NONE; + if (!twist_set) twist = TWIST_NONE; + damping_set = roll_set = twist_set = 1; + + int count = 0; + double damp; + if (damping == TSUJI){ + double cor; + cor = normal_coeffs_local[1]; + damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } + else damp = normal_coeffs_local[1]; + + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; + if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; + if ((normal == JKR) || (normal == DMT)) + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; + + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; + + if (roll != ROLL_NONE) + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; + + if (twist != TWIST_NONE && twist != TWIST_MARSHALL) + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; + + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairGranular::init_style() +{ + int i; + + // error and warning checks + + if (!atom->radius_flag || !atom->rmass_flag) + error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair granular requires ghost atoms store velocity"); + + // Determine whether we need a granular neigh list, how large it needs to be + use_history = tangential_history || roll_history || twist_history; + + //For JKR, will need fix/neigh/history to keep track of touch arrays + if (normal == JKR) use_history = 1; + + size_history = 3*tangential_history + 3*roll_history + twist_history; + + //Determine location of tangential/roll/twist histories in array + if (roll_history){ + if (tangential_history) roll_history_index = 3; + else roll_history_index = 0; + } + if (twist_history){ + if (tangential_history){ + if (roll_history) twist_history_index = 6; + else twist_history_index = 3; + } + else{ + if (roll_history) twist_history_index = 3; + else twist_history_index = 0; + } + } + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->size = 1; + if (use_history) neighbor->requests[irequest]->history = 1; + + dt = update->dt; + + // if history is stored: + // if first init, create Fix needed for storing history + + if (use_history && fix_history == NULL) { + char dnumstr[16]; + sprintf(dnumstr,"%d",size_history); + char **fixarg = new char*[4]; + fixarg[0] = (char *) "NEIGH_HISTORY"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "NEIGH_HISTORY"; + fixarg[3] = dnumstr; + modify->add_fix(4,fixarg,1); + delete [] fixarg; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; + fix_history->pair = this; + } + + // check for FixFreeze and set freeze_group_bit + + for (i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"freeze") == 0) break; + if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; + else freeze_group_bit = 0; + + // check for FixRigid so can extract rigid body masses + + fix_rigid = NULL; + for (i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) break; + if (i < modify->nfix) fix_rigid = modify->fix[i]; + + // check for FixPour and FixDeposit so can extract particle radii + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + // set maxrad_dynamic and maxrad_frozen for each type + // include future FixPour and FixDeposit particles as dynamic + + int itype; + for (i = 1; i <= atom->ntypes; i++) { + onerad_dynamic[i] = onerad_frozen[i] = 0.0; + if (ipour >= 0) { + itype = i; + double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); + if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; + } + if (idep >= 0) { + itype = i; + double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); + if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); + onerad_dynamic[i] = radmax; + } + } + + double *radius = atom->radius; + int *mask = atom->mask; + int *type = atom->type; + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++){ + double radius_cut = radius[i]; + if (normal == JKR){ + radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); + } + if (mask[i] & freeze_group_bit){ + onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); + } + else{ + onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); + } + } + + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, + MPI_DOUBLE,MPI_MAX,world); + + // set fix which stores history info + + if (size_history > 0){ + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairGranular::init_one(int i, int j) +{ + double cutoff; + if (setflag[i][j] == 0) { + + if (normal != HOOKE && normal != HERTZ){ + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], + normal_coeffs[i][i][2], normal_coeffs[j][j][2]); + } + else{ + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + } + + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); + if ((normal == JKR) || (normal == DMT)) + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + + for (int k = 0; k < 3; k++) + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + + + if (roll != ROLL_NONE){ + for (int k = 0; k < 3; k++) + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); + } + + if (twist != TWIST_NONE && twist != TWIST_MARSHALL){ + for (int k = 0; k < 3; k++) + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); + } + } + + // It is possible that cut[i][j] at this point is still 0.0. This can happen when + // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates + // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size + // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only + // if there is no current information about radius/cutoff of type i and j). + // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. + + if (cutoff_global < 0){ + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); + } + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; + } + } + else{ + cutoff = cutoff_global; + } + return cutoff; +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void PairGranular::write_restart(FILE *fp) +{ + int i,j; + fwrite(&normal,sizeof(int),1,fp); + fwrite(&damping,sizeof(int),1,fp); + fwrite(&tangential,sizeof(int),1,fp); + fwrite(&roll,sizeof(int),1,fp); + fwrite(&twist,sizeof(int),1,fp); + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); + fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); + fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); + fwrite(&twist_coeffs[i][j],sizeof(double),3,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairGranular::read_restart(FILE *fp) +{ + allocate(); + int i,j; + int me = comm->me; + if (me == 0){ + fread(&normal,sizeof(int),1,fp); + fread(&damping,sizeof(int),1,fp); + fread(&tangential,sizeof(int),1,fp); + fread(&roll,sizeof(int),1,fp); + fread(&twist,sizeof(int),1,fp); + } + MPI_Bcast(&normal,1,MPI_INT,0,world); + MPI_Bcast(&damping,1,MPI_INT,0,world); + MPI_Bcast(&tangential,1,MPI_INT,0,world); + MPI_Bcast(&roll,1,MPI_INT,0,world); + MPI_Bcast(&twist,1,MPI_INT,0,world); + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&normal_coeffs[i][j],sizeof(double),4,fp); + fread(&tangential_coeffs[i][j],sizeof(double),3,fp); + fread(&roll_coeffs[i][j],sizeof(double),3,fp); + fread(&twist_coeffs[i][j],sizeof(double),3,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); + MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&twist_coeffs[i][j],3,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } + } +} + + +/* ---------------------------------------------------------------------- */ + +void PairGranular::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- */ + +double PairGranular::single(int i, int j, int itype, int jtype, + double rsq, double factor_coul, double factor_lj, double &fforce) +{ + double radi,radj,radsum; + double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; + double dR, dR2; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; + double mi,mj,meff,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + + double knfac, damp_normal; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; + + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double delta, t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; + + + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; + + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; + + double shrmag,rsht; + int jnum; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *history,*allhistory,**firsthistory; + + double *radius = atom->radius; + radi = radius[i]; + radj = radius[j]; + radsum = radi + radj; + Reff = radi*radj/(radi+radj); + + bool touchflag; + if (normal == JKR){ + R2 = Reff*Reff; + coh = normal_coeffs[itype][jtype][3]; + a = cbrt(9.0*M_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + dist_pulloff = radsum+delta_pulloff; + touchflag = (rsq <= dist_pulloff*dist_pulloff); + } + else{ + touchflag = (rsq <= radsum*radsum); + } + + if (touchflag){ + fforce = 0.0; + for (int m = 0; m < single_extra; m++) svector[m] = 0.0; + return 0.0; + } + + double **x = atom->x; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + r = sqrt(rsq); + rinv = 1.0/r; + + nx = delx*rinv; + ny = dely*rinv; + nz = delz*rinv; + + // relative translational velocity + + double **v = atom->v; + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*nx + vr2*ny + vr3*nz; + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; + + double *rmass = atom->rmass; + int *mask = atom->mask; + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + double **omega = atom->omega; + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // meff = effective mass of pair of particles + // if I or J part of rigid body, use body mass + // if I or J is frozen, meff is other particle + + int *type = atom->type; + + mi = rmass[i]; + mj = rmass[j]; + if (fix_rigid) { + // NOTE: ensure mass_rigid is current for owned+ghost atoms? + if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; + if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; + } + + meff = mi*mj / (mi+mj); + if (mask[i] & freeze_group_bit) meff = mj; + if (mask[j] & freeze_group_bit) meff = mi; + + delta = radsum - r; + dR = delta*Reff; + if (normal == JKR){ + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = FOURTHIRDS*E*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; + Fne = knfac*delta; + if (normal != HOOKE) + a = sqrt(dR); + Fne *= a; + if (normal == DMT) + Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; + } + + //Consider restricting Hooke to only have 'velocity' as an option for damping? + if (damping == VELOCITY){ + damp_normal = normal_coeffs[itype][jtype][1]; + } + else if (damping == VISCOELASTIC){ + if (normal == HOOKE) a = sqrt(dR); + damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + } + else if (damping == TSUJI){ + damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + } + + Fdamp = -damp_normal*vnnr; + + Fntot = Fne + Fdamp; + + jnum = list->numneigh[i]; + jlist = list->firstneigh[i]; + + if (use_history){ + allhistory = fix_history->firstvalue[i]; + for (int jj = 0; jj < jnum; jj++) { + neighprev++; + if (neighprev >= jnum) neighprev = 0; + if (jlist[neighprev] == j) break; + } + history = &allhistory[size_history*neighprev]; + } + + //**************************************** + //Tangential force, including history effects + //**************************************** + + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + wr1 = (radi*omega[i][0] + radj*omega[j][0]); + wr2 = (radi*omega[i][1] + radj*omega[j][1]); + wr3 = (radi*omega[i][2] + radj*omega[j][2]); + + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + + Fcrit = fabs(Fne); + if (normal == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fcrit = fabs(Fne + 2*F_pulloff); + } + + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[itype][jtype][0]; + if (normal != HOOKE){ + k_tangential *= a; + } + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + + if (tangential_history){ + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[2] - damp_tangential*vtr3; + + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } + + //**************************************** + // Rolling resistance + //**************************************** + + if (roll != ROLL_NONE){ + relrot1 = omega[i][0] - omega[j][0]; + relrot2 = omega[i][1] - omega[j][1]; + relrot3 = omega[i][2] - omega[j][2]; + + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + if (roll_history){ + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; + + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); + + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } + else{ // + fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; + if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; + else fr = 0.0; + fr1 = -fr*vrl1; + fr2 = -fr*vrl2; + fr3 = -fr*vrl3; + } + } + + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (twist != TWIST_NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a; + } + else{ + k_twist = twist_coeffs[itype][jtype][0]; + damp_twist = twist_coeffs[itype][jtype][1]; + mu_twist = twist_coeffs[itype][jtype][2]; + } + if (twist_history){ + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + else{ + if (magtwist > 0) magtortwist = -damp_twist*magtwist; + else magtortwist = 0; + } + } + + // set single_extra quantities + + svector[0] = fs1; + svector[1] = fs2; + svector[2] = fs3; + svector[3] = fs; + svector[4] = fr1; + svector[5] = fr2; + svector[6] = fr3; + svector[7] = fr; + svector[8] = magtortwist; + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairGranular::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = mass_rigid[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairGranular::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + mass_rigid[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays + ------------------------------------------------------------------------- */ + +double PairGranular::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + mixing of Young's modulus (E) +------------------------------------------------------------------------- */ + +double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); +} + +/* ---------------------------------------------------------------------- + mixing of shear modulus (G) + ------------------------------------------------------------------------- */ + +double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) +{ + double poisii = Eii/(2.0*Gii) - 1.0; + double poisjj = Ejj/(2.0*Gjj) - 1.0; + return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); +} + +/* ---------------------------------------------------------------------- + mixing of everything else +------------------------------------------------------------------------- */ + +double PairGranular::mix_geom(double valii, double valjj) +{ + return sqrt(valii*valjj); +} + + +/* ---------------------------------------------------------------------- + Compute pull-off distance (beyond contact) for a given radius and atom type +------------------------------------------------------------------------- */ + +double PairGranular::pulloff_distance(double radius, int itype) +{ + double E, coh, a, delta_pulloff; + coh = normal_coeffs[itype][itype][3]; + E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], + normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); + a = cbrt(9*M_PI*coh*radius*radius/(4*E)); + return a*a/radius - 2*sqrt(M_PI*coh*a/E); +} + diff --git a/src/pair_granular.h b/src/pair_granular.h new file mode 100644 index 0000000000..f39f31e4cb --- /dev/null +++ b/src/pair_granular.h @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(granular,PairGranular) + +#else + +#ifndef LMP_PAIR_GRANULAR_H +#define LMP_PAIR_GRANULAR_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGranular : public Pair { +public: + PairGranular(class LAMMPS *); + virtual ~PairGranular(); + + void compute(int, int); + // comment next line to turn off templating +#define TEMPLATED_PAIR_GRANULAR +#ifdef TEMPLATED_PAIR_GRANULAR + template < int Tp_normal, int Tp_damping, int Tp_tangential, + int Tp_roll, int Tp_twist> + void compute_templated(int, int); +#else + void compute_untemplated(int, int, int, int, int, + int, int); +#endif + + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void reset_dt(); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double memory_usage(); + + protected: + double cut_global; + double dt; + int freeze_group_bit; + int use_history; + + int neighprev; + double *onerad_dynamic,*onerad_frozen; + double *maxrad_dynamic,*maxrad_frozen; + double **cut; + + class FixNeighHistory *fix_history; + + // storage of rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid + + virtual void allocate(); + +private: + int size_history; + + //Models + int normal, damping, tangential, roll, twist; + + //History flags + int tangential_history, roll_history, twist_history; + + //Indices of history entries + int tangential_history_index, roll_history_index, twist_history_index; + + //Flags for whether model choices have been set + int normal_set, tangential_set, damping_set, roll_set, twist_set; + + //Per-type coefficients, set in pair coeff command + double ***normal_coeffs; + double ***tangential_coeffs; + double ***roll_coeffs; + double ***twist_coeffs; + + //Optional user-specified global cutoff + double cutoff_global; + + double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); + double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); + double mix_geom(double valii, double valjj); + double pulloff_distance(double radius, int itype); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + + */ From 6ff1557af8c03becc5615ccebcd41334a0cf082b Mon Sep 17 00:00:00 2001 From: dsbolin Date: Tue, 12 Feb 2019 07:42:26 -0700 Subject: [PATCH 029/243] More progress on doc page --- doc/src/pair_granular.txt | 101 +++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 8bf4f20d5d..d6b18217d8 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -14,7 +14,6 @@ :line pair_style granular command :h3 -pair_style granular/multi command :h3 [Syntax:] @@ -33,7 +32,7 @@ pair_style granular pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall pair_coeff 2 2 hertz 200.0 20.0 tangential mindlin 300.0 50.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre -pair_style granular/multi +pair_style granular pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall pair_coeff 2 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall pair_coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre @@ -44,24 +43,17 @@ pair_coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll The {granular} styles support a variety of options for the normal, tangential, rolling and twisting forces resulting from contact between two granular particles. This expands on the options offered by the "pair gran/*"_pair_gran.html options. The total computed forces and torques depend on the combination -of choices for these various modes of motion. +of models selected for these various modes of motion. All model options and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for various combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. -For {pair_style granular}, coefficients can vary between particle types, but model choices -cannot. For instance, in the first -example above, the stiffness, damping, and tangential friction are different for -type 1 - type 1 and type 2 - type 2 interactions, but -both 1-1 and 2-2 interactions must have the same model form, hence all keywords are -identical between the two types. Cross-coefficients -for 1-2 interactions for the case of the {hertz} model above are set via simple -geometric mixing rules. The {granular/multi} -style removes this restriction at a small cost in computational efficiency, so that different particle types -can potentially interact via different model forms. As shown in the second example, -1-1 interactions are based on a Hertzian contact model and 2-2 interactions are based on a {dmt} model (see below). -In the case that 1-1 and 2-2 interactions have different model forms, mixing of coefficients cannot be -determined, so 1-2 interactions must be explicitly defined via the pair coeff command, otherwise an error results. +For {pair_style granular}, coefficients as well as model options can vary between particle types. +As shown in the second example, +type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a {dmt} model (see below). +In that example, 1-1 and 2-2 interactions have different model forms, in which case +mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the +pair coeff command, otherwise an error would result. :line @@ -70,12 +62,13 @@ for normal contact models and their required arguments are: {hooke} : \(k_n\), damping {hertz} : \(k_n\), damping -{hertz/material} : E, damping, G -{dmt} : E, damping, G, cohesion -{jkr} : E, damping, G, cohesion :ol +{hertz/material} : E, damping, \(\nu\) +{dmt} : E, damping, \(\nu\), cohesion +{jkr} : E, damping, \(\nu\), cohesion :ol -Here, \(k_n\) is spring stiffness, damping is a damping constant or a coefficient of restitution, depending on -the choice of damping model (see below), E and G are Young's modulus and shear modulus, in units of pressure, +Here, \(k_n\) is spring stiffness (with units that depend on model choice, see below); +damping is a damping constant or a coefficient of restitution, depending on +the choice of damping model; E is Young's modulus in units of force/length^2; \(\nu\) is Poisson's ratio and cohesion is a surface energy density, in units of energy/length^2. For the {hooke} model, the normal (elastic) component of force between two particles {i} and {j} is given by: @@ -88,6 +81,8 @@ Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, \(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_j - \mathbf\{r\}_i\) is the vector separating the two particle centers and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). +Therefore, for {hooke}, the units of the spring constant \(k_n\) are {force}/{distance}, +or equivalently {mass}/{time^2}. For the {hertz} model, the normal component of force is given by: \begin\{equation\} @@ -95,6 +90,8 @@ For the {hertz} model, the normal component of force is given by: \end\{equation\} Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. +For {hertz}, the units of the spring constant \(k_n\) are {force}/{distance}^2, or equivalently +{pressure}. For the {hertz/material} model, the force is given by: \begin\{equation\} @@ -102,9 +99,9 @@ For the {hertz/material} model, the force is given by: \end\{equation\} Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) -is the effectve Young's modulus, -with \(\nu_i, \nu_j \) the Poisson ratios of the particles, which are related to the -input shear and Young's moduli by \(\nu_i = E_i/2G_i - 1\). Thus, if the elastic and shear moduli of the +is the effective Young's modulus, +with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that + if the elastic and shear moduli of the two particles are the same, the {hertz/material} model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) @@ -127,12 +124,12 @@ Here, {a} is the radius of the contact zone, related to the overlap \(\delta\) a LAMMPS internally inverts the equation above to solve for {a} in terms of \(\delta\), then solves for the force in the previous equation. Additionally, note that the JKR model allows for a tensile force beyond -contact (i.e. for \(\delta < 0\)), up to a maximum tensile force of \(-3\pi\gamma R\) (also known as +contact (i.e. for \(\delta < 0\)), up to a maximum of \(3\pi\gamma R\) (also known as the 'pull-off' force). Note that this is a hysteretic effect, where particles that are not contacting initially will not experience force until they come into contact \(\delta \geq 0\); as they move apart -and (\(\delta < 0\)), they experience a tensile force up to \(-3\pi\gamma R\), -at which point they will lose contact. +and (\(\delta < 0\)), they experience a tensile force up to \(3\pi\gamma R\), +at which point they lose contact. In addition to the above options, the normal force is augmented by a damping term. The optional {damping} keyword to the {pair_coeff} command followed by the model choice determines the form of the damping. @@ -167,7 +164,19 @@ Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the cont for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). In this case, \(\gamma_N\) is the damping coefficient, in units of 1/({time}*{distance}). -The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the +The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the +damping term is given by: +\begin\{equation\} +F_\{N,damp\} = -\alpha (m_\{eff\}k_N)^\{l/2\} \mathbf\{v\}_\{N,rel\} +\end\{equation\} + +For normal contact models based on material parameters, \(k_N = 4/3Ea\). +The parameter \(\alpha\) is related to the restitution coefficient {e} according to: +\begin{equation} +\alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 +\end{equation} + +For further details, see "(Tsuji et al)"_#Tsuji1992. :line @@ -175,13 +184,13 @@ Following the normal contact model settings, the {pair_coeff} command requires s of the tangential contact model. The required keyword {tangential} is expected, followed by the model choice and associated parameters. Currently supported tangential model choices and their expected parameters are as follows: -{nohistory} : \(\gamma_t\), \(\mu_s\) -{history} : \(k_t\), \(\gamma_t\), \(\mu_s\) :ol +{linear_nohistory} : \(\gamma_t\), \(\mu_s\) +{linear_history} : \(k_t\), \(\gamma_t\), \(\mu_s\) :ol Here, \(\gamma_t\) is the tangential damping coefficient, \(\mu_s\) is the tangential (or sliding) friction -coefficient, and \(k_t\) is the tangential stiffness. +coefficient, and \(k_t\) is the tangential stiffness coefficient. -For {nohistory}, a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior +For {linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: \begin\{equation\} @@ -190,7 +199,33 @@ of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given Where \(\|\mathbf\{F\}_n\) is the magnitude of the normal force, \(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\) is the relative tangential -velocity at the point of contact, \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_n - \) +velocity at the point of contact, \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_R - \mathbf\{v\}_R\cdot\mathbf\{n\}\), +\(\mathbf\{v\}_R = \mathbf\{v\}_i - \mathbf\{v\}_j. + +For {linear_history}, the total tangential displacement \(\mathbf\{\xi\}\) is accumulated during the entire +duration of the contact: + +\begin\{equation\} +\mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau +\end\{equation\} + +The tangential displacement must in the frame of reference of the contacting pair of particles, + +\begin\{equation\} +\mathbf\{\xi\} = \mathbf\{\xi'\} - \mathbf\{n\}(\mathbf\{n\} \cdot \mathbf\{\xi'\}) +\end\{equation\} + +\noindent Since the goal here is a `rotation', the equation above should be accompanied by a rescaling, so that at each step, +the displacement is first rotated into the current frame of reference $\mathbf\{\xi\}$, then updated: + +\begin\{equation\} +\mathbf\{\xi\} = \left(\mathbf\{\xi'\} - (\mathbf\{n\} \cdot \mathbf\{\xi'\})\mathbf\{n\}\right) \frac\{\|\mathbf\{\xi'\}\|\}\{\|\mathbf\{\xi'\}\| - \mathbf\{n\}\cdot\mathbf\{\xi'\}\} +\label\{eq:rotate_displacements\} +\end\{equation\} + + +a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior +of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: :link(Brill1996) From d8e8a0d2d24fcbbf26b5b60fb876ea3d85ba023b Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 18 Feb 2019 09:58:34 -0700 Subject: [PATCH 030/243] More changes to pair granular: - tangential damping now set by scaling the normal damping - some fixes to the twisting coefficients for the Marshall twist model - progress (completion?) of doc page --- doc/src/pair_granular.txt | 529 ++++++++++++++++++++++++++++----- src/GRANULAR/pair_granular.cpp | 364 +++++++++++------------ 2 files changed, 619 insertions(+), 274 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index d6b18217d8..ff2ee94be0 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -17,69 +17,79 @@ pair_style granular command :h3 [Syntax:] -pair_style style cutoff :pre +pair_style granular cutoff :pre -style = {granular} or {granular/multi} :ulb,l cutoff = global cutoff (optional). See discussion below. :l :ule [Examples:] pair_style granular -pair_coeff * * hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.4 :pre +pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre pair_style granular -pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair_coeff 2 2 hertz 200.0 20.0 tangential mindlin 300.0 50.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre +pair_coeff * * hertz 1000.0 50.0 tangential linear_history 800.0 1.0 0.4 :pre pair_style granular -pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 50.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair_coeff 2 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall -pair_coeff 1 2 dmt 1000.0 50.0 800.0 10.0 tangential mindlin 800.0 50.0 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre +pair_coeff * * hertz 1000.0 0.3 tangential linear_history 800.0 1.0 0.4 damping tsuji :pre +pair_style granular +pair_coeff 1 1 jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre + +pair_style granular +pair_coeff 1 1 hertz 1000.0 50.0 tangential linear_history 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre [Description:] The {granular} styles support a variety of options for the normal, tangential, rolling and twisting forces resulting from contact between two granular particles. This expands on the options offered -by the "pair gran/*"_pair_gran.html options. The total computed forces and torques depend on the combination -of models selected for these various modes of motion. +by the "pair gran/*"_pair_gran.html pair styles. The total computed forces and torques are the +sum of various models selected for the normal, tangential, rolling and twisting modes of motion. -All model options and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. +All model choices and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for -various combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. -For {pair_style granular}, coefficients as well as model options can vary between particle types. -As shown in the second example, -type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a {dmt} model (see below). +different combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. +If the contact model choice is the same for two particle types, the mixing for the cross-coefficients can be carried out +automatically. This is shown in the second example, where model choices are the same for type 1 - type 1 as for type 2 - type2 +interactions, but coefficients are different. In this case, the coefficients for type 2 - type interactions can be +determined from mixing rules discussed below. +For additional flexibility, coefficients as well as model forms can vary between particle types, +as shown in the third example: +type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a DMT cohesive model (see below). In that example, 1-1 and 2-2 interactions have different model forms, in which case mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the -pair coeff command, otherwise an error would result. +{pair_coeff 1 2} command, otherwise an error would result. :line The first required keyword for the {pair_coeff} command is the normal contact model. Currently supported options for normal contact models and their required arguments are: -{hooke} : \(k_n\), damping -{hertz} : \(k_n\), damping -{hertz/material} : E, damping, \(\nu\) -{dmt} : E, damping, \(\nu\), cohesion -{jkr} : E, damping, \(\nu\), cohesion :ol +{hooke} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) +{hertz} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) +{hertz/material} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\) +{dmt} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) +{jkr} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) :ol Here, \(k_n\) is spring stiffness (with units that depend on model choice, see below); -damping is a damping constant or a coefficient of restitution, depending on -the choice of damping model; E is Young's modulus in units of force/length^2; \(\nu\) is Poisson's ratio -and cohesion is a surface energy density, in units of energy/length^2. +\(\eta_\{n0\}\) is a damping prefactor (or, in its place a coefficient of restitution +\(e\), depending on the choice of damping mode, see below); E is Young's modulus +in units of {force}/{length}^2, i.e. {pressure}; \(\nu\) is Poisson's ratio +and \(\gamma\) is a surface energy density, in units of {energy}/{length}^2. -For the {hooke} model, the normal (elastic) component of force between two particles {i} and {j} is given by: +For the {hooke} model, the normal, elastic component of force acting on particle {i} due to +contact with particle {j} is given by: \begin\{equation\} \mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} \end\{equation\} Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, \(R_i, R_j\) are the particle radii, -\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_j - \mathbf\{r\}_i\) is the vector separating the -two particle centers +\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the +two particle centers (note the i-j ordering so that \(F_\{ne\}\) is positive for repulsion), and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). Therefore, for {hooke}, the units of the spring constant \(k_n\) are {force}/{distance}, or equivalently {mass}/{time^2}. @@ -90,7 +100,7 @@ For the {hertz} model, the normal component of force is given by: \end\{equation\} Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. -For {hertz}, the units of the spring constant \(k_n\) are {force}/{distance}^2, or equivalently +For {hertz}, the units of the spring constant \(k_n\) are {force}/{length}^2, or equivalently {pressure}. For the {hertz/material} model, the force is given by: @@ -101,17 +111,17 @@ For the {hertz/material} model, the force is given by: Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) is the effective Young's modulus, with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that - if the elastic and shear moduli of the +if the elastic and shear moduli of the two particles are the same, the {hertz/material} model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) -The {dmt} model corresponds to the Derjaguin-Muller-Toporov model, +The {dmt} model corresponds to the "(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, where the force is simply Hertz with an additional attractive cohesion term: \begin\{equation\} \mathbf\{F\}_\{ne, dmt\} = \left(\frac\{4\}\{3\} E R^\{1/2\}\delta_\{ij\}^\{3/2\} - 4\pi\gamma R\right)\mathbf\{n\} \end\{equation\} -The {jkr} model is the Johnson-Kendall-Roberts model, where the force is computed as: +The {jkr} model is the "(Johnson-Kendall-Roberts)"_#JKR1971 model, where the force is computed as: \begin\{equation\} \label\{eq:force_jkr\} \mathbf\{F\}_\{ne, jkr\} = \left(\frac\{4Ea^3\}\{3R\} - 2\pi a^2\sqrt\{\frac\{4\gamma E\}\{\pi a\}\}\right)\mathbf\{n\} @@ -131,11 +141,25 @@ will not experience force until they come into contact \(\delta \geq 0\); as the and (\(\delta < 0\)), they experience a tensile force up to \(3\pi\gamma R\), at which point they lose contact. -In addition to the above options, the normal force is augmented by a damping term. The optional -{damping} keyword to the {pair_coeff} command followed by the model choice determines the form of the damping. -The damping coefficient that was specified for the normal model -settings is used in computing the damping term, as described below. Note this damping parameter -may be interpreted differently depending on the model choice. +:line + +In addition, the normal force is augmented by a damping term of the following +general form: + +\begin\{equation\} +\mathbf\{F\}_\{n,damp\} = -\eta_n \mathbf\{v\}_\{n,rel\} +\end\{equation\} + +Here, \(\mathbf\{v\}_\{n,rel\} = (\mathbf\{v\}_j - \mathbf\{v\}_i) \cdot \mathbf\{n\}\) +is the component of relative velocity along \(\mathbf\{n\}\). + +The optional {damping} keyword to the {pair_coeff} command followed by a keyword +determines the model form of the damping factor \(\eta_n\), and the interpretation +of the \(\eta_\{n0\}\) or \(e\) coefficients specified as part of the normal contact +model settings. The {damping} keyword and corresponding +model form selection may be appended anywhere in the {pair coeff} command. +Note that the choice of damping model affects both the +normal and tangential damping (and depending on other settings, potentially also the twisting damping). The options for the damping model currently supported are: {velocity} @@ -144,91 +168,414 @@ The options for the damping model currently supported are: If the {damping} keyword is not specified, the {viscoelastic} model is used by default. -For {damping velocity}, the normal damping is simply proportional to the velocity: +For {damping velocity}, the normal damping is simply equal to the user-specified damping +coefficient in the {normal} model: + \begin\{equation\} -F_\{N,damp\} = -\gamma_N\mathbf\{v\}_\{N,rel\} +\eta_n = \eta_\{n0\}\ \end\{equation\} -Here, \(\gamma_N\) is the damping coefficient, in units of {mass}/{time}, -\(\mathbf\{v\}_\{N,rel\} = (\mathbf\{v\}_i - \mathbf\{v\}_j) \cdot \mathbf\{n\}\) -is the component of relative velocity along the direction of the vector \(\mathbf\{n\}\) that connects the centers of -particles {i} and {j}. +Here, \(\gamma_n\) is the damping coefficient specified for the normal contact model, in units of {mass}/{time}, The {damping viscoelastic} model is based on the viscoelastic treatment of "(Brilliantov et al)"_#Brill1996, where the normal damping is given by: \begin\{equation\} -F_\{N,damp\} = -\gamma_N a m_\{eff\} \mathbf\{v\}_\{N,rel\} +\eta_n = \eta_\{n0\}\ a m_\{eff\} \end\{equation\} Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\) for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). -In this case, \(\gamma_N\) is the damping coefficient, in units of 1/({time}*{distance}). +In this case, \eta_\{n0\}\ is in units of 1/({time}*{distance}). The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the -damping term is given by: +damping coefficient specified as part of the normal model is intepreted +as a restitution coefficient \(e\). The damping constant \(\eta_n\) is given by: + \begin\{equation\} -F_\{N,damp\} = -\alpha (m_\{eff\}k_N)^\{l/2\} \mathbf\{v\}_\{N,rel\} +\eta_n = \alpha (m_\{eff\}k_n)^\{1/2\} \end\{equation\} -For normal contact models based on material parameters, \(k_N = 4/3Ea\). +For normal contact models based on material parameters, \(k_n = 4/3Ea\). The parameter \(\alpha\) is related to the restitution coefficient {e} according to: -\begin{equation} -\alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 -\end{equation} -For further details, see "(Tsuji et al)"_#Tsuji1992. +\begin\{equation\} +\alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 +\end\{equation\} + +The dimensionless coefficient of restitution \(e\) specified as part of the normal contact model +parameters should be between 0 and 1, but no error check is performed on this. + +The total normal force is computed as the sum of the elastic and damping components: + +\begin\{equation\} +\mathbf\{F\}_n = \mathbf\{F\}_\{ne\} + \mathbf\{F\}_\{n,damp\} +\end\{equation\} :line -Following the normal contact model settings, the {pair_coeff} command requires specification -of the tangential contact model. The required keyword {tangential} is expected, followed by the model choice and associated -parameters. Currently supported tangential model choices and their expected parameters are as follows: +The {pair_coeff} command also requires specification +of the tangential contact model. The required keyword {tangential} is expected, followed by the model +choice and associated parameters. Currently supported tangential model choices and their +expected parameters are as follows: -{linear_nohistory} : \(\gamma_t\), \(\mu_s\) -{linear_history} : \(k_t\), \(\gamma_t\), \(\mu_s\) :ol +{linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) +{linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) :ol -Here, \(\gamma_t\) is the tangential damping coefficient, \(\mu_s\) is the tangential (or sliding) friction -coefficient, and \(k_t\) is the tangential stiffness coefficient. +Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) +that determines the magnitude of the +tangential damping, \(\mu_t\) is the tangential (or sliding) friction +coefficient, and \(k_t\) is the tangential stiffness coefficient. -For {linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior +For {tangential linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, +which mimics the behavior of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: \begin\{equation\} -\mathbf\{F\}_t = -min(\mu_s \|\mathbf\{F\}_n\|, \gamma_t m_\{eff\}\|\mathbf\{v\}_\{t, rel\}\|) \mathbf\{t\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|\mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} \end\{equation\} -Where \(\|\mathbf\{F\}_n\) is the magnitude of the normal force, -\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\) is the relative tangential -velocity at the point of contact, \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_R - \mathbf\{v\}_R\cdot\mathbf\{n\}\), -\(\mathbf\{v\}_R = \mathbf\{v\}_i - \mathbf\{v\}_j. +The tangential damping force \(\mathbf\{F\}_\mathrm\{t,damp\}\) is given by: -For {linear_history}, the total tangential displacement \(\mathbf\{\xi\}\) is accumulated during the entire +\begin\{equation\} +\mathbf\{F\}_\mathrm\{t,damp\} = -\eta_t \mathbf\{v\}_\{t,rel\} +\end\{equation\} + +The tangetial damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): +\begin\{equation\} +\eta_t = -x_\{\gamma,t\} \eta_n +\end\{equation\} + +The normal damping prefactor \(\eta_n\) is determined by the choice of the {damping} keyword, as discussed above. +Thus, the {damping} keyword also affects the tangential damping. +The parameter \(x_\{\gamma,t\}\) is a scaling coefficient. Several works in the literature use +\(x_\{\gamma,t\} = 1\) ("Marshall"_#Marshall2009, "Tsuji et al"_#Tsuji1992, "Silbert et al"_#Silbert2001). +The relative tangential velocity at the point of contact is given by +\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\), +where \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_r - \mathbf\{v\}_r\cdot\mathbf\{n\}\), +\(\mathbf\{v\}_r = \mathbf\{v\}_j - \mathbf\{v\}_i\). The direction of the applied force is +\(\mathbf\{t\} = \mathbf\{v_\{t,rel\}\}/\|\mathbf\{v_\{t,rel\}\}\|\). + +The normal force value \(F_\{n0\}\) used to compute the critical force +depends on the form of the contact model. For non-cohesive models +({hertz}, {hertz/material}, {hooke}), it is given by the magnitude of the normal force: + +\begin\{equation\} +F_\{n0\} = \|\mathbf\{F\}_n\| +\end\{equation\} + +For cohesive models such as {jkr} and {dmt}, the critical force is adjusted so that the critical tangential +force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#. +For both models, \(F_\{n0\}\) takes the form: + +\begin\{equation\} +F_\{n0\} = \|\mathbf\{F\}_ne + 2 F_\{pulloff\}\| +\end\{equation\} + +Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and \(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. + +For {tangential linear_history}, the tangential force is given by: + +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t\mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} +\end\{equation\} + +Here, \(\mathbf\{\xi\}\) is the tangential displacement accumulated during the entire duration of the contact: \begin\{equation\} \mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau \end\{equation\} -The tangential displacement must in the frame of reference of the contacting pair of particles, - -\begin\{equation\} -\mathbf\{\xi\} = \mathbf\{\xi'\} - \mathbf\{n\}(\mathbf\{n\} \cdot \mathbf\{\xi'\}) -\end\{equation\} - -\noindent Since the goal here is a `rotation', the equation above should be accompanied by a rescaling, so that at each step, -the displacement is first rotated into the current frame of reference $\mathbf\{\xi\}$, then updated: +This accumlated tangential displacement must be adjusted to account for changes +in the frame of reference +of the contacting pair of particles during contact. This occurs due to the overall motion of the contacting particles +in a rigid-body-like fashion during the duration of the contact. There are two modes of motion +that are relevant: the 'tumbling' rotation of the contacting pair, which changes the orientation of the +plane in which tangential displacement occurs; and 'spinning' rotation of the contacting pair +about the vector connecting their centers of mass (\(\mathbf\{n\}\)). +Corrections due to the former mode of motion are +made by rotating the accumulated displacement into the plane that is tangential +to the contact vector at each step, +or equivalently removing any component of the tangential displacement +that lies along \(\mathbf\{n\}\), and rescaling to preserve the magnitude. +This folllows the discussion in "Luding"_#Luding2008, see equation 17 and +relevant discussion in that work: \begin\{equation\} \mathbf\{\xi\} = \left(\mathbf\{\xi'\} - (\mathbf\{n\} \cdot \mathbf\{\xi'\})\mathbf\{n\}\right) \frac\{\|\mathbf\{\xi'\}\|\}\{\|\mathbf\{\xi'\}\| - \mathbf\{n\}\cdot\mathbf\{\xi'\}\} \label\{eq:rotate_displacements\} \end\{equation\} +Here, \(\mathbf\{\xi'\}\) is the accumulated displacement prior to the current time step and +\(\mathbf\{\xi\}\) is the corrected displacement. Corrections to the displacement +due to the second mode of motion described above (rotations about \(\mathbf\{n\}\)) +are not currently implemented, but are expected to be minor for most simulations. -a simple velocity-dependent Coulomb friction criterion is used, which reproduces the behavior -of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: +Furthermore, when the tangential force exceeds the critical force, +the tangential displacement is re-scaled to match the value for the critical force (see "Luding"_#Luding2008, +equation 20 and related discussion): +\begin\{equation\} +\mathbf\{\xi\} = -\frac\{1\}\{k_t\}\left(\mu_t F_\{n0\}\mathbf\{t\} + \mathbf\{F\}_\{t,damp\}\right) +\end\{equation\} - :link(Brill1996) +The tangential force is added to the total normal force (elastic plus damping) to produce the total force +on the particle. The tangential force also acts at the contact point to induce a torque on each +particle according to: + +\begin\{equation\} +\mathbf\{\tau\}_i = -R_i \mathbf\{n\} \times \mathbf\{F\}_t +\end\{equation\} + +\begin\{equation\} +\mathbf\{\tau\}_j = -R_j \mathbf\{n\} \times \mathbf\{F\}_t +\end\{equation\} + +:line + +The optional {rolling} keyword enables rolling friction, which resists pure rolling +motion of particles. The options currently supported are: + +{none} +{sds} : \(k_\{roll\}\), \(\gamma_\{roll\}\), \(\mu_\{roll\}\) :ol + +If the {rolling} keyword is not specified, the model defaults to {none}. + +For {rolling sds}, rolling friction is computed via a spring-dashpot-slider, using a +'pseudo-force' formulation, as detailed by "Luding"_#Luding2008. Unlike the formulation +in "Marshall"_#Marshall2009, this allows for the required adjustment of +rolling displacement due to changes in the frame of referenece of the contacting pair. +The rolling pseudo-force is computed analogously to the tangential force: + +\begin\{equation\} +\mathbf\{F\}_\{roll,0\} = k_\{roll\} \mathbf\{\xi\}_\{roll\} - \gamma_\{roll\} \mathbf\{v\}_\{roll\} +\end\{equation\} + +Here, \(\mathbf\{v\}_\{roll\} = -R(\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \times \mathbf\{n\}\) is the +relative rolling velocity, as given in "Wang et al"_#Wang2015 and "Luding"_#Luding2008. This differs +from the expressions given by "Kuhn and Bagi"_#Kuhn2004 and used in "Marshall"_#Marshall2009; +see "Wang et al"_#Wang2015 for details. The rolling displacement is given by: + +\begin\{equation\} +\mathbf\{\xi\}_\{roll\} = \int_\{t_0\}^t \mathbf\{v\}_\{roll\} (\tau) \mathrm\{d\} \tau +\end\{equation\} + +A Coulomb friction criterion truncates the rolling pseudo-force if it exceeds a critical value: +\begin\{equation\} +\mathbf\{F\}_\{roll\} = min(\mu_\{roll\} F_\{n,0\}, \|\mathbf\{F\}_\{roll,0\}\|)\mathbf\{k\} +\end\{equation\} + +Here, \(\mathbf\{k\} = \mathbf\{v\}_\{roll\}/\|\mathbf\{v\}_\{roll\}\|\) is the direction of the pseudo-force. +As with tangential displacement, the rolling displacement is rescaled when the critical +force is exceeded, so that the spring length corresponds the critical force. Additionally, the +displacement is adjusted to account for rotations of the frame of reference of the two +contacting particles in a manner analogous to the tangential displacement. + +The rolling pseudo-force does not contribute to the total force on either particle (hence 'pseudo'), +but acts only to induce an equal and opposite torque on each particle, according to: + +\begin\{equation\} +\tau_\{roll,i\} = R_\{eff\} \mathbf\{n\} \times \mathbf\{F\}_\{roll\} +\end\{equation\} + +\begin\{equation\} +\tau_\{roll,j\} = -\tau_\{roll,i\} +\end\{equation\} + +:line + +The optional {twisting} keyword enables twisting friction, which resists +rotation of two contacting particles about the vector \(\mathbf\{n\}\) that connects their +centers. The options currently supported are: + +{none} +{sds} : \(k_\{twist\}\), \(\gamma_\{twist\}\), \(\mu_\{twist\}\) +{marshall} :ol + +If the {twisting} keyword is not specified, the model defaults to {none}. + +For both {twisting sds} and {twisting marshall}, a history-dependent spring-dashpot-slider is used to compute the twisting +torque. Because twisting displacement is a scalar, there is no need to adjust for changes +in the frame of reference due to rotations of the particle pair. The formulation in +"Marshall"_#Marshall2009 therefore provides the most straightforward treatment: + +\begin\{equation\} +\tau_\{twist,0\} = -k_\{twist\}\xi_\{twist\} - \gamma_\{twist\}\Omega_\{twist\} +\end\{equation\} + +Here \(\xi_\{twist\} = \int_\{t_0\}^t \Omega_\{twist\} (\tau) \mathrm\{d\}\tau\) is the twisting +angular displacement, and \(\Omega_\{twist\} = (\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \cdot \mathbf\{n\}\) +is the relative twisting angular velocity. The torque is then truncated according to: + +\begin\{equation\} +\tau_\{twist\} = min(\mu_\{twist\} F_\{n,0\}, \tau_\{twist,0\}) +\end\{equation\} + +Similar to the sliding and rolling displacement, the angular displacement is +rescaled so that it corresponds to the critical value if the twisting torque +exceeds this critical value: + +\begin\{equation\} +\xi_\{twist\} = \frac\{1\}\{k_\{twist\}\} (\mu_\{twist\} F_\{n,0\}sgn(\Omega_\{twist\}) - \gamma_\{twist\}\Omega_\{twist\}) +\end\{equation\} + +For {twisting sds}, the coefficients \(k_\{twist\}, \gamma_\{twist\}\) and \(\mu_\{twist\}\) are +simply the user input parameters that follow the {twisting sds} keywords in the {pair_coeff} command. + +For {twisting_marshall}, the coefficients are expressed in terms of sliding friction coefficients, +as discussed in "Marshall"_#Marshall2009 (see equations 32 and 33 of that work): + +\begin\{equation\} +k_\{twist\} = 0.5k_ta^2 +\end\{equation\} + +\begin\{equation\} +\eta_\{twist\} = 0.5\eta_ta^2 +\end\{equation\} + +\begin\{equation\} +\mu_\{twist\} = \frac\{2\}\{3\}a\mu_t +\end\{equation\} + +Finally, the twisting torque on each particle is given by: + +\begin\{equation\} +\mathbf\{\tau\}_\{twist,i\} = \tau_\{twist\}\mathbf\{n\} +\end\{equation\} + +\begin\{equation\} +\mathbf\{\tau\}_\{twist,j\} = -\mathbf\{\tau\}_\{twist,i\} +\end\{equation\} + +:line + +LAMMPS automatically sets pairwise cutoff values for {pair_style granular} based on particle radii (and in the case +of {jkr} pulloff distances). In the vast majority of situations, this is adequate. +However, a cutoff value can optionally be appended to the {pair_style granular} command to specify +a global cutoff (i.e. a cutoff for all atom types). Additionally, the optional {cutoff} keyword +can be passed to the {pair_coeff} command, followed by a cutoff value. +This will set a pairwise cutoff for the atom types in the {pair_coeff} command. +These options may be useful in some rare cases where the automatic cutoff determination is not sufficient, e.g. +if particle diameters are being modified via the {fix adapt} command. In that case, the global cutoff +specified as part of the {pair_style granular} command is applied to all atom types, unless it is +overridden for a given atom type combination by the {cutoff} value specified in the {pair coeff} command. +If {cutoff} is only specified in the {pair coeff} command and no global +cutoff is appended to the {pair_style granular} command, then LAMMPS will use that cutoff for the specified +atom type combination, and automatically set pairwise cutoffs for the remaining atom types. + +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Build +package"_Build_package.html doc page for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Run_options.html when you invoke LAMMPS, or you can use the +"suffix"_suffix.html command in your input script. + +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +The "pair_modify"_pair_modify.html mix, shift, table, and tail options +are not relevant for granular pair styles. + +Mixing of coefficients is carried out using geometric averaging for +most quantities, e.g. if friction coefficient for type 1-type 1 interactions +is set to \(\mu_1\), and friction coefficient for type 2-type 2 interactions +is set to \(\mu_2\), the friction coefficient for type1-type2 interactions +is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explictly specified to +a different value by a {pair_coeff 1 2 ...} command. The exception to this is +elastic modulus, only applicable to {hertz/material}, {dmt} and {jkr} normal +contact models. In that case, the effective elastic modulus is computed as: + +\begin\{equation\} +E_\{eff,ij\} = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\} +\end\{equation\} + +If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explictly specified, +the effective modulus is computed as: + +\begin\{equation\} +E_\{eff,ij\} = \left(\frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\} + \frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\}\right)^\{-1\} +\end\{equation\} + +or + +\begin\{equation\} +E_\{eff,ij\} = \frac\{E_\{ij\}\}\{2(1-\nu_\{ij\})\} +\end\{equation\} + +These pair styles write their information to "binary restart +files"_restart.html, so a pair_style command does not need to be +specified in an input script that reads a restart file. + +These pair styles can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. They do not support the +{inner}, {middle}, {outer} keywords. + +The single() function of these pair styles returns 0.0 for the energy +of a pairwise interaction, since energy is not conserved in these +dissipative potentials. It also returns only the normal component of +the pairwise interaction force. However, the single() function also +calculates 10 extra pairwise quantities. The first 3 are the +components of the tangential force between particles I and J, acting +on particle I. The 4th is the magnitude of this tangential force. +The next 3 (5-7) are the components of the relative velocity in the +normal direction (along the line joining the 2 sphere centers). The +last 3 (8-10) the components of the relative velocity in the +tangential direction. + +These extra quantities can be accessed by the "compute +pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., +{p10}. + +:line + +[Restrictions:] + +All the granular pair styles are part of the GRANULAR package. It is +only enabled if LAMMPS was built with that package. See the "Build +package"_Build_package.html doc page for more info. + +These pair styles require that atoms store torque and angular velocity +(omega) as defined by the "atom_style"_atom_style.html. They also +require a per-particle radius is stored. The {sphere} atom style does +all of this. + +This pair style requires you to use the "comm_modify vel +yes"_comm_modify.html command so that velocities are stored by ghost +atoms. + +These pair styles will not restart exactly when using the +"read_restart"_read_restart.html command, though they should provide +statistically similar results. This is because the forces they +compute depend on atom velocities. See the +"read_restart"_read_restart.html command for more details. + +[Related commands:] + +"pair_coeff"_pair_coeff.html + +[Default:] + +For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, {twisting none} + +[References:] + + :link(Brill1996) [(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). Model for collisions in granular gases. Physical review E, 53(5), 5382. @@ -236,5 +583,33 @@ Model for collisions in granular gases. Physical review E, 53(5), 5382. [(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. + :link(JKR1971) + [(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). + Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. - \ No newline at end of file + :link(DMT1975) + [Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the + adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. + + :link(Luding2008) + [(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. + + :link(Marshall2009) + [(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. + Journal of Computational Physics, 228(5), 1541-1561. + + :link(Silbert2001) + [(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). + Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. + + :link(Kuhn2004) + [(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. + International journal of solids and structures, 41(21), 5793-5820. + + :link(Wang2015) + [(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). + Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. + + :link(Thornton1991) + [(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. + J. Phys. D: Appl. Phys. 24 1942 \ No newline at end of file diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 3713b9251c..5631240fea 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -52,8 +52,8 @@ using namespace MathConst; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN}; -enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; -enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; +enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; +enum {ROLL_NONE, ROLL_SDS}; /* ---------------------------------------------------------------------- */ @@ -136,9 +136,9 @@ void PairGranular::compute(int eflag, int vflag) double wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; - double knfac, damp_normal; + double knfac, damp_normal, damp_normal_prefactor; double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; double fs, fs1, fs2, fs3; double mi,mj,meff,damp,ccel,tor1,tor2,tor3; @@ -324,10 +324,12 @@ void PairGranular::compute(int eflag, int vflag) } else{ knfac = E; //Hooke - Fne = knfac*delta; a = sqrt(dR); - if (normal_model[itype][jtype] != HOOKE) + if (normal_model[itype][jtype] != HOOKE){ Fne *= a; + knfac *= a; + } + Fne = knfac*delta; if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } @@ -343,7 +345,8 @@ void PairGranular::compute(int eflag, int vflag) damp_normal = sqrt(meff*knfac); } - Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; + damp_normal_prefactor = normal_coeffs[itype][jtype][1]*damp_normal; + Fdamp = -damp_normal_prefactor*vnnr; Fntot = Fne + Fdamp; @@ -376,17 +379,21 @@ void PairGranular::compute(int eflag, int vflag) if (normal_model[itype][jtype] == JKR){ F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); + Fncrit = fabs(Fne + 2*F_pulloff); + } + else if (normal_model[itype][jtype] == DMT){ + F_pulloff = 4*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); } else{ - Fcrit = fabs(Fne); + Fncrit = fabs(Fntot); } //------------------------------ //Tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; if (tangential_history){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + @@ -419,7 +426,7 @@ void PairGranular::compute(int eflag, int vflag) fs3 = -k_tangential*history[2] - damp_tangential*vtr3; // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { @@ -460,64 +467,53 @@ void PairGranular::compute(int eflag, int vflag) if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - if (roll_history){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - if (historyupdate){ - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - history[rhist0] -= rolldotn*nx; - history[rhist1] -= rolldotn*ny; - history[rhist2] -= rolldotn*nz; - //Also rescale to preserve magnitude - history[rhist0] *= scalefac; - history[rhist1] *= scalefac; - history[rhist2] *= scalefac; - } - history[rhist0] += vrl1*dt; - history[rhist1] += vrl2*dt; - history[rhist2] += vrl3*dt; - } - - - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; + if (historyupdate){ + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; + + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fncrit; + + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; } } @@ -527,30 +523,24 @@ void PairGranular::compute(int eflag, int vflag) if (twist_model[itype][jtype] != TWIST_NONE){ magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) if (twist_model[itype][jtype] == TWIST_MARSHALL){ - k_twist = 0.5*k_tangential*a*a;; //eq 32 + k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; + mu_twist = TWOTHIRDS*a*tangential_coeffs[itype][jtype][2]; } else{ k_twist = twist_coeffs[itype][jtype][0]; damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - if (twist_model[itype][jtype] > 1){ - if (historyupdate){ - history[twist_history_index] += magtwist*dt; - } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } + if (historyupdate){ + history[twist_history_index] += magtwist*dt; } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 } } // Apply forces & torques @@ -747,7 +737,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } - else if (strcmp(arg[iarg], "damp") == 0){ + else if (strcmp(arg[iarg], "damping") == 0){ if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0){ damping_model_one = VELOCITY; @@ -757,10 +747,12 @@ void PairGranular::coeff(int narg, char **arg) damping_model_one = VISCOELASTIC; iarg += 1; } - else if (strcmp(arg[iarg], "tsuji") == 0){ + else if (strcmp(arg[iarg+1], "tsuji") == 0){ damping_model_one = TSUJI; iarg += 1; } + else error->all(FLERR, "Illegal pair_coeff command, unrecognized damping model"); + iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); @@ -785,23 +777,18 @@ void PairGranular::coeff(int narg, char **arg) roll_model_one = ROLL_NONE; iarg += 2; } - else{ + else if (strcmp(arg[iarg+1], "sds") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - roll_model_one = ROLL_NOHISTORY; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ - roll_model_one = ROLL_SDS; - roll_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); - } + roll_model_one = ROLL_SDS; + roll_history = 1; roll_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kR roll_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR roll_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; } + else{ + error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); + } } else if (strcmp(arg[iarg], "twisting") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); @@ -814,22 +801,17 @@ void PairGranular::coeff(int narg, char **arg) twist_history = 1; iarg += 2; } - else{ + else if (strcmp(arg[iarg+1], "sds") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - twist_model_one = TWIST_NOHISTORY; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ twist_model_one = TWIST_SDS; twist_history = 1; - } - else{ + twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else{ error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); - } - twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt - twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; } } else if (strcmp(arg[iarg], "cutoff") == 0){ @@ -1063,7 +1045,6 @@ double PairGranular::init_one(int i, int j) for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - if (roll_model[i][j] != ROLL_NONE){ for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); @@ -1082,44 +1063,44 @@ double PairGranular::init_one(int i, int j) // if there is no current information about radius/cutoff of type i and j). // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. double pulloff; - if (cutoff_global < 0){ - if (cutoff_type[i][j] < 0){ - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - if (normal_model[i][j] == JKR){ - pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_dynamic[j], i, j); - cutoff += pulloff; - } - else{ - pulloff = 0; - } - if (normal_model[i][j] == JKR) - pulloff = pulloff_distance(maxrad_frozen[i], maxrad_dynamic[j], i, j); - cutoff = MAX(cutoff, maxrad_frozen[i]+maxrad_dynamic[j]+pulloff); + if (cutoff_type[i][j] < 0 && cutoff_global < 0){ + if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || + ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + if (normal_model[i][j] == JKR){ + pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_dynamic[j], i, j); + cutoff += pulloff; + } + else{ + pulloff = 0; + } - if (normal_model[i][j] == JKR) - pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_frozen[j], i, j); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]+pulloff); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } + if (normal_model[i][j] == JKR) + pulloff = pulloff_distance(maxrad_frozen[i], maxrad_dynamic[j], i, j); + cutoff = MAX(cutoff, maxrad_frozen[i]+maxrad_dynamic[j]+pulloff); + + if (normal_model[i][j] == JKR) + pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_frozen[j], i, j); + cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]+pulloff); } - else{ - cutoff = cutoff_type[i][j]; + else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + double cutmax = 0.0; + for (int k = 1; k <= atom->ntypes; k++) { + cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); + cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); + } + cutoff = cutmax; } } - else{ + else if (cutoff_type[i][j] > 0){ + cutoff = cutoff_type[i][j]; + } + else if (cutoff_global > 0){ cutoff = cutoff_global; } + return cutoff; } @@ -1211,9 +1192,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, double mi,mj,meff,damp,ccel,tor1,tor2,tor3; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double knfac, damp_normal; + double knfac, damp_normal, damp_normal_prefactor; double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; + double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; double fs, fs1, fs2, fs3; //For JKR @@ -1357,10 +1338,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, } else{ knfac = E; - Fne = knfac*delta; a = sqrt(dR); - if (normal_model[itype][jtype] != HOOKE) + if (normal_model[itype][jtype] != HOOKE){ Fne *= a; + knfac *= a; + } + Fne = knfac*delta; if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } @@ -1376,7 +1359,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); } - Fdamp = -damp_normal*vnnr; + damp_normal_prefactor = normal_coeffs[itype][jtype][1]*damp_normal; + Fdamp = -damp_normal_prefactor*vnnr; Fntot = Fne + Fdamp; @@ -1416,20 +1400,21 @@ double PairGranular::single(int i, int j, int itype, int jtype, if (normal_model[itype][jtype] == JKR){ F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); + Fncrit = fabs(Fne + 2*F_pulloff); + } + else if (normal_model[itype][jtype] == DMT){ + F_pulloff = 4*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); } else{ - Fcrit = fabs(Fne); + Fncrit = fabs(Fntot); } //------------------------------ //Tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal_model[itype][jtype] != HOOKE){ - k_tangential *= a; - } - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; + damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; if (tangential_history){ shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + @@ -1441,7 +1426,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, fs3 = -k_tangential*history[2] - damp_tangential*vtr3; // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; + Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { @@ -1482,47 +1467,38 @@ double PairGranular::single(int i, int j, int itype, int jtype, if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; else vrlmaginv = 0.0; - if (roll_history){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + k_roll = roll_coeffs[itype][jtype][0]; + damp_roll = roll_coeffs[itype][jtype][1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[itype][jtype][2] * Fncrit; - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; } + } //**************************************** @@ -1533,25 +1509,19 @@ double PairGranular::single(int i, int j, int itype, int jtype, if (twist_model[itype][jtype] == TWIST_MARSHALL){ k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; + mu_twist = TWOTHIRDS*a*tangential_coeffs[itype][jtype][2];; } else{ k_twist = twist_coeffs[itype][jtype][0]; damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - if (twist_history){ - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 } } From ff795e761a02300b790daa77ce98d806bdfc96b8 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Tue, 19 Feb 2019 14:31:27 -0700 Subject: [PATCH 031/243] Added generalized granular option to fix wall/gran and fix wall/gran/region; some minor bug fixes for pair granular --- doc/src/pair_granular.txt | 13 +- src/GRANULAR/fix_wall_gran.cpp | 948 +++++++++++++++++--------- src/GRANULAR/fix_wall_gran.h | 45 +- src/GRANULAR/fix_wall_gran_region.cpp | 105 +-- src/GRANULAR/fix_wall_gran_region.h | 2 +- src/GRANULAR/pair_granular.cpp | 55 +- src/GRANULAR/pair_granular.h | 4 +- 7 files changed, 743 insertions(+), 429 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index ff2ee94be0..911e3cc1dc 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -533,14 +533,16 @@ the pairwise interaction force. However, the single() function also calculates 10 extra pairwise quantities. The first 3 are the components of the tangential force between particles I and J, acting on particle I. The 4th is the magnitude of this tangential force. -The next 3 (5-7) are the components of the relative velocity in the -normal direction (along the line joining the 2 sphere centers). The -last 3 (8-10) the components of the relative velocity in the -tangential direction. +The next 3 (5-7) are the components of the rolling torque acting on +particle I. The next entry (8) is the magnitude of the rolling torque. +The next entry (9) is the magnitude of the twisting torque acting +about the vector connecting the two particle centers. +The last 3 (10-12) are the components of the vector connecting +the centers of the two particles (x_I - x_J). These extra quantities can be accessed by the "compute pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., -{p10}. +{p12}. :line @@ -568,6 +570,7 @@ compute depend on atom velocities. See the [Related commands:] "pair_coeff"_pair_coeff.html +"pair gran/*"_pair_gran.html [Default:] diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index d3129b7cdb..6e8cba7b4f 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -39,11 +39,24 @@ using namespace MathConst; // XYZ PLANE need to be 0,1,2 enum{XPLANE=0,YPLANE=1,ZPLANE=2,ZCYLINDER,REGION}; -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,JKR_ROLLING,DMT_ROLLING}; +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,GRANULAR}; enum{NONE,CONSTANT,EQUAL}; -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; +#define PI27SQ 266.47931882941264802866 // 27*PI**2 +#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) +#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) +#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) +#define FOURTHIRDS 1.333333333333333 // 4/3 +#define THREEQUARTERS 0.75 // 3/4 +#define TWOPI 6.28318530717959 // 2*PI + +#define EPSILON 1e-10 + +enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; +enum {VELOCITY, VISCOELASTIC, TSUJI}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN}; +enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; +enum {ROLL_NONE, ROLL_SDS}; #define BIG 1.0e20 #define EPSILON 1e-10 @@ -51,7 +64,7 @@ enum {INDEP, BRILLROLL}; /* ---------------------------------------------------------------------- */ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), idregion(NULL), shearone(NULL), fix_rigid(NULL), mass_rigid(NULL) + Fix(lmp, narg, arg), idregion(NULL), history_one(NULL), fix_rigid(NULL), mass_rigid(NULL) { if (narg < 4) error->all(FLERR,"Illegal fix wall/gran command"); @@ -66,19 +79,18 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[3],"hooke") == 0) pairstyle = HOOKE; else if (strcmp(arg[3],"hooke/history") == 0) pairstyle = HOOKE_HISTORY; else if (strcmp(arg[3],"hertz/history") == 0) pairstyle = HERTZ_HISTORY; - else if (strcmp(arg[3],"dmt/rolling") == 0) pairstyle = DMT_ROLLING; - //else if (strcmp(arg[3],"jkr/rolling") == 0) pairstyle = JKR_ROLLING; + else if (strcmp(arg[3],"granular") == 0) pairstyle = GRANULAR; else error->all(FLERR,"Invalid fix wall/gran interaction style"); - history = restart_peratom = 1; - if (pairstyle == HOOKE) history = restart_peratom = 0; + use_history = restart_peratom = 1; + if (pairstyle == HOOKE) use_history = restart_peratom = 0; // wall/particle coefficients int iarg; - if (pairstyle != JKR_ROLLING && pairstyle != DMT_ROLLING) { - sheardim = 3; + if (pairstyle != GRANULAR) { + size_history = 3; if (narg < 11) error->all(FLERR,"Illegal fix wall/gran command"); kn = force->numeric(FLERR,arg[4]); @@ -103,46 +115,157 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : kn /= force->nktv2p; kt /= force->nktv2p; } - iarg = 10; } else { - if (narg < 12) error->all(FLERR,"Illegal fix wall/gran command"); - - sheardim = 7; - Emod = force->numeric(FLERR,arg[4]); - Gmod = force->numeric(FLERR,arg[5]); - xmu = force->numeric(FLERR,arg[6]); - gamman = force->numeric(FLERR,arg[7]); - Ecoh = force->numeric(FLERR,arg[8]); - kR = force->numeric(FLERR,arg[9]); - muR = force->numeric(FLERR,arg[10]); - etaR = force->numeric(FLERR,arg[11]); - - //Defaults - normaldamp = TSUJI; - rollingdamp = INDEP; - - iarg = 12; - for (int iiarg=iarg; iiarg < narg; ++iiarg){ - if (strcmp(arg[iiarg], "normaldamp") == 0){ - if(iiarg+2 > narg) error->all(FLERR, "Invalid fix/wall/gran region command"); - if (strcmp(arg[iiarg+1],"tsuji") == 0){ - normaldamp = TSUJI; - alpha = gamman; - } - else if (strcmp(arg[iiarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for fix wall/gran dmt/rolling"); - iarg += 2; + iarg = 4; + damping_model = VISCOELASTIC; + roll_model = twist_model = NONE; + while (iarg < narg){ + if (strcmp(arg[iarg], "hooke") == 0){ + if (iarg + 2 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hooke option"); + normal_model = NORMAL_HOOKE; + normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += 3; } - if (strcmp(arg[iiarg], "rollingdamp") == 0){ - if(iiarg+2 > narg) error->all(FLERR, "Invalid fix/wall/gran region command"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for fix wall/gran dmt/rolling"); - iarg += 2; + else if (strcmp(arg[iarg], "hertz") == 0){ + int num_coeffs = 2; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + normal_model = NORMAL_HERTZ; + normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn + normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "hertz/material") == 0){ + int num_coeffs = 3; + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + normal_model = HERTZ_MATERIAL; + Emod = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping + poiss = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs[0] = Emod/(2*(1-poiss))*FOURTHIRDS; + normal_coeffs[2] = poiss; + iarg += num_coeffs+1; + } + else if (strcmp(arg[iarg], "dmt") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + normal_model = DMT; + Emod = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping + poiss = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs[0] = Emod/(2*(1-poiss))*FOURTHIRDS; + normal_coeffs[2] = poiss; + normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "jkr") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for JKR option"); + beyond_contact = 1; + normal_model = JKR; + Emod = force->numeric(FLERR,arg[iarg+1]); //E + normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping + poiss = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs[0] = Emod/(2*(1-poiss))*FOURTHIRDS; + normal_coeffs[2] = poiss; + normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + iarg += 5; + } + else if (strcmp(arg[iarg], "damping") == 0){ + if (iarg+1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters provided for damping model"); + if (strcmp(arg[iarg+1], "velocity") == 0){ + damping_model = VELOCITY; + iarg += 1; + } + else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + damping_model = VISCOELASTIC; + iarg += 1; + } + else if (strcmp(arg[iarg+1], "tsuji") == 0){ + damping_model = TSUJI; + iarg += 1; + } + else error->all(FLERR, "Illegal wall/gran command, unrecognized damping model"); + iarg += 1; + } + else if (strcmp(arg[iarg], "tangential") == 0){ + if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); + if (strcmp(arg[iarg+1], "linear_nohistory") == 0){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + tangential_model = TANGENTIAL_NOHISTORY; + tangential_coeffs[0] = 0; + tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; + } + else if (strcmp(arg[iarg+1], "linear_history") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + tangential_model = TANGENTIAL_HISTORY; + tangential_history = 1; + tangential_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else{ + error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + } + } + else if (strcmp(arg[iarg], "rolling") == 0){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); + if (strcmp(arg[iarg+1], "none") == 0){ + roll_model = ROLL_NONE; + iarg += 2; + } + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for rolling model"); + roll_model = ROLL_SDS; + roll_history = 1; + roll_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kR + roll_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR + roll_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. + iarg += 5; + } + else{ + error->all(FLERR, "Illegal wall/gran command, rolling friction model not recognized"); + } + } + else if (strcmp(arg[iarg], "twisting") == 0){ + if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); + if (strcmp(arg[iarg+1], "none") == 0){ + twist_model = TWIST_NONE; + iarg += 2; + } + else if (strcmp(arg[iarg+1], "marshall") == 0){ + twist_model = TWIST_MARSHALL; + twist_history = 1; + iarg += 2; + } + else if (strcmp(arg[iarg+1], "sds") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for twist model"); + twist_model = TWIST_SDS; + twist_history = 1; + twist_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt + twist_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + twist_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; + } + else{ + error->all(FLERR, "Illegal wall/gran command, twisting friction model not recognized"); + } + } + else if (strcmp(arg[iarg], "xplane") == 0 || + strcmp(arg[iarg], "yplane") == 0 || + strcmp(arg[iarg], "zplane") == 0 || + strcmp(arg[iarg], "zcylinder") == 0 || + strcmp(arg[iarg], "region") == 0){ + break; + } + else{ + error->all(FLERR, "Illegal fix wall/gran command"); } } + size_history = (normal_model == JKR) + 3*tangential_history + 3*roll_history + twist_history; } // wallstyle args @@ -216,11 +339,10 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else if (strcmp(arg[iarg],"store_contacts") == 0){ peratom_flag = 1; - size_peratom_cols = 8; //Could make this a user input option? + size_peratom_cols = 8; peratom_freq = 1; iarg += 1; } else error->all(FLERR,"Illegal fix wall/gran command"); - } if (wallstyle == XPLANE && domain->xperiodic) @@ -252,7 +374,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class - shearone = NULL; + history_one = NULL; grow_arrays(atom->nmax); atom->add_callback(0); atom->add_callback(1); @@ -260,14 +382,14 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : nmax = 0; mass_rigid = NULL; - // initialize shear history as if particle is not touching region - // shearone will be NULL for wallstyle = REGION + // initialize history as if particle is not touching region + // history_one will be NULL for wallstyle = REGION - if (history && shearone) { + if (use_history && history_one) { int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - for (int j = 0; j < sheardim; j++) - shearone[i][j] = 0.0; + for (int j = 0; j < size_history; j++) + history_one[i][j] = 0.0; } if (peratom_flag){ @@ -292,7 +414,7 @@ FixWallGran::~FixWallGran() // delete local storage delete [] idregion; - memory->destroy(shearone); + memory->destroy(history_one); memory->destroy(mass_rigid); } @@ -323,6 +445,34 @@ void FixWallGran::init() for (i = 0; i < modify->nfix; i++) if (modify->fix[i]->rigid_flag) break; if (i < modify->nfix) fix_rigid = modify->fix[i]; + + tangential_history_index = 0; + if (roll_history){ + if (tangential_history) roll_history_index = 3; + else roll_history_index = 0; + } + if (twist_history){ + if (tangential_history){ + if (roll_history) twist_history_index = 6; + else twist_history_index = 3; + } + else{ + if (roll_history) twist_history_index = 3; + else twist_history_index = 0; + } + } + if (normal_model == JKR){ + tangential_history_index += 1; + roll_history_index += 1; + twist_history_index += 1; + } + + if (damping_model == TSUJI){ + double cor = normal_coeffs[1]; + normal_coeffs[1] = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ + 27.467*pow(cor,4)-18.022*pow(cor,5)+ + 4.8218*pow(cor,6); + } } /* ---------------------------------------------------------------------- */ @@ -346,10 +496,10 @@ void FixWallGran::post_force(int /*vflag*/) double dx,dy,dz,del1,del2,delxy,delr,rsq,rwall,meff; double vwall[3]; - // do not update shear history during setup + // do not update history during setup - shearupdate = 1; - if (update->setupflag) shearupdate = 0; + history_update = 1; + if (update->setupflag) history_update = 0; // if just reneighbored: // update rigid body masses for owned atoms if using FixRigid @@ -395,7 +545,7 @@ void FixWallGran::post_force(int /*vflag*/) // if wall was set to NULL, it's skipped since lo/hi are infinity // compute force and torque on atom if close enough to wall // via wall potential matched to pair potential - // set shear if pair potential stores history + // set history if pair potential stores history double **x = atom->x; double **v = atom->v; @@ -450,12 +600,27 @@ void FixWallGran::post_force(int /*vflag*/) rsq = dx*dx + dy*dy + dz*dz; - if (rsq > radius[i]*radius[i]) { - if (history) - for (j = 0; j < sheardim; j++) - shearone[i][j] = 0.0; + double rad; + if (pairstyle == GRANULAR && normal_model == JKR){ + rad = radius[i] + pulloff_distance(radius[i]); + } + else + rad = radius[i]; - } else { + if (rsq > rad*rad) { + if (use_history) + for (j = 0; j < size_history; j++) + history_one[i][j] = 0.0; + } + else { + if (pairstyle == GRANULAR && normal_model == JKR && use_history){ + if ((history_one[i][0] == 0) && (rsq > radius[i]*radius[i])){ + // Particles have not contacted yet, and are outside of contact distance + for (j = 0; j < size_history; j++) + history_one[i][j] = 0.0; + continue; + } + } // meff = effective mass of sphere // if I is part of rigid body, use body mass @@ -484,20 +649,16 @@ void FixWallGran::post_force(int /*vflag*/) omega[i],torque[i],radius[i],meff, contact); else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], + omega[i],torque[i],radius[i],meff,history_one[i], contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], + omega[i],torque[i],radius[i],meff,history_one[i], contact); - else if (pairstyle == DMT_ROLLING) - dmt_rolling(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], + else if (pairstyle == GRANULAR) + granular(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,history_one[i], contact); - /*else if (pairstyle == JKR_ROLLING) - jkr_rolling(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i], - contact);*/ } } } @@ -605,7 +766,7 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, double *vwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear, + double radius, double meff, double *history, double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; @@ -657,28 +818,28 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, // shear history effects - if (shearupdate) { - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; + if (history_update) { + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; } - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); // rotate shear displacements - rsht = shear[0]*dx + shear[1]*dy + shear[2]*dz; + rsht = history[0]*dx + history[1]*dy + history[2]*dz; rsht = rsht*rsqinv; - if (shearupdate) { - shear[0] -= rsht*dx; - shear[1] -= rsht*dy; - shear[2] -= rsht*dz; + if (history_update) { + history[0] -= rsht*dx; + history[1] -= rsht*dy; + history[2] -= rsht*dz; } // tangential forces = shear + tangential velocity damping - fs1 = - (kt*shear[0] + meff*gammat*vtr1); - fs2 = - (kt*shear[1] + meff*gammat*vtr2); - fs3 = - (kt*shear[2] + meff*gammat*vtr3); + fs1 = - (kt*history[0] + meff*gammat*vtr1); + fs2 = - (kt*history[1] + meff*gammat*vtr2); + fs3 = - (kt*history[2] + meff*gammat*vtr3); // rescale frictional displacements and forces if needed @@ -687,11 +848,11 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, if (fs > fn) { if (shrmag != 0.0) { - shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - + history[0] = (fn/fs) * (history[0] + meff*gammat*vtr1/kt) - meff*gammat*vtr1/kt; - shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - + history[1] = (fn/fs) * (history[1] + meff*gammat*vtr2/kt) - meff*gammat*vtr2/kt; - shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - + history[2] = (fn/fs) * (history[2] + meff*gammat*vtr3/kt) - meff*gammat*vtr3/kt; fs1 *= fn/fs ; fs2 *= fn/fs; @@ -728,7 +889,7 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, double *vwall, double rwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear, + double radius, double meff, double *history, double *contact) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; @@ -787,28 +948,28 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, // shear history effects - if (shearupdate) { - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; + if (history_update) { + history[0] += vtr1*dt; + history[1] += vtr2*dt; + history[2] += vtr3*dt; } - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); - // rotate shear displacements + // rotate history displacements - rsht = shear[0]*dx + shear[1]*dy + shear[2]*dz; + rsht = history[0]*dx + history[1]*dy + history[2]*dz; rsht = rsht*rsqinv; - if (shearupdate) { - shear[0] -= rsht*dx; - shear[1] -= rsht*dy; - shear[2] -= rsht*dz; + if (history_update) { + history[0] -= rsht*dx; + history[1] -= rsht*dy; + history[2] -= rsht*dz; } // tangential forces = shear + tangential velocity damping - fs1 = -polyhertz * (kt*shear[0] + meff*gammat*vtr1); - fs2 = -polyhertz * (kt*shear[1] + meff*gammat*vtr2); - fs3 = -polyhertz * (kt*shear[2] + meff*gammat*vtr3); + fs1 = -polyhertz * (kt*history[0] + meff*gammat*vtr1); + fs2 = -polyhertz * (kt*history[1] + meff*gammat*vtr2); + fs3 = -polyhertz * (kt*history[2] + meff*gammat*vtr3); // rescale frictional displacements and forces if needed @@ -817,11 +978,11 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, if (fs > fn) { if (shrmag != 0.0) { - shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - + history[0] = (fn/fs) * (history[0] + meff*gammat*vtr1/kt) - meff*gammat*vtr1/kt; - shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - + history[1] = (fn/fs) * (history[1] + meff*gammat*vtr2/kt) - meff*gammat*vtr2/kt; - shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - + history[2] = (fn/fs) * (history[2] + meff*gammat*vtr3/kt) - meff*gammat*vtr3/kt; fs1 *= fn/fs ; fs2 *= fn/fs; @@ -854,268 +1015,366 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, } -void FixWallGran::dmt_rolling(double rsq, double dx, double dy, double dz, +void FixWallGran::granular(double rsq, double dx, double dy, double dz, double *vwall, double rwall, double *v, double *f, double *omega, double *torque, - double radius, double meff, double *shear, + double radius, double meff, double *history, double *contact) { - int i,j,ii,jj,inum,jnum; - int itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,r,rinv,rsqinv,R,a; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; - double overlap; - double mi,mj,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; + double radi,radj,radsum,r,rinv,rsqinv; + double Reff, delta, dR, dR2; - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; - radsum = radius + rwall; - if (rwall == 0) R = radius; - else R = radius*rwall/(radius+rwall); + double knfac, damp_normal, damp_normal_prefactor; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; - nx = dx*rinv; - ny = dy*rinv; - nz = dz*rinv; + double mi,mj,damp,ccel,tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - // relative translational velocity + //For JKR + double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3, sqrt4; - vr1 = v[0] - vwall[0]; - vr2 = v[1] - vwall[1]; - vr3 = v[2] - vwall[2]; + //Rolling + double k_roll, damp_roll; + double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; - // normal component + //Twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; + double shrmag,rsht; + int *ilist,*jlist,*numneigh,**firstneigh; + int *touch,**firsttouch; + double *allhistory,**firsthistory; + r = sqrt(rsq); + radsum = rwall + radius; - //**************************************** - //Normal force = Hertzian contact + DMT + damping - //**************************************** - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*Emod*a; - Fhz = kn*overlap; + E = normal_coeffs[0]; - //Damping (based on Tsuji et al) - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman; - else if (normaldamp == TSUJI) eta_N=alpha*sqrt(meff*kn); + radsum = radius + rwall; + if (rwall == 0) Reff = radius; + else Reff = radius*rwall/(radius+rwall); - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 + rinv = 1.0/r; - //DMT - Fdmt = -4*MY_PI*Ecoh*R; + nx = dx*rinv; + ny = dy*rinv; + nz = dz*rinv; - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; + // relative translational velocity - //**************************************** - //Tangential force, including shear history effects - //**************************************** + vr1 = v[0] - vwall[0]; + vr2 = v[1] - vwall[1]; + vr3 = v[2] - vwall[2]; - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; + // normal component - // relative rotational velocity + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; - wr1 = radius*omega[0] * rinv; - wr2 = radius*omega[1] * rinv; - wr3 = radius*omega[2] * rinv; + delta = radsum - r; + dR = delta*Reff; + if (normal_model == JKR){ + history[0] = 1.0; + E *= THREEQUARTERS; + R2=Reff*Reff; + coh = normal_coeffs[3]; + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = normal_coeffs[0]*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; //Hooke + a = sqrt(dR); + if (normal_model != HOOKE){ + Fne *= a; + knfac *= a; + } + Fne = knfac*delta; + if (normal_model == DMT) + Fne -= 4*MY_PI*normal_coeffs[3]*Reff; + } - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); + if (damping_model == VELOCITY){ + damp_normal = 1; + } + else if (damping_model == VISCOELASTIC){ + damp_normal = a*meff; + } + else if (damping_model == TSUJI){ + damp_normal = sqrt(meff*knfac); + } - // shear history effects - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); + damp_normal_prefactor = normal_coeffs[1]*damp_normal; + Fdamp = -damp_normal_prefactor*vnnr; - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } + Fntot = Fne + Fdamp; - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*Gmod*a; + //**************************************** + //Tangential force, including history effects + //**************************************** - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; - // rescale frictional displacements and forces if needed - Fscrit = xmu * fabs(Fne); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead + // relative rotational velocity + wr1 = radius*omega[0] * rinv; + wr2 = radius*omega[1] * rinv; + wr3 = radius*omega[2] * rinv; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } + if (normal_model == JKR){ + F_pulloff = 3*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); + } + else if (normal_model == DMT){ + F_pulloff = 4*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); + } + else{ + Fncrit = fabs(Fntot); + } - //**************************************** - // Rolling force, including shear history effects - //**************************************** + //------------------------------ + //Tangential forces + //------------------------------ + k_tangential = tangential_coeffs[0]; + damp_tangential = tangential_coeffs[1]*damp_normal_prefactor; - relrot1 = omega[0]; //- omega[j][0]; TODO: figure out how to - relrot2 = omega[1]; //- omega[j][1]; incorporate wall angular - relrot3 = omega[2]; //- omega[j][2]; velocity + int thist0 = tangential_history_index; + int thist1 = thist0 + 1; + int thist2 = thist1 + 1; - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; + if (tangential_history){ + shrmag = sqrt(history[thist0]*history[thist0] + history[thist1]*history[thist1] + + history[thist2]*history[thist2]); - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; + // Rotate and update displacements. + // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (history_update) { + rsht = history[thist0]*nx + history[thist1]*ny + history[thist2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0){ + scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + history[thist0] -= rsht*nx; + history[thist1] -= rsht*ny; + history[thist2] -= rsht*nz; + //Also rescale to preserve magnitude + history[thist0] *= scalefac; + history[thist1] *= scalefac; + history[thist2] *= scalefac; + } + //Update history + history[thist0] += vtr1*dt; + history[thist1] += vtr2*dt; + history[thist2] += vtr3*dt; + } - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[thist0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[thist1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[thist2] - damp_tangential*vtr3; - if (rollingdamp == BRILLROLL) etaR = muR*fabs(Fne); - fr1 = -kR*shear[3] - etaR*vrl1; - fr2 = -kR*shear[4] - etaR*vrl2; - fr3 = -kR*shear[5] - etaR*vrl3; + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[2] * Fncrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[thist0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); + history[thist1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); + history[thist2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } + else{ //Classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } - // rescale frictional displacements and forces if needed - Frcrit = muR * fabs(Fne); - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); + //**************************************** + // Rolling resistance + //**************************************** - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/kR*(Frcrit*fr1/fr + etaR*vrl1); - shear[4] = -1.0/kR*(Frcrit*fr2/fr + etaR*vrl2); - shear[5] = -1.0/kR*(Frcrit*fr3/fr + etaR*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } + if (roll_model != ROLL_NONE){ + relrot1 = omega[0]; + relrot2 = omega[1]; + relrot3 = omega[2]; + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit){ - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } + // Rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); - // Apply forces & torques + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; + if (history_update){ + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0){ //Rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + //Also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; + } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; + } - f[0] += fx; - f[1] += fy; - f[2] += fz; + k_roll = roll_coeffs[0]; + damp_roll = roll_coeffs[1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[2] * Fncrit; - torque[0] -= radi*tor1; - torque[1] -= radi*tor2; - torque[2] -= radi*tor3; + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; + //**************************************** + // Twisting torque, including history effects + //**************************************** + if (twist_model != TWIST_NONE){ + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist_model == TWIST_MARSHALL){ + k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a*tangential_coeffs[2]; + } + else{ + k_twist = twist_coeffs[0]; + damp_twist = twist_coeffs[1]; + mu_twist = twist_coeffs[2]; + } + if (history_update){ + history[twist_history_index] += magtwist*dt; + } + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; //eq 34 + } + } + // Apply forces & torques - torque[0] += tortwist1; - torque[1] += tortwist2; - torque[2] += tortwist3; + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); + if (peratom_flag){ + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } - torque[0] += torroll1; - torque[1] += torroll2; - torque[2] += torroll3; + f[0] += fx; + f[1] += fy; + f[2] += fz; + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; + + torque[0] -= radius*tor1; + torque[1] -= radius*tor2; + torque[2] -= radius*tor3; + + if (twist_model != TWIST_NONE){ + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[0] += tortwist1; + torque[1] += tortwist2; + torque[2] += tortwist3; + } + + if (roll_model != ROLL_NONE){ + torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = Reff*(nz*fr1 - nx*fr3); + torroll3 = Reff*(nx*fr2 - ny*fr1); + + torque[0] += torroll1; + torque[1] += torroll2; + torque[2] += torroll3; + } } + /* ---------------------------------------------------------------------- memory usage of local atom-based arrays ------------------------------------------------------------------------- */ @@ -1124,7 +1383,7 @@ double FixWallGran::memory_usage() { int nmax = atom->nmax; double bytes = 0.0; - if (history) bytes += nmax*sheardim * sizeof(double); // shear history + if (use_history) bytes += nmax*size_history * sizeof(double); // shear history if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); //store contacts return bytes; @@ -1136,7 +1395,7 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { - if (history) memory->grow(shearone,nmax,sheardim,"fix_wall_gran:shearone"); + if (use_history) memory->grow(history_one,nmax,size_history,"fix_wall_gran:history_one"); if (peratom_flag){ memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); } @@ -1148,9 +1407,9 @@ void FixWallGran::grow_arrays(int nmax) void FixWallGran::copy_arrays(int i, int j, int /*delflag*/) { - if (history) - for (int m = 0; m < sheardim; m++) - shearone[j][m] = shearone[i][m]; + if (use_history) + for (int m = 0; m < size_history; m++) + history_one[j][m] = history_one[i][m]; if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) array_atom[j][m] = array_atom[i][m]; @@ -1163,9 +1422,9 @@ void FixWallGran::copy_arrays(int i, int j, int /*delflag*/) void FixWallGran::set_arrays(int i) { - if (history) - for (int m = 0; m < sheardim; m++) - shearone[i][m] = 0; + if (use_history) + for (int m = 0; m < size_history; m++) + history_one[i][m] = 0; if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) array_atom[i][m] = 0; @@ -1179,9 +1438,9 @@ void FixWallGran::set_arrays(int i) int FixWallGran::pack_exchange(int i, double *buf) { int n = 0; - if (history){ - for (int m = 0; m < sheardim; m++) - buf[n++] = shearone[i][m]; + if (use_history){ + for (int m = 0; m < size_history; m++) + buf[n++] = history_one[i][m]; } if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) @@ -1197,9 +1456,9 @@ int FixWallGran::pack_exchange(int i, double *buf) int FixWallGran::unpack_exchange(int nlocal, double *buf) { int n = 0; - if (history){ - for (int m = 0; m < sheardim; m++) - shearone[nlocal][m] = buf[n++]; + if (use_history){ + for (int m = 0; m < size_history; m++) + history_one[nlocal][m] = buf[n++]; } if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) @@ -1214,12 +1473,12 @@ int FixWallGran::unpack_exchange(int nlocal, double *buf) int FixWallGran::pack_restart(int i, double *buf) { - if (!history) return 0; + if (!use_history) return 0; int n = 0; - buf[n++] = sheardim + 1; - for (int m = 0; m < sheardim; m++) - buf[n++] = shearone[i][m]; + buf[n++] = size_history + 1; + for (int m = 0; m < size_history; m++) + buf[n++] = history_one[i][m]; return n; } @@ -1229,7 +1488,7 @@ int FixWallGran::pack_restart(int i, double *buf) void FixWallGran::unpack_restart(int nlocal, int nth) { - if (!history) return; + if (!use_history) return; double **extra = atom->extra; @@ -1239,8 +1498,8 @@ void FixWallGran::unpack_restart(int nlocal, int nth) for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); m++; - for (int i = 0; i < sheardim; i++) - shearone[nlocal][i] = extra[nlocal][m++]; + for (int i = 0; i < size_history; i++) + history_one[nlocal][i] = extra[nlocal][m++]; } /* ---------------------------------------------------------------------- @@ -1249,8 +1508,8 @@ void FixWallGran::unpack_restart(int nlocal, int nth) int FixWallGran::maxsize_restart() { - if (!history) return 0; - return 1 + sheardim; + if (!use_history) return 0; + return 1 + size_history; } /* ---------------------------------------------------------------------- @@ -1259,8 +1518,8 @@ int FixWallGran::maxsize_restart() int FixWallGran::size_restart(int /*nlocal*/) { - if (!history) return 0; - return 1 + sheardim; + if (!use_history) return 0; + return 1 + size_history; } /* ---------------------------------------------------------------------- */ @@ -1270,3 +1529,12 @@ void FixWallGran::reset_dt() dt = update->dt; } +double FixWallGran::pulloff_distance(double radius){ + double coh, E, a, dist; + coh = normal_coeffs[3]; + E = normal_coeffs[0]*THREEQUARTERS; + a = cbrt(9*M_PI*coh*radius/(4*E)); + dist = a*a/radius - 2*sqrt(M_PI*coh*a/E); + return dist; +} + diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index 4212b96544..07c6c131cf 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -54,12 +54,11 @@ class FixWallGran : public Fix { void hertz_history(double, double, double, double, double *, double, double *, double *, double *, double *, double, double, double *, double *); - void dmt_rolling(double, double, double, double, double *, double, - double *, double *, double *, double *, double, double, - double *, double *); - // void jkr_rolling(double, double, double, double, double *, double, - // double *, double *, double *, double *, double, double, - // double *, double *); + void granular(double, double, double, double, double *, double, + double *, double *, double *, double *, double, double, + double *, double *); + + double pulloff_distance(double); protected: int wallstyle,wiggle,wshear,axis; @@ -67,23 +66,43 @@ class FixWallGran : public Fix { bigint time_origin; double kn,kt,gamman,gammat,xmu; - //For DMT/ROLLING - int normaldamp, rollingdamp; - double Emod, Gmod, alpha, Ecoh, kR, muR, etaR; + //For granular + //Model choices + int normal_model, damping_model; + int tangential_model, roll_model, twist_model; + int beyond_contact; + + //History flags + int normal_history, tangential_history, roll_history, twist_history; + + //Indices of history entries + int normal_history_index; + int tangential_history_index; + int roll_history_index; + int twist_history_index; + + //Material coefficients + double Emod, poiss, Gmod; + + //Contact model coefficients + double normal_coeffs[4]; + double tangential_coeffs[3]; + double roll_coeffs[3]; + double twist_coeffs[3]; double lo,hi,cylradius; double amplitude,period,omega,vshear; double dt; char *idregion; - int history; // if particle/wall interaction stores history - int shearupdate; // flag for whether shear history is updated - int sheardim; // # of shear history values per contact + int use_history; // if particle/wall interaction stores history + int history_update; // flag for whether shear history is updated + int size_history; // # of shear history values per contact // shear history for single contact per particle - double **shearone; + double **history_one; // rigid body masses for use in granular interactions diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index 17e16cb16b..95b34e0929 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -39,7 +39,8 @@ using namespace MathConst; // same as FixWallGran -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,JKR_ROLLING,DMT_ROLLING}; +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,GRANULAR}; +enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; #define BIG 1.0e20 @@ -47,7 +48,7 @@ enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,JKR_ROLLING,DMT_ROLLING}; FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), ncontact(NULL), - walls(NULL), shearmany(NULL), c2r(NULL) + walls(NULL), history_many(NULL), c2r(NULL) { restart_global = 1; motion_resetflag = 0; @@ -66,17 +67,17 @@ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : // re-allocate atom-based arrays with nshear // do not register with Atom class, since parent class did that - memory->destroy(shearone); - shearone = NULL; + memory->destroy(history_one); + history_one = NULL; ncontact = NULL; walls = NULL; - shearmany = NULL; + history_many = NULL; grow_arrays(atom->nmax); // initialize shear history as if particle is not touching region - if (history) { + if (use_history) { int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) ncontact[i] = 0; @@ -92,7 +93,7 @@ FixWallGranRegion::~FixWallGranRegion() memory->destroy(ncontact); memory->destroy(walls); - memory->destroy(shearmany); + memory->destroy(history_many); } /* ---------------------------------------------------------------------- */ @@ -138,8 +139,8 @@ void FixWallGranRegion::post_force(int /*vflag*/) // do not update shear history during setup - shearupdate = 1; - if (update->setupflag) shearupdate = 0; + history_update = 1; + if (update->setupflag) history_update = 0; // if just reneighbored: // update rigid body masses for owned atoms if using FixRigid @@ -188,7 +189,12 @@ void FixWallGranRegion::post_force(int /*vflag*/) if (mask[i] & groupbit) { if (!region->match(x[i][0],x[i][1],x[i][2])) continue; - nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]); + if (pairstyle == GRANULAR && normal_model == JKR){ + nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]+pulloff_distance(radius[i])); + } + else{ + nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]); + } if (nc > tmax) error->one(FLERR,"Too many wall/gran/region contacts for one particle"); @@ -198,7 +204,7 @@ void FixWallGranRegion::post_force(int /*vflag*/) // also set c2r[] = indices into region->contact[] for each of N contacts // process zero or one contact here, otherwise invoke update_contacts() - if (history) { + if (use_history) { if (nc == 0) { ncontact[i] = 0; continue; @@ -209,8 +215,8 @@ void FixWallGranRegion::post_force(int /*vflag*/) if (ncontact[i] == 0) { ncontact[i] = 1; walls[i][0] = iwall; - for (m = 0; m < sheardim; m++) - shearmany[i][0][m] = 0.0; + for (m = 0; m < size_history; m++) + history_many[i][0][m] = 0.0; } else if (ncontact[i] > 1 || iwall != walls[i][0]) update_contacts(i,nc); } else update_contacts(i,nc); @@ -224,13 +230,20 @@ void FixWallGranRegion::post_force(int /*vflag*/) rsq = region->contact[ic].r*region->contact[ic].r; + if (pairstyle == GRANULAR && normal_model == JKR){ + if (history_many[i][c2r[ic]][0] == 0.0 && rsq > radius[i]*radius[i]){ + for (m = 0; m < size_history; m++) + history_many[i][0][m] = 0.0; + continue; + } + } + dx = region->contact[ic].delx; dy = region->contact[ic].dely; dz = region->contact[ic].delz; if (regiondynamic) region->velocity_contact(vwall, x[i], ic); - // meff = effective mass of sphere // if I is part of rigid body, use body mass @@ -259,13 +272,13 @@ void FixWallGranRegion::post_force(int /*vflag*/) else if (pairstyle == HOOKE_HISTORY) hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], omega[i],torque[i],radius[i],meff, - shearmany[i][c2r[ic]], contact); + history_many[i][c2r[ic]], contact); else if (pairstyle == HERTZ_HISTORY) hertz_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], - radius[i],meff,shearmany[i][c2r[ic]], contact); - else if (pairstyle == DMT_ROLLING) - dmt_rolling(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], radius[i],meff,shearmany[i][c2r[ic]], contact); + radius[i],meff,history_many[i][c2r[ic]], contact); + else if (pairstyle == GRANULAR) + granular(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], radius[i],meff,history_many[i][c2r[ic]], contact); } } @@ -294,8 +307,8 @@ void FixWallGranRegion::update_contacts(int i, int nc) if (region->contact[m].iwall == walls[i][iold]) break; if (m >= nc) { ilast = ncontact[i]-1; - for (j = 0; j < sheardim; j++) - shearmany[i][iold][j] = shearmany[i][ilast][j]; + for (j = 0; j < size_history; j++) + history_many[i][iold][j] = history_many[i][ilast][j]; walls[i][iold] = walls[i][ilast]; ncontact[i]--; } else iold++; @@ -317,8 +330,8 @@ void FixWallGranRegion::update_contacts(int i, int nc) iadd = ncontact[i]; c2r[iadd] = inew; - for (j = 0; j < sheardim; j++) - shearmany[i][iadd][j] = 0.0; + for (j = 0; j < size_history; j++) + history_many[i][iadd][j] = 0.0; walls[i][iadd] = iwall; ncontact[i]++; } @@ -333,10 +346,10 @@ double FixWallGranRegion::memory_usage() { int nmax = atom->nmax; double bytes = 0.0; - if (history) { // shear history + if (use_history) { // shear history bytes += nmax * sizeof(int); // ncontact bytes += nmax*tmax * sizeof(int); // walls - bytes += nmax*tmax*sheardim * sizeof(double); // shearmany + bytes += nmax*tmax*size_history * sizeof(double); // history_many } if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid return bytes; @@ -348,10 +361,10 @@ double FixWallGranRegion::memory_usage() void FixWallGranRegion::grow_arrays(int nmax) { - if (history) { + if (use_history) { memory->grow(ncontact,nmax,"fix_wall_gran:ncontact"); memory->grow(walls,nmax,tmax,"fix_wall_gran:walls"); - memory->grow(shearmany,nmax,tmax,sheardim,"fix_wall_gran:shearmany"); + memory->grow(history_many,nmax,tmax,size_history,"fix_wall_gran:history_many"); } if (peratom_flag){ memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); @@ -366,12 +379,12 @@ void FixWallGranRegion::copy_arrays(int i, int j, int /*delflag*/) { int m,n,iwall; - if (history){ + if (use_history){ n = ncontact[i]; for (iwall = 0; iwall < n; iwall++) { walls[j][iwall] = walls[i][iwall]; - for (m = 0; m < sheardim; m++) - shearmany[j][iwall][m] = shearmany[i][iwall][m]; + for (m = 0; m < size_history; m++) + history_many[j][iwall][m] = history_many[i][iwall][m]; } ncontact[j] = ncontact[i]; } @@ -388,7 +401,7 @@ void FixWallGranRegion::copy_arrays(int i, int j, int /*delflag*/) void FixWallGranRegion::set_arrays(int i) { - if (history) + if (use_history) ncontact[i] = 0; if (peratom_flag){ for (int m = 0; m < size_peratom_cols; m++) @@ -405,13 +418,13 @@ int FixWallGranRegion::pack_exchange(int i, double *buf) int m; int n = 0; - if (history){ + if (use_history){ int count = ncontact[i]; buf[n++] = ubuf(count).d; for (int iwall = 0; iwall < count; iwall++) { buf[n++] = ubuf(walls[i][iwall]).d; - for (m = 0; m < sheardim; m++) - buf[n++] = shearmany[i][iwall][m]; + for (m = 0; m < size_history; m++) + buf[n++] = history_many[i][iwall][m]; } } if (peratom_flag){ @@ -432,12 +445,12 @@ int FixWallGranRegion::unpack_exchange(int nlocal, double *buf) int n = 0; - if (history){ + if (use_history){ int count = ncontact[nlocal] = (int) ubuf(buf[n++]).i; for (int iwall = 0; iwall < count; iwall++) { walls[nlocal][iwall] = (int) ubuf(buf[n++]).i; - for (m = 0; m < sheardim; m++) - shearmany[nlocal][iwall][m] = buf[n++]; + for (m = 0; m < size_history; m++) + history_many[nlocal][iwall][m] = buf[n++]; } } if (peratom_flag){ @@ -456,7 +469,7 @@ int FixWallGranRegion::pack_restart(int i, double *buf) { int m; - if (!history) return 0; + if (!use_history) return 0; int n = 1; int count = ncontact[i]; @@ -464,8 +477,8 @@ int FixWallGranRegion::pack_restart(int i, double *buf) buf[n++] = ubuf(count).d; for (int iwall = 0; iwall < count; iwall++) { buf[n++] = ubuf(walls[i][iwall]).d; - for (m = 0; m < sheardim; m++) - buf[n++] = shearmany[i][iwall][m]; + for (m = 0; m < size_history; m++) + buf[n++] = history_many[i][iwall][m]; } buf[0] = n; return n; @@ -479,7 +492,7 @@ void FixWallGranRegion::unpack_restart(int nlocal, int nth) { int k; - if (!history) return; + if (!use_history) return; double **extra = atom->extra; @@ -492,8 +505,8 @@ void FixWallGranRegion::unpack_restart(int nlocal, int nth) int count = ncontact[nlocal] = (int) ubuf(extra[nlocal][m++]).i; for (int iwall = 0; iwall < count; iwall++) { walls[nlocal][iwall] = (int) ubuf(extra[nlocal][m++]).i; - for (k = 0; k < sheardim; k++) - shearmany[nlocal][iwall][k] = extra[nlocal][m++]; + for (k = 0; k < size_history; k++) + history_many[nlocal][iwall][k] = extra[nlocal][m++]; } } @@ -503,8 +516,8 @@ void FixWallGranRegion::unpack_restart(int nlocal, int nth) int FixWallGranRegion::maxsize_restart() { - if (!history) return 0; - return 2 + tmax*(sheardim+1); + if (!use_history) return 0; + return 2 + tmax*(size_history+1); } /* ---------------------------------------------------------------------- @@ -513,8 +526,8 @@ int FixWallGranRegion::maxsize_restart() int FixWallGranRegion::size_restart(int nlocal) { - if (!history) return 0; - return 2 + ncontact[nlocal]*(sheardim+1); + if (!use_history) return 0; + return 2 + ncontact[nlocal]*(size_history+1); } /* ---------------------------------------------------------------------- diff --git a/src/GRANULAR/fix_wall_gran_region.h b/src/GRANULAR/fix_wall_gran_region.h index 8d1b6d533a..fd40e27e4c 100644 --- a/src/GRANULAR/fix_wall_gran_region.h +++ b/src/GRANULAR/fix_wall_gran_region.h @@ -54,7 +54,7 @@ class FixWallGranRegion : public FixWallGran { int tmax; // max # of region walls one particle can touch int *ncontact; // # of shear contacts per particle int **walls; // which wall each contact is with - double ***shearmany; // shear history per particle per contact + double ***history_many; // history per particle per contact int *c2r; // contact to region mapping // c2r[i] = index of Ith contact in // region-contact[] list of contacts diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 5631240fea..ac0b668854 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -45,6 +45,7 @@ using namespace MathConst; #define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) #define INVROOT6 0.40824829046386307274 // 1/sqrt(6) #define FOURTHIRDS 1.333333333333333 // 4/3 +#define THREEQUARTERS 0.75 // 3/4 #define TWOPI 6.28318530717959 // 2*PI #define EPSILON 1e-10 @@ -63,7 +64,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) no_virial_fdotr_compute = 1; fix_history = NULL; - single_extra = 9; + single_extra = 12; svector = new double[single_extra]; neighprev = 0; @@ -238,10 +239,11 @@ void PairGranular::compute(int eflag, int vflag) radsum = radi + radj; E = normal_coeffs[itype][jtype][0]; - Reff = radi*radj/(radi+radj); + Reff = radi*radj/radsum; touchflag = false; if (normal_model[itype][jtype] == JKR){ + E *= THREEQUARTERS; if (touch[jj]){ R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; @@ -319,17 +321,17 @@ void PairGranular::compute(int eflag, int vflag) sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); a = INVROOT6*(t6 + sqrt(sqrt3)); a2 = a*a; - knfac = FOURTHIRDS*E*a; + knfac = normal_coeffs[itype][jtype][0]*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); } else{ knfac = E; //Hooke + Fne = knfac*delta; a = sqrt(dR); if (normal_model[itype][jtype] != HOOKE){ Fne *= a; knfac *= a; } - Fne = knfac*delta; if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } @@ -711,9 +713,9 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg], "hertz/material") == 0){ int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_model_one = HERTZ; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz/material option"); + normal_model_one = HERTZ_MATERIAL; + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio iarg += num_coeffs+1; @@ -721,10 +723,10 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg], "dmt") == 0){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_model_one = DMT; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio - normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0){ @@ -755,21 +757,27 @@ void PairGranular::coeff(int narg, char **arg) iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); if (strcmp(arg[iarg+1], "linear_nohistory") == 0){ + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); tangential_model_one = TANGENTIAL_NOHISTORY; + tangential_coeffs_one[0] = 0; + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + iarg += 4; } else if (strcmp(arg[iarg+1], "linear_history") == 0){ + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); tangential_model_one = TANGENTIAL_HISTORY; tangential_history = 1; + tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + iarg += 5; } else{ error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); } - tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; } else if (strcmp(arg[iarg], "rolling") == 0){ if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); @@ -842,7 +850,7 @@ void PairGranular::coeff(int narg, char **arg) if (normal_model_one != HERTZ && normal_model_one != HOOKE){ Emod[i][j] = Emod[j][i] = normal_coeffs_one[0]; poiss[i][j] = poiss[j][i] = normal_coeffs_one[2]; - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = FOURTHIRDS*mix_stiffnessE(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); } else{ normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_one[0]; @@ -1068,14 +1076,13 @@ double PairGranular::init_one(int i, int j) if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist + cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; + pulloff = 0.0; if (normal_model[i][j] == JKR){ pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_dynamic[j], i, j); cutoff += pulloff; } - else{ - pulloff = 0; - } if (normal_model[i][j] == JKR) pulloff = pulloff_distance(maxrad_frozen[i], maxrad_dynamic[j], i, j); @@ -1224,10 +1231,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, radi = radius[i]; radj = radius[j]; radsum = radi + radj; - Reff = radi*radj/(radi+radj); + Reff = radi*radj/radsum; bool touchflag; + E = normal_coeffs[itype][jtype][0]; if (normal_model[itype][jtype] == JKR){ + E *= THREEQUARTERS; R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); @@ -1333,7 +1342,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); a = INVROOT6*(t6 + sqrt(sqrt3)); a2 = a*a; - knfac = FOURTHIRDS*E*a; + knfac = normal_coeffs[itype][jtype][0]*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); } else{ @@ -1348,7 +1357,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } - //Consider restricting Hooke to only have 'velocity' as an option for damping? if (damping_model[itype][jtype] == VELOCITY){ damp_normal = normal_coeffs[itype][jtype][1]; } @@ -1536,6 +1544,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, svector[6] = fr3; svector[7] = fr; svector[8] = magtortwist; + svector[9] = delx; + svector[10] = dely; + svector[11] = delz; return 0.0; } @@ -1614,7 +1625,7 @@ double PairGranular::pulloff_distance(double radi, double radj, int itype, int j Reff = radi*radj/(radi+radj); if (Reff <= 0) return 0; coh = normal_coeffs[itype][itype][3]; - E = normal_coeffs[itype][jtype][0]; + E = normal_coeffs[itype][jtype][0]*THREEQUARTERS; a = cbrt(9*M_PI*coh*Reff/(4*E)); return a*a/Reff - 2*sqrt(M_PI*coh*a/E); } diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 625ff17c72..7bce3831f1 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -65,9 +65,9 @@ public: private: int size_history; - //Models choices + //Model choices int **normal_model, **damping_model; - double **tangential_model, **roll_model, **twist_model; + int **tangential_model, **roll_model, **twist_model; //History flags int normal_history, tangential_history, roll_history, twist_history; From 4e26ca29f7d43b75b729e3c23f54566dd155ba63 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Tue, 19 Feb 2019 16:47:13 -0700 Subject: [PATCH 032/243] Changes to new generalized granular pair styles and fix wall/gran -Clean-up of unused variables in code -Bug fix for single method of pair granular -Changes to fix wall/gran to fix issues with JKR -Doc page updates for fix wall/gran and fix wall/gran/region --- doc/src/fix_wall_gran.txt | 53 +++++++++++++++--------- doc/src/fix_wall_gran_region.txt | 43 ++++++++++++------- src/GRANULAR/fix_wall_gran.cpp | 16 +++---- src/GRANULAR/pair_gran_hooke_history.cpp | 4 -- src/GRANULAR/pair_granular.cpp | 50 +++++++--------------- 5 files changed, 85 insertions(+), 81 deletions(-) diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt index 871ee2e5d1..096bec4920 100644 --- a/doc/src/fix_wall_gran.txt +++ b/doc/src/fix_wall_gran.txt @@ -11,18 +11,21 @@ fix wall/gran/omp command :h3 [Syntax:] -fix ID group-ID wall/gran fstyle Kn Kt gamma_n gamma_t xmu dampflag wallstyle args keyword values ... :pre +fix ID group-ID wall/gran fstyle fstyle_params wallstyle args keyword values ... :pre ID, group-ID are documented in "fix"_fix.html command :ulb,l wall/gran = style name of this fix command :l fstyle = style of force interactions between particles and wall :l - possible choices: hooke, hooke/history, hertz/history :pre -Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) :l -Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) :l -gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) :l -gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) :l -xmu = static yield criterion (unitless value between 0.0 and 1.0e4) :l -dampflag = 0 or 1 if tangential damping force is excluded or included :l + possible choices: hooke, hooke/history, hertz/history, granular :pre +fstyle_params = parameters associated with force interaction style :l + For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are: + Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) + Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) + gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) + gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) + xmu = static yield criterion (unitless value between 0.0 and 1.0e4) + dampflag = 0 or 1 if tangential damping force is excluded or included :pre + For {granular}, {fstyle_params} are set using the same syntax as for the {pair_coeff} command of "pair_style granular"_pair_granular.html :pre wallstyle = {xplane} or {yplane} or {zplane} or {zcylinder} :l args = list of arguments for a particular style :l {xplane} or {yplane} or {zplane} args = lo hi @@ -44,7 +47,10 @@ keyword = {wiggle} or {shear} :l fix 1 all wall/gran hooke 200000.0 NULL 50.0 NULL 0.5 0 xplane -10.0 10.0 fix 1 all wall/gran hooke/history 200000.0 NULL 50.0 NULL 0.5 0 zplane 0.0 NULL -fix 2 all wall/gran hooke 100000.0 20000.0 50.0 30.0 0.5 1 zcylinder 15.0 wiggle z 3.0 2.0 :pre +fix 2 all wall/gran hooke 100000.0 20000.0 50.0 30.0 0.5 1 zcylinder 15.0 wiggle z 3.0 2.0 +fix 3 all wall/gran granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 zplane 0.0 NULL +fix 4 all wall/gran granular jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall zcylinder 15.0 wiggle z 3.0 2.0 +fix 5 all wall/gran granular dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall zplane 0.0 NULL :pre [Description:] @@ -54,31 +60,39 @@ close enough to touch it. The nature of the wall/particle interactions are determined by the {fstyle} setting. It can be any of the styles defined by the -"pair_style granular"_pair_gran.html commands. Currently this is -{hooke}, {hooke/history}, or {hertz/history}. The equation for the +"pair_style gran/*"_pair_gran.html or the more general "pair_style granular"_pair_granular.html" +commands. Currently the options are {hooke}, {hooke/history}, or {hertz/history} for the former, +and {granular} with all the possible options of the associated {pair_coeff} command +for the latter. The equation for the force between the wall and particles touching it is the same as the -corresponding equation on the "pair_style granular"_pair_gran.html doc -page, in the limit of one of the two particles going to infinite +corresponding equation on the "pair_style gran/*"_pair_gran.html +and "pair_style_granular"_pair_granular.html doc +pages, in the limit of one of the two particles going to infinite radius and mass (flat wall). Specifically, delta = radius - r = overlap of particle with wall, m_eff = mass of particle, and the -effective radius of contact = RiRj/Ri+Rj is just the radius of the -particle. +effective radius of contact = RiRj/Ri+Rj is set to the radius +of the particle. The parameters {Kn}, {Kt}, {gamma_n}, {gamma_t}, {xmu} and {dampflag} have the same meaning and units as those specified with the -"pair_style granular"_pair_gran.html commands. This means a NULL can +"pair_style gran/*"_pair_gran.html commands. This means a NULL can be used for either {Kt} or {gamma_t} as described on that page. If a NULL is used for {Kt}, then a default value is used where {Kt} = 2/7 {Kn}. If a NULL is used for {gamma_t}, then a default value is used where {gamma_t} = 1/2 {gamma_n}. +All the model choices for cohesion, tangential friction, rolling friction +and twisting friction supported by the "pair_style granular"_pair_granular.html +through its {pair_coeff} command are also supported for walls. These are discussed +in greater detail on the doc page for "pair_style granular"_pair_granular.html. + Note that you can choose a different force styles and/or different -values for the 6 wall/particle coefficients than for particle/particle +values for the wall/particle coefficients than for particle/particle interactions. E.g. if you wish to model the wall as a different material. NOTE: As discussed on the doc page for "pair_style -granular"_pair_gran.html, versions of LAMMPS before 9Jan09 used a +gran/*"_pair_gran.html, versions of LAMMPS before 9Jan09 used a different equation for Hertzian interactions. This means Hertizian wall/particle interactions have also changed. They now include a sqrt(radius) term which was not present before. Also the previous @@ -188,6 +202,7 @@ Any dimension (xyz) that has a granular wall must be non-periodic. "fix move"_fix_move.html, "fix wall/gran/region"_fix_wall_gran_region.html, -"pair_style granular"_pair_gran.html +"pair_style gran/*"_pair_gran.html +"pair_style granular"_pair_granular.html [Default:] none diff --git a/doc/src/fix_wall_gran_region.txt b/doc/src/fix_wall_gran_region.txt index 50d744b305..6dcac2c180 100644 --- a/doc/src/fix_wall_gran_region.txt +++ b/doc/src/fix_wall_gran_region.txt @@ -10,24 +10,30 @@ fix wall/gran/region command :h3 [Syntax:] -fix ID group-ID wall/gran/region fstyle Kn Kt gamma_n gamma_t xmu dampflag wallstyle regionID :pre +fix ID group-ID wall/gran/region fstyle fstyle_params wallstyle regionID :pre ID, group-ID are documented in "fix"_fix.html command :ulb,l wall/region = style name of this fix command :l fstyle = style of force interactions between particles and wall :l - possible choices: hooke, hooke/history, hertz/history :pre -Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) :l -Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) :l -gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) :l -gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) :l -xmu = static yield criterion (unitless value between 0.0 and 1.0e4) :l -dampflag = 0 or 1 if tangential damping force is excluded or included :l + possible choices: hooke, hooke/history, hertz/history, granular :pre +fstyle_params = parameters associated with force interaction style :l + For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are: + Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) + Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) + gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) + gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) + xmu = static yield criterion (unitless value between 0.0 and 1.0e4) + dampflag = 0 or 1 if tangential damping force is excluded or included :pre + For {granular}, {fstyle_params} are set using the same syntax as for the {pair_coeff} command of "pair_style granular"_pair_granular.html :pre wallstyle = region (see "fix wall/gran"_fix_wall_gran.html for options for other kinds of walls) :l region-ID = region whose boundary will act as wall :l,ule [Examples:] -fix wall all wall/gran/region hooke/history 1000.0 200.0 200.0 100.0 0.5 1 region myCone :pre +fix wall all wall/gran/region hooke/history 1000.0 200.0 200.0 100.0 0.5 1 region myCone +fix 3 all wall/gran/region granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 region myBox +fix 4 all wall/gran/region granular jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall region myCone +fix 5 all wall/gran/region granular dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall region myCone :pre [Description:] @@ -122,11 +128,14 @@ to make the two faces differ by epsilon in their position. The nature of the wall/particle interactions are determined by the {fstyle} setting. It can be any of the styles defined by the -"pair_style granular"_pair_gran.html commands. Currently this is -{hooke}, {hooke/history}, or {hertz/history}. The equation for the +"pair_style gran/*"_pair_gran.html or the more general "pair_style granular"_pair_granular.html" +commands. Currently the options are {hooke}, {hooke/history}, or {hertz/history} for the former, +and {granular} with all the possible options of the associated {pair_coeff} command +for the latter. The equation for the force between the wall and particles touching it is the same as the -corresponding equation on the "pair_style granular"_pair_gran.html doc -page, but the effective radius is calculated using the radius of the +corresponding equation on the "pair_style gran/*"_pair_gran.html +and "pair_style_granular"_pair_granular.html doc +pages, but the effective radius is calculated using the radius of the particle and the radius of curvature of the wall at the contact point. Specifically, delta = radius - r = overlap of particle with wall, @@ -140,12 +149,18 @@ particle. The parameters {Kn}, {Kt}, {gamma_n}, {gamma_t}, {xmu} and {dampflag} have the same meaning and units as those specified with the -"pair_style granular"_pair_gran.html commands. This means a NULL can +"pair_style gran/*"_pair_gran.html commands. This means a NULL can be used for either {Kt} or {gamma_t} as described on that page. If a NULL is used for {Kt}, then a default value is used where {Kt} = 2/7 {Kn}. If a NULL is used for {gamma_t}, then a default value is used where {gamma_t} = 1/2 {gamma_n}. + +All the model choices for cohesion, tangential friction, rolling friction +and twisting friction supported by the "pair_style granular"_pair_granular.html +through its {pair_coeff} command are also supported for walls. These are discussed +in greater detail on the doc page for "pair_style granular"_pair_granular.html. + Note that you can choose a different force styles and/or different values for the 6 wall/particle coefficients than for particle/particle interactions. E.g. if you wish to model the wall as a different diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 6e8cba7b4f..3b959e1a01 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -1021,9 +1021,8 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, double radius, double meff, double *history, double *contact) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,r,rinv,rsqinv; + double fx,fy,fz,nx,ny,nz; + double radsum,r,rinv; double Reff, delta, dR, dR2; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; @@ -1035,17 +1034,17 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; double fs, fs1, fs2, fs3; - double mi,mj,damp,ccel,tor1,tor2,tor3; + double tor1,tor2,tor3; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; //For JKR - double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; + double R2, coh, F_pulloff, a, a2, E; double t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; + double sqrt1, sqrt2, sqrt3; //Rolling double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double torroll1, torroll2, torroll3; double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; @@ -1055,9 +1054,6 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, double tortwist1, tortwist2, tortwist3; double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *allhistory,**firsthistory; r = sqrt(rsq); radsum = rwall + radius; diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 04df3b3d9b..344e72f8ef 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -349,10 +349,6 @@ void PairGranHookeHistory::settings(int narg, char **arg) { if (narg != 6) error->all(FLERR,"Illegal pair_style command"); - - - - kn = force->numeric(FLERR,arg[0]); if (strcmp(arg[1],"NULL") == 0) kt = kn * 2.0/7.0; else kt = force->numeric(FLERR,arg[1]); diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index ac0b668854..caef852ab0 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -130,7 +130,7 @@ void PairGranular::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv; + double radi,radj,radsum,rsq,r,rinv; double Reff, delta, dR, dR2; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; @@ -140,19 +140,19 @@ void PairGranular::compute(int eflag, int vflag) double knfac, damp_normal, damp_normal_prefactor; double k_tangential, damp_tangential; double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; + double fs, fs1, fs2, fs3, tor1, tor2, tor3; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double mi,mj,meff; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; //For JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; + double sqrt1, sqrt2, sqrt3; //Rolling double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; + double torroll1, torroll2, torroll3; double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; @@ -204,7 +204,6 @@ void PairGranular::compute(int eflag, int vflag) double *rmass = atom->rmass; int *mask = atom->mask; int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; inum = list->inum; ilist = list->ilist; @@ -465,9 +464,6 @@ void PairGranular::compute(int eflag, int vflag) vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; @@ -1192,12 +1188,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, double rsq, double factor_coul, double factor_lj, double &fforce) { double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; + double r,rinv,delx,dely,delz, nx, ny, nz, Reff; double dR, dR2; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; double vtr1,vtr2,vtr3,vrel; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double mi,mj,meff; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; double knfac, damp_normal, damp_normal_prefactor; double k_tangential, damp_tangential; @@ -1207,25 +1203,22 @@ double PairGranular::single(int i, int j, int itype, int jtype, //For JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double delta, t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; + double sqrt1, sqrt2, sqrt3; //Rolling double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; + double rollmag; double fr, fr1, fr2, fr3; //Twisting double k_twist, damp_twist, mu_twist; double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; + double shrmag; int jnum; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *history,*allhistory,**firsthistory; + int *jlist; + double *history,*allhistory; double *radius = atom->radius; radi = radius[i]; @@ -1312,8 +1305,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, // if I or J part of rigid body, use body mass // if I or J is frozen, meff is other particle - int *type = atom->type; - mi = rmass[i]; mj = rmass[j]; if (fix_rigid) { @@ -1348,11 +1339,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, else{ knfac = E; a = sqrt(dR); + Fne = knfac*delta; if (normal_model[itype][jtype] != HOOKE){ Fne *= a; knfac *= a; } - Fne = knfac*delta; if (normal_model[itype][jtype] == DMT) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } @@ -1471,9 +1462,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; @@ -1484,8 +1472,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, history[rhist1]*history[rhist1] + history[rhist2]*history[rhist2]); - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - k_roll = roll_coeffs[itype][jtype][0]; damp_roll = roll_coeffs[itype][jtype][1]; fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; @@ -1498,9 +1484,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); if (fr > Frcrit) { if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); fr1 *= Frcrit/fr; fr2 *= Frcrit/fr; fr3 *= Frcrit/fr; @@ -1528,7 +1511,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, signtwist = (magtwist > 0) - (magtwist < 0); Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); magtortwist = -Mtcrit * signtwist; //eq 34 } } @@ -1621,7 +1603,7 @@ double PairGranular::mix_geom(double valii, double valjj) double PairGranular::pulloff_distance(double radi, double radj, int itype, int jtype) { - double E, coh, a, delta_pulloff, Reff; + double E, coh, a, Reff; Reff = radi*radj/(radi+radj); if (Reff <= 0) return 0; coh = normal_coeffs[itype][itype][3]; From eea30c5b766f15f2c011ba0736c6bf4b4c46dfc1 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 26 Feb 2019 16:17:31 -0700 Subject: [PATCH 033/243] half-bond lists and no bond migration for local hyper --- src/REPLICA/fix_hyper_global.cpp | 124 ++- src/REPLICA/fix_hyper_global.h | 4 +- src/REPLICA/fix_hyper_local.cpp | 1299 +++++++++++++++--------------- src/REPLICA/fix_hyper_local.h | 142 ++-- 4 files changed, 814 insertions(+), 755 deletions(-) diff --git a/src/REPLICA/fix_hyper_global.cpp b/src/REPLICA/fix_hyper_global.cpp index d235b06dc0..e43f1431a9 100644 --- a/src/REPLICA/fix_hyper_global.cpp +++ b/src/REPLICA/fix_hyper_global.cpp @@ -32,12 +32,12 @@ using namespace LAMMPS_NS; using namespace FixConst; -#define DELTA 16384 +#define DELTABOND 16384 #define VECLEN 5 -// NOTE: count/output # of timesteps on which bias is non-zero -// NOTE: should there be a virial contribution from boosted bond? -// NOTE: allow newton off? see Note in pre_reverse() +// possible enhancements +// should there be a virial contribution from boosted bond? +// allow newton off? see Note in pre_reverse() /* ---------------------------------------------------------------------- */ @@ -102,7 +102,6 @@ int FixHyperGlobal::setmask() { int mask = 0; mask |= PRE_NEIGHBOR; - mask |= PRE_FORCE; mask |= PRE_REVERSE; mask |= THERMO_ENERGY; return mask; @@ -124,6 +123,10 @@ void FixHyperGlobal::init() if (force->newton_pair == 0) error->all(FLERR,"Hyper global requires newton pair on"); + if (atom->molecular && me == 0) + error->warning(FLERR,"Hyper global for molecular systems " + "requires care in defining hyperdynamic bonds"); + dt = update->dt; // need an occasional half neighbor list @@ -167,15 +170,56 @@ void FixHyperGlobal::setup_pre_reverse(int eflag, int vflag) void FixHyperGlobal::pre_neighbor() { - int m,iold,jold,ilocal,jlocal; + int i,m,iold,jold,ilocal,jlocal; double distsq; - // reset local IDs for owned bond atoms, since atoms have migrated - // uses xold and tagold from when bonds were created + // reset local indices for owned bond atoms, since atoms have migrated // must be done after ghost atoms are setup via comm->borders() + // first time this is done for a particular I or J atom: + // use tagold and xold from when bonds were created + // atom->map() finds atom ID if it exists, owned index if possible + // closest current I or J atoms to old I may now be ghost atoms + // closest_image() returns the ghost atom index in that case + // also compute max drift of any atom in a bond + // drift = displacement from quenched coord while event has not yet occured + + for (i = 0; i < nall_old; i++) old2now[i] = -1; double **x = atom->x; + for (m = 0; m < nblocal; m++) { + iold = blist[m].iold; + jold = blist[m].jold; + ilocal = old2now[iold]; + jlocal = old2now[jold]; + + if (ilocal < 0) { + ilocal = atom->map(tagold[iold]); + ilocal = domain->closest_image(xold[iold],ilocal); + if (ilocal < 0) + error->one(FLERR,"Fix hyper/global bond atom not found"); + old2now[iold] = ilocal; + distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + if (jlocal < 0) { + jlocal = atom->map(tagold[jold]); + jlocal = domain->closest_image(xold[iold],jlocal); // closest to iold + if (jlocal < 0) + error->one(FLERR,"Fix hyper/global bond atom not found"); + old2now[jold] = jlocal; + distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + + blist[m].i = ilocal; + blist[m].j = jlocal; + } + + /* old way - nblocal loop is re-doing index-find calculation + + // NOTE: drift may not include J atoms moving (if not themselves bond owners) + int flag = 0; for (m = 0; m < nblocal; m++) { @@ -196,6 +240,8 @@ void FixHyperGlobal::pre_neighbor() } if (flag) error->one(FLERR,"Fix hyper/global bond atom not found"); + + */ } /* ---------------------------------------------------------------------- */ @@ -204,15 +250,16 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) { int i,j,m,imax,jmax; double delx,dely,delz; - double r,r0,estrain,rmax,r0max,emax,dt_boost; - double vbias,fbias,fbiasr; + double r,r0,estrain,rmax,r0max,dt_boost; + double ebias,vbias,fbias,fbiasr; // compute current strain of each owned bond - // emax = maximum strain of any bond I own + // eabs_max = maximum absolute value of strain of any bond I own // imax,jmax = local indices of my 2 atoms in that bond + // rmax,r0max = current and relaxed lengths of that bond double **x = atom->x; - emax = 0.0; + double estrain_maxabs = 0.0; for (m = 0; m < nblocal; m++) { i = blist[m].i; @@ -225,8 +272,8 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) r0 = blist[m].r0; estrain = fabs(r-r0) / r0; - if (estrain > emax) { - emax = estrain; + if (estrain > estrain_maxabs) { + estrain_maxabs = estrain; rmax = r; r0max = r0; imax = i; @@ -238,7 +285,7 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) // finds max strain and what proc owns it // owner = proc that owns that bond - pairme.value = emax; + pairme.value = estrain_maxabs; pairme.proc = me; MPI_Allreduce(&pairme,&pairall,1,MPI_DOUBLE_INT,MPI_MAXLOC,world); owner = pairall.proc; @@ -255,25 +302,34 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) return; } - // I own the bond with max strain - // compute Vbias and apply force to atoms imax,jmax - // NOTE: logic would need to be different for newton off + // I own the bond with max absolute value of strain + // compute bias force on atoms imax,jmax if strain < q, else zero + // Ebias = current strain = (r-r0) / r0 + // Vbias = bias potential = Vmax (1 - Ebias^2/q^2) + // Fbias = bias force as function of strain + // = -dVbias/dEbias = 2 Vmax Ebias / q^2 + // Fix = x component of force on atom I + // = Fbias dEbias/dr dr/dxi, dEbias/dr = 1/r0, dr/dxi = delx/r + // dt_boost = time boost factor = exp(Vbias/kT) + // NOTE: logic here would need to be different for newton off double **f = atom->f; vbias = fbias = 0.0; dt_boost = 1.0; - if (emax < qfactor) { - vbias = vmax * (1.0 - emax*emax*invqfactorsq); - fbias = 2.0 * vmax * emax / (qfactor*qfactor * r0max); + if (estrain_maxabs < qfactor) { + //ebias = (rmax-r0max) / r0max; + ebias = fabs(rmax-r0max) / r0max; + vbias = vmax * (1.0 - ebias*ebias*invqfactorsq); + fbias = 2.0 * vmax * ebias * invqfactorsq; dt_boost = exp(beta*vbias); delx = x[imax][0] - x[jmax][0]; dely = x[imax][1] - x[jmax][1]; delz = x[imax][2] - x[jmax][2]; - fbiasr = fbias / rmax; + fbiasr = fbias / r0max / rmax; f[imax][0] += delx*fbiasr; f[imax][1] += dely*fbiasr; f[imax][2] += delz*fbiasr; @@ -281,13 +337,14 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) f[jmax][0] -= delx*fbiasr; f[jmax][1] -= dely*fbiasr; f[jmax][2] -= delz*fbiasr; + } else nobias++; // output quantities outvec[0] = vbias; outvec[1] = dt_boost; - outvec[2] = emax; + outvec[2] = ebias; outvec[3] = atom->tag[imax]; outvec[4] = atom->tag[jmax]; @@ -364,13 +421,16 @@ void FixHyperGlobal::build_bond_list(int natom) if (atom->nmax > maxold) { memory->destroy(xold); memory->destroy(tagold); + memory->destroy(old2now); maxold = atom->nmax; memory->create(xold,maxold,3,"hyper/global:xold"); memory->create(tagold,maxold,"hyper/global:tagold"); + memory->create(old2now,maxold,"hyper/global:old2now"); } tagint *tag = atom->tag; int nall = atom->nlocal + atom->nghost; + nall_old = nall; for (i = 0; i < nall; i++) { xold[i][0] = x[i][0]; @@ -386,14 +446,11 @@ void FixHyperGlobal::build_bond_list(int natom) void FixHyperGlobal::grow_bond() { - // NOTE: could add int arg to do initial large alloc: - // maxbond = maxbond/DELTA * DELTA; maxbond += DELTA; - - maxbond += DELTA; - if (maxbond < 0 || maxbond > MAXSMALLINT) - error->one(FLERR,"Fix hyper/local per-processor bond count is too big"); + if (maxbond + DELTABOND > MAXSMALLINT) + error->one(FLERR,"Fix hyper/global bond count is too big"); + maxbond += DELTABOND; blist = (OneBond *) - memory->srealloc(blist,maxbond*sizeof(OneBond),"hyper/local:blist"); + memory->srealloc(blist,maxbond*sizeof(OneBond),"hyper/global:blist"); } /* ---------------------------------------------------------------------- */ @@ -419,7 +476,7 @@ double FixHyperGlobal::compute_vector(int i) // 11 vector outputs returned for i = 0-10 // i = 0 = boost factor on this step - // i = 1 = max strain of any bond on this step + // i = 1 = max strain of any bond on this step (positive or negative) // i = 2 = ID of atom I in max-strain bond on this step // i = 3 = ID of atom J in max-strain bond on this step // i = 4 = ave bonds/atom on this step @@ -438,8 +495,9 @@ double FixHyperGlobal::compute_vector(int i) if (i == 3) return outvec[4]; if (i == 4) { - int allbonds; // NOTE: bigint? - MPI_Allreduce(&nblocal,&allbonds,1,MPI_INT,MPI_SUM,world); + bigint mybonds = nblocal; + bigint allbonds; + MPI_Allreduce(&mybonds,&allbonds,1,MPI_LMP_BIGINT,MPI_SUM,world); return 2.0*allbonds/atom->natoms; } diff --git a/src/REPLICA/fix_hyper_global.h b/src/REPLICA/fix_hyper_global.h index d8b1cef425..42dd64e145 100644 --- a/src/REPLICA/fix_hyper_global.h +++ b/src/REPLICA/fix_hyper_global.h @@ -76,10 +76,12 @@ class FixHyperGlobal : public FixHyper { // coords and IDs of owned+ghost atoms when bonds were formed // persists on a proc from one event until the next + int nall_old; // nlocal+nghost for old atoms int maxold; // allocated size of old atoms double **xold; // coords of atoms when bonds were formed - tagint *tagold; // IDs of atoms when bonds were formed + tagint *tagold; // IDs of atoms when bonds were forme + int *old2now; // o2n[i] = current local index of old atom I // MPI data struct for finding bond with max strain via Allreduce diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index 60198f4ddf..99dd1945ad 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -1,4 +1,4 @@ -/* ---------------------------------------------------------------------- + /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov @@ -33,33 +33,30 @@ using namespace LAMMPS_NS; using namespace FixConst; -#define DELTABOOST 16 -#define BOOSTINIT 1.0 +#define DELTABOND 16384 +#define DELTABIAS 16 +#define COEFFINIT 1.0 #define COEFFMAX 1.2 +#define MAXBONDPERATOM 30 #define BIG 1.0e20 -enum{STRAIN,STRAINREGION,BIASFLAG}; +enum{STRAIN,STRAINDOMAIN,BIASFLAG,BIASCOEFF}; enum{IGNORE,WARN,ERROR}; /* ---------------------------------------------------------------------- */ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : FixHyper(lmp, narg, arg), old2now(NULL), xold(NULL), tagold(NULL), - bonds(NULL), numbond(NULL), maxstrain(NULL), maxstrain_region(NULL), - maxstrain_bondindex(NULL), biasflag(NULL), boost(NULL), - histo(NULL), allhisto(NULL) + blist(NULL), maxstrain(NULL), maxstrain_domain(NULL), + biasflag(NULL), bias(NULL) { + // NOTE: need to add vecs/arrays to constructor list + // error checks - // solution for tagint != int is to worry about storing - // local index vs global ID in same variable - // maybe need to declare them all tagint, not int if (atom->map_style == 0) error->all(FLERR,"Fix hyper/local command requires atom map"); - if (sizeof(tagint) != sizeof(int)) - error->all(FLERR,"Fix hyper/local requires tagint = int"); - // parse args if (narg < 10) error->all(FLERR,"Illegal fix hyper/local command"); @@ -79,10 +76,10 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : tequil = force->numeric(FLERR,arg[6]); dcut = force->numeric(FLERR,arg[7]); alpha_user = force->numeric(FLERR,arg[8]); - boosttarget = force->numeric(FLERR,arg[9]); + boost_target = force->numeric(FLERR,arg[9]); if (cutbond < 0.0 || qfactor < 0.0 || vmax < 0.0 || - tequil <= 0.0 || dcut <= 0.0 || alpha_user <= 0.0 || boosttarget < 1.0) + tequil <= 0.0 || dcut <= 0.0 || alpha_user <= 0.0 || boost_target < 1.0) error->all(FLERR,"Illegal fix hyper/local command"); invqfactorsq = 1.0 / (qfactor*qfactor); @@ -92,36 +89,11 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : // optional args - histoflag = 0; - lostbond = IGNORE; checkbias = 0; - checkcoeff = 0; int iarg = 10; while (iarg < narg) { - /* NOTE: do not enable this yet, need to think about it differently - if (strcmp(arg[iarg],"histo") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix hyper/local command"); - histoflag = 1; - histo_every = force->inumeric(FLERR,arg[iarg+1]); - histo_count = force->inumeric(FLERR,arg[iarg+2]); - histo_delta = force->numeric(FLERR,arg[iarg+3]); - histo_print = force->inumeric(FLERR,arg[iarg+4]); - if (histo_every <= 0 || histo_count % 2 || - histo_delta <= 0.0 || histo_print <= 0) - error->all(FLERR,"Illegal fix hyper/local command"); - iarg += 5; - */ - - if (strcmp(arg[iarg],"lostbond") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix hyper/local command"); - if (strcmp(arg[iarg+1],"error") == 0) lostbond = ERROR; - else if (strcmp(arg[iarg+1],"warn") == 0) lostbond = WARN; - else if (strcmp(arg[iarg+1],"ignore") == 0) lostbond = IGNORE; - else error->all(FLERR,"Illegal fix hyper/local command"); - iarg += 2; - - } else if (strcmp(arg[iarg],"check/bias") == 0) { + if (strcmp(arg[iarg],"check/bias") == 0) { if (iarg+3 > narg) error->all(FLERR,"Illegal fix hyper/local command"); checkbias = 1; checkbias_every = force->inumeric(FLERR,arg[iarg+1]); @@ -131,56 +103,51 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix hyper/local command"); iarg += 3; - } else if (strcmp(arg[iarg],"check/coeff") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix hyper/local command"); - checkcoeff = 1; - checkcoeff_every = force->inumeric(FLERR,arg[iarg+1]); - if (strcmp(arg[iarg+2],"error") == 0) checkcoeff_flag = ERROR; - else if (strcmp(arg[iarg+2],"warn") == 0) checkcoeff_flag = WARN; - else if (strcmp(arg[iarg+2],"ignore") == 0) checkcoeff_flag = IGNORE; - else error->all(FLERR,"Illegal fix hyper/local command"); - iarg += 3; - } else error->all(FLERR,"Illegal fix hyper/local command"); } // per-atom data structs maxbond = 0; - bonds = NULL; - numbond = NULL; + blist = NULL; + + maxatom = 0; maxstrain = NULL; - maxstrain_region = NULL; - maxstrain_bondindex = NULL; + maxstrain_domain = NULL; biasflag = NULL; - maxold = old_nall = 0; - old2now = NULL; - xold = NULL; // NOTE: don't really need except to monitor drift - tagold = NULL; + maxlocal = nlocal_old = 0; + numbond = NULL; + maxhalf = NULL; + eligible = NULL; + maxhalfstrain = NULL; - nboost = maxboost = 0; - boost = NULL; + maxall = nall_old = 0; + xold = NULL; + tagold = NULL; + old2now = NULL; + + nbias = maxbias = 0; + bias = NULL; + + maxcoeff = 0; + maxcoeffperatom = 0; + numcoeff = NULL; + clist = NULL; // maxbondperatom = max # of bonds any atom is part of // will be reset in bond_build() - // set comm size needed by this fix + // set comm sizes needed by this fix + // NOTE: remove MBPA when minimize reverse Cij comm maxbondperatom = 1; comm_forward = 1; - comm_reverse = 1; - - // perform initial allocation of atom-based arrays - // register with Atom class - - grow_arrays(atom->nmax); - atom->add_callback(0); + comm_reverse = MAXBONDPERATOM; me = comm->me; firstflag = 1; - allbonds = 0; - allboost = 0.0; + allbias = 0.0; starttime = update->ntimestep; nostrainyet = 1; @@ -188,36 +155,31 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : nevent = 0; nevent_atom = 0; mybias = 0.0; - - histo = allhisto = NULL; - if (histoflag) { - invhisto_delta = 1.0 / histo_delta; - histo_lo = 1.0 - (histo_count/2 * histo_delta); - histo = new bigint[histo_count+2]; - allhisto = new bigint[histo_count+2]; - } } /* ---------------------------------------------------------------------- */ FixHyperLocal::~FixHyperLocal() { - memory->destroy(bonds); - memory->destroy(numbond); - - atom->delete_callback(id,0); + memory->destroy(blist); memory->destroy(maxstrain); - memory->destroy(maxstrain_region); - memory->destroy(maxstrain_bondindex); + memory->destroy(maxstrain_domain); memory->destroy(biasflag); - memory->destroy(old2now); + memory->destroy(numbond); + memory->destroy(maxhalf); + memory->destroy(eligible); + memory->destroy(maxhalfstrain); + memory->destroy(xold); memory->destroy(tagold); - memory->destroy(boost); - delete [] histo; - delete [] allhisto; + memory->destroy(old2now); + + memory->destroy(bias); + + memory->destroy(numcoeff); + memory->destroy(clist); } /* ---------------------------------------------------------------------- */ @@ -237,24 +199,19 @@ int FixHyperLocal::setmask() void FixHyperLocal::init_hyper() { ghost_toofar = 0; - lostbond_partner = 0; - lostbond_coeff = 0.0; checkbias_count = 0; - checkcoeff_count = 0; maxdriftsq = 0.0; maxbondlen = 0.0; - maxboostcoeff = 0.0; - minboostcoeff = BIG; - sumboostcoeff = 0.0; - nboost_running = 0; + maxbiascoeff = 0.0; + minbiascoeff = BIG; + sumbiascoeff = 0.0; + nbias_running = 0; nobias_running = 0; rmaxever = 0.0; rmaxeverbig = 0.0; nbondbuild = 0; time_bondbuild = 0.0; - - if (histoflag) histo_steps = 0; } /* ---------------------------------------------------------------------- */ @@ -262,7 +219,7 @@ void FixHyperLocal::init_hyper() void FixHyperLocal::init() { // for newton off, bond force bias will not be applied correctly - // bonds that straddle 2 procs + // for bonds that straddle 2 procs // warn if molecular system, since near-neighbors may not appear in neigh list // user should not be including bonded atoms as hyper "bonds" @@ -271,7 +228,7 @@ void FixHyperLocal::init() if (atom->molecular && me == 0) error->warning(FLERR,"Hyper local for molecular systems " - "requires care in defining hyperdynamics bonds"); + "requires care in defining hyperdynamic bonds"); // cutghost = communication cutoff as calculated by Neighbor and Comm // error if cutghost is smaller than Dcut @@ -285,30 +242,41 @@ void FixHyperLocal::init() cutghost = comm->cutghostuser; if (cutghost < dcut) - error->all(FLERR,"Fix hyper/local bond cutoff exceeds ghost atom range - " + error->all(FLERR,"Fix hyper/local domain cutoff exceeds ghost atom range - " "use comm_modify cutoff command"); if (cutghost < dcut+cutbond/2.0 && me == 0) error->warning(FLERR,"Fix hyper/local ghost atom range " "may not allow for atom drift between events"); } - alpha = update->dt / alpha_user; - // need an occasional full neighbor list with cutoff = Dcut + // need occasional full neighbor list with cutoff = Dcut + // used for finding maxstrain of neighbor bonds out to Dcut // do not need to include neigh skin in cutoff, // b/c this list will be built every time bond_build() is called // NOTE: what if pair style list cutoff > Dcut // or what if neigh skin is huge? - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - neighbor->requests[irequest]->cut = 1; - neighbor->requests[irequest]->cutoff = dcut; - neighbor->requests[irequest]->occasional = 1; + int irequest_full = neighbor->request(this,instance_me); + neighbor->requests[irequest_full]->pair = 0; + neighbor->requests[irequest_full]->fix = 1; + neighbor->requests[irequest_full]->half = 0; + neighbor->requests[irequest_full]->full = 1; + neighbor->requests[irequest_full]->cut = 1; + neighbor->requests[irequest_full]->cutoff = dcut; + neighbor->requests[irequest_full]->occasional = 1; + + // also need occasional half neighbor list derived from pair style + // used for building local bond list + // no specified cutoff, should be longer than cutbond + // this list will also be built (or derived/copied) + // every time bond_build() is called + + int irequest_half = neighbor->request(this,instance_me); + neighbor->requests[irequest_half]->pair = 0; + neighbor->requests[irequest_half]->fix = 1; + neighbor->requests[irequest_half]->occasional = 1; // extra timing output @@ -318,16 +286,18 @@ void FixHyperLocal::init() /* ---------------------------------------------------------------------- */ -void FixHyperLocal::init_list(int /* id */, NeighList *ptr) +void FixHyperLocal::init_list(int id, NeighList *ptr) { - list = ptr; + if (id == 1) listfull = ptr; + else if (id == 2) listhalf = ptr; } /* ---------------------------------------------------------------------- */ void FixHyperLocal::setup_pre_neighbor() { - // called for dynamics and minimization NOTE: check if min is needed? + // called for dynamics and minimization + // NOTE: check if needed for min, I think so b/c of Cij persist? pre_neighbor(); } @@ -337,8 +307,8 @@ void FixHyperLocal::setup_pre_neighbor() void FixHyperLocal::setup_pre_reverse(int eflag, int vflag) { // only called for dynamics, not minimization - // setupflag prevents boostostat update of boost coeffs in setup - // also prevents increments of nboost_running, nbias_running, sumboostcoeff + // setupflag prevents boostostat update of bias coeffs in setup + // also prevents increments of nbias_running, nobias_running, sumbiascoeff setupflag = 1; pre_reverse(eflag,vflag); @@ -349,67 +319,67 @@ void FixHyperLocal::setup_pre_reverse(int eflag, int vflag) void FixHyperLocal::pre_neighbor() { - int i,m,n,ilocal,jlocal; + int i,m,iold,jold,ilocal,jlocal; + double distsq; - // convert global ID bond partners back to local indices - // need to use closest_image() so can calculate bond lengths - // error flag should not happen for a well-behaved system - // b/c are only looking up bond partners inside or near my sub-domain + // reset local indices for owned bond atoms, since atoms have migrated + // must be done after ghost atoms are setup via comm->borders() + // first time this is done for a particular I or J atom: + // use tagold and xold from when bonds were created + // atom->map() finds atom ID if it exists, owned index if possible + // closest current I or J atoms to old I may now be ghost atoms + // closest_image() returns the ghost atom index in that case + // also compute max drift of any atom in a bond + // drift = displacement from quenched coord while event has not yet occured + + for (i = 0; i < nall_old; i++) old2now[i] = -1; double **x = atom->x; - int nlocal = atom->nlocal; - int missing = 0; - double missing_coeff = 0.0; + for (m = 0; m < nblocal; m++) { + iold = blist[m].iold; + jold = blist[m].jold; + ilocal = old2now[iold]; + jlocal = old2now[jold]; - for (i = 0; i < nlocal; i++) { - n = numbond[i]; - for (m = 0; m < n; m++) { - jlocal = atom->map(bonds[i][m].jtag); - if (jlocal >= 0) bonds[i][m].j = domain->closest_image(i,jlocal); - else { - bonds[i][m].j = -1; - missing++; - missing_coeff += bonds[i][m].boostcoeff; - if (lostbond != IGNORE) { - char str[128]; - sprintf(str,"Fix hyper/local bond info missing for bond " - TAGINT_FORMAT "," TAGINT_FORMAT - " with coeff %g at step " BIGINT_FORMAT, - atom->tag[i],bonds[i][m].jtag,bonds[i][m].boostcoeff, - update->ntimestep); - if (lostbond == ERROR) error->one(FLERR,str); - if (lostbond == WARN) error->warning(FLERR,str); - } - } + if (ilocal < 0) { + ilocal = atom->map(tagold[iold]); + ilocal = domain->closest_image(xold[iold],ilocal); + if (ilocal < 0) + error->one(FLERR,"Fix hyper/local bond atom not found"); + old2now[iold] = ilocal; + distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + maxdriftsq = MAX(distsq,maxdriftsq); } + if (jlocal < 0) { + jlocal = atom->map(tagold[jold]); + jlocal = domain->closest_image(xold[iold],jlocal); // closest to iold + if (jlocal < 0) + error->one(FLERR,"Fix hyper/local bond atom not found"); + old2now[jold] = jlocal; + distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + + blist[m].i = ilocal; + blist[m].j = jlocal; } - lostbond_partner += missing; - lostbond_coeff += missing_coeff; - - // set old2now to point to current local atom indices + // set remaining old2now values to point to current local atom indices + // if old2now >= 0, already set by bond loop above // only necessary for tagold entries > 0 // because if tagold = 0, atom is not active in Dcut neighbor list // must be done after atoms migrate and ghost atoms setup via comm->borders() - // does not matter if there are multiple ghost copies of a global ID - // since only need the ghost atom strain, not its coordinates - // NOTE: maybe need not use closest image, b/c old2now only used to access - // maxstrain values, which will be same for any copy of ghost atom ?? - // also need it to compute maxdriftsq correctly when a proc spans a PBC + // does not matter which atom (owned or ghost) that atom->map() finds + // b/c old2now is only used to access maxstrain() or biasflag() + // which will be identical for every copy of the same atom ID - double distsq; - - for (i = 0; i < old_nall; i++) { + for (i = 0; i < nall_old; i++) { + if (old2now[i] >= 0) continue; if (tagold[i] == 0) continue; ilocal = atom->map(tagold[i]); - ilocal = domain->closest_image(xold[i],ilocal); old2now[i] = ilocal; - - if (ilocal >= 0) { - distsq = MathExtra::distsq3(x[ilocal],xold[i]); - maxdriftsq = MAX(distsq,maxdriftsq); - } else ghost_toofar++; + if (ilocal < 0) ghost_toofar++; } } @@ -417,93 +387,116 @@ void FixHyperLocal::pre_neighbor() void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) { - int i,j,m,ii,jj,inum,jnum,iold,jold,nbond,bondindex; - tagint itag,jtag; + int i,j,m,ii,jj,inum,jnum,iold,jold,ibond,nbond,ijhalf,ncount; double xtmp,ytmp,ztmp,delx,dely,delz; - double r,r0,estrain,emax,vbias,fbias,fbiasr,boostcoeff; + double r,r0,estrain,emax,ebias,vbias,fbias,fbiasr,biascoeff; + double halfstrain,selfstrain; int *ilist,*jlist,*numneigh,**firstneigh; //double time1,time2,time3,time4,time5,time6,time7,time8; //time1 = MPI_Wtime(); - // compute current maxstrain and maxstrain_bond for each owned atom - // use per-atom full bond list - // this is double-calculating for IJ and JI bonds - // could compute once, but would have to find/store index of JI bond - // order two I,J atoms consistently for IJ and JI calcs - // to insure no round-off issue when comparing maxstrain values of I,J + // reallocate local vectors if necessary + + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + + if (maxatom < nall) { + maxatom = atom->nmax; + memory->grow(maxstrain,maxatom,"hyper/local:maxstrain"); + memory->grow(maxstrain_domain,maxatom,"hyper/local:maxstrain_domain"); + if (checkbias) memory->grow(biasflag,maxatom,"hyper/local:biasflag"); + } + + // each old atom I's owned bond with max strain is eligible for biasing + + for (iold = 0; iold < nlocal_old; iold++) eligible[iold] = 1; + + // ------------------------------------------------------------- + // stage 1: + // maxstrain[i] = max abs value of strain of any bond atom I is part of + // reverse/forward comm so know it for all current owned and ghost atoms + // ------------------------------------------------------------- + + // compute estrain = current abs value strain of each owned bond + // blist = bondlist from last event + // mark atom I ineligible if it has no bonds + // also store: + // maxhalf = which owned bond is maxstrain for each old atom I + // maxhalfstrain = strain of that bond for each old atom I + + for (i = 0; i < nall; i++) maxstrain[i] = 0.0; double **x = atom->x; - tagint *tag = atom->tag; - int nlocal = atom->nlocal; - int mybonds = 0; - nostrainyet = 0; - - for (i = 0; i < nlocal; i++) { - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itag = tag[i]; - emax = 0.0; - bondindex = -1; - jtag = 0; - - nbond = numbond[i]; - mybonds += nbond; - for (m = 0; m < nbond; m++) { - j = bonds[i][m].j; - if (j < 0) continue; - jtag = bonds[i][m].jtag; - r0 = bonds[i][m].r0; - if (itag < jtag) { - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - } else { - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp;; - } + m = 0; + for (iold = 0; iold < nlocal_old; iold++) { + nbond = numbond[iold]; + if (!nbond) { + eligible[iold] = 0; + continue; + } + halfstrain = 0.0; + for (ibond = 0; ibond < nbond; ibond++) { + i = blist[m].i; + j = blist[m].j; + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; r = sqrt(delx*delx + dely*dely + delz*delz); maxbondlen = MAX(r,maxbondlen); + r0 = blist[m].r0; estrain = fabs(r-r0) / r0; - if (estrain > emax) { - emax = estrain; - bondindex = m; + maxstrain[i] = MAX(maxstrain[i],estrain); + maxstrain[j] = MAX(maxstrain[j],estrain); + if (estrain > halfstrain) { + halfstrain = estrain; + ijhalf = m; } + m++; } - maxstrain[i] = emax; - maxstrain_bondindex[i] = bondindex; + maxhalf[iold] = ijhalf; + maxhalfstrain[iold] = halfstrain; } //time2 = MPI_Wtime(); - // forward comm to acquire maxstrain of all ghost atoms + // reverse comm acquires maxstrain of all current owned atoms + // needed b/c only saw half the bonds of each atom + // also needed b/c bond list may refer to old owned atoms that are now ghost + // forward comm acquires maxstrain of all current ghost atoms commflag = STRAIN; + comm->reverse_comm_fix(this); comm->forward_comm_fix(this); //time3 = MPI_Wtime(); - // use original Dcut neighbor list to check maxstrain of all neighbor atoms - // set maxstrain_region of I atoms = maxstrain of I and all J neighs - // neighbor list has old indices for IJ b/c reneighboring may have occurred + // ------------------------------------------------------------- + // stage 2: + // maxstrain_domain[i] = maxstrain of atom I and all its J neighs out to Dcut + // reverse/forward comm so know it for all current owned and ghost atoms + // ------------------------------------------------------------- + + // use full Dcut neighbor list to check maxstrain of all neighbor atoms + // NOTE: is II loop the same as iold over nlocal_old ?? + // neighlist is from last event + // has old indices for I,J (reneighboring may have occurred) // use old2now[] to convert to current indices - // if neighbor is not currently known (too far away), - // then assume it was part of an event and its strain = qfactor - // this double loop sets maxstrain_region of mostly owned atoms - // but possibly some ghost atoms as well + // if J is unknown (drifted ghost), + // assume it was part of an event and its strain = qfactor + // mark atom I ineligible for biasing if: + // its maxhalfstrain < maxstrain (J atom owns the IJ bond) + // its maxstrain < maxstrain_domain + // ncount > 1 (break tie by making all atoms with tie value ineligible) + // if ncount > 1, also flip sign of maxstrain_domain for atom I - int nall = nlocal + atom->nghost; - for (i = 0; i < nall; i++) maxstrain_region[i] = 0.0; + for (i = 0; i < nall; i++) maxstrain_domain[i] = 0.0; - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // find largest distance from subbox that a ghost atom is with strain < qfactor + inum = listfull->inum; + ilist = listfull->ilist; + numneigh = listfull->numneigh; + firstneigh = listfull->firstneigh; double rmax = rmaxever; double rmaxbig = rmaxeverbig; @@ -515,23 +508,36 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) jlist = firstneigh[iold]; jnum = numneigh[iold]; - // I and J may be ghost atoms + // I or J may be ghost atoms // will always know I b/c atoms do not drift that far // but may no longer know J if hops outside cutghost // in that case, assume it performed an event, its strain = qfactor + // this assumes cutghost is sufficiently longer than Dcut i = old2now[iold]; - emax = maxstrain[i]; - + emax = selfstrain = maxstrain[i]; + ncount = 0; + for (jj = 0; jj < jnum; jj++) { jold = jlist[jj]; j = old2now[jold]; - if (j >= 0) emax = MAX(emax,maxstrain[j]); - else { + + // special case for missing (drifted) J atom + + if (j < 0) { emax = MAX(emax,qfactor); + if (selfstrain == qfactor) ncount++; continue; } + emax = MAX(emax,maxstrain[j]); + if (selfstrain == maxstrain[j]) ncount++; + + // diagnostic + // tally largest distance from subbox that a ghost atom is (rmaxbig) + // and the largest distance if strain < qfactor (rmax) + // NOTE: could this be removed from loop ?? + if (j >= nlocal) { if (x[j][0] < sublo[0]) rmaxbig = MAX(rmaxbig,sublo[0]-x[j][0]); if (x[j][1] < sublo[1]) rmaxbig = MAX(rmaxbig,sublo[1]-x[j][1]); @@ -550,9 +556,17 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) } } - maxstrain_region[i] = emax; + if (maxhalfstrain[iold] < selfstrain) eligible[iold] = 0; + if (selfstrain < emax) eligible[iold] = 0; + else if (ncount > 1) { + eligible[iold] = 0; + emax = -emax; + } + maxstrain_domain[i] = emax; } + // diagnostic // NOTE: optional, should skip + double rmax2[2],rmax2all[2]; rmax2[0] = rmax; rmax2[1] = rmaxbig; @@ -560,80 +574,76 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) rmaxever = rmax2all[0]; rmaxeverbig = rmax2all[1]; - MPI_Allreduce(&mybonds,&allbonds,1,MPI_INT,MPI_SUM,world); - //time4 = MPI_Wtime(); - // reverse comm to acquire maxstrain_region from ghost atoms - // needed b/c neighbor list referred to old owned atoms, - // so above loop may set maxstrain_region of ghost atoms - // forward comm to acquire maxstrain_region of all ghost atoms + // reverse comm to acquire maxstrain_domain from ghost atoms + // needed b/c neigh list may refer to old owned atoms that are now ghost + // forward comm acquires maxstrain_domain of all current ghost atoms - commflag = STRAINREGION; + commflag = STRAINDOMAIN; comm->reverse_comm_fix(this); comm->forward_comm_fix(this); //time5 = MPI_Wtime(); - // identify biased bonds and add to boost list - // for each max-strain bond IJ of atom I: - // bias this bond only if all these conditions hold: - // itag < jtag, so bond is only biased once - // maxstrain[i] = maxstrain_region[i] - // maxstrain[j] = maxstrain_region[j] - // NOTE: also need to check that maxstrain[i] = maxstrain[j] ?? - // don't think so, b/c maxstrain_region[i] includes maxstrain[i] + // ------------------------------------------------------------- + // stage 3: + // create bias = list of Nbias biased bonds this proc owns + // ------------------------------------------------------------- - nboost = 0; + // identify biased bonds and add to bias list + // bias the I,J maxhalf bond of atom I only if all these conditions hold: + // maxstrain[i] = maxstrain_domain[i] (checked in stage 2) + // maxstrain[j] = maxstrain_domain[j] (checked here) + // I is not part of an I,J bond with > strain owned by some J (checked in 2) + // no ties with other maxstrain bonds in atom I's domain (chedcked in 2) - for (i = 0; i < nlocal; i++) { - if (numbond[i] == 0) continue; - itag = tag[i]; - j = bonds[i][maxstrain_bondindex[i]].j; - jtag = tag[j]; - if (itag > jtag) continue; - - if (maxstrain[i] != maxstrain_region[i]) continue; - if (maxstrain[j] != maxstrain_region[j]) continue; - - if (nboost == maxboost) { - maxboost += DELTABOOST; - memory->grow(boost,maxboost,"hyper/local:boost"); + nbias = 0; + for (iold = 0; iold < nlocal_old; iold++) { + if (eligible[iold] == 0) continue; + j = blist[maxhalf[iold]].j; + if (maxstrain[j] != maxstrain_domain[j]) continue; + if (nbias == maxbias) { + maxbias += DELTABIAS; + memory->grow(bias,maxbias,"hyper/local:bias"); } - boost[nboost++] = i; + bias[nbias++] = ibond; } //time6 = MPI_Wtime(); - // apply boost force to bonds with locally max strain + // ------------------------------------------------------------- + // stage 4: + // apply bias force to bonds with locally max strain + // ------------------------------------------------------------- double **f = atom->f; int nobias = 0; mybias = 0.0; - for (int iboost = 0; iboost < nboost; iboost++) { - i = boost[iboost]; - emax = maxstrain[i]; - if (emax >= qfactor) { + for (int ibias = 0; ibias < nbias; ibias++) { + m = bias[ibias]; + i = blist[m].i; + j = blist[m].j; + + if (maxstrain[i] >= qfactor) { nobias++; continue; } - m = maxstrain_bondindex[i]; - j = bonds[i][m].j; - r0 = bonds[i][m].r0; - boostcoeff = bonds[i][m].boostcoeff; - - vbias = boostcoeff * vmax * (1.0 - emax*emax*invqfactorsq); - fbias = boostcoeff * 2.0 * vmax * emax / (qfactor*qfactor * r0); - delx = x[i][0] - x[j][0]; dely = x[i][1] - x[j][1]; delz = x[i][2] - x[j][2]; r = sqrt(delx*delx + dely*dely + delz*delz); - fbiasr = fbias / r; + r0 = blist[m].r0; + //ebias = (r-r0) / r0; + ebias = fabs(r-r0) / r0; + biascoeff = blist[m].biascoeff; + vbias = biascoeff * vmax * (1.0 - ebias*ebias*invqfactorsq); + fbias = biascoeff * 2.0 * vmax * ebias * invqfactorsq; + fbiasr = fbias / r0 / r; f[i][0] += delx*fbiasr; f[i][1] += dely*fbiasr; f[i][2] += delz*fbiasr; @@ -647,111 +657,72 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) //time7 = MPI_Wtime(); - // no boostostat update of boost coeffs when pre_reverse called from setup() - // nboost_running, nobias_running, sumboostcoeff only incremented on run steps + // ------------------------------------------------------------- + // apply boostostat to bias coeffs of all bonds I own + // ------------------------------------------------------------- + + // no boostostat update when pre_reverse called from setup() + // nbias_running, nobias_running, sumbiascoeff only incremented on run steps // NOTE: maybe should also not bias any bonds on firststep of this fix if (setupflag) return; - nboost_running += nboost; + nbias_running += nbias; nobias_running += nobias; - // apply boostostat to boost coefficients of all bonds of all owned atoms - // use per-atom full bond list - // this is double-calculating for IJ and JI bonds - // should be identical for both, b/c emax is the same - // could compute once, but would have to find/store index of JI bond - // delta in boost coeff is function of maxboost_region vs target boost - // maxboost_region is function of two maxstrain_regions for I,J - // NOTE: if J is lost to I but not vice versa, then biascoeff IJ != JI + // loop over bonds I own to adjust bias coeff + // delta in boost coeff is function of maxboost_domain vs target boost + // maxboost_domain is function of two maxstrain_domains for I,J - double myboost = 0.0; - double emaxi,emaxj,maxboost_region; + double mybias = 0.0; + double emaxi,emaxj,maxboost_domain; - for (i = 0; i < nlocal; i++) { - emaxi = maxstrain_region[i]; - nbond = numbond[i]; - for (m = 0; m < nbond; m++) { - j = bonds[i][m].j; - if (j < 0) continue; - emaxj = maxstrain_region[j]; - emax = MAX(emaxi,emaxj); - if (emax < qfactor) vbias = vmax * (1.0 - emax*emax*invqfactorsq); - else vbias = 0.0; - boostcoeff = bonds[i][m].boostcoeff; - maxboost_region = exp(beta * boostcoeff*vbias); - boostcoeff -= alpha * (maxboost_region-boosttarget) / boosttarget; - // COMMENT OUT for now - need better way to bound boostcoeff - //boostcoeff = MIN(boostcoeff,COEFFMAX); - myboost += boostcoeff; - maxboostcoeff = MAX(maxboostcoeff,boostcoeff); - minboostcoeff = MIN(minboostcoeff,boostcoeff); - bonds[i][m].boostcoeff = boostcoeff; - } + for (m = 0; m < nblocal; m++) { + i = blist[m].i; + j = blist[m].j; + emaxi = fabs(maxstrain_domain[i]); + emaxj = fabs(maxstrain_domain[j]); + emax = MAX(emaxi,emaxj); + if (emax < qfactor) vbias = vmax * (1.0 - emax*emax*invqfactorsq); + else vbias = 0.0; + + biascoeff = blist[m].biascoeff; + maxboost_domain = exp(beta * biascoeff*vbias); + biascoeff -= alpha * (maxboost_domain-boost_target) / boost_target; + blist[m].biascoeff = biascoeff; + + // stats + + mybias += biascoeff; + maxbiascoeff = MAX(maxbiascoeff,biascoeff); + minbiascoeff = MIN(minbiascoeff,biascoeff); } // running stats - MPI_Allreduce(&myboost,&allboost,1,MPI_DOUBLE,MPI_SUM,world); - if (allbonds) sumboostcoeff += allboost/allbonds; + MPI_Allreduce(&mybias,&allbias,1,MPI_DOUBLE,MPI_SUM,world); + if (allbonds) sumbiascoeff += allbias/allbonds; - // histogram the bond coeffs and output as requested - // do not double count each bond + // ------------------------------------------------------------- + // extra diagnostics if requested + // ------------------------------------------------------------- - if (histoflag && update->ntimestep % histo_every == 0) { - if (histo_steps == 0) - for (i = 0; i < histo_count+2; i++) histo[i] = 0; - histo_steps++; - - int ihisto; - for (i = 0; i < nlocal; i++) { - nbond = numbond[i]; - for (m = 0; m < nbond; m++) { - if (tag[i] > bonds[i][m].jtag) continue; - boostcoeff = bonds[i][m].boostcoeff; - if (boostcoeff < histo_lo) ihisto = -1; - else ihisto = static_cast ((boostcoeff-histo_lo) * invhisto_delta); - if (ihisto >= histo_count) ihisto = histo_count; - histo[ihisto+1]++; - } - } - - if (update->ntimestep % histo_print == 0) { - MPI_Allreduce(histo,allhisto,histo_count+2,MPI_LMP_BIGINT,MPI_SUM,world); - - bigint total = 0; - for (i = 0; i < histo_count+2; i++) total += allhisto[i]; - - if (me == 0) { - if (screen) { - fprintf(screen,"Histogram of bias coeffs:\n"); - for (i = 0; i < histo_count+2; i++) - fprintf(screen," %g",1.0*allhisto[i]/total); - fprintf(screen,"\n"); - } - if (logfile) { - fprintf(logfile,"Histogram of bias coeffs:\n"); - for (i = 0; i < histo_count+2; i++) - fprintf(logfile," %g",1.0*allhisto[i]/total); - fprintf(logfile,"\n"); - } - } - } - } - - // check for any biased bonds that are too close to each other + // if requsted, check for any biased bonds that are too close to each other // keep a running count for output + // requires 2 additional local comm operations if (checkbias && update->ntimestep % checkbias_every == 0) { // mark each atom in a biased bond with ID of partner - // nboost loop will mark some ghost atoms + // nbias loop will mark some ghost atoms for (i = 0; i < nall; i++) biasflag[i] = 0; - for (int iboost = 0; iboost < nboost; iboost++) { - i = boost[iboost]; - m = maxstrain_bondindex[i]; - j = bonds[i][m].j; + tagint *tag = atom->tag; + + for (int ibias = 0; ibias < nbias; ibias++) { + m = bias[ibias]; + i = blist[m].i; + j = blist[m].j; biasflag[i] = tag[j]; biasflag[j] = tag[i]; } @@ -766,7 +737,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) // I and J may be ghost atoms // only continue if I is a biased atom - // if J is unknonw (drifted ghost) just ignore + // if J is unknown (drifted ghost) just ignore // if J is biased and is not bonded to I, then flag as too close for (ii = 0; ii < inum; ii++) { @@ -785,32 +756,6 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) } } } - - // check for any bond bias coeffcients that do not match - // cannot check unless both atoms IJ are owned by this proc - // keep a running count for output - - if (checkcoeff && update->ntimestep % checkcoeff_every == 0) { - int jb,jbonds; - - for (i = 0; i < nlocal; i++) { - nbond = numbond[i]; - for (m = 0; m < nbond; m++) { - if (tag[i] > bonds[i][m].jtag) continue; - j = bonds[i][m].j; - if (j < 0) continue; - if (j >= nlocal) continue; - itag = tag[i]; - jbonds = numbond[j]; - for (jb = 0; jb < jbonds; jb++) - if (bonds[j][jb].jtag == itag) break; - if (jb == jbonds) - error->one(FLERR,"Fix hyper/local could not find duplicate bond"); - if (bonds[i][m].boostcoeff != bonds[j][jb].boostcoeff) - checkcoeff_count++; - } - } - } } /* ---------------------------------------------------------------------- */ @@ -837,159 +782,215 @@ void FixHyperLocal::build_bond_list(int natom) nevent_atom += natom; } - // trigger Dcut neighbor list build - // NOTE: turn off special bonds in this Dcut neigh list? + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; - neighbor->build_one(list); + // acquire old bond coeffs so can persist them in new blist + // while loop is to allow new value of maxcoeffperatom + // will loop at most 2 times, just once when maxcoeffperatom is large enough + // just reverse comm needed, + // b/c new bond list will be bonds of current owned atoms - // make copy of old bonds to preserve boostcoeffs for bonds that persist - // allocate new numbond + tagint *tag = atom->tag; - OneBond **old_bonds = bonds; - int *old_numbond = numbond; + if (maxcoeff < nall) { + maxcoeff = atom->nmax; + grow_coeff(); + } - int nmax = atom->nmax; - memory->create(numbond,nmax,"hyper/local:numbond"); + while (1) { + if (firstflag) break; + for (i = 0; i < nall; i++) numcoeff[i] = 0; - // old_nall = value of nall at time bonds are built - // reallocate new xold and tagold if necessary + for (m = 0; m < nblocal; m++) { + i = blist[m].i; + j = blist[m].j; + + if (numcoeff[i] < maxcoeffperatom) { + clist[i][numcoeff[i]].biascoeff = blist[m].biascoeff; + clist[i][numcoeff[i]].jtag = tag[j]; + } + numcoeff[i]++; + + if (numcoeff[j] < maxcoeffperatom) { + clist[j][numcoeff[j]].biascoeff = blist[m].biascoeff; + clist[j][numcoeff[i]].jtag = tag[i]; + } + numcoeff[j]++; + } + + int maxcol = 0; + for (i = 0; i < nall; i++) maxcol = MAX(maxcol,numcoeff[i]); + int maxcolall; + MPI_Allreduce(&maxcol,&maxcolall,1,MPI_INT,MPI_MAX,world); + + if (maxcolall > maxcoeffperatom) { + maxcoeffperatom = maxcolall; + grow_coeff(); + memory->destroy(clist); + memory->create(clist,maxcoeff,maxcoeffperatom,"hyper/local:clist"); + continue; + } + + commflag = BIASCOEFF; + comm->reverse_comm_fix(this); + + maxcol = 0; + for (i = 0; i < nall; i++) maxcol = MAX(maxcol,numcoeff[i]); + MPI_Allreduce(&maxcol,&maxcolall,1,MPI_INT,MPI_MAX,world); + if (maxcolall <= maxcoeffperatom) break; + + maxcoeffperatom = maxcolall; + grow_coeff(); + } + + // reallocate vectors that are maxnew xold and tagold if necessary // initialize xold to current coords // initialize tagold to zero, so atoms not in neighbor list will remain zero - old_nall = atom->nlocal + atom->nghost; - - if (old_nall > maxold) { + if (nlocal > maxlocal) { + memory->destroy(eligible); + memory->destroy(numbond); + memory->destroy(maxhalf); + maxlocal = nlocal; + memory->create(eligible,maxlocal,"hyper/local:eligible"); + memory->create(numbond,maxlocal,"hyper/local:numbond"); + memory->create(maxhalf,maxlocal,"hyper/local:maxhalf"); + } + + if (nall > maxall) { memory->destroy(xold); memory->destroy(tagold); memory->destroy(old2now); - maxold = atom->nmax; - memory->create(xold,maxold,3,"hyper/local:xold"); - memory->create(tagold,maxold,"hyper/local:tagold"); - memory->create(old2now,maxold,"hyper/local:old2now"); + maxall = atom->nmax; + memory->create(xold,maxall,3,"hyper/local:xold"); + memory->create(tagold,maxall,"hyper/local:tagold"); + memory->create(old2now,maxall,"hyper/local:old2now"); } + // nlocal_old = value of nlocal at time bonds are built + // nall_old = value of nall at time bonds are built + // archive current peratom info in old vecs + + nlocal_old = nlocal; + nall_old = nall; + double **x = atom->x; - memcpy(&xold[0][0],&x[0][0],3*old_nall*sizeof(double)); - for (i = 0; i < old_nall; i++) tagold[i] = 0; + memcpy(&xold[0][0],&x[0][0],3*nall*sizeof(double)); + for (i = 0; i < nall; i++) tagold[i] = 0; + for (i = 0; i < nlocal; i++) numbond[i] = 0; - // create and populate new bonds data struct - // while loop allows maxbondperatom to increase once if necessary - // don't know new maxbondperatom value until end of loop - // in practice maxbondperatom will hardly ever increase - // since there is a physical max value + // trigger builds for both neighbor lists + // NOTE: insure the I atoms are in same order? + + neighbor->build_one(listfull); + neighbor->build_one(listhalf); - tagint *tag = atom->tag; - int *mask = atom->mask; - int nlocal = atom->nlocal; + // set tagold = 1 for all J atoms used in full neighbor list + // tagold remains 0 for unused atoms, skipped in pre_neighbor - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; + inum = listfull->inum; + ilist = listfull->ilist; + numneigh = listfull->numneigh; + firstneigh = listfull->firstneigh; - while (1) { - bonds = (OneBond **) memory->create(bonds,nmax,maxbondperatom, - "hyper/local:bonds"); - if (bonds) memset(bonds[0],0,nmax*sizeof(OneBond)); - for (i = 0; i < nlocal; i++) numbond[i] = 0; - - // identify bonds assigned to each owned atom - // do not create a bond between two non-group atoms - // set tagold = global ID for all I,J atoms used in neighbor list - // tagold remains 0 for unused atoms, skipped in pre_neighbor - - int nbondmax = 0; - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itag = tag[i]; - tagold[i] = tag[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - nbond = 0; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtag = tag[j]; - tagold[j] = jtag; - - // skip if neither atom I or J are in fix group - // order IJ to insure IJ and JI bonds are stored consistently - - if (!(mask[i] & groupbit) && !(mask[j] & groupbit)) continue; - - if (itag < jtag) { - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - } else { - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - } - - rsq = delx*delx + dely*dely + delz*delz; - - // NOTE: could create two bonds for IJ both owned from one calc? - // have to skip one of 2 bonds in that case - - if (rsq < cutbondsq) { - if (nbond >= maxbondperatom) { - nbond++; - continue; - } - - bonds[i][nbond].r0 = sqrt(rsq); - bonds[i][nbond].jtag = tag[j]; - bonds[i][nbond].j = j; - - if (firstflag) oldcoeff = 0.0; - else { - oldcoeff = 0.0; - jtag = tag[j]; - n = old_numbond[i]; - for (m = 0; m < n; m++) { - if (old_bonds[i][m].jtag == jtag) { - oldcoeff = old_bonds[i][m].boostcoeff; - break; - } - } - } - - if (oldcoeff > 0.0) bonds[i][nbond].boostcoeff = oldcoeff; - else { - bonds[i][nbond].boostcoeff = BOOSTINIT; - nnewbond++; - } - nbond++; - } - } - numbond[i] = nbond; - nbondmax = MAX(nbondmax,nbond); + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + tagold[j] = 1; } - - // maxbondperatom must increase uniformly on all procs - // since bonds are comunicated when atoms migrate - - int allnbondmax; - MPI_Allreduce(&nbondmax,&allnbondmax,1,MPI_INT,MPI_MAX,world); - if (allnbondmax <= maxbondperatom) break; - - maxbondperatom = allnbondmax; - memory->destroy(bonds); } - // deallocate old_bonds and old_numbond + // identify bonds assigned to each owned atom + // do not create a bond between two non-group atoms - memory->destroy(old_bonds); - memory->destroy(old_numbond); + int *mask = atom->mask; + + inum = listhalf->inum; + ilist = listhalf->ilist; + numneigh = listhalf->numneigh; + firstneigh = listhalf->firstneigh; + + bigint bondcount = 0; + nblocal = 0; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + itag = tag[i]; + tagold[i] = tag[i]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + nbond = 0; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + jtag = tag[j]; + tagold[j] = jtag; + + // skip if neither atom I or J are in fix group + + if (!(mask[i] & groupbit) && !(mask[j] & groupbit)) 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 < cutbondsq) { + nbond++; + + if (nblocal == maxbond) grow_bond(); + blist[nblocal].i = i; + blist[nblocal].j = j; + blist[nblocal].iold = i; + blist[nblocal].jold = j; + blist[nblocal].r0 = sqrt(rsq); + + // set biascoeff to old coeff for same I,J pair or to default + + if (firstflag) oldcoeff = 0.0; + else { + oldcoeff = 0.0; + jtag = tag[j]; + n = numcoeff[i]; + for (m = 0; m < n; m++) { + if (clist[i][m].jtag == jtag) { + oldcoeff = clist[i][m].biascoeff; + break; + } + } + } + + if (oldcoeff > 0.0) blist[nblocal].biascoeff = oldcoeff; + else { + blist[nblocal].biascoeff = COEFFINIT; + nnewbond++; + } + + nblocal++; + } + } + + numbond[i] = nbond; + bondcount += nbond; + } + + MPI_Allreduce(&bondcount,&allbonds,1,MPI_LMP_BIGINT,MPI_SUM,world); time2 = MPI_Wtime(); + if (firstflag) nnewbond = 0; else { time_bondbuild += time2-time1; @@ -1016,13 +1017,13 @@ int FixHyperLocal::pack_forward_comm(int n, int *list, double *buf, buf[m++] = maxstrain[j]; } - // STRAINREGION - // pack maxstrain_region vector + // STRAINDOMAIN + // pack maxstrain_domain vector - } else if (commflag == STRAINREGION) { + } else if (commflag == STRAINDOMAIN) { for (i = 0; i < n; i++) { j = list[i]; - buf[m++] = maxstrain_region[j]; + buf[m++] = maxstrain_domain[j]; } // BIASFLAG @@ -1056,11 +1057,11 @@ void FixHyperLocal::unpack_forward_comm(int n, int first, double *buf) } // STRAINREGION - // unpack maxstrain_region vector + // unpack maxstrain_domain vector - } else if (commflag == STRAINREGION) { + } else if (commflag == STRAINDOMAIN) { for (i = first; i < last; i++) { - maxstrain_region[i] = buf[m++]; + maxstrain_domain[i] = buf[m++]; } // BIASFLAG @@ -1077,17 +1078,25 @@ void FixHyperLocal::unpack_forward_comm(int n, int first, double *buf) int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i,j,m,last; m = 0; last = first + n; - // STRAINREGION - // pack maxstrain_region vector + // STRAIN + // pack maxstrain vector - if (commflag == STRAINREGION) { + if (commflag == STRAIN) { for (i = first; i < last; i++) { - buf[m++] = maxstrain_region[i]; + buf[m++] = maxstrain[i]; + } + + // STRAINDOMAIN + // pack maxstrain_domain vector + + } else if (commflag == STRAINDOMAIN) { + for (i = first; i < last; i++) { + buf[m++] = maxstrain_domain[i]; } // BIASFLAG @@ -1097,6 +1106,20 @@ int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) for (i = first; i < last; i++) { buf[m++] = ubuf(biasflag[i]).d; } + + // BIASCOEFF + // pack list of biascoeffs + + } else if (commflag == BIASCOEFF) { + int ncoeff; + for (i = first; i < last; i++) { + ncoeff = numcoeff[i]; + buf[m++] = ubuf(ncoeff).d; + for (j = 0; j < ncoeff; j++) { + buf[m++] = clist[i][j].biascoeff; + buf[m++] = ubuf(clist[i][j].jtag).d; + } + } } return m; @@ -1106,17 +1129,29 @@ int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i,j,k,m; m = 0; - // STRAINREGION - // unpack maxstrain_region vector - - if (commflag == STRAINREGION) { + // STRAIN + // unpack maxstrain vector + // use MAX, b/c want maximum abs value strain for each atom's bonds + + if (commflag == STRAIN) { for (i = 0; i < n; i++) { j = list[i]; - maxstrain_region[j] += buf[m++]; + maxstrain[j] = MAX(maxstrain[j],buf[m]); + m++; + } + + // STRAINDOMAIN + // unpack maxstrain_domain vector + // use SUM, b/c exactly one ghost or owned value per atom ID is non-zero + + } else if (commflag == STRAINDOMAIN) { + for (i = 0; i < n; i++) { + j = list[i]; + maxstrain_domain[j] += buf[m++]; } // BIASFLAG @@ -1127,84 +1162,49 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) j = list[i]; biasflag[j] = (tagint) ubuf(buf[m++]).i; } + + // BIASCOEFF + // unpack list of biascoeffs and add to atom J's list + // protect against overflow of clist columns + // if that happens, caller will realloc clist and reverse comm again + + } else if (commflag == BIASFLAG) { + int ncoeff; + for (i = 0; i < n; i++) { + j = list[i]; + ncoeff = (int) ubuf(buf[m++]).i; + for (k = 0; k < ncoeff; k++) { + if (numcoeff[j] < maxcoeffperatom) { + clist[j][numcoeff[j]].biascoeff = buf[m++]; + clist[j][numcoeff[j]].jtag = (tagint) ubuf(buf[m++]).i; + } else m += 2; + numcoeff[j]++; + } + } } } /* ---------------------------------------------------------------------- - allocate atom-based arrays + grow bond list by a chunk ------------------------------------------------------------------------- */ -void FixHyperLocal::grow_arrays(int nmax) +void FixHyperLocal::grow_bond() { - // NOTE: not all of these need to be Nmax in length, could allocate elsewhere - - memory->grow(maxstrain,nmax,"hyper/local:maxstrain"); - memory->grow(maxstrain_bondindex,nmax,"hyper/local:maxstrain_bondindex"); - memory->grow(maxstrain_region,nmax,"hyper/local:maxstrain_region"); - if (checkbias) memory->grow(biasflag,nmax,"hyper/local:biasflag"); - - memory->grow(numbond,nmax,"hyper/local:numbond"); - memory->grow(bonds,nmax,maxbondperatom,"hyper/local:bonds"); - - // zero so valgrind does not complain about memcpy() in copy() - // also so loops in pre_neighbor() are OK before - // bonds are setup for the first time - - if (bonds) { - memset(bonds[maxbond],0,(nmax-maxbond)*maxbondperatom*sizeof(OneBond)); - memset(&numbond[maxbond],0,(nmax-maxbond)*sizeof(int)); - maxbond = nmax; - } + if (maxbond + DELTABOND > MAXSMALLINT) + error->one(FLERR,"Fix hyper/local bond count is too big"); + maxbond += DELTABOND; + blist = (OneBond *) + memory->srealloc(blist,maxbond*sizeof(OneBond),"hyper/local:blist"); } /* ---------------------------------------------------------------------- - copy values within local atom-based arrays + reallocate 2-dimensional clist ------------------------------------------------------------------------- */ -void FixHyperLocal::copy_arrays(int i, int j, int /* delflag */) +void FixHyperLocal::grow_coeff() { - // avoid valgrind copy-to-self warning - - if (i != j) memcpy(bonds[j],bonds[i],numbond[i]*sizeof(OneBond)); - numbond[j] = numbond[i]; -} - -/* ---------------------------------------------------------------------- - pack values in local atom-based array for exchange with another proc -------------------------------------------------------------------------- */ - -int FixHyperLocal::pack_exchange(int i, double *buf) -{ - int m = 1; - int n = numbond[i]; - buf[m++] = ubuf(n).d; - for (int j = 0; j < n; j++) { - buf[m++] = bonds[i][j].r0; - buf[m++] = bonds[i][j].boostcoeff; - buf[m++] = ubuf(bonds[i][j].jtag).d; - buf[m++] = ubuf(bonds[i][j].j).d; - } - - buf[0] = m; - return m; -} - -/* ---------------------------------------------------------------------- - unpack values in local atom-based array from exchange with another proc -------------------------------------------------------------------------- */ - -int FixHyperLocal::unpack_exchange(int nlocal, double *buf) -{ - int m = 1; - int n = numbond[nlocal] = (int) ubuf(buf[m++]).i; - for (int j = 0; j < n; j++) { - bonds[nlocal][j].r0 = buf[m++]; - bonds[nlocal][j].boostcoeff = buf[m++]; - bonds[nlocal][j].jtag = (tagint) ubuf(buf[m++]).i; - bonds[nlocal][j].j = (int) ubuf(buf[m++]).i; - } - - return m; + memory->destroy(clist); + memory->create(clist,maxcoeff,maxcoeffperatom,"hyper/local:clist"); } /* ---------------------------------------------------------------------- */ @@ -1222,7 +1222,7 @@ double FixHyperLocal::compute_vector(int i) { // 23 vector outputs returned for i = 0-22 - // i = 0 = # of boosted bonds on this step + // i = 0 = # of biased bonds on this step // i = 1 = max strain of any bond on this step // i = 2 = average bias potential for all bonds on this step // i = 3 = ave bonds/atom on this step @@ -1231,7 +1231,7 @@ double FixHyperLocal::compute_vector(int i) // i = 5 = fraction of steps and bonds with no bias during this run // i = 6 = max drift distance of any atom during this run // i = 7 = max bond length during this run - // i = 8 = average # of boosted bonds/step during this run + // i = 8 = average # of biased bonds/step during this run // i = 9 = average bias potential for all bonds during this run // i = 10 = max bias potential for any bond during this run // i = 11 = min bias potential for any bond during this run @@ -1241,9 +1241,14 @@ double FixHyperLocal::compute_vector(int i) // any maxstrain during this run // i = 14 = count of ghost atoms that could not be found // by any proc at any reneighbor step during this run + + // NOTE: these 2 are no longer relevant // i = 15 = count of lost bond partners during this run // i = 16 = average bias coeff for lost bond partners during this run + // i = 17 = count of bias overlaps found during this run + + // NOTE: this is no longer relevant // i = 18 = count of non-matching bias coefficients found during this run // i = 19 = cummulative hyper time @@ -1252,9 +1257,9 @@ double FixHyperLocal::compute_vector(int i) // i = 22 = cummulative # of new bonds formed since fix created if (i == 0) { - int nboostall; - MPI_Allreduce(&nboost,&nboostall,1,MPI_INT,MPI_SUM,world); - return (double) nboostall; + int nbiasall; + MPI_Allreduce(&nbias,&nbiasall,1,MPI_INT,MPI_SUM,world); + return (double) nbiasall; } if (i == 1) { @@ -1269,33 +1274,30 @@ double FixHyperLocal::compute_vector(int i) } if (i == 2) { - if (allboost && allbonds) return allboost/allbonds * vmax; + if (allbias && allbonds) return allbias/allbonds * vmax; return 1.0; } - if (i == 3) return 1.0*allbonds/atom->natoms; + if (i == 3) { + return 2.0*allbonds/atom->natoms; + } if (i == 4) { const int nlocal = atom->nlocal; - bigint nbonds = 0; - for (int j = 0; j < nlocal; j++) - nbonds += numbond[j]; - bigint allbonds; - MPI_Allreduce(&nbonds,&allbonds,1,MPI_LMP_BIGINT,MPI_SUM,world); bigint allneigh,thisneigh; - thisneigh = list->ipage->ndatum; + thisneigh = listfull->ipage->ndatum; MPI_Allreduce(&thisneigh,&allneigh,1,MPI_LMP_BIGINT,MPI_SUM,world); const double natoms = atom->natoms; const double neighsperatom = static_cast(allneigh)/natoms; - const double bondsperatom = 0.5*static_cast(allbonds)/natoms; + const double bondsperatom = static_cast(allbonds)/natoms; return neighsperatom * bondsperatom; } if (i == 5) { - int allboost_running,allnobias_running; - MPI_Allreduce(&nboost_running,&allboost_running,1,MPI_INT,MPI_SUM,world); + int allbias_running,allnobias_running; + MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); MPI_Allreduce(&nobias_running,&allnobias_running,1,MPI_INT,MPI_SUM,world); - if (allboost_running) return 1.0*allnobias_running / allboost_running; + if (allbias_running) return 1.0*allnobias_running / allbias_running; return 0.0; } @@ -1313,26 +1315,26 @@ double FixHyperLocal::compute_vector(int i) if (i == 8) { if (update->ntimestep == update->firststep) return 0.0; - int allboost_running; - MPI_Allreduce(&nboost_running,&allboost_running,1,MPI_INT,MPI_SUM,world); - return 1.0*allboost_running / (update->ntimestep - update->firststep); + int allbias_running; + MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); + return 1.0*allbias_running / (update->ntimestep - update->firststep); } if (i == 9) { if (update->ntimestep == update->firststep) return 0.0; - return sumboostcoeff * vmax / (update->ntimestep - update->firststep); + return sumbiascoeff * vmax / (update->ntimestep - update->firststep); } if (i == 10) { - double allboostcoeff; - MPI_Allreduce(&maxboostcoeff,&allboostcoeff,1,MPI_DOUBLE,MPI_MAX,world); - return allboostcoeff * vmax; + double allbiascoeff; + MPI_Allreduce(&maxbiascoeff,&allbiascoeff,1,MPI_DOUBLE,MPI_MAX,world); + return allbiascoeff * vmax; } if (i == 11) { - double allboostcoeff; - MPI_Allreduce(&minboostcoeff,&allboostcoeff,1,MPI_DOUBLE,MPI_MAX,world); - return allboostcoeff * vmax; + double allbiascoeff; + MPI_Allreduce(&minbiascoeff,&allbiascoeff,1,MPI_DOUBLE,MPI_MAX,world); + return allbiascoeff * vmax; } if (i == 12) return rmaxever; @@ -1344,35 +1346,14 @@ double FixHyperLocal::compute_vector(int i) return 1.0*allghost_toofar; } - if (i == 15) { - int alllost; - MPI_Allreduce(&lostbond_partner,&alllost,1,MPI_INT,MPI_SUM,world); - return 1.0*alllost; - } - - if (i == 16) { - int alllost; - MPI_Allreduce(&lostbond_partner,&alllost,1,MPI_INT,MPI_SUM,world); - double allcoeff; - MPI_Allreduce(&lostbond_coeff,&allcoeff,1,MPI_DOUBLE,MPI_SUM,world); - if (alllost == 0) return 0; - return allcoeff/alllost; - } - if (i == 17) { int allclose; MPI_Allreduce(&checkbias_count,&allclose,1,MPI_INT,MPI_SUM,world); return 1.0*allclose; } - if (i == 18) { - int allcoeff; - MPI_Allreduce(&checkcoeff_count,&allcoeff,1,MPI_INT,MPI_SUM,world); - return 1.0*allcoeff; - } - if (i == 19) { - return boosttarget * update->dt * (update->ntimestep - starttime); + return boost_target * update->dt * (update->ntimestep - starttime); } if (i == 20) return (double) nevent; @@ -1406,20 +1387,20 @@ double FixHyperLocal::query(int i) if (i == 8) return compute_vector(22); // number of new bonds if (i == 9) return 1.0*maxbondperatom; // max bonds/atom - if (i == 10) return compute_vector(8); // ave # of boosted bonds/step - if (i == 11) return compute_vector(9); // ave boost coeff over all bonds - if (i == 12) return compute_vector(10); // max boost cooef for any bond - if (i == 13) return compute_vector(11); // max boost cooef for any bond + if (i == 10) return compute_vector(8); // ave # of biased bonds/step + if (i == 11) return compute_vector(9); // ave bias coeff over all bonds + if (i == 12) return compute_vector(10); // max bias cooef for any bond + if (i == 13) return compute_vector(11); // max bias cooef for any bond if (i == 14) return compute_vector(4); // neighbor bonds/bond - if (i == 15) return compute_vector(2); // ave boost cooef now + if (i == 15) return compute_vector(2); // ave bias coeff now if (i == 16) return time_bondbuild; // CPU time for bond_build calls if (i == 17) return rmaxever; // ghost atom distance for < maxstrain if (i == 18) return rmaxeverbig; // ghost atom distance for any strain if (i == 19) return compute_vector(14); // count of ghost atoms not found - if (i == 20) return compute_vector(15); // count of lost bond partners - if (i == 21) return compute_vector(16); // ave bias coeff of long bonds + //if (i == 20) return compute_vector(15); // count of lost bond partners + //if (i == 21) return compute_vector(16); // ave bias coeff of long bonds if (i == 22) return compute_vector(17); // count of bias overlaps - if (i == 23) return compute_vector(18); // count of non-matching bias coeffs + //if (i == 23) return compute_vector(18); // count of non-matching bias coeffs error->all(FLERR,"Invalid query to fix hyper/local"); @@ -1433,11 +1414,15 @@ double FixHyperLocal::query(int i) double FixHyperLocal::memory_usage() { int nmax = atom->nmax; - double bytes = 2*nmax * sizeof(int); // numbond, maxstrain_bondindex - bytes = 2*nmax * sizeof(double); // maxstrain, maxstrain_region - bytes += maxbondperatom*nmax * sizeof(OneBond); // bonds - bytes += 3*maxold * sizeof(double); // xold - bytes += maxold * sizeof(tagint); // tagold - bytes += maxold * sizeof(int); // old2now + double bytes = maxbond * sizeof(OneBond); // bond list + bytes += 3*maxlocal * sizeof(int); // numbond,maxhalf,eligible + bytes += maxlocal * sizeof(double); // maxhalfstrain + bytes += maxall * sizeof(int); // old2now + bytes += maxall * sizeof(tagint); // tagold + bytes += 3*maxall * sizeof(double); // xold + bytes += 2*nmax * sizeof(double); // maxstrain,maxstrain_domain + if (checkbias) bytes += nmax * sizeof(tagint); // biasflag + bytes += maxcoeff*maxcoeffperatom * sizeof(OneCoeff); // clist + bytes += maxcoeff * sizeof(int); // numcoeff return bytes; } diff --git a/src/REPLICA/fix_hyper_local.h b/src/REPLICA/fix_hyper_local.h index 147e3ef1ef..67361ce3ac 100644 --- a/src/REPLICA/fix_hyper_local.h +++ b/src/REPLICA/fix_hyper_local.h @@ -45,11 +45,6 @@ class FixHyperLocal : public FixHyper { int pack_reverse_comm(int, int, double *); void unpack_reverse_comm(int, int *, double *); - void grow_arrays(int); - void copy_arrays(int, int, int); - int pack_exchange(int, double *); - int unpack_exchange(int, double *); - double memory_usage(); // extra methods visible to callers @@ -62,24 +57,20 @@ class FixHyperLocal : public FixHyper { double cutbond,qfactor,vmax,tequil,dcut; double alpha_user; // timescale to apply boostostat (time units) double alpha; // unitless dt/alpha_user - double boosttarget; // target value of boost - int histoflag; - int lostbond,lostbond_partner; - double lostbond_coeff; + double boost_target; // target value of boost int checkbias,checkbias_every,checkbias_flag,checkbias_count; - int checkcoeff,checkcoeff_every,checkcoeff_flag,checkcoeff_count; int setupflag; // 1 during setup, 0 during run int firstflag; // set for first time bond_build takes place int nostrainyet; // 1 until maxstrain is first computed - int nboost_running,nobias_running; + int nbias_running,nobias_running; int nbondbuild; double time_bondbuild; bigint starttime; - double sumboostcoeff; // sum of aveboost at every timestep - int allbonds; // sum of bond count on this step - double allboost; // sum of boostcoeff on all bonds on this step + double sumbiascoeff; // sum of aveboost at every timestep + bigint allbonds; // sum of bond count on this step + double allbias; // sum of biascoeff on all bonds on this step int nnewbond; // running tally of number of new bonds created int maxbondperatom; // max # of bonds any atom ever has @@ -91,65 +82,88 @@ class FixHyperLocal : public FixHyper { double mybias; double maxbondlen; // cummulative max length of any bond double maxdriftsq; // max distance any atom drifts from original pos - double maxboostcoeff; // cummulative max boost coeff for any bond - double minboostcoeff; // cummulative min boost coeff for any bond + double maxbiascoeff; // cummulative max bias coeff for any bond + double minbiascoeff; // cummulative min bias coeff for any bond double rmaxever,rmaxeverbig; int ghost_toofar; + class NeighList *listfull; // full neigh list up to Dcut distance + class NeighList *listhalf; // half neigh list up to pair distance + // both created only when bonds are rebuilt + + // list of my owned bonds + // persists on a proc from one event until the next + + struct OneBond { // single IJ bond, atom I is owner + int i,j; // current local indices of 2 bond atoms + int iold,jold; // local indices when bonds were formed + double r0; // relaxed bond length + double biascoeff; // biasing coefficient = prefactor Cij + }; + + struct OneBond *blist; // list of owned bonds + int nblocal; // # of owned bonds + int maxbond; // allocated size of blist + + // old data from last timestep bonds were formed + // persists on a proc from one event until the next + // first set of vectors are maxlocal in length + // second set of vectors are maxall in length + + int nlocal_old; // nlocal for old atoms + int nall_old; // nlocal+nghost for old atoms + int maxlocal; // allocated size of old local atom vecs + int maxall; // allocated size of old all atom vecs + + int *numbond; // # of bonds owned by old owned atoms + int *maxhalf; // bond index for maxstrain bond of old atoms + int *eligible; // 0/1 flag for bias on one of old atom's bonds + double *maxhalfstrain; // strain value for maxstrain bond of old atoms + + int *old2now; // o2n[i] = current local index of old atom I + // may be -1 if ghost atom has drifted + tagint *tagold; // IDs of atoms when bonds were formed + // 0 if a ghost atom is not in Dcut neigh list + double **xold; // coords of atoms when bonds were formed + + // vectors used to find maxstrain bonds within a local domain + + int maxatom; // size of these vectors, nlocal + nghost + + double *maxstrain; // max-strain of any bond atom I is part of + // for owned and ghost atoms + double *maxstrain_domain; // max-strain of any neighbor atom J of atom I + // for owned and ghost atoms + tagint *biasflag; // atoms in biased bonds marked with bond partner + // for owned and ghost atoms + + // data struct used to persist biascoeffs when bond list is re-created + + struct OneCoeff { + double biascoeff; + tagint jtag; + }; + + struct OneCoeff **clist; // list of bond coeffs for each atom's bonds + int *numcoeff; // # of coeffs per atom + int maxcoeff; // allocate size of clist + int maxcoeffperatom; // allocated # of columns in clist + + // list of biased bonds this proc owns + + int maxbias; // allocated size of bias list + int nbias; // # of biased bonds I own + int *bias; // index of biased bonds in my bond list + // extra timers //double timefirst,timesecond,timethird,timefourth; //double timefifth,timesixth,timeseventh,timetotal; - // data structs for per-atom and per-bond info - // all of these are for current owned and ghost atoms - // except list and old2now are for atom indices at time of last bond build + // private methods - class NeighList *list; // full neigh list up to Dcut distance - // created only when bonds are rebuilt - - int *old2now; // o2n[i] = current local index of old atom i - // stored for old owned and ghost atoms - // I = old index when bonds were last created - // old indices are stored in old neighbor list - - double **xold; // coords of owned+ghost atoms when bonds created - tagint *tagold; // global IDs of owned+ghost atoms when b created - - int maxold; // allocated size of old2now - int maxbond; // allocated size of bonds - int old_nall; // nlocal+nghost when old2now was last setup - - struct OneBond { // single IJ bond, atom I is owner - double r0; // original relaxed bond length - double boostcoeff; // boost coefficient - tagint jtag; // global index of J atom in bond IJ - int j; // local index of J atom in bond IJ - }; - - struct OneBond **bonds; // 2d array of bonds for owned atoms - int *numbond; // number of bonds for each owned atom - - double *maxstrain; // max-strain of any bond atom I is part of - // for owned and ghost atoms - double *maxstrain_region; // max-strain of any neighbor atom J of atom I - // for owned and ghost atoms - int *maxstrain_bondindex; // index of max-strain bond of each atom I - // just for owned atoms - tagint *biasflag; // atoms in biased bonds marked with bond partner - // for owned and ghost atoms - - // list of boosted bonds that this proc will bias - - int maxboost; // allocated size of boost list - int nboost; // # of boosted bonds I own - int *boost; // index of atom I in each boosted bond - - // histogramming of bond boost cooeficients - - int histo_every,histo_count,histo_print,histo_steps; - double histo_delta,invhisto_delta,histo_lo; - bigint *histo,*allhisto; + void grow_bond(); + void grow_coeff(); }; } From c555f7e2ed98ae2e33ce30d9ae9fbad36676418d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 17:52:53 -0500 Subject: [PATCH 034/243] update permissions --- examples/USER/smtbq/data.Alpha | 0 examples/USER/smtbq/ffield.smtbq.Al | 0 examples/USER/smtbq/ffield.smtbq.Al2O3 | 0 examples/USER/smtbq/ffield.smtbq.TiO2 | 0 examples/USER/smtbq/in.smtbq.Al | 0 examples/USER/smtbq/in.smtbq.Al2O3 | 0 examples/USER/smtbq/in.smtbq.TiO2 | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 examples/USER/smtbq/data.Alpha mode change 100755 => 100644 examples/USER/smtbq/ffield.smtbq.Al mode change 100755 => 100644 examples/USER/smtbq/ffield.smtbq.Al2O3 mode change 100755 => 100644 examples/USER/smtbq/ffield.smtbq.TiO2 mode change 100755 => 100644 examples/USER/smtbq/in.smtbq.Al mode change 100755 => 100644 examples/USER/smtbq/in.smtbq.Al2O3 mode change 100755 => 100644 examples/USER/smtbq/in.smtbq.TiO2 diff --git a/examples/USER/smtbq/data.Alpha b/examples/USER/smtbq/data.Alpha old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/ffield.smtbq.Al b/examples/USER/smtbq/ffield.smtbq.Al old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/ffield.smtbq.Al2O3 b/examples/USER/smtbq/ffield.smtbq.Al2O3 old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/ffield.smtbq.TiO2 b/examples/USER/smtbq/ffield.smtbq.TiO2 old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/in.smtbq.Al b/examples/USER/smtbq/in.smtbq.Al old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/in.smtbq.Al2O3 b/examples/USER/smtbq/in.smtbq.Al2O3 old mode 100755 new mode 100644 diff --git a/examples/USER/smtbq/in.smtbq.TiO2 b/examples/USER/smtbq/in.smtbq.TiO2 old mode 100755 new mode 100644 From fbc9cf83542a87449981e52773e2d7d4a1d5610b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 17:53:17 -0500 Subject: [PATCH 035/243] fix huge memory leak --- src/USER-SMTBQ/pair_smtbq.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index c2690dc864..0c259c950a 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -187,6 +187,16 @@ PairSMTBQ::~PairSMTBQ() memory->destroy(potqn); memory->destroy(dpotqn); + memory->destroy(fafbOxOxSurf); + memory->destroy(dfafbOxOxSurf); + memory->destroy(fafbTiOxSurf); + memory->destroy(dfafbTiOxSurf); + + memory->destroy(fafbOxOxBB); + memory->destroy(dfafbOxOxBB); + memory->destroy(fafbTiOxBB); + memory->destroy(dfafbTiOxBB); + memory->destroy(ecov); memory->destroy(sbcov); memory->destroy(coord); From 47b0c77dd9e8ba58555259152f36e50887345dc9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 17:53:50 -0500 Subject: [PATCH 036/243] replace variable length arrays with std::vector --- src/USER-SMTBQ/pair_smtbq.cpp | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index 0c259c950a..1931754427 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include "pair_smtbq.h" #include "atom.h" #include "comm.h" @@ -252,7 +253,7 @@ void PairSMTBQ::allocate() global settings ------------------------------------------------------------------------- */ -void PairSMTBQ::settings(int narg, char **/*arg*/) +void PairSMTBQ::settings(int narg, char ** /* arg */) { if (narg > 0) error->all(FLERR,"Illegal pair_style command"); } @@ -2539,10 +2540,10 @@ void PairSMTBQ::Charge() // --------------------------- - double enegtotall[nteam+1],enegchkall[nteam+1],enegmaxall[nteam+1],qtota[nteam+1],qtotc[nteam+1]; - double qtotcll[nteam+1],qtotall[nteam+1]; - double sigmaa[nteam+1],sigmac[nteam+1],sigmaall[nteam+1],sigmacll[nteam+1]; - int end[nteam+1], nQEq[nteam+1],nQEqc[nteam+1],nQEqa[nteam+1]; + std::vector enegtotall(nteam+1),enegchkall(nteam+1),enegmaxall(nteam+1); + std::vector qtotcll(nteam+1),qtotall(nteam+1),qtota(nteam+1),qtotc(nteam+1); + std::vector sigmaa(nteam+1),sigmac(nteam+1),sigmaall(nteam+1),sigmacll(nteam+1); + std::vector end(nteam+1), nQEq(nteam+1),nQEqc(nteam+1),nQEqa(nteam+1); iloop = 0; @@ -2553,9 +2554,7 @@ void PairSMTBQ::Charge() dtq = 0.0006; // 0.0006 dtq2 = 0.5*dtq*dtq/qmass; - double enegchk[nteam+1]; - double enegtot[nteam+1]; - double enegmax[nteam+1]; + std::vector enegchk(nteam+1),enegtot(nteam+1),enegmax(nteam+1); @@ -2580,12 +2579,12 @@ void PairSMTBQ::Charge() if (itype == 0) { qtota[gp] += q[i]; nQEqa[gp] += 1; } } - MPI_Allreduce(nQEq,nQEqall,nteam+1,MPI_INT,MPI_SUM,world); - MPI_Allreduce(nQEqc,nQEqcall,nteam+1,MPI_INT,MPI_SUM,world); - MPI_Allreduce(nQEqa,nQEqaall,nteam+1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(nQEq.data(),nQEqall,nteam+1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(nQEqc.data(),nQEqcall,nteam+1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(nQEqa.data(),nQEqaall,nteam+1,MPI_INT,MPI_SUM,world); - MPI_Allreduce(qtotc,qtotcll,nteam+1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(qtota,qtotall,nteam+1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(qtotc.data(),qtotcll.data(),nteam+1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(qtota.data(),qtotall.data(),nteam+1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&qtot,&qtotll,1,MPI_DOUBLE,MPI_SUM,world); @@ -2704,8 +2703,8 @@ void PairSMTBQ::Charge() } // Boucle local - MPI_Allreduce(enegchk,enegchkall,nteam+1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(enegmax,enegmaxall,nteam+1,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(enegchk.data(),enegchkall.data(),nteam+1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(enegmax.data(),enegmaxall.data(),nteam+1,MPI_DOUBLE,MPI_MAX,world); for (gp = 0; gp < nteam+1; gp++) { @@ -2793,8 +2792,8 @@ void PairSMTBQ::Charge() if (itype == 1) sigmac[gp] += (q[i]-TransfAll[gp+cluster])*(q[i]-TransfAll[gp+cluster]); } - MPI_Allreduce(sigmaa,sigmaall,nteam+1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(sigmac,sigmacll,nteam+1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sigmaa.data(),sigmaall.data(),nteam+1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sigmac.data(),sigmacll.data(),nteam+1,MPI_DOUBLE,MPI_SUM,world); for (gp = 1; gp < nteam+1; gp++) { sigmaall[gp] = sqrt(sigmaall[gp]/static_cast(nQEqaall[gp])) ; From 87a243203b52cd6755a0648b02030fd53948824d Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Thu, 28 Feb 2019 16:46:21 -0700 Subject: [PATCH 037/243] Removed pair_granular.cpp/h from src directory --- src/pair_granular.cpp | 2337 ----------------------------------------- src/pair_granular.h | 120 --- 2 files changed, 2457 deletions(-) delete mode 100644 src/pair_granular.cpp delete mode 100644 src/pair_granular.h diff --git a/src/pair_granular.cpp b/src/pair_granular.cpp deleted file mode 100644 index 82a470f83b..0000000000 --- a/src/pair_granular.cpp +++ /dev/null @@ -1,2337 +0,0 @@ -/* ---------------------------------------------------------------------- -http://lammps.sandia.gov, Sandia National Laboratories -Steve Plimpton, sjplimp@sandia.gov - -Copyright (2003) Sandia Corporation. Under the terms of Contract -DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains -certain rights in this software. This software is distributed under -the GNU General Public License. - -See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), - Jeremy Lechman (SNL), Dan Bolintineanu (SNL), Ishan Srivastava (SNL) ------------------------------------------------------------------------ */ - -#include -#include -#include -#include -#include "pair_granular.h" -#include "atom.h" -#include "atom_vec.h" -#include "domain.h" -#include "force.h" -#include "update.h" -#include "modify.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define PI27SQ 266.47931882941264802866 // 27*PI**2 -#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) -#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) -#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) -#define FOURTHIRDS 1.333333333333333 // 4/3 -#define TWOPI 6.28318530717959 // 2*PI - -#define EPSILON 1e-10 - -enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; -enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; -enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; -enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; - -/* ---------------------------------------------------------------------- */ - -PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 1; - no_virial_fdotr_compute = 1; - fix_history = NULL; - - single_extra = 9; - svector = new double[single_extra]; - - neighprev = 0; - - nmax = 0; - mass_rigid = NULL; - - onerad_dynamic = NULL; - onerad_frozen = NULL; - maxrad_dynamic = NULL; - maxrad_frozen = NULL; - - dt = update->dt; - - // set comm size needed by this Pair if used with fix rigid - - comm_forward = 1; - - use_history = 0; - beyond_contact = 0; - nondefault_history_transfer = 0; - tangential_history_index = 0; - roll_history_index = twist_history_index = 0; - -} - -/* ---------------------------------------------------------------------- */ -PairGranular::~PairGranular() -{ - delete [] svector; - if (fix_history) modify->delete_fix("NEIGH_HISTORY"); - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(cut); - - memory->destroy(normal_coeffs); - memory->destroy(tangential_coeffs); - memory->destroy(roll_coeffs); - memory->destroy(twist_coeffs); - - delete [] onerad_dynamic; - delete [] onerad_frozen; - delete [] maxrad_dynamic; - delete [] maxrad_frozen; - } - memory->destroy(mass_rigid); -} - -void PairGranular::compute(int eflag, int vflag){ -#ifdef TEMPLATED_PAIR_GRANULAR - if (normal == HOOKE){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<0,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<0,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<0,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<0,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<0,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<0,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == HERTZ){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<1,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<1,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<1,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<1,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<1,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<1,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == HERTZ_MATERIAL){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<2,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<2,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<2,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<2,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<2,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<2,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == DMT){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<3,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<3,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<3,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<3,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<3,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<3,2,1,3,2>(eflag, vflag); - } - } - } - } - else if (normal == JKR){ - if (damping == VELOCITY){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,0,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,0,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,0,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,0,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,0,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,0,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,0,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,0,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,0,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,0,1,3,2>(eflag, vflag); - } - } - } - else if (damping == VISCOELASTIC){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,1,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,1,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,1,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,1,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,1,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,1,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,1,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,1,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,1,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,1,1,3,2>(eflag, vflag); - } - } - } - else if (damping == TSUJI){ - if (tangential == TANGENTIAL_NOHISTORY){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,2,0,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,2,0,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,2,0,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,2,0,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,0,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,0,3,2>(eflag, vflag); - } - } - else if (tangential == TANGENTIAL_MINDLIN){ - if (twist == TWIST_NONE){ - if (roll == ROLL_NONE) compute_templated<4,2,1,0,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,0,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,0,2>(eflag, vflag); - } - else if (twist == TWIST_NOHISTORY){ - if (roll == ROLL_NONE) compute_templated<4,2,1,1,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,1,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,1,2>(eflag, vflag); - } - else if (twist == TWIST_SDS){ - if (roll == ROLL_NONE) compute_templated<4,2,1,2,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,2,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,2,2>(eflag, vflag); - } - else if (twist == TWIST_MARSHALL){ - if (roll == ROLL_NONE) compute_templated<4,2,1,3,0>(eflag, vflag); - else if (roll == ROLL_NOHISTORY) compute_templated<4,2,1,3,1>(eflag, vflag); - else if (roll == ROLL_SDS) compute_templated<4,2,1,3,2>(eflag, vflag); - } - } - } - } - -#else - compute_untemplated(Tp_normal, Tp_damping, Tp_tangential, - Tp_roll, Tp_twist, - eflag, vflag); -#endif -} - -#ifdef TEMPLATED_PAIR_GRANULAR -template < int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_twist, int Tp_roll > -void PairGranular::compute_templated(int eflag, int vflag) -#else -void PairGranular::compute_untemplated - (int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_twist, int Tp_roll, int eflag, int vflag) -#endif -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv; - double Reff, delta, dR, dR2; - - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - - double knfac, damp_normal; - double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; - - //For JKR - double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; - double t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; - - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - - //Rolling - double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - - //Twisting - double k_twist, damp_twist, mu_twist; - double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; - - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *history,*allhistory,**firsthistory; - - bool touchflag; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int historyupdate = 1; - if (update->setupflag) historyupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - int *type = atom->type; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *mask = atom->mask; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firsthistory = fix_history->firstvalue; - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - radi = radius[i]; - touch = firsttouch[i]; - allhistory = firsthistory[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++){ - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - jtype = type[j]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - - E = normal_coeffs[itype][jtype][0]; - Reff = radi*radj/(radi+radj); - touchflag = false; - - if (Tp_normal == JKR){ - if (touch[jj]){ - R2 = Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); - dist_pulloff = radsum-delta_pulloff; - touchflag = (rsq < dist_pulloff*dist_pulloff); - } - else{ - touchflag = (rsq < radsum*radsum); - } - } - else{ - touchflag = (rsq < radsum*radsum); - } - - if (!touchflag){ - // unset non-touching neighbors - touch[jj] = 0; - history = &allhistory[size_history*jj]; - for (int k = 0; k < size_history; k++) history[k] = 0.0; - } - else{ - r = sqrt(rsq); - rinv = 1.0/r; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - if (Tp_normal == JKR){ - touch[jj] = 1; - R2=Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - dR2 = dR*dR; - t0 = coh*coh*R2*R2*E; - t1 = PI27SQ*t0; - t2 = 8*dR*dR2*E*E*E; - t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); - t5 = t3/t4 + t4/E; - sqrt2 = MAX(0, 2*dR + t5); - t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); - a = INVROOT6*(t6 + sqrt(sqrt3)); - a2 = a*a; - knfac = FOURTHIRDS*E*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ - knfac = E; //Hooke - Fne = knfac*delta; - if (Tp_normal != HOOKE) - a = sqrt(dR); - Fne *= a; - if (Tp_normal == DMT) - Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; - } - - //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (Tp_damping == VELOCITY){ - damp_normal = 1; - } - else if (Tp_damping == VISCOELASTIC){ - if (Tp_normal == HOOKE) a = sqrt(dR); - damp_normal = a*meff; - } - else if (Tp_damping == TSUJI){ - damp_normal = sqrt(meff*knfac); - } - - Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; - - Fntot = Fne + Fdamp; - - //**************************************** - //Tangential force, including history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // If any history is needed: - if (use_history){ - touch[jj] = 1; - history = &allhistory[size_history*jj]; - } - - - if (Tp_normal == JKR){ - F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); - } - else{ - Fcrit = fabs(Fne); - } - - //------------------------------ - //Tangential forces - //------------------------------ - k_tangential = tangential_coeffs[itype][jtype][0]; - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - - if (Tp_tangential > 0){ - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); - - // Rotate and update displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (historyupdate) { - rsht = history[0]*nx + history[1]*ny + history[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - history[0] -= rsht*nx; - history[1] -= rsht*ny; - history[2] -= rsht*nz; - //Also rescale to preserve magnitude - history[0] *= scalefac; - history[1] *= scalefac; - history[2] *= scalefac; - } - //Update history - history[0] += vtr1*dt; - history[1] += vtr2*dt; - history[2] += vtr3*dt; - } - - // tangential forces = history + tangential velocity damping - fs1 = -k_tangential*history[0] - damp_tangential*vtr1; - fs2 = -k_tangential*history[1] - damp_tangential*vtr2; - fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - } - else{ //Classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; - else Ft = 0.0; - fs1 = -Ft*vtr1; - fs2 = -Ft*vtr2; - fs3 = -Ft*vtr3; - } - - //**************************************** - // Rolling resistance - //**************************************** - - if (Tp_roll != ROLL_NONE){ - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - if (Tp_roll > 1){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; - - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); - - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - - if (historyupdate){ - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - history[rhist0] -= rolldotn*nx; - history[rhist1] -= rolldotn*ny; - history[rhist2] -= rolldotn*nz; - //Also rescale to preserve magnitude - history[rhist0] *= scalefac; - history[rhist1] *= scalefac; - history[rhist2] *= scalefac; - } - history[rhist0] += vrl1*dt; - history[rhist1] += vrl2*dt; - history[rhist2] += vrl3*dt; - } - - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; - } - } - - //**************************************** - // Twisting torque, including history effects - //**************************************** - if (Tp_twist != TWIST_NONE){ - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (Tp_twist == TWIST_MARSHALL){ - k_twist = 0.5*k_tangential*a*a;; //eq 32 - damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; - } - else{ - k_twist = twist_coeffs[itype][jtype][0]; - damp_twist = twist_coeffs[itype][jtype][1]; - mu_twist = twist_coeffs[itype][jtype][2]; - } - if (Tp_twist > 1){ - if (historyupdate){ - history[twist_history_index] += magtwist*dt; - } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; - } - } - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - if (Tp_twist != TWIST_NONE){ - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - } - - if (Tp_roll != ROLL_NONE){ - torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = Reff*(nz*fr1 - nx*fr3); - torroll3 = Reff*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - } - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - if (Tp_twist != TWIST_NONE){ - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - } - if (Tp_roll != ROLL_NONE){ - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - - -/* ---------------------------------------------------------------------- -allocate all arrays -------------------------------------------------------------------------- */ - -void PairGranular::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); - memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); - memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); - memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); - - onerad_dynamic = new double[n+1]; - onerad_frozen = new double[n+1]; - maxrad_dynamic = new double[n+1]; - maxrad_frozen = new double[n+1]; -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairGranular::settings(int narg, char **arg) -{ - if (narg == 1){ - cutoff_global = force->numeric(FLERR,arg[0]); - } - else{ - cutoff_global = -1; //Will be set based on particle sizes, model choice - } - tangential_history = 0; - roll_history = twist_history = 0; - normal_set = tangential_set = damping_set = roll_set = twist_set = 0; -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairGranular::coeff(int narg, char **arg) -{ - double normal_coeffs_local[4]; - double tangential_coeffs_local[4]; - double roll_coeffs_local[4]; - double twist_coeffs_local[4]; - - if (narg < 2) - error->all(FLERR,"Incorrect args for pair coefficients"); - - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - int iarg = 2; - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ - if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); - if (!normal_set) normal = HOOKE; - else if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_set = 1; - iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ - int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = HERTZ; - else if (normal_set && normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_set = 1; - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ - int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = HERTZ_MATERIAL; - else if (normal != HERTZ) if (normal != HOOKE) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_set = 1; - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - if (!normal_set) normal = DMT; - else if (normal != DMT) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion - normal_set = 1; - iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); - beyond_contact = 1; - if (!normal_set) normal = JKR; - else if (normal != JKR) error->all(FLERR, "Illegal pair_coeff command, choice of normal contact model must be the same for all types"); - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion - normal_set = 1; - iarg += 5; - } - else if (strcmp(arg[iarg], "damp") == 0){ - if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1], "velocity") == 0){ - if (!damping_set) damping = VELOCITY; - else if (damping != VELOCITY) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); - } - else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ - if (!damping_set) damping = VISCOELASTIC; - else if (damping != VISCOELASTIC) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); - } - else if (strcmp(arg[iarg+1], "tsuji") == 0){ - if (!damping_set) damping = TSUJI; - if (damping != TSUJI) error->all(FLERR, "Illegal pair_coeff command, choice of damping contact model must be the same for all types"); - } - damping_set = 1; - iarg += 2; - } - else if (strcmp(arg[iarg], "tangential") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!tangential_set) tangential = TANGENTIAL_NOHISTORY; - else if (tangential != TANGENTIAL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types"); - } - else if (strcmp(arg[iarg+1], "mindlin") == 0){ - if (!tangential_set) tangential = TANGENTIAL_MINDLIN; - else if (tangential != TANGENTIAL_MINDLIN) error->all(FLERR, "Illegal pair_coeff command, choice of tangential contact model must be the same for all types");; - tangential_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); - } - tangential_set = 1; - tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - else if (strcmp(arg[iarg], "rolling") == 0){ - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ - if (!roll_set) roll = ROLL_NONE; - else if (roll != ROLL_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!roll_set) roll = ROLL_NOHISTORY; - else if (roll != ROLL_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); - } - else if (strcmp(arg[iarg+1], "sds") == 0){ - if (!roll_set) roll = ROLL_SDS; - else if (roll != ROLL_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of rolling friction model must be the same for all types"); - roll_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); - } - roll_set =1 ; - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. - iarg += 5; - } - } - else if (strcmp(arg[iarg], "twisting") == 0){ - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ - if (!twist_set) twist = TWIST_NONE; - else if (twist != TWIST_NONE) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); - iarg += 2; - } - else if (strcmp(arg[iarg+1], "marshall") == 0){ - if (!twist_set) twist = TWIST_MARSHALL; - else if (twist != TWIST_MARSHALL) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); - twist_history = 1; - twist_set = 1; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - else if (strcmp(arg[iarg+1], "nohistory") == 0){ - if (!twist_set) twist = TWIST_NOHISTORY; - if (twist != TWIST_NOHISTORY) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); - } - else if (strcmp(arg[iarg+1], "sds") == 0){ - if (!twist_set) twist = TWIST_SDS; - else if (twist != TWIST_SDS) error->all(FLERR, "Illegal pair_coeff command, choice of twisting friction model must be the same for all types"); - twist_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); - } - twist_set = 1; - twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else error->all(FLERR, "Illegal pair coeff command"); - } - - //It is an error not to specify normal or tangential model - if (!normal_set) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); - if (!tangential_set) error->all(FLERR, "Illegal pair coeff command, must specify tangential contact model"); - - //If unspecified, set damping to VISCOELASTIC, twist/roll to NONE (cannot be changed by subsequent pair_coeff commands) - if (!damping_set) damping = VISCOELASTIC; - if (!roll_set) roll = ROLL_NONE; - if (!twist_set) twist = TWIST_NONE; - damping_set = roll_set = twist_set = 1; - - int count = 0; - double damp; - if (damping == TSUJI){ - double cor; - cor = normal_coeffs_local[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_local[1]; - - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; - if (normal != HERTZ && normal != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; - - for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; - - if (roll != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; - - if (twist != TWIST_NONE && twist != TWIST_MARSHALL) - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; - - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairGranular::init_style() -{ - int i; - - // error and warning checks - - if (!atom->radius_flag || !atom->rmass_flag) - error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); - if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - - // Determine whether we need a granular neigh list, how large it needs to be - use_history = tangential_history || roll_history || twist_history; - - //For JKR, will need fix/neigh/history to keep track of touch arrays - if (normal == JKR) use_history = 1; - - size_history = 3*tangential_history + 3*roll_history + twist_history; - - //Determine location of tangential/roll/twist histories in array - if (roll_history){ - if (tangential_history) roll_history_index = 3; - else roll_history_index = 0; - } - if (twist_history){ - if (tangential_history){ - if (roll_history) twist_history_index = 6; - else twist_history_index = 3; - } - else{ - if (roll_history) twist_history_index = 3; - else twist_history_index = 0; - } - } - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->size = 1; - if (use_history) neighbor->requests[irequest]->history = 1; - - dt = update->dt; - - // if history is stored: - // if first init, create Fix needed for storing history - - if (use_history && fix_history == NULL) { - char dnumstr[16]; - sprintf(dnumstr,"%d",size_history); - char **fixarg = new char*[4]; - fixarg[0] = (char *) "NEIGH_HISTORY"; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "NEIGH_HISTORY"; - fixarg[3] = dnumstr; - modify->add_fix(4,fixarg,1); - delete [] fixarg; - fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; - fix_history->pair = this; - } - - // check for FixFreeze and set freeze_group_bit - - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; - - // check for FixRigid so can extract rigid body masses - - fix_rigid = NULL; - for (i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) break; - if (i < modify->nfix) fix_rigid = modify->fix[i]; - - // check for FixPour and FixDeposit so can extract particle radii - - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; - - // set maxrad_dynamic and maxrad_frozen for each type - // include future FixPour and FixDeposit particles as dynamic - - int itype; - for (i = 1; i <= atom->ntypes; i++) { - onerad_dynamic[i] = onerad_frozen[i] = 0.0; - if (ipour >= 0) { - itype = i; - double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); - if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); - onerad_dynamic[i] = radmax; - } - if (idep >= 0) { - itype = i; - double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); - if (normal == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); - onerad_dynamic[i] = radmax; - } - } - - double *radius = atom->radius; - int *mask = atom->mask; - int *type = atom->type; - int nlocal = atom->nlocal; - - for (i = 0; i < nlocal; i++){ - double radius_cut = radius[i]; - if (normal == JKR){ - radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); - } - if (mask[i] & freeze_group_bit){ - onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); - } - else{ - onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); - } - } - - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - - // set fix which stores history info - - if (size_history > 0){ - int ifix = modify->find_fix("NEIGH_HISTORY"); - if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; - } -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairGranular::init_one(int i, int j) -{ - double cutoff; - if (setflag[i][j] == 0) { - - if (normal != HOOKE && normal != HERTZ){ - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - } - else{ - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); - } - - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); - if ((normal == JKR) || (normal == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); - - for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - - - if (roll != ROLL_NONE){ - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); - } - - if (twist != TWIST_NONE && twist != TWIST_MARSHALL){ - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); - } - } - - // It is possible that cut[i][j] at this point is still 0.0. This can happen when - // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates - // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size - // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only - // if there is no current information about radius/cutoff of type i and j). - // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - - if (cutoff_global < 0){ - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } - } - else{ - cutoff = cutoff_global; - } - return cutoff; -} - - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ - -void PairGranular::write_restart(FILE *fp) -{ - int i,j; - fwrite(&normal,sizeof(int),1,fp); - fwrite(&damping,sizeof(int),1,fp); - fwrite(&tangential,sizeof(int),1,fp); - fwrite(&roll,sizeof(int),1,fp); - fwrite(&twist,sizeof(int),1,fp); - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); - fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); - fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); - fwrite(&twist_coeffs[i][j],sizeof(double),3,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ - -void PairGranular::read_restart(FILE *fp) -{ - allocate(); - int i,j; - int me = comm->me; - if (me == 0){ - fread(&normal,sizeof(int),1,fp); - fread(&damping,sizeof(int),1,fp); - fread(&tangential,sizeof(int),1,fp); - fread(&roll,sizeof(int),1,fp); - fread(&twist,sizeof(int),1,fp); - } - MPI_Bcast(&normal,1,MPI_INT,0,world); - MPI_Bcast(&damping,1,MPI_INT,0,world); - MPI_Bcast(&tangential,1,MPI_INT,0,world); - MPI_Bcast(&roll,1,MPI_INT,0,world); - MPI_Bcast(&twist,1,MPI_INT,0,world); - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&normal_coeffs[i][j],sizeof(double),4,fp); - fread(&tangential_coeffs[i][j],sizeof(double),3,fp); - fread(&roll_coeffs[i][j],sizeof(double),3,fp); - fread(&twist_coeffs[i][j],sizeof(double),3,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); - MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&twist_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } - } -} - - -/* ---------------------------------------------------------------------- */ - -void PairGranular::reset_dt() -{ - dt = update->dt; -} - -/* ---------------------------------------------------------------------- */ - -double PairGranular::single(int i, int j, int itype, int jtype, - double rsq, double factor_coul, double factor_lj, double &fforce) -{ - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; - double dR, dR2; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - - double knfac, damp_normal; - double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; - - //For JKR - double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; - double delta, t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; - - - //Rolling - double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - - //Twisting - double k_twist, damp_twist, mu_twist; - double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; - - double shrmag,rsht; - int jnum; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *history,*allhistory,**firsthistory; - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - Reff = radi*radj/(radi+radj); - - bool touchflag; - if (normal == JKR){ - R2 = Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); - dist_pulloff = radsum+delta_pulloff; - touchflag = (rsq <= dist_pulloff*dist_pulloff); - } - else{ - touchflag = (rsq <= radsum*radsum); - } - - if (touchflag){ - fforce = 0.0; - for (int m = 0; m < single_extra; m++) svector[m] = 0.0; - return 0.0; - } - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - r = sqrt(rsq); - rinv = 1.0/r; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - double *rmass = atom->rmass; - int *mask = atom->mask; - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - int *type = atom->type; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - if (normal == JKR){ - dR2 = dR*dR; - t0 = coh*coh*R2*R2*E; - t1 = PI27SQ*t0; - t2 = 8*dR*dR2*E*E*E; - t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); - t5 = t3/t4 + t4/E; - sqrt2 = MAX(0, 2*dR + t5); - t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); - a = INVROOT6*(t6 + sqrt(sqrt3)); - a2 = a*a; - knfac = FOURTHIRDS*E*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ - knfac = E; - Fne = knfac*delta; - if (normal != HOOKE) - a = sqrt(dR); - Fne *= a; - if (normal == DMT) - Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; - } - - //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping == VELOCITY){ - damp_normal = normal_coeffs[itype][jtype][1]; - } - else if (damping == VISCOELASTIC){ - if (normal == HOOKE) a = sqrt(dR); - damp_normal = normal_coeffs[itype][jtype][1]*a*meff; - } - else if (damping == TSUJI){ - damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); - } - - Fdamp = -damp_normal*vnnr; - - Fntot = Fne + Fdamp; - - jnum = list->numneigh[i]; - jlist = list->firstneigh[i]; - - if (use_history){ - allhistory = fix_history->firstvalue[i]; - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - history = &allhistory[size_history*neighprev]; - } - - //**************************************** - //Tangential force, including history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - Fcrit = fabs(Fne); - if (normal == JKR){ - F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); - } - - //------------------------------ - //Tangential forces - //------------------------------ - k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal != HOOKE){ - k_tangential *= a; - } - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - - if (tangential_history){ - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); - - // tangential forces = history + tangential velocity damping - fs1 = -k_tangential*history[0] - damp_tangential*vtr1; - fs2 = -k_tangential*history[1] - damp_tangential*vtr2; - fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - } - else{ //Classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; - else Ft = 0.0; - fs1 = -Ft*vtr1; - fs2 = -Ft*vtr2; - fs3 = -Ft*vtr3; - } - - //**************************************** - // Rolling resistance - //**************************************** - - if (roll != ROLL_NONE){ - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - if (roll_history){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; - - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); - - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; - } - } - - //**************************************** - // Twisting torque, including history effects - //**************************************** - if (twist != TWIST_NONE){ - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist == TWIST_MARSHALL){ - k_twist = 0.5*k_tangential*a*a;; //eq 32 - damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; - } - else{ - k_twist = twist_coeffs[itype][jtype][0]; - damp_twist = twist_coeffs[itype][jtype][1]; - mu_twist = twist_coeffs[itype][jtype][2]; - } - if (twist_history){ - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; - } - } - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = fr1; - svector[5] = fr2; - svector[6] = fr3; - svector[7] = fr; - svector[8] = magtortwist; - return 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int PairGranular::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - - m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = mass_rigid[j]; - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void PairGranular::unpack_forward_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) - mass_rigid[i] = buf[m++]; -} - -/* ---------------------------------------------------------------------- - memory usage of local atom-based arrays - ------------------------------------------------------------------------- */ - -double PairGranular::memory_usage() -{ - double bytes = nmax * sizeof(double); - return bytes; -} - -/* ---------------------------------------------------------------------- - mixing of Young's modulus (E) -------------------------------------------------------------------------- */ - -double PairGranular::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); -} - -/* ---------------------------------------------------------------------- - mixing of shear modulus (G) - ------------------------------------------------------------------------- */ - -double PairGranular::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); -} - -/* ---------------------------------------------------------------------- - mixing of everything else -------------------------------------------------------------------------- */ - -double PairGranular::mix_geom(double valii, double valjj) -{ - return sqrt(valii*valjj); -} - - -/* ---------------------------------------------------------------------- - Compute pull-off distance (beyond contact) for a given radius and atom type -------------------------------------------------------------------------- */ - -double PairGranular::pulloff_distance(double radius, int itype) -{ - double E, coh, a, delta_pulloff; - coh = normal_coeffs[itype][itype][3]; - E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], - normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); - a = cbrt(9*M_PI*coh*radius*radius/(4*E)); - return a*a/radius - 2*sqrt(M_PI*coh*a/E); -} - diff --git a/src/pair_granular.h b/src/pair_granular.h deleted file mode 100644 index f39f31e4cb..0000000000 --- a/src/pair_granular.h +++ /dev/null @@ -1,120 +0,0 @@ -/* ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(granular,PairGranular) - -#else - -#ifndef LMP_PAIR_GRANULAR_H -#define LMP_PAIR_GRANULAR_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairGranular : public Pair { -public: - PairGranular(class LAMMPS *); - virtual ~PairGranular(); - - void compute(int, int); - // comment next line to turn off templating -#define TEMPLATED_PAIR_GRANULAR -#ifdef TEMPLATED_PAIR_GRANULAR - template < int Tp_normal, int Tp_damping, int Tp_tangential, - int Tp_roll, int Tp_twist> - void compute_templated(int, int); -#else - void compute_untemplated(int, int, int, int, int, - int, int); -#endif - - virtual void settings(int, char **); - virtual void coeff(int, char **); - void init_style(); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void reset_dt(); - virtual double single(int, int, int, int, double, double, double, double &); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - double memory_usage(); - - protected: - double cut_global; - double dt; - int freeze_group_bit; - int use_history; - - int neighprev; - double *onerad_dynamic,*onerad_frozen; - double *maxrad_dynamic,*maxrad_frozen; - double **cut; - - class FixNeighHistory *fix_history; - - // storage of rigid body masses for use in granular interactions - - class Fix *fix_rigid; // ptr to rigid body fix, NULL if none - double *mass_rigid; // rigid mass for owned+ghost atoms - int nmax; // allocated size of mass_rigid - - virtual void allocate(); - -private: - int size_history; - - //Models - int normal, damping, tangential, roll, twist; - - //History flags - int tangential_history, roll_history, twist_history; - - //Indices of history entries - int tangential_history_index, roll_history_index, twist_history_index; - - //Flags for whether model choices have been set - int normal_set, tangential_set, damping_set, roll_set, twist_set; - - //Per-type coefficients, set in pair coeff command - double ***normal_coeffs; - double ***tangential_coeffs; - double ***roll_coeffs; - double ***twist_coeffs; - - //Optional user-specified global cutoff - double cutoff_global; - - double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); - double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); - double mix_geom(double valii, double valjj); - double pulloff_distance(double radius, int itype); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - - */ From 0f0a65bb4803332b86f3eb53dec6e303c60b386c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Feb 2019 17:49:34 -0500 Subject: [PATCH 038/243] plug small memory leak in USER-ADIOS --- src/USER-ADIOS/dump_custom_adios.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/USER-ADIOS/dump_custom_adios.cpp b/src/USER-ADIOS/dump_custom_adios.cpp index cd14195d45..67f3deeb64 100644 --- a/src/USER-ADIOS/dump_custom_adios.cpp +++ b/src/USER-ADIOS/dump_custom_adios.cpp @@ -154,6 +154,7 @@ DumpCustomADIOS::~DumpCustomADIOS() internal->fh.Close(); } delete internal->ad; + delete internal; } /* ---------------------------------------------------------------------- */ From 30ee2f3d78655b3145cf271202158b252630ab3a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 19:27:55 -0500 Subject: [PATCH 039/243] avoid windows portability issues with int32_t --- src/USER-PTM/compute_ptm_atom.h | 2 +- src/USER-PTM/ptm_neighbour_ordering.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/USER-PTM/compute_ptm_atom.h b/src/USER-PTM/compute_ptm_atom.h index 5c10e0c443..586d7a44cd 100644 --- a/src/USER-PTM/compute_ptm_atom.h +++ b/src/USER-PTM/compute_ptm_atom.h @@ -35,7 +35,7 @@ class ComputePTMAtom : public Compute { private: int nmax; - int32_t input_flags; + smallint input_flags; double rmsd_threshold; class NeighList *list; double **output; diff --git a/src/USER-PTM/ptm_neighbour_ordering.h b/src/USER-PTM/ptm_neighbour_ordering.h index 4a4fb8ce8b..2a619880bb 100644 --- a/src/USER-PTM/ptm_neighbour_ordering.h +++ b/src/USER-PTM/ptm_neighbour_ordering.h @@ -11,6 +11,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #define PTM_NEIGHBOUR_ORDERING_H #include +#include namespace ptm { From 5ecbb8bd0130881b97370e24f7a48ef2daf5b77d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 1 Mar 2019 09:46:13 -0500 Subject: [PATCH 040/243] fix int vs. bigint issue and add NULL file pointer check to dynamical_matrix --- src/USER-PHONON/dynamical_matrix.cpp | 5 +++-- src/USER-PHONON/dynamical_matrix.h | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index cef59b3a63..372f4e4e31 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -316,9 +316,10 @@ void DynamicalMatrix::calculateMatrix() void DynamicalMatrix::writeMatrix(double **dynmat) { - if (me != 0) - return; + if (me != 0 || fp == NULL) return; + // print file comment lines + if (!binaryflag && fp) { clearerr(fp); for (int i = 0; i < 3; i++) { diff --git a/src/USER-PHONON/dynamical_matrix.h b/src/USER-PHONON/dynamical_matrix.h index 187968c8f7..56de814e97 100644 --- a/src/USER-PHONON/dynamical_matrix.h +++ b/src/USER-PHONON/dynamical_matrix.h @@ -54,10 +54,10 @@ namespace LAMMPS_NS { double conv_mass; double del; int igroup,groupbit; - int gcount; // number of atoms in group + bigint gcount; // number of atoms in group + bigint dynlen; // rank of dynamical matrix int scaleflag; int me; - bigint dynlen; int *groupmap; int compressed; // 1 if dump file is written compressed, 0 no @@ -71,4 +71,4 @@ namespace LAMMPS_NS { #endif //LMP_DYNAMICAL_MATRIX_H -#endif \ No newline at end of file +#endif From f0ec2e3279ccb08e86e2b47950c660d3abf5cd99 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 1 Mar 2019 18:47:34 -0700 Subject: [PATCH 041/243] refactoring of global and local hyper, including amended doc pages --- doc/src/compute.txt | 7 +- doc/src/fix.txt | 6 +- doc/src/fix_ave_histo.txt | 19 +- doc/src/fix_hyper_global.txt | 45 +- doc/src/fix_hyper_local.txt | 225 ++++++---- examples/hyper/in.hyper.global | 6 +- examples/hyper/in.hyper.local | 6 + src/REPLICA/fix_hyper_global.cpp | 157 +++---- src/REPLICA/fix_hyper_global.h | 6 +- src/REPLICA/fix_hyper_local.cpp | 691 ++++++++++++++++++------------- src/REPLICA/fix_hyper_local.h | 89 ++-- src/REPLICA/hyper.cpp | 158 +++---- src/fix_ave_histo.cpp | 84 ++-- src/thermo.cpp | 3 +- 14 files changed, 868 insertions(+), 634 deletions(-) diff --git a/doc/src/compute.txt b/doc/src/compute.txt index 4886e73ab6..87dbee57d6 100644 --- a/doc/src/compute.txt +++ b/doc/src/compute.txt @@ -54,9 +54,10 @@ local quantities have the word "local" in their style, e.g. {bond/local}. Styles with neither "atom" or "local" in their style produce global quantities. -Note that a single compute produces either global or per-atom or local -quantities, but never more than one of these (with only a few -exceptions, as documented by individual compute commands). +Note that a single compute can produce either global or per-atom or +local quantities, but not both global and per-atom. It can produce +local quantities in tandem with global or per-atom quantities. The +compute doc page will explain. Global, per-atom, and local quantities each come in three kinds: a single scalar value, a vector of values, or a 2d array of values. The diff --git a/doc/src/fix.txt b/doc/src/fix.txt index 395f2ad7a9..9b48ee13bf 100644 --- a/doc/src/fix.txt +++ b/doc/src/fix.txt @@ -83,8 +83,10 @@ not in the specified fix group. Local quantities are calculated by each processor based on the atoms it owns, but there may be zero or more per atoms. -Note that a single fix may produces either global or per-atom or local -quantities (or none at all), but never more than one of these. +Note that a single fix can produce either global or per-atom or local +quantities (or none at all), but not both global and per-atom. It can +produce local quantities in tandem with global or per-atom quantities. +The fix doc page will explain. Global, per-atom, and local quantities each come in three kinds: a single scalar value, a vector of values, or a 2d array of values. The diff --git a/doc/src/fix_ave_histo.txt b/doc/src/fix_ave_histo.txt index 79f4d53481..6f99685682 100644 --- a/doc/src/fix_ave_histo.txt +++ b/doc/src/fix_ave_histo.txt @@ -35,6 +35,7 @@ keyword = {mode} or {file} or {ave} or {start} or {beyond} or {overwrite} or {ti {mode} arg = {scalar} or {vector} scalar = all input values are scalars vector = all input values are vectors + {kind} arg = {global} or {peratom} or {local} {file} arg = filename filename = name of file to output histogram(s) to {ave} args = {one} or {running} or {window} @@ -92,7 +93,8 @@ either all global, all per-atom, or all local quantities. Inputs of different kinds (e.g. global and per-atom) cannot be mixed. Atom attributes are per-atom vector values. See the doc page for individual "compute" and "fix" commands to see what kinds of -quantities they generate. +quantities they generate. See the optional {kind} keyword below for +how to force the fix ave/histo command to dis-ambiguate if necessary. Note that the output of this command is a single histogram for all input values combined together, not one histogram per input value. @@ -231,6 +233,14 @@ keyword is set to {vector}, then all input values must be global or per-atom or local vectors, or columns of global or per-atom or local arrays. +The {kind} keyword only needs to be set if a compute or fix produces +more than one kind of output (global, per-atom, local). If this is +not the case, then LAMMPS will determine what kind of input is +provided and whether all the input arguments are consistent. If a +compute or fix produces more than one kind of output, the {kind} +keyword should be used to specify which output will be used. The +remaining input arguments must still be consistent. + The {beyond} keyword determines how input values that fall outside the {lo} to {hi} bounds are treated. Values such that {lo} <= value <= {hi} are assigned to one bin. Values on a bin boundary are assigned @@ -240,7 +250,7 @@ If {beyond} is set to {end} then values < {lo} are counted in the first bin and values > {hi} are counted in the last bin. If {beyond} is set to {extend} then two extra bins are created, so that there are Nbins+2 total bins. Values < {lo} are counted in the first bin and -values > {hi} are counted in the last bin (Nbins+1). Values between +values > {hi} are counted in the last bin (Nbins+2). Values between {lo} and {hi} (inclusive) are counted in bins 2 through Nbins+1. The "coordinate" stored and printed for these two extra bins is {lo} and {hi}. @@ -354,5 +364,6 @@ ave/chunk"_fix_ave_chunk.html, "fix ave/time"_fix_ave_time.html, [Default:] none -The option defaults are mode = scalar, ave = one, start = 0, no file -output, beyond = ignore, and title 1,2,3 = strings as described above. +The option defaults are mode = scalar, kind = figured out from input +arguments, ave = one, start = 0, no file output, beyond = ignore, and +title 1,2,3 = strings as described above. diff --git a/doc/src/fix_hyper_global.txt b/doc/src/fix_hyper_global.txt index a7a938b144..81404ac6a2 100644 --- a/doc/src/fix_hyper_global.txt +++ b/doc/src/fix_hyper_global.txt @@ -102,7 +102,7 @@ Bi = exp(beta * Vij(max)) :pre where beta = 1/kTequil, and {Tequil} is the temperature of the system and an argument to this fix. Note that Bi >= 1 at every step. -NOTE: To run GHD, the input script must also use the "fix +NOTE: To run a GHD simulation, the input script must also use the "fix langevin"_fix_langevin.html command to thermostat the atoms at the same {Tequil} as specified by this fix, so that the system is running constant-temperature (NVT) dynamics. LAMMPS does not check that this @@ -166,9 +166,9 @@ correctly. There will just be fewer events because the hyper time NOTE: If you have no physical intuition as to the smallest barrier height in your system, a reasonable strategy to determine the largest -{Vmax} you can use for an LHD model, is to run a sequence of +{Vmax} you can use for a GHD model, is to run a sequence of simulations with smaller and smaller {Vmax} values, until the event -rate does not change. +rate does not change (as a function of hyper time). The {Tequil} argument is the temperature at which the system is simulated; see the comment above about the "fix @@ -177,7 +177,8 @@ beta term in the exponential factor that determines how much boost is achieved as a function of the bias potential. In general, the lower the value of {Tequil} and the higher the value -of {Vmax}, the more boost will be achievable by the GHD algorithm. +of {Vmax}, the more time boost will be achievable by the GHD +algorithm. :line @@ -190,41 +191,43 @@ The "fix_modify"_fix_modify.html {energy} option is supported by this fix to add the energy of the bias potential to the the system's potential energy as part of "thermodynamic output"_thermo_style.html. -This fix computes a global scalar and global vector of length 11, which +This fix computes a global scalar and global vector of length 12, which can be accessed by various "output commands"_Howto_output.html. The scalar is the magnitude of the bias potential (energy units) applied on the current timestep. The vector stores the following quantities: 1 = boost factor on this step (unitless) -2 = max strain Eij of any bond on this step (unitless) +2 = max strain Eij of any bond on this step (absolute value, unitless) 3 = ID of first atom in the max-strain bond 4 = ID of second atom in the max-strain bond 5 = average # of bonds/atom on this step :ul -6 = fraction of timesteps with bias = 0.0 during this run -7 = max drift distance of any atom during this run (distance units) -8 = max bond length during this run (distance units) :ul +6 = fraction of timesteps where the biased bond has bias = 0.0 during this run +7 = fraction of timesteps where the biased bond has negative strain during this run +8 = max drift distance of any atom during this run (distance units) +9 = max bond length during this run (distance units) :ul -9 = cumulative hyper time since fix was defined (time units) -10 = cumulative count of event timesteps since fix was defined -11 = cumulative count of atoms in events since fix was defined :ul +10 = cumulative hyper time since fix was defined (time units) +11 = cumulative count of event timesteps since fix was defined +12 = cumulative count of atoms in events since fix was defined :ul -The first 5 quantities are for the current timestep. Quantities 6-8 -are for the current hyper run. Quantities 9-11 are cumulative across -multiple runs (since the fix was defined in the input script). +The first 5 quantities are for the current timestep. Quantities 6-9 +are for the current hyper run. They are reset each time a new hyper +run is performed. Quantities 19-12 are cumulative across multiple +runs (since the point in the input script the fix was defined). -For value 7, drift is the distance an atom moves between timesteps -when the bond list is reset, i.e. between events. Atoms involved in -an event will typically move the greatest distance since others are -typically oscillating around their lattice site. +For value 8, drift is the distance an atom moves between two quenched +states when the second quench determines an event has occurred. Atoms +involved in an event will typically move the greatest distance since +others typically remain near their original quenched position. -For value 10, events are checked for by the "hyper"_hyper.html command +For value 11, events are checked for by the "hyper"_hyper.html command once every {Nevent} timesteps. This value is the count of those timesteps on which one (or more) events was detected. It is NOT the number of distinct events, since more than one event may occur in the same {Nevent} time window. -For value 11, each time the "hyper"_hyper.html command checks for an +For value 12, each time the "hyper"_hyper.html command checks for an event, it invokes a compute to flag zero or more atoms as participating in one or more events. E.g. atoms that have displaced more than some distance from the previous quench state. Value 11 is diff --git a/doc/src/fix_hyper_local.txt b/doc/src/fix_hyper_local.txt index c34b9ba7da..7f12e37999 100644 --- a/doc/src/fix_hyper_local.txt +++ b/doc/src/fix_hyper_local.txt @@ -22,10 +22,9 @@ Dcut = minimum distance between boosted bonds (distance units) :l alpha = boostostat relaxation time (time units) :l Btarget = desired time boost factor (unitless) :l zero or more keyword/value pairs may be appended :l -keyword = {lost} or {check/bias} or {check/coeff} - {lostbond} value = error/warn/ignore - {check/bias} values = Nevery error/warn/ignore - {check/coeff} values = Nevery error/warn/ignore :pre +keyword = {check/ghost} or {check/bias} :l + {check/ghost} values = none + {check/bias} values = Nevery error/warn/ignore :pre :ule [Examples:] @@ -65,8 +64,8 @@ To understand this description, you should first read the description of the GHD algorithm on the "fix hyper/global"_fix_hyper_global.html doc page. This description of LHD builds on the GHD description. -The definition of bonds, Eij, and Emax are the same for GHD and LHD. -The formulas for Vij(max) and Fij(max) are also the same except for a +The definition of bonds and Eij are the same for GHD and LHD. The +formulas for Vij(max) and Fij(max) are also the same except for a pre-factor Cij, explained below. The bias energy Vij applied to a bond IJ with maximum strain is @@ -117,11 +116,11 @@ where Vkl(max) is the bias energy of the maxstrain bond KL within bond IJ's neighborhood, beta = 1/kTequil, and {Tequil} is the temperature of the system and an argument to this fix. -NOTE: To run LHD, the input script must also use the "fix -langevin"_fix_langevin.html command to thermostat the atoms at the -same {Tequil} as specified by this fix, so that the system is running -constant-temperature (NVT) dynamics. LAMMPS does not check that this -is done. +NOTE: To run an LHD simulation, the input script must also use the +"fix langevin"_fix_langevin.html command to thermostat the atoms at +the same {Tequil} as specified by this fix, so that the system is +running constant-temperature (NVT) dynamics. LAMMPS does not check +that this is done. Note that if IJ = KL, then bond IJ is a biased bond on that timestep, otherwise it is not. But regardless, the boost factor Bij can be @@ -216,20 +215,20 @@ each pair. E.g. something like 2x the cutoff of the interatomic potential. In practice a {Dcut} value of ~10 Angstroms seems to work well for many solid-state systems. -NOTE: You must also insure that ghost atom communication is performed -for a distance of at least {Dcut} + {cutevent} where {cutevent} = the -distance one or more atoms move (between quenched states) to be -considered an "event". It is an argument to the "compute -event/displace" command used to detect events. By default the ghost -communication distance is set by the pair_style cutoff, which will -typically be < {Dcut}. The "comm_modify cutoff"_comm_modify.html -command can be used to set the ghost cutoff explicitly, e.g. +NOTE: You should insure that ghost atom communication is performed for +a distance of at least {Dcut} + {cutevent} = the distance one or more +atoms move (between quenched states) to be considered an "event". It +is an argument to the "compute event/displace" command used to detect +events. By default the ghost communication distance is set by the +pair_style cutoff, which will typically be < {Dcut}. The "comm_modify +cutoff"_comm_modify.html command should be used to override the ghost +cutoff explicitly, e.g. comm_modify cutoff 12.0 :pre -This fix does not know the {cutevent} parameter, but uses half the -bond length as an estimate to warn if the ghost cutoff is not long -enough. +Note that this fix does not know the {cutevent} parameter, but uses +half the {cutbond} parameter as an estimate to warn if the ghost +cutoff is not long enough. As described above the {alpha} argument is a pre-factor in the boostostat update equation for each bond's Cij prefactor. {Alpha} is @@ -269,7 +268,30 @@ NOTE: If you have no physical intuition as to the smallest barrier height in your system, a reasonable strategy to determine the largest {Btarget} you can use for an LHD model, is to run a sequence of simulations with smaller and smaller {Btarget} values, until the event -rate does not change. +rate does not change (as a function of hyper time). + +:line + +Here is additional information on the optional keywords for this fix. + +The {check/ghost} keyword turns on extra computation each timestep to +compute statistics about ghost atoms used to determine which bonds to +bias. The output of these stats are the vector values 14 and 15, +described below. If this keyword is not enabled, the output +of the stats will be zero. + +The {check/bias} keyword turns on extra computation and communcation +to check if any biased bonds are closer than {Dcut} to each other, +which should not be the case if LHD is operating correctly. Thus it +is a debugging check. The {Nevery} setting determines how often the +check is made. The {error}, {warn}, or {ignore} setting determines +what is done if the count of too-close bonds is not zero. Either the +code will exit, or issue a warning, or silently tally the count. The +count can be output as vector value 17, as described below. If this +keyword is not enabled, the output of that statistic will be 0. + +Note that both of these computations are costly, hence they are only +enabled by these keywords. :line @@ -282,95 +304,120 @@ The "fix_modify"_fix_modify.html {energy} option is supported by this fix to add the energy of the bias potential to the the system's potential energy as part of "thermodynamic output"_thermo_style.html. -This fix computes a global scalar and global vector of length 23, -which can be accessed by various "output -commands"_Howto_output.html. The scalar is the magnitude of -the bias potential (energy units) applied on the current timestep, -summed over all biased bonds. The vector stores the following -quantities: +This fix computes a global scalar and global vector of length 21, +which can be accessed by various "output commands"_Howto_output.html. +The scalar is the magnitude of the bias potential (energy units) +applied on the current timestep, summed over all biased bonds. The +vector stores the following quantities: 1 = # of biased bonds on this step -2 = max strain Eij of any bond on this step (unitless) -3 = average bias potential for all biased bonds on this step (energy units) +2 = max strain Eij of any bond on this step (absolute value, unitless) +3 = average bias coeff for all bonds on this step (unitless) 4 = average # of bonds/atom on this step 5 = average neighbor bonds/bond on this step within {Dcut} :ul -6 = fraction of steps and bonds with no bias during this run -7 = max drift distance of any atom during this run (distance units) -8 = max bond length during this run (distance units) -9 = average # of biased bonds/step during this run -10 = average bias potential for all biased bonds during this run (energy units) -11 = max bias potential for any biased bond during this run (energy units) -12 = min bias potential for any biased bond during this run (energy units) -13 = max distance from my sub-box of any ghost atom with maxstrain < qfactor during this run (distance units) -14 = max distance outside my box of any ghost atom with any maxstrain during this run (distance units) -15 = count of ghost neighbor atoms not found on reneighbor steps during this run -16 = count of lost bond partners during this run -17 = average bias coeff for lost bond partners during this run -18 = count of bias overlaps found during this run -19 = count of non-matching bias coefficients found during this run :ul +6 = max bond length during this run (distance units) +7 = average # of biased bonds/step during this run +8 = fraction of biased bonds with no bias during this run +9 = fraction of biased bonds with negative strain during this run +10 = average bias coeff for all bonds during this run (unitless) +11 = min bias coeff for any bond during this run (unitless) +12 = max bias coeff for any bond during this run (unitless) -20 = cumulative hyper time since fix created (time units) -21 = cumulative count of event timesteps since fix created -22 = cumulative count of atoms in events since fix created -23 = cumulative # of new bonds since fix created :ul +13 = max drift distance of any bond atom during this run (distance units) +14 = max distance from proc subbox of any ghost atom with maxstrain < qfactor during this run (distance units) +15 = max distance outside my box of any ghost atom with any maxstrain during this run (distance units) +16 = count of ghost atoms that could not be found on reneighbor steps during this run +17 = count of bias overlaps (< Dcut) found during this run + +18 = cumulative hyper time since fix created (time units) +19 = cumulative count of event timesteps since fix created +20 = cumulative count of atoms in events since fix created +21 = cumulative # of new bonds formed since fix created :ul The first quantities (1-5) are for the current timestep. Quantities -6-19 are for the current hyper run. They are reset each time a new -hyper run is performed. Quantities 20-23 are cumulative across -multiple runs (since the fix was defined in the input script). +6-17 are for the current hyper run. They are reset each time a new +hyper run is performed. Quantities 18-21 are cumulative across +multiple runs (since the point in the input script the fix was +defined). -For value 6, the numerator is a count of all biased bonds on every +For value 8, the numerator is a count of all biased bonds on each timestep whose bias energy = 0.0 due to Eij >= {qfactor}. The denominator is the count of all biased bonds on all timesteps. -For value 7, drift is the distance an atom moves between timesteps -when the bond list is reset, i.e. between events. Atoms involved in -an event will typically move the greatest distance since others are -typically oscillating around their lattice site. +For value 9, the numerator is a count of all biased bonds on each +timestep with negative strain. The denominator is the count of all +biased bonds on all timesteps. -For values 13 and 14, the maxstrain of a ghost atom is the maxstrain -of any bond it is part of, and it is checked for ghost atoms within -the bond neighbor cutoff. +Values 13-17 are mostly useful for debugging and diagnostic purposes. -Values 15-19 are mostly useful for debugging and diagnostic purposes. +For value 13, drift is the distance an atom moves between two quenched +states when the second quench determines an event has occurred. Atoms +involved in an event will typically move the greatest distance since +others typically remain near their original quenched position. -For values 15-17, it is possible that a ghost atom owned by another -processor will move far enough (e.g. as part of an event-in-progress) -that it will no longer be within the communication cutoff distance for -acquiring ghost atoms. Likewise it may be a ghost atom bond partner -that cannot be found because it has moved too far. These values count -those occurrences. Because they typically involve atoms that are part -of events, they do not usually indicate bad dynamics. Value 16 is the -average bias coefficient for bonds where a partner atom was lost. +For values 14-16, neighbor atoms in the full neighbor list with cutoff +{Dcut} may be ghost atoms outside a processor's sub-box. Before the +next event occurs they may move further than {Dcut} away from the +sub-box boundary. Value 14 is the furthest (from the sub-box) any +ghost atom in the neighbor list with maxstrain < {qfactor} was +accessed during the run. Value 15 is the same except that the ghost +atom's maxstrain may be >= {qfactor}, which may mean it is about to +participate in an event. Value 16 is a count of how many ghost atoms +could not be found on reneighbor steps, presumably because they moved +too far away due to their participation in an event (which will likely +be detected at the next quench). -For value 18, no two bonds should be biased if they are within a +Typical values for 14 and 15 should be slightly larger than {Dcut}, +which accounts for ghost atoms initially at a {Dcut} distance moving +thermally before the next event takes place. + +Note that for values 14 and 15 to be computed, the optional keyword +{check/ghost} must be specified. Otherwise these values will be zero. +This is because computing them incurs overhead, so the values are only +computed if requested. + +Value 16 should be zero or small. As explained above a small count +likely means some ghost atoms were participating in their own events +and moved a longer distance. If the value is large, it likely means +the communication cutoff for ghosts is too close to {Dcut} leading to +many not-found ghost atoms before the next event. This may lead to a +reduced number of bonds being selected for biasing, since the code +assumes those atoms are part of highly strained bonds. As explained +above, the "comm_modify cutoff"_comm_modify.html command can be used +to set a longer cutoff. + +For value 17, no two bonds should be biased if they are within a {Dcut} distance of each other. This value should be zero, indicating -that no pair of bonds "overlap", meaning they are closer than {Dcut} -from each other. +that no pair of biased bonds are closer than {Dcut} from each other. -For value 19, the same bias coefficient is stored by both atoms in an -IJ bond. This value should be zero, indicating that for all bonds, -each atom in the bond stores the a bias coefficient with the same -value. +Note that for values 17 to be computed, the optional keyword +{check/bias} must be specified and it determines how often this check +is performed. This is because performing the check incurs overhead, +so if only computed as often as requested. -Value 20 is simply the specified {boost} factor times the number of -timestep times the timestep size. +The result at the end of the run is the cumulative total from every +timestep the check was made. Note that the value is a count of atoms +in bonds which found other atoms in bonds too close, so it is almost +always an over-count of the number of too-close bonds. -For value 21, events are checked for by the "hyper"_hyper.html command +Value 18 is simply the specified {boost} factor times the number of +timesteps times the timestep size. + +For value 19, events are checked for by the "hyper"_hyper.html command once every {Nevent} timesteps. This value is the count of those timesteps on which one (or more) events was detected. It is NOT the number of distinct events, since more than one event may occur in the same {Nevent} time window. -For value 22, each time the "hyper"_hyper.html command checks for an +For value 20, each time the "hyper"_hyper.html command checks for an event, it invokes a compute to flag zero or more atoms as participating in one or more events. E.g. atoms that have displaced -more than some distance from the previous quench state. Value 22 is +more than some distance from the previous quench state. Value 20 is the cumulative count of the number of atoms participating in any of the events that were found. -Value 23 tallies the number of new bonds created by the bond reset +Value 21 tallies the number of new bonds created by the bond reset operation. Bonds between a specific I,J pair of atoms may persist for the entire hyperdynamics simulation if neither I or J are involved in an event. @@ -378,6 +425,16 @@ an event. The scalar and vector values calculated by this fix are all "intensive". +This fix also computes a local vector of length the number of bonds +currently in the system. The value for each bond is its Cij prefactor +(bias coefficient). These values can be can be accessed by various +"output commands"_Howto_output.html. A particularly useful one is the +"fix ave/histo"_fix_ave_histo.html command which can be used to +histogram the Cij values to see if they are distributed reasonably +close to 1.0, which indicates a good choice of {Vmax}. + +The local values calculated by this fix are unitless. + No parameter of this fix can be used with the {start/stop} keywords of the "run"_run.html command. This fix is not invoked during "energy minimization"_minimize.html. @@ -392,7 +449,9 @@ doc page for more info. "hyper"_hyper.html, "fix hyper/global"_fix_hyper_global.html -[Default:] None +[Default:] + +The check/ghost and check/bias keywords are not enabled by default. :line diff --git a/examples/hyper/in.hyper.global b/examples/hyper/in.hyper.global index 22b3b4251b..eba5c7bf89 100644 --- a/examples/hyper/in.hyper.global +++ b/examples/hyper/in.hyper.global @@ -12,6 +12,8 @@ variable cutevent index 1.1 variable steps index 100000 variable nevent index 1000 variable zoom index 1.8 +variable seed index 826626413 +variable tol index 1.0e-15 units metal atom_style atomic @@ -45,7 +47,7 @@ neighbor 0.5 bin neigh_modify every 1 delay 5 check yes fix 1 mobile nve -fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 858872873 zero yes +fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 ${seed} zero yes timestep 0.005 @@ -92,4 +94,4 @@ dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green # run -hyper ${steps} ${nevent} HG event min 1.0e-6 1.0e-6 100 100 dump 1 +hyper ${steps} ${nevent} HG event min ${tol} ${tol} 1000 1000 dump 1 diff --git a/examples/hyper/in.hyper.local b/examples/hyper/in.hyper.local index ef8ed4d042..cdf478ac38 100644 --- a/examples/hyper/in.hyper.local +++ b/examples/hyper/in.hyper.local @@ -107,6 +107,12 @@ dump 1 all image 10000000 local.*.jpg v_acolor type size 1024 1024 & zoom ${zoom} adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green +# test of histogramming and dump output of bias coeffs + +#fix histo all ave/histo 10 100 1000 0.9 1.1 100 f_HL & +# mode vector kind local file tmp.histo +#dump 2 all local 1000 tmp.local f_HL + # run hyper ${steps} ${nevent} HL event min ${tol} ${tol} 1000 1000 dump 1 diff --git a/src/REPLICA/fix_hyper_global.cpp b/src/REPLICA/fix_hyper_global.cpp index e43f1431a9..6924fe2d93 100644 --- a/src/REPLICA/fix_hyper_global.cpp +++ b/src/REPLICA/fix_hyper_global.cpp @@ -37,7 +37,7 @@ using namespace FixConst; // possible enhancements // should there be a virial contribution from boosted bond? -// allow newton off? see Note in pre_reverse() +// allow newton off? /* ---------------------------------------------------------------------- */ @@ -52,7 +52,7 @@ FixHyperGlobal::FixHyperGlobal(LAMMPS *lmp, int narg, char **arg) : hyperflag = 1; scalar_flag = 1; vector_flag = 1; - size_vector = 11; + size_vector = 12; global_freq = 1; extscalar = 0; extvector = 0; @@ -76,6 +76,7 @@ FixHyperGlobal::FixHyperGlobal(LAMMPS *lmp, int narg, char **arg) : maxold = 0; xold = NULL; tagold = NULL; + old2now = NULL; me = comm->me; firstflag = 1; @@ -94,6 +95,7 @@ FixHyperGlobal::~FixHyperGlobal() memory->sfree(blist); memory->destroy(xold); memory->destroy(tagold); + memory->destroy(old2now); } /* ---------------------------------------------------------------------- */ @@ -114,6 +116,7 @@ void FixHyperGlobal::init_hyper() maxdriftsq = 0.0; maxbondlen = 0.0; nobias = 0; + negstrain = 0; } /* ---------------------------------------------------------------------- */ @@ -155,14 +158,16 @@ void FixHyperGlobal::setup_pre_neighbor() void FixHyperGlobal::setup_pre_reverse(int eflag, int vflag) { - // no increment in nobias or hyper time when pre-run forces are calculated + // no increment in these quantities when pre-run forces are calculated int nobias_hold = nobias; + int negstrain_hold = negstrain; double t_hyper_hold = t_hyper; pre_reverse(eflag,vflag); nobias = nobias_hold; + negstrain = negstrain_hold; t_hyper = t_hyper_hold; } @@ -171,7 +176,7 @@ void FixHyperGlobal::setup_pre_reverse(int eflag, int vflag) void FixHyperGlobal::pre_neighbor() { int i,m,iold,jold,ilocal,jlocal; - double distsq; + // double distsq; // reset local indices for owned bond atoms, since atoms have migrated // must be done after ghost atoms are setup via comm->borders() @@ -182,6 +187,7 @@ void FixHyperGlobal::pre_neighbor() // closest_image() returns the ghost atom index in that case // also compute max drift of any atom in a bond // drift = displacement from quenched coord while event has not yet occured + // NOTE: drift calc is now done in bond_build(), between 2 quenched states for (i = 0; i < nall_old; i++) old2now[i] = -1; @@ -199,8 +205,8 @@ void FixHyperGlobal::pre_neighbor() if (ilocal < 0) error->one(FLERR,"Fix hyper/global bond atom not found"); old2now[iold] = ilocal; - distsq = MathExtra::distsq3(x[ilocal],xold[iold]); - maxdriftsq = MAX(distsq,maxdriftsq); + //distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + //maxdriftsq = MAX(distsq,maxdriftsq); } if (jlocal < 0) { jlocal = atom->map(tagold[jold]); @@ -208,40 +214,13 @@ void FixHyperGlobal::pre_neighbor() if (jlocal < 0) error->one(FLERR,"Fix hyper/global bond atom not found"); old2now[jold] = jlocal; - distsq = MathExtra::distsq3(x[jlocal],xold[jold]); - maxdriftsq = MAX(distsq,maxdriftsq); + //distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + //maxdriftsq = MAX(distsq,maxdriftsq); } blist[m].i = ilocal; blist[m].j = jlocal; } - - /* old way - nblocal loop is re-doing index-find calculation - - // NOTE: drift may not include J atoms moving (if not themselves bond owners) - - int flag = 0; - - for (m = 0; m < nblocal; m++) { - iold = blist[m].iold; - jold = blist[m].jold; - ilocal = atom->map(tagold[iold]); - jlocal = atom->map(tagold[jold]); - ilocal = domain->closest_image(xold[iold],ilocal); - jlocal = domain->closest_image(xold[iold],jlocal); - blist[m].i = ilocal; - blist[m].j = jlocal; - - if (ilocal < 0 || jlocal < 0) flag++; - else { - distsq = MathExtra::distsq3(x[ilocal],xold[iold]); - maxdriftsq = MAX(distsq,maxdriftsq); - } - } - - if (flag) error->one(FLERR,"Fix hyper/global bond atom not found"); - - */ } /* ---------------------------------------------------------------------- */ @@ -254,12 +233,12 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) double ebias,vbias,fbias,fbiasr; // compute current strain of each owned bond - // eabs_max = maximum absolute value of strain of any bond I own + // emax = maximum abs value of strain of any bond I own // imax,jmax = local indices of my 2 atoms in that bond // rmax,r0max = current and relaxed lengths of that bond double **x = atom->x; - double estrain_maxabs = 0.0; + double emax = 0.0; for (m = 0; m < nblocal; m++) { i = blist[m].i; @@ -272,8 +251,8 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) r0 = blist[m].r0; estrain = fabs(r-r0) / r0; - if (estrain > estrain_maxabs) { - estrain_maxabs = estrain; + if (estrain > emax) { + emax = estrain; rmax = r; r0max = r0; imax = i; @@ -285,7 +264,7 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) // finds max strain and what proc owns it // owner = proc that owns that bond - pairme.value = estrain_maxabs; + pairme.value = emax; pairme.proc = me; MPI_Allreduce(&pairme,&pairall,1,MPI_DOUBLE_INT,MPI_MAXLOC,world); owner = pairall.proc; @@ -311,16 +290,14 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) // Fix = x component of force on atom I // = Fbias dEbias/dr dr/dxi, dEbias/dr = 1/r0, dr/dxi = delx/r // dt_boost = time boost factor = exp(Vbias/kT) - // NOTE: logic here would need to be different for newton off double **f = atom->f; vbias = fbias = 0.0; dt_boost = 1.0; - if (estrain_maxabs < qfactor) { - //ebias = (rmax-r0max) / r0max; - ebias = fabs(rmax-r0max) / r0max; + if (emax < qfactor) { + ebias = (rmax-r0max) / r0max; vbias = vmax * (1.0 - ebias*ebias*invqfactorsq); fbias = 2.0 * vmax * ebias * invqfactorsq; dt_boost = exp(beta*vbias); @@ -338,13 +315,15 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) f[jmax][1] -= dely*fbiasr; f[jmax][2] -= delz*fbiasr; + if (ebias < 0.0) negstrain++; + } else nobias++; // output quantities outvec[0] = vbias; outvec[1] = dt_boost; - outvec[2] = ebias; + outvec[2] = emax; outvec[3] = atom->tag[imax]; outvec[4] = atom->tag[jmax]; @@ -356,8 +335,8 @@ void FixHyperGlobal::pre_reverse(int /* eflag */, int /* vflag */) void FixHyperGlobal::build_bond_list(int natom) { - int i,j,ii,jj,inum,jnum; - double xtmp,ytmp,ztmp,delx,dely,delz,rsq; + int i,j,m,ii,jj,iold,jold,ilocal,jlocal,inum,jnum; + double xtmp,ytmp,ztmp,delx,dely,delz,rsq,distsq; int *ilist,*jlist,*numneigh,**firstneigh; if (natom) { @@ -365,6 +344,27 @@ void FixHyperGlobal::build_bond_list(int natom) nevent_atom += natom; } + // compute max distance any bond atom has moved between 2 quenched states + // xold[iold] = last quenched coord for iold + // x[ilocal] = current quenched coord for same atom + + double **x = atom->x; + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + + for (m = 0; m < nblocal; m++) { + iold = blist[m].iold; + ilocal = atom->map(tagold[iold]); + ilocal = domain->closest_image(xold[iold],ilocal); + distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + maxdriftsq = MAX(distsq,maxdriftsq); + jold = blist[m].jold; + jlocal = atom->map(tagold[jold]); + jlocal = domain->closest_image(xold[iold],jlocal); + distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + // trigger neighbor list build neighbor->build_one(list); @@ -372,7 +372,6 @@ void FixHyperGlobal::build_bond_list(int natom) // identify bonds assigned to each owned atom // do not create a bond between two non-group atoms - double **x = atom->x; int *mask = atom->mask; inum = list->inum; @@ -415,10 +414,12 @@ void FixHyperGlobal::build_bond_list(int natom) } } - // store IDs and coords for owned+ghost atoms at time of bond creation - // realloc xold and tagold as needed + // store per-atom quantities for owned+ghost atoms at time of bond creation + // nall_old = value of nall at time bonds are built - if (atom->nmax > maxold) { + tagint *tag = atom->tag; + + if (nall > maxold) { memory->destroy(xold); memory->destroy(tagold); memory->destroy(old2now); @@ -428,16 +429,11 @@ void FixHyperGlobal::build_bond_list(int natom) memory->create(old2now,maxold,"hyper/global:old2now"); } - tagint *tag = atom->tag; - int nall = atom->nlocal + atom->nghost; - nall_old = nall; + memcpy(&xold[0][0],&x[0][0],3*nall*sizeof(double)); + for (i = 0; i < nall; i++) tagold[i] = tag[i]; - for (i = 0; i < nall; i++) { - xold[i][0] = x[i][0]; - xold[i][1] = x[i][1]; - xold[i][2] = x[i][2]; - tagold[i] = tag[i]; - } + nlocal_old = nlocal; + nall_old = nall; } /* ---------------------------------------------------------------------- @@ -473,7 +469,7 @@ double FixHyperGlobal::compute_vector(int i) bcastflag = 0; } - // 11 vector outputs returned for i = 0-10 + // 12 vector outputs returned for i = 0-11 // i = 0 = boost factor on this step // i = 1 = max strain of any bond on this step (positive or negative) @@ -481,13 +477,14 @@ double FixHyperGlobal::compute_vector(int i) // i = 3 = ID of atom J in max-strain bond on this step // i = 4 = ave bonds/atom on this step - // i = 5 = fraction of steps with no bias during this run - // i = 6 = max drift of any atom during this run - // i = 7 = max bond length during this run + // i = 5 = fraction of steps where bond has no bias during this run + // i = 6 = fraction of steps where bond has negative strain during this run + // i = 7 = max drift distance of any atom during this run + // i = 8 = max bond length during this run - // i = 8 = cummulative hyper time since fix created - // i = 9 = cummulative # of event timesteps since fix created - // i = 10 = cummulative # of atoms in events since fix created + // i = 9 = cummulative hyper time since fix created + // i = 10 = cummulative # of event timesteps since fix created + // i = 11 = cummulative # of atoms in events since fix created if (i == 0) return outvec[1]; if (i == 1) return outvec[2]; @@ -509,20 +506,27 @@ double FixHyperGlobal::compute_vector(int i) } if (i == 6) { + if (update->ntimestep == update->firststep) return 0.0; + int allnegstrain; + MPI_Allreduce(&negstrain,&allnegstrain,1,MPI_INT,MPI_SUM,world); + return 1.0*allnegstrain / (update->ntimestep - update->firststep); + } + + if (i == 7) { double alldriftsq; MPI_Allreduce(&maxdriftsq,&alldriftsq,1,MPI_DOUBLE,MPI_MAX,world); return sqrt(alldriftsq); } - if (i == 7) { + if (i == 8) { double allbondlen; MPI_Allreduce(&maxbondlen,&allbondlen,1,MPI_DOUBLE,MPI_MAX,world); return allbondlen; } - if (i == 8) return t_hyper; - if (i == 9) return (double) nevent; - if (i == 10) return (double) nevent_atom; + if (i == 9) return t_hyper; + if (i == 10) return (double) nevent; + if (i == 11) return (double) nevent_atom; return 0.0; } @@ -534,13 +538,14 @@ double FixHyperGlobal::compute_vector(int i) double FixHyperGlobal::query(int i) { - if (i == 1) return compute_vector(8); // cummulative hyper time - if (i == 2) return compute_vector(9); // nevent - if (i == 3) return compute_vector(10); // nevent_atom + if (i == 1) return compute_vector(9); // cummulative hyper time + if (i == 2) return compute_vector(10); // nevent + if (i == 3) return compute_vector(11); // nevent_atom if (i == 4) return compute_vector(4); // ave bonds/atom - if (i == 5) return compute_vector(6); // maxdrift - if (i == 6) return compute_vector(7); // maxbondlen + if (i == 5) return compute_vector(7); // maxdrift + if (i == 6) return compute_vector(8); // maxbondlen if (i == 7) return compute_vector(5); // fraction with zero bias + if (i == 8) return compute_vector(6); // fraction with negative strain error->all(FLERR,"Invalid query to fix hyper/global"); diff --git a/src/REPLICA/fix_hyper_global.h b/src/REPLICA/fix_hyper_global.h index 42dd64e145..a62f80b54a 100644 --- a/src/REPLICA/fix_hyper_global.h +++ b/src/REPLICA/fix_hyper_global.h @@ -56,6 +56,7 @@ class FixHyperGlobal : public FixHyper { double maxbondlen; // max length of any bond double maxdriftsq; // max distance any atom drifts from original pos int nobias; // # of steps when bias = 0, b/c bond too long + int negstrain; // # of steps when biased bond has negative strain class NeighList *list; @@ -70,12 +71,13 @@ class FixHyperGlobal : public FixHyper { double r0; // relaxed bond length }; - struct OneBond *blist; // list of owned bonds - int nblocal; // # of owned bonds + OneBond *blist; // list of owned bonds + int nblocal; // # of owned bonds // coords and IDs of owned+ghost atoms when bonds were formed // persists on a proc from one event until the next + int nlocal_old; // nlocal for old atoms int nall_old; // nlocal+nghost for old atoms int maxold; // allocated size of old atoms diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index 99dd1945ad..a2af3dff6e 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -36,8 +36,7 @@ using namespace FixConst; #define DELTABOND 16384 #define DELTABIAS 16 #define COEFFINIT 1.0 -#define COEFFMAX 1.2 -#define MAXBONDPERATOM 30 +#define FCCBONDS 12 #define BIG 1.0e20 enum{STRAIN,STRAINDOMAIN,BIASFLAG,BIASCOEFF}; @@ -46,12 +45,11 @@ enum{IGNORE,WARN,ERROR}; /* ---------------------------------------------------------------------- */ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : - FixHyper(lmp, narg, arg), old2now(NULL), xold(NULL), tagold(NULL), - blist(NULL), maxstrain(NULL), maxstrain_domain(NULL), - biasflag(NULL), bias(NULL) + FixHyper(lmp, narg, arg), blist(NULL), biascoeff(NULL), numbond(NULL), + maxhalf(NULL), eligible(NULL), maxhalfstrain(NULL), old2now(NULL), + tagold(NULL), xold(NULL), maxstrain(NULL), maxstrain_domain(NULL), + biasflag(NULL), bias(NULL), cpage(NULL), clist(NULL), numcoeff(NULL) { - // NOTE: need to add vecs/arrays to constructor list - // error checks if (atom->map_style == 0) @@ -64,7 +62,11 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : hyperflag = 2; scalar_flag = 1; vector_flag = 1; - size_vector = 23; + size_vector = 21; + local_flag = 1; + size_local_rows = 0; + size_local_cols = 0; + local_freq = 1; global_freq = 1; extscalar = 0; @@ -89,11 +91,15 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : // optional args + checkghost = 0; checkbias = 0; int iarg = 10; while (iarg < narg) { - if (strcmp(arg[iarg],"check/bias") == 0) { + if (strcmp(arg[iarg],"check/ghost") == 0) { + checkghost = 1; + iarg++; + } else if (strcmp(arg[iarg],"check/bias") == 0) { if (iarg+3 > narg) error->all(FLERR,"Illegal fix hyper/local command"); checkbias = 1; checkbias_every = force->inumeric(FLERR,arg[iarg+1]); @@ -102,14 +108,15 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg+2],"ignore") == 0) checkbias_flag = IGNORE; else error->all(FLERR,"Illegal fix hyper/local command"); iarg += 3; - } else error->all(FLERR,"Illegal fix hyper/local command"); } // per-atom data structs - maxbond = 0; + maxbond = nblocal = 0; blist = NULL; + biascoeff = NULL; + allbonds = 0; maxatom = 0; maxstrain = NULL; @@ -130,24 +137,30 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : nbias = maxbias = 0; bias = NULL; + // data structs for persisting bias coeffs when bond list is reformed + // maxbondperatom = max # of bonds any atom is part of + // FCCBONDS = 12 is a good estimate for fcc lattices + // will be reset in build_bond() if necessary + maxcoeff = 0; - maxcoeffperatom = 0; + maxbondperatom = FCCBONDS; numcoeff = NULL; clist = NULL; + cpage = new MyPage; + cpage->init(maxbondperatom,1024*maxbondperatom,1); - // maxbondperatom = max # of bonds any atom is part of - // will be reset in bond_build() // set comm sizes needed by this fix - // NOTE: remove MBPA when minimize reverse Cij comm + // reverse = 2 is for sending atom index + value, though total likely < 1 + // reverse comm for bias coeffs has variable size, so not tallied here - maxbondperatom = 1; comm_forward = 1; - comm_reverse = MAXBONDPERATOM; + comm_reverse = 2; me = comm->me; firstflag = 1; - allbias = 0.0; + sumbiascoeff = 0.0; + avebiascoeff = 0.0; starttime = update->ntimestep; nostrainyet = 1; @@ -162,6 +175,7 @@ FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : FixHyperLocal::~FixHyperLocal() { memory->destroy(blist); + memory->destroy(biascoeff); memory->destroy(maxstrain); memory->destroy(maxstrain_domain); @@ -179,7 +193,8 @@ FixHyperLocal::~FixHyperLocal() memory->destroy(bias); memory->destroy(numcoeff); - memory->destroy(clist); + memory->sfree(clist); + delete cpage; } /* ---------------------------------------------------------------------- */ @@ -202,11 +217,12 @@ void FixHyperLocal::init_hyper() checkbias_count = 0; maxdriftsq = 0.0; maxbondlen = 0.0; - maxbiascoeff = 0.0; + avebiascoeff = 0.0; minbiascoeff = BIG; - sumbiascoeff = 0.0; + maxbiascoeff = 0.0; nbias_running = 0; nobias_running = 0; + negstrain_running = 0; rmaxever = 0.0; rmaxeverbig = 0.0; @@ -254,11 +270,12 @@ void FixHyperLocal::init() // need occasional full neighbor list with cutoff = Dcut // used for finding maxstrain of neighbor bonds out to Dcut // do not need to include neigh skin in cutoff, - // b/c this list will be built every time bond_build() is called + // b/c this list will be built every time build_bond() is called // NOTE: what if pair style list cutoff > Dcut // or what if neigh skin is huge? int irequest_full = neighbor->request(this,instance_me); + neighbor->requests[irequest_full]->id = 1; neighbor->requests[irequest_full]->pair = 0; neighbor->requests[irequest_full]->fix = 1; neighbor->requests[irequest_full]->half = 0; @@ -271,9 +288,10 @@ void FixHyperLocal::init() // used for building local bond list // no specified cutoff, should be longer than cutbond // this list will also be built (or derived/copied) - // every time bond_build() is called + // every time build_bond() is called int irequest_half = neighbor->request(this,instance_me); + neighbor->requests[irequest_half]->id = 2; neighbor->requests[irequest_half]->pair = 0; neighbor->requests[irequest_half]->fix = 1; neighbor->requests[irequest_half]->occasional = 1; @@ -297,7 +315,6 @@ void FixHyperLocal::init_list(int id, NeighList *ptr) void FixHyperLocal::setup_pre_neighbor() { // called for dynamics and minimization - // NOTE: check if needed for min, I think so b/c of Cij persist? pre_neighbor(); } @@ -308,7 +325,8 @@ void FixHyperLocal::setup_pre_reverse(int eflag, int vflag) { // only called for dynamics, not minimization // setupflag prevents boostostat update of bias coeffs in setup - // also prevents increments of nbias_running, nobias_running, sumbiascoeff + // also prevents increments of nbias_running, nobias_running, + // negstrain_running, sumbiascoeff setupflag = 1; pre_reverse(eflag,vflag); @@ -320,7 +338,7 @@ void FixHyperLocal::setup_pre_reverse(int eflag, int vflag) void FixHyperLocal::pre_neighbor() { int i,m,iold,jold,ilocal,jlocal; - double distsq; + // double distsq; // reset local indices for owned bond atoms, since atoms have migrated // must be done after ghost atoms are setup via comm->borders() @@ -331,6 +349,7 @@ void FixHyperLocal::pre_neighbor() // closest_image() returns the ghost atom index in that case // also compute max drift of any atom in a bond // drift = displacement from quenched coord while event has not yet occured + // NOTE: drift calc is now done in bond_build(), between 2 quenched states for (i = 0; i < nall_old; i++) old2now[i] = -1; @@ -348,17 +367,17 @@ void FixHyperLocal::pre_neighbor() if (ilocal < 0) error->one(FLERR,"Fix hyper/local bond atom not found"); old2now[iold] = ilocal; - distsq = MathExtra::distsq3(x[ilocal],xold[iold]); - maxdriftsq = MAX(distsq,maxdriftsq); + //distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + //maxdriftsq = MAX(distsq,maxdriftsq); } if (jlocal < 0) { jlocal = atom->map(tagold[jold]); - jlocal = domain->closest_image(xold[iold],jlocal); // closest to iold + jlocal = domain->closest_image(xold[iold],jlocal); // close to I atom if (jlocal < 0) error->one(FLERR,"Fix hyper/local bond atom not found"); old2now[jold] = jlocal; - distsq = MathExtra::distsq3(x[jlocal],xold[jold]); - maxdriftsq = MAX(distsq,maxdriftsq); + //distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + //maxdriftsq = MAX(distsq,maxdriftsq); } blist[m].i = ilocal; @@ -374,11 +393,11 @@ void FixHyperLocal::pre_neighbor() // b/c old2now is only used to access maxstrain() or biasflag() // which will be identical for every copy of the same atom ID - for (i = 0; i < nall_old; i++) { - if (old2now[i] >= 0) continue; - if (tagold[i] == 0) continue; - ilocal = atom->map(tagold[i]); - old2now[i] = ilocal; + for (iold = 0; iold < nall_old; iold++) { + if (old2now[iold] >= 0) continue; + if (tagold[iold] == 0) continue; + ilocal = atom->map(tagold[iold]); + old2now[iold] = ilocal; if (ilocal < 0) ghost_toofar++; } } @@ -389,26 +408,31 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) { int i,j,m,ii,jj,inum,jnum,iold,jold,ibond,nbond,ijhalf,ncount; double xtmp,ytmp,ztmp,delx,dely,delz; - double r,r0,estrain,emax,ebias,vbias,fbias,fbiasr,biascoeff; + double r,r0,estrain,emax,ebias,vbias,fbias,fbiasr; double halfstrain,selfstrain; int *ilist,*jlist,*numneigh,**firstneigh; //double time1,time2,time3,time4,time5,time6,time7,time8; //time1 = MPI_Wtime(); - // reallocate local vectors if necessary + nostrainyet = 0; + + // reallocate per-atom maxstrain and biasflag vectors if necessary int nlocal = atom->nlocal; int nall = nlocal + atom->nghost; if (maxatom < nall) { + memory->destroy(maxstrain); + memory->destroy(maxstrain_domain); + if (checkbias) memory->destroy(biasflag); maxatom = atom->nmax; - memory->grow(maxstrain,maxatom,"hyper/local:maxstrain"); - memory->grow(maxstrain_domain,maxatom,"hyper/local:maxstrain_domain"); - if (checkbias) memory->grow(biasflag,maxatom,"hyper/local:biasflag"); + memory->create(maxstrain,maxatom,"hyper/local:maxstrain"); + memory->create(maxstrain_domain,maxatom,"hyper/local:maxstrain_domain"); + if (checkbias) memory->create(biasflag,maxatom,"hyper/local:biasflag"); } - // each old atom I's owned bond with max strain is eligible for biasing + // one max strain bond per old owned atom is eligible for biasing for (iold = 0; iold < nlocal_old; iold++) eligible[iold] = 1; @@ -423,7 +447,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) // mark atom I ineligible if it has no bonds // also store: // maxhalf = which owned bond is maxstrain for each old atom I - // maxhalfstrain = strain of that bond for each old atom I + // maxhalfstrain = abs value strain of that bond for each old atom I for (i = 0; i < nall; i++) maxstrain[i] = 0.0; @@ -479,7 +503,6 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) // ------------------------------------------------------------- // use full Dcut neighbor list to check maxstrain of all neighbor atoms - // NOTE: is II loop the same as iold over nlocal_old ?? // neighlist is from last event // has old indices for I,J (reneighboring may have occurred) // use old2now[] to convert to current indices @@ -503,8 +526,12 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) double *sublo = domain->sublo; double *subhi = domain->subhi; + // first two lines of outer loop should be identical to this: + // for (iold = 0; iold < nlocal_old; iold++) + for (ii = 0; ii < inum; ii++) { iold = ilist[ii]; + if (eligible[iold] == 0) continue; jlist = firstneigh[iold]; jnum = numneigh[iold]; @@ -533,29 +560,30 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) emax = MAX(emax,maxstrain[j]); if (selfstrain == maxstrain[j]) ncount++; - // diagnostic + // optional diagnostic // tally largest distance from subbox that a ghost atom is (rmaxbig) // and the largest distance if strain < qfactor (rmax) - // NOTE: could this be removed from loop ?? - if (j >= nlocal) { - if (x[j][0] < sublo[0]) rmaxbig = MAX(rmaxbig,sublo[0]-x[j][0]); - if (x[j][1] < sublo[1]) rmaxbig = MAX(rmaxbig,sublo[1]-x[j][1]); - if (x[j][2] < sublo[2]) rmaxbig = MAX(rmaxbig,sublo[2]-x[j][2]); - if (x[j][0] > subhi[0]) rmaxbig = MAX(rmaxbig,x[j][0]-subhi[0]); - if (x[j][1] > subhi[1]) rmaxbig = MAX(rmaxbig,x[j][1]-subhi[1]); - if (x[j][2] > subhi[2]) rmaxbig = MAX(rmaxbig,x[j][2]-subhi[2]); - if (maxstrain[j] < qfactor) { - if (x[j][0] < sublo[0]) rmax = MAX(rmax,sublo[0]-x[j][0]); - if (x[j][1] < sublo[1]) rmax = MAX(rmax,sublo[1]-x[j][1]); - if (x[j][2] < sublo[2]) rmax = MAX(rmax,sublo[2]-x[j][2]); - if (x[j][0] > subhi[0]) rmax = MAX(rmax,x[j][0]-subhi[0]); - if (x[j][1] > subhi[1]) rmax = MAX(rmax,x[j][1]-subhi[1]); - if (x[j][2] > subhi[2]) rmax = MAX(rmax,x[j][2]-subhi[2]); + if (checkghost) { + if (j >= nlocal) { + if (x[j][0] < sublo[0]) rmaxbig = MAX(rmaxbig,sublo[0]-x[j][0]); + if (x[j][1] < sublo[1]) rmaxbig = MAX(rmaxbig,sublo[1]-x[j][1]); + if (x[j][2] < sublo[2]) rmaxbig = MAX(rmaxbig,sublo[2]-x[j][2]); + if (x[j][0] > subhi[0]) rmaxbig = MAX(rmaxbig,x[j][0]-subhi[0]); + if (x[j][1] > subhi[1]) rmaxbig = MAX(rmaxbig,x[j][1]-subhi[1]); + if (x[j][2] > subhi[2]) rmaxbig = MAX(rmaxbig,x[j][2]-subhi[2]); + if (maxstrain[j] < qfactor) { + if (x[j][0] < sublo[0]) rmax = MAX(rmax,sublo[0]-x[j][0]); + if (x[j][1] < sublo[1]) rmax = MAX(rmax,sublo[1]-x[j][1]); + if (x[j][2] < sublo[2]) rmax = MAX(rmax,sublo[2]-x[j][2]); + if (x[j][0] > subhi[0]) rmax = MAX(rmax,x[j][0]-subhi[0]); + if (x[j][1] > subhi[1]) rmax = MAX(rmax,x[j][1]-subhi[1]); + if (x[j][2] > subhi[2]) rmax = MAX(rmax,x[j][2]-subhi[2]); + } } } } - + if (maxhalfstrain[iold] < selfstrain) eligible[iold] = 0; if (selfstrain < emax) eligible[iold] = 0; else if (ncount > 1) { @@ -565,15 +593,6 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) maxstrain_domain[i] = emax; } - // diagnostic // NOTE: optional, should skip - - double rmax2[2],rmax2all[2]; - rmax2[0] = rmax; - rmax2[1] = rmaxbig; - MPI_Allreduce(&rmax2,&rmax2all,2,MPI_DOUBLE,MPI_MAX,world); - rmaxever = rmax2all[0]; - rmaxeverbig = rmax2all[1]; - //time4 = MPI_Wtime(); // reverse comm to acquire maxstrain_domain from ghost atoms @@ -607,7 +626,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) maxbias += DELTABIAS; memory->grow(bias,maxbias,"hyper/local:bias"); } - bias[nbias++] = ibond; + bias[nbias++] = maxhalf[iold]; } //time6 = MPI_Wtime(); @@ -620,6 +639,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) double **f = atom->f; int nobias = 0; + int negstrain = 0; mybias = 0.0; for (int ibias = 0; ibias < nbias; ibias++) { @@ -637,11 +657,9 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) delz = x[i][2] - x[j][2]; r = sqrt(delx*delx + dely*dely + delz*delz); r0 = blist[m].r0; - //ebias = (r-r0) / r0; - ebias = fabs(r-r0) / r0; - biascoeff = blist[m].biascoeff; - vbias = biascoeff * vmax * (1.0 - ebias*ebias*invqfactorsq); - fbias = biascoeff * 2.0 * vmax * ebias * invqfactorsq; + ebias = (r-r0) / r0; + vbias = biascoeff[m] * vmax * (1.0 - ebias*ebias*invqfactorsq); + fbias = biascoeff[m] * 2.0 * vmax * ebias * invqfactorsq; fbiasr = fbias / r0 / r; f[i][0] += delx*fbiasr; @@ -652,6 +670,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) f[j][1] -= dely*fbiasr; f[j][2] -= delz*fbiasr; + if (ebias < 0.0) negstrain++; mybias += vbias; } @@ -662,50 +681,59 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) // ------------------------------------------------------------- // no boostostat update when pre_reverse called from setup() - // nbias_running, nobias_running, sumbiascoeff only incremented on run steps - // NOTE: maybe should also not bias any bonds on firststep of this fix + // nbias_running, nobias_running, negstrain_running only incremented + // on run steps if (setupflag) return; nbias_running += nbias; nobias_running += nobias; + negstrain_running += negstrain; // loop over bonds I own to adjust bias coeff // delta in boost coeff is function of maxboost_domain vs target boost // maxboost_domain is function of two maxstrain_domains for I,J - double mybias = 0.0; - double emaxi,emaxj,maxboost_domain; + double emaxi,emaxj,maxboost_domain,bc; + double mybiascoeff = 0.0; for (m = 0; m < nblocal; m++) { i = blist[m].i; j = blist[m].j; - emaxi = fabs(maxstrain_domain[i]); - emaxj = fabs(maxstrain_domain[j]); + emaxi = maxstrain_domain[i]; + emaxj = maxstrain_domain[j]; emax = MAX(emaxi,emaxj); if (emax < qfactor) vbias = vmax * (1.0 - emax*emax*invqfactorsq); else vbias = 0.0; - biascoeff = blist[m].biascoeff; - maxboost_domain = exp(beta * biascoeff*vbias); - biascoeff -= alpha * (maxboost_domain-boost_target) / boost_target; - blist[m].biascoeff = biascoeff; + maxboost_domain = exp(beta * biascoeff[m]*vbias); + biascoeff[m] -= alpha * (maxboost_domain-boost_target) / boost_target; // stats - mybias += biascoeff; - maxbiascoeff = MAX(maxbiascoeff,biascoeff); - minbiascoeff = MIN(minbiascoeff,biascoeff); + bc = biascoeff[m]; + mybiascoeff += bc; + minbiascoeff = MIN(minbiascoeff,bc); + maxbiascoeff = MAX(maxbiascoeff,bc); } - // running stats - - MPI_Allreduce(&mybias,&allbias,1,MPI_DOUBLE,MPI_SUM,world); - if (allbonds) sumbiascoeff += allbias/allbonds; - // ------------------------------------------------------------- - // extra diagnostics if requested + // diagnostics, some optional // ------------------------------------------------------------- + MPI_Allreduce(&mybiascoeff,&sumbiascoeff,1,MPI_DOUBLE,MPI_SUM,world); + if (allbonds) avebiascoeff += sumbiascoeff/allbonds; + + // if requested, monitor ghost distance from processor sub-boxes + + if (checkghost) { + double rmax2[2],rmax2all[2]; + rmax2[0] = rmax; + rmax2[1] = rmaxbig; + MPI_Allreduce(&rmax2,&rmax2all,2,MPI_DOUBLE,MPI_MAX,world); + rmaxever = rmax2all[0]; + rmaxeverbig = rmax2all[1]; + } + // if requsted, check for any biased bonds that are too close to each other // keep a running count for output // requires 2 additional local comm operations @@ -713,7 +741,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) if (checkbias && update->ntimestep % checkbias_every == 0) { // mark each atom in a biased bond with ID of partner - // nbias loop will mark some ghost atoms + // this may mark some ghost atoms for (i = 0; i < nall; i++) biasflag[i] = 0; @@ -728,13 +756,13 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) } // reverse comm to acquire biasflag from ghost atoms - // needed b/c above loop may set biasflag of ghost atoms - // forward comm to acquire biasflag of all ghost atoms + // forward comm to set biasflag for all ghost atoms commflag = BIASFLAG; comm->reverse_comm_fix(this); comm->forward_comm_fix(this); + // loop over Dcut full neighbor list // I and J may be ghost atoms // only continue if I is a biased atom // if J is unknown (drifted ghost) just ignore @@ -755,6 +783,19 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) if (biasflag[j] && biasflag[j] != tag[i]) checkbias_count++; } } + + if (checkbias_flag != IGNORE) { + int allcount; + MPI_Allreduce(&checkbias_count,&allcount,1,MPI_INT,MPI_SUM,world); + if (allcount) { + char str[128]; + sprintf(str,"Fix hyper/local biased bonds too close: " + "cumulative atom count %d",allcount); + if (checkbias_flag == WARN) { + if (me == 0) error->warning(FLERR,str); + } else error->all(FLERR,str); + } + } } } @@ -769,9 +810,9 @@ void FixHyperLocal::min_pre_neighbor() void FixHyperLocal::build_bond_list(int natom) { - int i,j,ii,jj,m,n,inum,jnum,nbond; + int i,j,ii,jj,m,n,iold,jold,ilocal,jlocal,inum,jnum,nbond; tagint itag,jtag; - double xtmp,ytmp,ztmp,delx,dely,delz,rsq,oldcoeff; + double xtmp,ytmp,ztmp,delx,dely,delz,rsq,distsq,oldcoeff; int *ilist,*jlist,*numneigh,**firstneigh; double time1,time2; @@ -782,80 +823,117 @@ void FixHyperLocal::build_bond_list(int natom) nevent_atom += natom; } + // compute max distance any bond atom has moved between 2 quenched states + // xold[iold] = last quenched coord for iold + // x[ilocal] = current quenched coord for same atom + // use of old2now calculates distsq only once per atom + + double **x = atom->x; + + for (i = 0; i < nall_old; i++) old2now[i] = -1; + + for (m = 0; m < nblocal; m++) { + iold = blist[m].iold; + if (old2now[iold] < 0) { + ilocal = atom->map(tagold[iold]); + ilocal = domain->closest_image(xold[iold],ilocal); + if (ilocal < 0) error->one(FLERR,"Fix hyper/local bond atom not found"); + old2now[iold] = ilocal; + distsq = MathExtra::distsq3(x[ilocal],xold[iold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + jold = blist[m].jold; + if (old2now[jold] < 0) { + jold = blist[m].jold; + jlocal = atom->map(tagold[jold]); + jlocal = domain->closest_image(xold[iold],jlocal); // close to I atom + if (jlocal < 0) error->one(FLERR,"Fix hyper/local bond atom not found"); + old2now[jold] = jlocal; + distsq = MathExtra::distsq3(x[jlocal],xold[jold]); + maxdriftsq = MAX(distsq,maxdriftsq); + } + } + + // store old bond coeffs so can persist them in new blist + // while loop allows growing value of maxbondperatom + // will loop at most 2 times, stops when maxbondperatom is large enough + // requires reverse comm, no forward comm: + // b/c new coeff list is stored only by current owned atoms + + tagint *tag = atom->tag; int nlocal = atom->nlocal; int nall = nlocal + atom->nghost; - // acquire old bond coeffs so can persist them in new blist - // while loop is to allow new value of maxcoeffperatom - // will loop at most 2 times, just once when maxcoeffperatom is large enough - // just reverse comm needed, - // b/c new bond list will be bonds of current owned atoms - - tagint *tag = atom->tag; - if (maxcoeff < nall) { + memory->destroy(numcoeff); + memory->sfree(clist); maxcoeff = atom->nmax; - grow_coeff(); + memory->create(numcoeff,maxcoeff,"hyper/local:numcoeff"); + clist = (OneCoeff **) memory->smalloc(maxcoeff*sizeof(OneCoeff *), + "hyper/local:clist"); } while (1) { if (firstflag) break; for (i = 0; i < nall; i++) numcoeff[i] = 0; + for (i = 0; i < nall; i++) clist[i] = NULL; + cpage->reset(); for (m = 0; m < nblocal; m++) { i = blist[m].i; j = blist[m].j; - if (numcoeff[i] < maxcoeffperatom) { - clist[i][numcoeff[i]].biascoeff = blist[m].biascoeff; - clist[i][numcoeff[i]].jtag = tag[j]; + if (numcoeff[i] == 0) clist[i] = cpage->get(maxbondperatom); + if (numcoeff[j] == 0) clist[j] = cpage->get(maxbondperatom); + + if (numcoeff[i] < maxbondperatom) { + clist[i][numcoeff[i]].biascoeff = biascoeff[m]; + clist[i][numcoeff[i]].tag = tag[j]; } numcoeff[i]++; - if (numcoeff[j] < maxcoeffperatom) { - clist[j][numcoeff[j]].biascoeff = blist[m].biascoeff; - clist[j][numcoeff[i]].jtag = tag[i]; + if (numcoeff[j] < maxbondperatom) { + clist[j][numcoeff[j]].biascoeff = biascoeff[m]; + clist[j][numcoeff[j]].tag = tag[i]; } numcoeff[j]++; } - int maxcol = 0; - for (i = 0; i < nall; i++) maxcol = MAX(maxcol,numcoeff[i]); - int maxcolall; - MPI_Allreduce(&maxcol,&maxcolall,1,MPI_INT,MPI_MAX,world); + int mymax = 0; + for (i = 0; i < nall; i++) mymax = MAX(mymax,numcoeff[i]); + int maxcoeffall; + MPI_Allreduce(&mymax,&maxcoeffall,1,MPI_INT,MPI_MAX,world); - if (maxcolall > maxcoeffperatom) { - maxcoeffperatom = maxcolall; - grow_coeff(); - memory->destroy(clist); - memory->create(clist,maxcoeff,maxcoeffperatom,"hyper/local:clist"); + if (maxcoeffall > maxbondperatom) { + maxbondperatom = maxcoeffall; + cpage->init(maxbondperatom,1024*maxbondperatom,1); continue; } commflag = BIASCOEFF; - comm->reverse_comm_fix(this); + comm->reverse_comm_fix_variable(this); - maxcol = 0; - for (i = 0; i < nall; i++) maxcol = MAX(maxcol,numcoeff[i]); - MPI_Allreduce(&maxcol,&maxcolall,1,MPI_INT,MPI_MAX,world); - if (maxcolall <= maxcoeffperatom) break; + mymax = 0; + for (i = 0; i < nall; i++) mymax = MAX(mymax,numcoeff[i]); + MPI_Allreduce(&mymax,&maxcoeffall,1,MPI_INT,MPI_MAX,world); + if (maxcoeffall <= maxbondperatom) break; - maxcoeffperatom = maxcolall; - grow_coeff(); + maxbondperatom = maxcoeffall; + cpage->init(maxbondperatom,1024*maxbondperatom,1); } - // reallocate vectors that are maxnew xold and tagold if necessary - // initialize xold to current coords - // initialize tagold to zero, so atoms not in neighbor list will remain zero + // reallocate vectors that are maxlocal and maxall length if necessary if (nlocal > maxlocal) { memory->destroy(eligible); memory->destroy(numbond); memory->destroy(maxhalf); + memory->destroy(maxhalfstrain); maxlocal = nlocal; memory->create(eligible,maxlocal,"hyper/local:eligible"); memory->create(numbond,maxlocal,"hyper/local:numbond"); memory->create(maxhalf,maxlocal,"hyper/local:maxhalf"); + memory->create(maxhalfstrain,maxlocal,"hyper/local:maxhalfstrain"); } if (nall > maxall) { @@ -870,23 +948,26 @@ void FixHyperLocal::build_bond_list(int natom) // nlocal_old = value of nlocal at time bonds are built // nall_old = value of nall at time bonds are built - // archive current peratom info in old vecs + // archive current atom coords in xold + // tagold will be set to non-zero below for accessed atoms + // numbond will be set below nlocal_old = nlocal; nall_old = nall; - double **x = atom->x; - memcpy(&xold[0][0],&x[0][0],3*nall*sizeof(double)); for (i = 0; i < nall; i++) tagold[i] = 0; for (i = 0; i < nlocal; i++) numbond[i] = 0; - // trigger builds for both neighbor lists - // NOTE: insure the I atoms are in same order? - + // trigger neighbor list builds for both lists + // insure the I loops in both are from 1 to nlocal + neighbor->build_one(listfull); neighbor->build_one(listhalf); + if (listfull->inum != nlocal || listhalf->inum != nlocal) + error->one(FLERR,"Invalid neighbor list in fix hyper/local bond build"); + // set tagold = 1 for all J atoms used in full neighbor list // tagold remains 0 for unused atoms, skipped in pre_neighbor @@ -897,12 +978,13 @@ void FixHyperLocal::build_bond_list(int natom) for (ii = 0; ii < inum; ii++) { i = ilist[ii]; + tagold[i] = tag[i]; jlist = firstneigh[i]; jnum = numneigh[i]; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; - tagold[j] = 1; + tagold[j] = tag[j]; } } @@ -916,7 +998,6 @@ void FixHyperLocal::build_bond_list(int natom) numneigh = listhalf->numneigh; firstneigh = listhalf->firstneigh; - bigint bondcount = 0; nblocal = 0; for (ii = 0; ii < inum; ii++) { @@ -966,16 +1047,16 @@ void FixHyperLocal::build_bond_list(int natom) jtag = tag[j]; n = numcoeff[i]; for (m = 0; m < n; m++) { - if (clist[i][m].jtag == jtag) { + if (clist[i][m].tag == jtag) { oldcoeff = clist[i][m].biascoeff; break; } } } - if (oldcoeff > 0.0) blist[nblocal].biascoeff = oldcoeff; + if (oldcoeff > 0.0) biascoeff[nblocal] = oldcoeff; else { - blist[nblocal].biascoeff = COEFFINIT; + biascoeff[nblocal] = COEFFINIT; nnewbond++; } @@ -984,9 +1065,15 @@ void FixHyperLocal::build_bond_list(int natom) } numbond[i] = nbond; - bondcount += nbond; } - + + // this fix allows access to biascoeffs as local data + + size_local_rows = nblocal; + + // allbonds = total # of bonds in system + + bigint bondcount = nblocal; MPI_Allreduce(&bondcount,&allbonds,1,MPI_LMP_BIGINT,MPI_SUM,world); time2 = MPI_Wtime(); @@ -1010,6 +1097,7 @@ int FixHyperLocal::pack_forward_comm(int n, int *list, double *buf, // STRAIN // pack maxstrain vector + // must send to all ghosts out to Dcut if (commflag == STRAIN) { for (i = 0; i < n; i++) { @@ -1019,6 +1107,8 @@ int FixHyperLocal::pack_forward_comm(int n, int *list, double *buf, // STRAINDOMAIN // pack maxstrain_domain vector + // could just send to nearby ghosts in bonds + // don't see easy way to determine precisely which atoms that is } else if (commflag == STRAINDOMAIN) { for (i = 0; i < n; i++) { @@ -1028,6 +1118,7 @@ int FixHyperLocal::pack_forward_comm(int n, int *list, double *buf, // BIASFLAG // pack biasflag vector + // must send to all ghosts out to Dcut } else if (commflag == BIASFLAG) { for (i = 0; i < n; i++) { @@ -1085,22 +1176,37 @@ int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) // STRAIN // pack maxstrain vector + // only pack for nonzero values if (commflag == STRAIN) { + int nonzero = 0; + m++; // placeholder for count of atoms for (i = first; i < last; i++) { - buf[m++] = maxstrain[i]; + if (maxstrain[i] == 0.0) continue; + nonzero++; + buf[m++] = ubuf(i-first).d; // which atom is next + buf[m++] = maxstrain[i]; // value } + buf[0] = ubuf(nonzero).d; // STRAINDOMAIN // pack maxstrain_domain vector + // only pack for nonzero values } else if (commflag == STRAINDOMAIN) { + int nonzero = 0; + m++; // placeholder for count of atoms for (i = first; i < last; i++) { - buf[m++] = maxstrain_domain[i]; + if (maxstrain[i] == 0.0) continue; + nonzero++; + buf[m++] = ubuf(i-first).d; // which atom is next + buf[m++] = maxstrain_domain[i]; // value } + buf[0] = ubuf(nonzero).d; // BIASFLAG // pack biasflag vector + // could just pack for nonzero values, like STRAIN and STRAINDOMAIN } else if (commflag == BIASFLAG) { for (i = first; i < last; i++) { @@ -1109,22 +1215,46 @@ int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) // BIASCOEFF // pack list of biascoeffs + // only pack for atoms with nonzero # of bias coeffs + // this will skip majority of ghost atoms } else if (commflag == BIASCOEFF) { int ncoeff; + int nonzero = 0; + m++; // placeholder for count of atoms for (i = first; i < last; i++) { + if (numcoeff[i] == 0) continue; + nonzero++; ncoeff = numcoeff[i]; - buf[m++] = ubuf(ncoeff).d; + buf[m++] = ubuf(i-first).d; // which atom is next + buf[m++] = ubuf(ncoeff).d; // # of bias coeffs for (j = 0; j < ncoeff; j++) { buf[m++] = clist[i][j].biascoeff; - buf[m++] = ubuf(clist[i][j].jtag).d; + buf[m++] = ubuf(clist[i][j].tag).d; } } + buf[0] = ubuf(nonzero).d; } return m; } +/* ---------------------------------------------------------------------- + callback by comm->reverse_comm_fix_variable() in build_bond() + same logic as BIASCOEFF option in pack_reverse_comm() + m = returned size of message +------------------------------------------------------------------------- */ + +int FixHyperLocal::pack_reverse_comm_size(int n, int first) +{ + int last = first + n; + int m = 1; + for (int i = first; i < last; i++) { + if (numcoeff[i]) m += 2 + 2*numcoeff[i]; + } + return m; +} + /* ---------------------------------------------------------------------- */ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) @@ -1135,23 +1265,32 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) // STRAIN // unpack maxstrain vector + // nonzero # of entries, each has offset to which atom in receiver's list // use MAX, b/c want maximum abs value strain for each atom's bonds if (commflag == STRAIN) { - for (i = 0; i < n; i++) { - j = list[i]; + int offset; + int nonzero = (int) ubuf(buf[m++]).i; // # of atoms with values + for (int iatom = 0; iatom < nonzero; iatom++) { + offset = (int) ubuf(buf[m++]).i; // offset into list for which atom + j = list[offset]; maxstrain[j] = MAX(maxstrain[j],buf[m]); m++; } // STRAINDOMAIN // unpack maxstrain_domain vector - // use SUM, b/c exactly one ghost or owned value per atom ID is non-zero + // use MAX, b/c want maximum abs value strain for each atom's domain + // could also use SUM, b/c exactly one ghost or owned value is non-zero } else if (commflag == STRAINDOMAIN) { - for (i = 0; i < n; i++) { - j = list[i]; - maxstrain_domain[j] += buf[m++]; + int offset; + int nonzero = (int) ubuf(buf[m++]).i; // # of atoms with values + for (int iatom = 0; iatom < nonzero; iatom++) { + offset = (int) ubuf(buf[m++]).i; // offset into list for which atom + j = list[offset]; + maxstrain_domain[j] = MAX(maxstrain_domain[j],buf[m]); + m++; } // BIASFLAG @@ -1164,19 +1303,23 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) } // BIASCOEFF - // unpack list of biascoeffs and add to atom J's list - // protect against overflow of clist columns - // if that happens, caller will realloc clist and reverse comm again + // unpack list of biascoeffs + // nonzero # of entries, each has offset to which atom in receiver's list + // protect against overflow of clist vector + // if that happens, caller will re-setup cpage and reverse comm again - } else if (commflag == BIASFLAG) { - int ncoeff; - for (i = 0; i < n; i++) { - j = list[i]; - ncoeff = (int) ubuf(buf[m++]).i; + } else if (commflag == BIASCOEFF) { + int offset,ncoeff; + int nonzero = (int) ubuf(buf[m++]).i; // # of atoms with coeffs + for (int iatom = 0; iatom < nonzero; iatom++) { + offset = (int) ubuf(buf[m++]).i; // offset into list for which atom + j = list[offset]; + ncoeff = (int) ubuf(buf[m++]).i; // # of bias coeffs for (k = 0; k < ncoeff; k++) { - if (numcoeff[j] < maxcoeffperatom) { + if (numcoeff[j] == 0) clist[j] = cpage->get(maxbondperatom); + if (numcoeff[j] < maxbondperatom) { clist[j][numcoeff[j]].biascoeff = buf[m++]; - clist[j][numcoeff[j]].jtag = (tagint) ubuf(buf[m++]).i; + clist[j][numcoeff[j]].tag = (tagint) ubuf(buf[m++]).i; } else m += 2; numcoeff[j]++; } @@ -1185,7 +1328,7 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) } /* ---------------------------------------------------------------------- - grow bond list by a chunk + grow bond list and bias coeff vector by a chunk ------------------------------------------------------------------------- */ void FixHyperLocal::grow_bond() @@ -1195,16 +1338,8 @@ void FixHyperLocal::grow_bond() maxbond += DELTABOND; blist = (OneBond *) memory->srealloc(blist,maxbond*sizeof(OneBond),"hyper/local:blist"); -} - -/* ---------------------------------------------------------------------- - reallocate 2-dimensional clist -------------------------------------------------------------------------- */ - -void FixHyperLocal::grow_coeff() -{ - memory->destroy(clist); - memory->create(clist,maxcoeff,maxcoeffperatom,"hyper/local:clist"); + memory->grow(biascoeff,maxbond,"hyper/local:biascoeff"); + vector_local = biascoeff; } /* ---------------------------------------------------------------------- */ @@ -1220,41 +1355,35 @@ double FixHyperLocal::compute_scalar() double FixHyperLocal::compute_vector(int i) { - // 23 vector outputs returned for i = 0-22 + // 21 vector outputs returned for i = 0-20 // i = 0 = # of biased bonds on this step // i = 1 = max strain of any bond on this step - // i = 2 = average bias potential for all bonds on this step + // i = 2 = average bias coeff for all bonds on this step // i = 3 = ave bonds/atom on this step // i = 4 = ave neighbor bonds/bond on this step - // i = 5 = fraction of steps and bonds with no bias during this run - // i = 6 = max drift distance of any atom during this run - // i = 7 = max bond length during this run - // i = 8 = average # of biased bonds/step during this run - // i = 9 = average bias potential for all bonds during this run - // i = 10 = max bias potential for any bond during this run - // i = 11 = min bias potential for any bond during this run - // i = 12 = max dist from my box of any ghost atom with - // maxstain < qfactor during this run - // i = 13 = max dist from my box of any ghost atom with + // i = 5 = max bond length during this run + // i = 6 = average # of biased bonds/step during this run + // i = 7 = fraction of biased bonds with no bias during this run + // i = 8 = fraction of biased bonds with negative strain during this run + // i = 9 = average bias coeff for all bonds during this run + // i = 10 = min bias coeff for any bond during this run + // i = 11 = max bias coeff for any bond during this run + + // i = 12 = max drift distance of any atom during this run + // i = 13 = max distance from proc subbox of any ghost atom with + // maxstrain < qfactor during this run + // i = 14 = max distance from proc subbox of any ghost atom with // any maxstrain during this run - // i = 14 = count of ghost atoms that could not be found - // by any proc at any reneighbor step during this run + // i = 15 = count of ghost atoms that could not be found + // on reneighbor steps during this run + // i = 16 = count of bias overlaps (< Dcut) found during this run - // NOTE: these 2 are no longer relevant - // i = 15 = count of lost bond partners during this run - // i = 16 = average bias coeff for lost bond partners during this run - - // i = 17 = count of bias overlaps found during this run - - // NOTE: this is no longer relevant - // i = 18 = count of non-matching bias coefficients found during this run - - // i = 19 = cummulative hyper time - // i = 20 = cummulative # of event timesteps since fix created - // i = 21 = cummulative # of atoms in events since fix created - // i = 22 = cummulative # of new bonds formed since fix created + // i = 17 = cumulative hyper time since fix created + // i = 18 = cumulative # of event timesteps since fix created + // i = 19 = cumulative # of atoms in events since fix created + // i = 20 = cumulative # of new bonds formed since fix created if (i == 0) { int nbiasall; @@ -1274,7 +1403,7 @@ double FixHyperLocal::compute_vector(int i) } if (i == 2) { - if (allbias && allbonds) return allbias/allbonds * vmax; + if (allbonds) return sumbiascoeff/allbonds; return 1.0; } @@ -1294,6 +1423,19 @@ double FixHyperLocal::compute_vector(int i) } if (i == 5) { + double allbondlen; + MPI_Allreduce(&maxbondlen,&allbondlen,1,MPI_DOUBLE,MPI_MAX,world); + return allbondlen; + } + + if (i == 6) { + if (update->ntimestep == update->firststep) return 0.0; + int allbias_running; + MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); + return 1.0*allbias_running / (update->ntimestep - update->firststep); + } + + if (i == 7) { int allbias_running,allnobias_running; MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); MPI_Allreduce(&nobias_running,&allnobias_running,1,MPI_INT,MPI_SUM,world); @@ -1301,68 +1443,64 @@ double FixHyperLocal::compute_vector(int i) return 0.0; } - if (i == 6) { + if (i == 8) { + int allbias_running,allnegstrain_running; + MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(&negstrain_running,&allnegstrain_running,1,MPI_INT, + MPI_SUM,world); + if (allbias_running) return 1.0*allnegstrain_running / allbias_running; + return 0.0; + } + + if (i == 9) { + if (update->ntimestep == update->firststep) return 0.0; + return avebiascoeff / (update->ntimestep - update->firststep); + } + + if (i == 10) { + double biascoeff; + MPI_Allreduce(&minbiascoeff,&biascoeff,1,MPI_DOUBLE,MPI_MIN,world); + return biascoeff; + } + + if (i == 11) { + double biascoeff; + MPI_Allreduce(&maxbiascoeff,&biascoeff,1,MPI_DOUBLE,MPI_MAX,world); + return biascoeff; + } + + if (i == 12) { double alldriftsq; MPI_Allreduce(&maxdriftsq,&alldriftsq,1,MPI_DOUBLE,MPI_MAX,world); return (double) sqrt(alldriftsq); } - if (i == 7) { - double allbondlen; - MPI_Allreduce(&maxbondlen,&allbondlen,1,MPI_DOUBLE,MPI_MAX,world); - return allbondlen; - } + if (i == 13) return rmaxever; + if (i == 14) return rmaxeverbig; - if (i == 8) { - if (update->ntimestep == update->firststep) return 0.0; - int allbias_running; - MPI_Allreduce(&nbias_running,&allbias_running,1,MPI_INT,MPI_SUM,world); - return 1.0*allbias_running / (update->ntimestep - update->firststep); - } - - if (i == 9) { - if (update->ntimestep == update->firststep) return 0.0; - return sumbiascoeff * vmax / (update->ntimestep - update->firststep); - } - - if (i == 10) { - double allbiascoeff; - MPI_Allreduce(&maxbiascoeff,&allbiascoeff,1,MPI_DOUBLE,MPI_MAX,world); - return allbiascoeff * vmax; - } - - if (i == 11) { - double allbiascoeff; - MPI_Allreduce(&minbiascoeff,&allbiascoeff,1,MPI_DOUBLE,MPI_MAX,world); - return allbiascoeff * vmax; - } - - if (i == 12) return rmaxever; - if (i == 13) return rmaxeverbig; - - if (i == 14) { + if (i == 15) { int allghost_toofar; MPI_Allreduce(&ghost_toofar,&allghost_toofar,1,MPI_INT,MPI_SUM,world); return 1.0*allghost_toofar; } - if (i == 17) { + if (i == 16) { int allclose; MPI_Allreduce(&checkbias_count,&allclose,1,MPI_INT,MPI_SUM,world); return 1.0*allclose; } - if (i == 19) { + if (i == 17) { return boost_target * update->dt * (update->ntimestep - starttime); } - if (i == 20) return (double) nevent; - if (i == 21) return (double) nevent_atom; + if (i == 18) return (double) nevent; + if (i == 19) return (double) nevent_atom; - if (i == 22) { - int allnew; - MPI_Allreduce(&nnewbond,&allnew,1,MPI_INT,MPI_SUM,world); - return (double) 0.5*allnew; + if (i == 20) { + int allnewbond; + MPI_Allreduce(&nnewbond,&allnewbond,1,MPI_INT,MPI_SUM,world); + return (double) allnewbond; } return 0.0; @@ -1375,32 +1513,30 @@ double FixHyperLocal::compute_vector(int i) double FixHyperLocal::query(int i) { - if (i == 1) return compute_vector(19); // cummulative hyper time - if (i == 2) return compute_vector(20); // nevent - if (i == 3) return compute_vector(21); // nevent_atom + if (i == 1) return compute_vector(17); // cummulative hyper time + if (i == 2) return compute_vector(18); // nevent + if (i == 3) return compute_vector(19); // nevent_atom if (i == 4) return compute_vector(3); // ave bonds/atom - if (i == 5) return compute_vector(6); // maxdrift - if (i == 6) return compute_vector(7); // maxbondlen - if (i == 7) return compute_vector(5); // fraction with zero bias + if (i == 5) return compute_vector(12); // maxdrift + if (i == 6) return compute_vector(5); // maxbondlen + if (i == 7) return compute_vector(7); // fraction with zero bias + if (i == 8) return compute_vector(8); // fraction with negative strain // unique to local hyper - if (i == 8) return compute_vector(22); // number of new bonds - if (i == 9) return 1.0*maxbondperatom; // max bonds/atom - if (i == 10) return compute_vector(8); // ave # of biased bonds/step - if (i == 11) return compute_vector(9); // ave bias coeff over all bonds - if (i == 12) return compute_vector(10); // max bias cooef for any bond - if (i == 13) return compute_vector(11); // max bias cooef for any bond - if (i == 14) return compute_vector(4); // neighbor bonds/bond - if (i == 15) return compute_vector(2); // ave bias coeff now - if (i == 16) return time_bondbuild; // CPU time for bond_build calls - if (i == 17) return rmaxever; // ghost atom distance for < maxstrain - if (i == 18) return rmaxeverbig; // ghost atom distance for any strain - if (i == 19) return compute_vector(14); // count of ghost atoms not found - //if (i == 20) return compute_vector(15); // count of lost bond partners - //if (i == 21) return compute_vector(16); // ave bias coeff of long bonds - if (i == 22) return compute_vector(17); // count of bias overlaps - //if (i == 23) return compute_vector(18); // count of non-matching bias coeffs + if (i == 9) return compute_vector(20); // number of new bonds + if (i == 10) return 1.0*maxbondperatom; // max bonds/atom + if (i == 11) return compute_vector(6); // ave # of biased bonds/step + if (i == 12) return compute_vector(9); // ave bias coeff over all bonds + if (i == 13) return compute_vector(10); // min bias cooef for any bond + if (i == 14) return compute_vector(11); // max bias cooef for any bond + if (i == 15) return compute_vector(4); // neighbor bonds/bond + if (i == 16) return compute_vector(2); // ave bias coeff now + if (i == 17) return time_bondbuild; // CPU time for build_bond calls + if (i == 18) return rmaxever; // ghost atom distance for < maxstrain + if (i == 19) return rmaxeverbig; // ghost atom distance for any strain + if (i == 20) return compute_vector(15); // count of ghost atoms not found + if (i == 21) return compute_vector(16); // count of bias overlaps error->all(FLERR,"Invalid query to fix hyper/local"); @@ -1408,21 +1544,22 @@ double FixHyperLocal::query(int i) } /* ---------------------------------------------------------------------- - memory usage of per-atom and per-bond arrays + memory usage of per-atom and per-bond data structs ------------------------------------------------------------------------- */ double FixHyperLocal::memory_usage() { - int nmax = atom->nmax; - double bytes = maxbond * sizeof(OneBond); // bond list + double bytes = maxbond * sizeof(OneBond); // blist + bytes = maxbond * sizeof(double); // per-bond bias coeffs bytes += 3*maxlocal * sizeof(int); // numbond,maxhalf,eligible bytes += maxlocal * sizeof(double); // maxhalfstrain bytes += maxall * sizeof(int); // old2now bytes += maxall * sizeof(tagint); // tagold bytes += 3*maxall * sizeof(double); // xold - bytes += 2*nmax * sizeof(double); // maxstrain,maxstrain_domain - if (checkbias) bytes += nmax * sizeof(tagint); // biasflag - bytes += maxcoeff*maxcoeffperatom * sizeof(OneCoeff); // clist - bytes += maxcoeff * sizeof(int); // numcoeff + bytes += 2*maxall * sizeof(double); // maxstrain,maxstrain_domain + if (checkbias) bytes += maxall * sizeof(tagint); // biasflag + bytes += maxcoeff * sizeof(int); // numcoeff + bytes += maxcoeff * sizeof(OneCoeff *); // clist + bytes += maxlocal*maxbondperatom * sizeof(OneCoeff); // cpage estimate return bytes; } diff --git a/src/REPLICA/fix_hyper_local.h b/src/REPLICA/fix_hyper_local.h index 67361ce3ac..f0075c185c 100644 --- a/src/REPLICA/fix_hyper_local.h +++ b/src/REPLICA/fix_hyper_local.h @@ -21,6 +21,7 @@ FixStyle(hyper/local,FixHyperLocal) #define LMP_FIX_HYPER_LOCAL_H #include "fix_hyper.h" +#include "my_page.h" namespace LAMMPS_NS { @@ -43,6 +44,7 @@ class FixHyperLocal : public FixHyper { int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); int pack_reverse_comm(int, int, double *); + int pack_reverse_comm_size(int, int); void unpack_reverse_comm(int, int *, double *); double memory_usage(); @@ -54,54 +56,72 @@ class FixHyperLocal : public FixHyper { private: int me; + + // inputs and derived quantities + double cutbond,qfactor,vmax,tequil,dcut; double alpha_user; // timescale to apply boostostat (time units) double alpha; // unitless dt/alpha_user double boost_target; // target value of boost - int checkbias,checkbias_every,checkbias_flag,checkbias_count; + int checkghost,checkbias; // flags for optional stats + + double cutbondsq,dcutsq; + double beta,invqfactorsq; + + // flags int setupflag; // 1 during setup, 0 during run int firstflag; // set for first time bond_build takes place - int nostrainyet; // 1 until maxstrain is first computed - - int nbias_running,nobias_running; - int nbondbuild; - double time_bondbuild; - bigint starttime; - double sumbiascoeff; // sum of aveboost at every timestep - bigint allbonds; // sum of bond count on this step - double allbias; // sum of biascoeff on all bonds on this step - - int nnewbond; // running tally of number of new bonds created - int maxbondperatom; // max # of bonds any atom ever has + int nostrainyet; // 1 until maxstrain is first compute + bigint starttime; // timestep when this fix was invoked int commflag; // flag for communication mode + + // stats + + int nbondbuild; // # of rebuilds of bond list + double time_bondbuild; // CPU time for bond builds + + bigint allbonds; // current total # of bonds + int nnewbond; // running tally of # of new bonds created + int maxbondperatom; // max # of bonds any atom ever has int nevent; // # of events that trigger bond rebuild int nevent_atom; // # of atoms that experienced an event - double cutbondsq,dcutsq; - double beta,invqfactorsq; - double mybias; + + int nbias_running; // running count of biased bonds + int nobias_running; // ditto for bonds with bias = 0, b/c too long + int negstrain_running; // ditto for bonds with negative strain + + double mybias; // sum of bias potentials for biased bonds double maxbondlen; // cummulative max length of any bond - double maxdriftsq; // max distance any atom drifts from original pos - double maxbiascoeff; // cummulative max bias coeff for any bond + double maxdriftsq; // max distance any bond atom drifts from quenched x + + double sumbiascoeff; // sum of all bond bias coeffs at each timestep + double avebiascoeff; // cummulative sumbiascoeff/allbonds across steps double minbiascoeff; // cummulative min bias coeff for any bond + double maxbiascoeff; // cummulative max bias coeff for any bond + double rmaxever,rmaxeverbig; - int ghost_toofar; + int ghost_toofar; // # of ghost atoms not found in Dcut neigh list + + int checkbias_every,checkbias_flag,checkbias_count; + + // 2 neighbor lists class NeighList *listfull; // full neigh list up to Dcut distance class NeighList *listhalf; // half neigh list up to pair distance // both created only when bonds are rebuilt - // list of my owned bonds + // list of my owned bonds and bias coeffs // persists on a proc from one event until the next struct OneBond { // single IJ bond, atom I is owner int i,j; // current local indices of 2 bond atoms int iold,jold; // local indices when bonds were formed double r0; // relaxed bond length - double biascoeff; // biasing coefficient = prefactor Cij }; - struct OneBond *blist; // list of owned bonds + OneBond *blist; // list of owned bonds + double *biascoeff; // biasing coefficient Cij for each bond int nblocal; // # of owned bonds int maxbond; // allocated size of blist @@ -137,24 +157,24 @@ class FixHyperLocal : public FixHyper { tagint *biasflag; // atoms in biased bonds marked with bond partner // for owned and ghost atoms - // data struct used to persist biascoeffs when bond list is re-created - - struct OneCoeff { - double biascoeff; - tagint jtag; - }; - - struct OneCoeff **clist; // list of bond coeffs for each atom's bonds - int *numcoeff; // # of coeffs per atom - int maxcoeff; // allocate size of clist - int maxcoeffperatom; // allocated # of columns in clist - // list of biased bonds this proc owns int maxbias; // allocated size of bias list int nbias; // # of biased bonds I own int *bias; // index of biased bonds in my bond list + // data structs for persisting bias coeffs when bond list is reformed + + struct OneCoeff { + double biascoeff; + tagint tag; + }; + + MyPage *cpage; // pages of OneCoeff datums for clist + OneCoeff **clist; // ptrs to vectors of bias coeffs for each atom + int *numcoeff; // # of bias coeffs per atom (one per bond) + int maxcoeff; // allocate sized of clist and numcoeff + // extra timers //double timefirst,timesecond,timethird,timefourth; @@ -163,7 +183,6 @@ class FixHyperLocal : public FixHyper { // private methods void grow_bond(); - void grow_coeff(); }; } diff --git a/src/REPLICA/hyper.cpp b/src/REPLICA/hyper.cpp index 22940de221..0d8de6d060 100644 --- a/src/REPLICA/hyper.cpp +++ b/src/REPLICA/hyper.cpp @@ -40,9 +40,7 @@ enum{NOHYPER,GLOBAL,LOCAL}; /* ---------------------------------------------------------------------- */ -Hyper::Hyper(LAMMPS *lmp) : - Pointers(lmp), dumplist(NULL) -{} +Hyper::Hyper(LAMMPS *lmp) : Pointers(lmp), dumplist(NULL) {} /* ---------------------------------------------------------------------- perform hyperdynamics simulation @@ -260,11 +258,12 @@ void Hyper::command(int narg, char **arg) double maxdrift = 0.0; double maxbondlen = 0.0; double fraczero = 1.0; + double fracneg = 1.0; - double nnewbond,avenboost,aveboostcoeff,maxboostcoeff,minboostcoeff; - double maxbondperatom,neighbondperbond,aveboostnow; + double nnewbond,avenbias,avebiascoeff,minbiascoeff,maxbiascoeff; + double maxbondperatom,neighbondperbond,avebiasnow; double tbondbuild,rmaxever,rmaxeverbig,allghost_toofar; - double lostbond,lostbondcoeff,biasoverlap,nonmatchbiascoeff; + double lostbond,lostbondcoeff,biasoverlap; if (hyperenable) { t_hyper = fix_hyper->query(1); @@ -274,115 +273,70 @@ void Hyper::command(int narg, char **arg) maxdrift = fix_hyper->query(5); maxbondlen = fix_hyper->query(6); fraczero = fix_hyper->query(7); + fracneg = fix_hyper->query(8); if (hyperstyle == LOCAL) { - nnewbond = fix_hyper->query(8); - maxbondperatom = fix_hyper->query(9); - avenboost = fix_hyper->query(10); - aveboostcoeff = fix_hyper->query(11); - maxboostcoeff = fix_hyper->query(12); - minboostcoeff = fix_hyper->query(13); - neighbondperbond = fix_hyper->query(14); - aveboostnow = fix_hyper->query(15); - tbondbuild = fix_hyper->query(16); - rmaxever = fix_hyper->query(17); - rmaxeverbig = fix_hyper->query(18); - allghost_toofar = fix_hyper->query(19); - lostbond = fix_hyper->query(20); - lostbondcoeff = fix_hyper->query(21); - biasoverlap = fix_hyper->query(22); - nonmatchbiascoeff = fix_hyper->query(23); + nnewbond = fix_hyper->query(9); + maxbondperatom = fix_hyper->query(10); + avenbias = fix_hyper->query(11); + avebiascoeff = fix_hyper->query(12); + minbiascoeff = fix_hyper->query(13); + maxbiascoeff = fix_hyper->query(14); + neighbondperbond = fix_hyper->query(15); + avebiasnow = fix_hyper->query(16); + tbondbuild = fix_hyper->query(17); + rmaxever = fix_hyper->query(18); + rmaxeverbig = fix_hyper->query(19); + allghost_toofar = fix_hyper->query(20); + biasoverlap = fix_hyper->query(21); } } if (me == 0) { - if (screen) { - fprintf(screen,"Cummulative quantities for fix hyper:\n"); - fprintf(screen," hyper time = %g\n",t_hyper); - fprintf(screen," time boost factor = %g\n",t_hyper/(nsteps*update->dt)); - fprintf(screen," event timesteps = %d\n",nevent_running); - fprintf(screen," # of atoms in events = %d\n",nevent_atoms_running); - fprintf(screen,"Quantities for this hyper run:\n"); - fprintf(screen," event timesteps = %d\n",nevent); - fprintf(screen," # of atoms in events = %d\n",nevent_atoms); - fprintf(screen," max length of any bond = %g\n",maxbondlen); - fprintf(screen," max drift distance of any atom = %g\n",maxdrift); - fprintf(screen," fraction of steps & bonds with zero bias = %g\n", - fraczero); - fprintf(screen,"Current quantities:\n"); - fprintf(screen," ave bonds/atom = %g\n",avebonds); + FILE *out; + for (int iout = 0; iout < 2; iout++) { + if (iout == 0) out = screen; + if (iout == 1) out = logfile; + if (!out) continue; + fprintf(out,"Cummulative quantities for fix hyper:\n"); + fprintf(out," hyper time = %g\n",t_hyper); + fprintf(out," time boost factor = %g\n",t_hyper/(nsteps*update->dt)); + fprintf(out," event timesteps = %d\n",nevent_running); + fprintf(out," # of atoms in events = %d\n",nevent_atoms_running); + fprintf(out,"Quantities for this hyper run:\n"); + fprintf(out," event timesteps = %d\n",nevent); + fprintf(out," # of atoms in events = %d\n",nevent_atoms); + fprintf(out," max length of any bond = %g\n",maxbondlen); + fprintf(out," max drift distance of any atom = %g\n",maxdrift); + fprintf(out," fraction of biased bonds with zero bias = %g\n",fraczero); + fprintf(out," fraction of biased bonds with negative strain = %g\n", + fracneg); + fprintf(out,"Current quantities:\n"); + fprintf(out," ave bonds/atom = %g\n",avebonds); if (hyperstyle == LOCAL) { - fprintf(screen,"Cummulative quantities specific to fix hyper/local:\n"); - fprintf(screen," # of new bonds formed = %g\n",nnewbond); - fprintf(screen," max bonds/atom = %g\n",maxbondperatom); - fprintf(screen,"Quantities for this hyper run specific to " + fprintf(out,"Cummulative quantities specific to fix hyper/local:\n"); + fprintf(out," # of new bonds formed = %g\n",nnewbond); + fprintf(out," max bonds/atom = %g\n",maxbondperatom); + fprintf(out,"Quantities for this hyper run specific to " "fix hyper/local:\n"); - fprintf(screen," ave boosted bonds/step = %g\n",avenboost); - fprintf(screen," ave boost coeff of all bonds = %g\n",aveboostcoeff); - fprintf(screen," max boost coeff of any bond = %g\n",maxboostcoeff); - fprintf(screen," min boost coeff of any bond = %g\n",minboostcoeff); - fprintf(screen," max dist from my box of any " + fprintf(out," ave biased bonds/step = %g\n",avenbias); + fprintf(out," ave bias coeff of all bonds = %g\n",avebiascoeff); + fprintf(out," min bias coeff of any bond = %g\n",minbiascoeff); + fprintf(out," max bias coeff of any bond = %g\n",maxbiascoeff); + fprintf(out," max dist from my subbox of any " "non-maxstrain bond ghost atom = %g\n",rmaxever); - fprintf(screen," max dist from my box of any bond ghost atom = %g\n", + fprintf(out," max dist from my box of any bond ghost atom = %g\n", rmaxeverbig); - fprintf(screen," count of bond ghost neighbors " + fprintf(out," count of bond ghost neighbors " "not found on reneighbor steps = %g\n",allghost_toofar); - fprintf(screen," lost bond partners = %g\n",lostbond); - fprintf(screen," ave bias coeff for lost bond partners = %g\n", - lostbondcoeff); - fprintf(screen," bias overlaps = %g\n",biasoverlap); - fprintf(screen," non-matching bias coeffs = %g\n",nonmatchbiascoeff); - fprintf(screen," CPU time for bond builds = %g\n",tbondbuild); - fprintf(screen,"Current quantities specific to fix hyper/local:\n"); - fprintf(screen," neighbor bonds/bond = %g\n",neighbondperbond); - fprintf(screen," ave boost coeff for all bonds = %g\n",aveboostnow); + fprintf(out," bias overlaps = %g\n",biasoverlap); + fprintf(out," CPU time for bond builds = %g\n",tbondbuild); + fprintf(out,"Current quantities specific to fix hyper/local:\n"); + fprintf(out," neighbor bonds/bond = %g\n",neighbondperbond); + fprintf(out," ave boost coeff for all bonds = %g\n",avebiasnow); } - fprintf(screen,"\n"); - } - - if (logfile) { - fprintf(logfile,"Cummulative quantities for fix hyper:\n"); - fprintf(logfile," hyper time = %g\n",t_hyper); - fprintf(logfile," event timesteps = %d\n",nevent_running); - fprintf(logfile," # of atoms in events = %d\n",nevent_atoms_running); - fprintf(logfile,"Quantities for this hyper run:\n"); - fprintf(logfile," event timesteps = %d\n",nevent); - fprintf(logfile," # of atoms in events = %d\n",nevent_atoms); - fprintf(logfile," max length of any bond = %g\n",maxbondlen); - fprintf(logfile," max drift distance of any atom = %g\n",maxdrift); - fprintf(logfile," fraction of steps & bonds with zero bias = %g\n", - fraczero); - fprintf(logfile,"Current quantities:\n"); - fprintf(logfile," ave bonds/atom = %g\n",avebonds); - - if (hyperstyle == LOCAL) { - fprintf(logfile,"Cummulative quantities specific tofix hyper/local:\n"); - fprintf(logfile," # of new bonds formed = %g\n",nnewbond); - fprintf(logfile," max bonds/atom = %g\n",maxbondperatom); - fprintf(logfile,"Quantities for this hyper run specific to " - "fix hyper/local:\n"); - fprintf(logfile," ave boosted bonds/step = %g\n",avenboost); - fprintf(logfile," ave boost coeff of all bonds = %g\n",aveboostcoeff); - fprintf(logfile," max boost coeff of any bond = %g\n",maxboostcoeff); - fprintf(logfile," min boost coeff of any bond = %g\n",minboostcoeff); - fprintf(logfile," max dist from my box of any " - "non-maxstrain bond ghost atom = %g\n",rmaxever); - fprintf(logfile," max dist from my box of any bond ghost atom = %g\n", - rmaxeverbig); - fprintf(logfile," count of ghost bond neighbors " - "not found on reneighbor steps = %g\n",allghost_toofar); - fprintf(logfile," lost bond partners = %g\n",lostbond); - fprintf(logfile," ave bias coeff for lost bond partners = %g\n", - lostbondcoeff); - fprintf(logfile," bias overlaps = %g\n",biasoverlap); - fprintf(logfile," non-matching bias coeffs = %g\n",nonmatchbiascoeff); - fprintf(logfile," CPU time for bond builds = %g\n",tbondbuild); - fprintf(logfile,"Current quantities specific to fix hyper/local:\n"); - fprintf(logfile," neighbor bonds/bond = %g\n",neighbondperbond); - fprintf(logfile," ave boost coeff for all bonds = %g\n",aveboostnow); - } - fprintf(logfile,"\n"); + fprintf(out,"\n"); } } diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index a5bf8db557..d60fe7af14 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -32,7 +32,7 @@ using namespace FixConst; enum{X,V,F,COMPUTE,FIX,VARIABLE}; enum{ONE,RUNNING}; enum{SCALAR,VECTOR,WINDOW}; -enum{GLOBAL,PERATOM,LOCAL}; +enum{DEFAULT,GLOBAL,PERATOM,LOCAL}; enum{IGNORE,END,EXTRA}; #define INVOKED_SCALAR 1 @@ -46,8 +46,10 @@ enum{IGNORE,END,EXTRA}; FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - nvalues(0), which(NULL), argindex(NULL), value2index(NULL), ids(NULL), fp(NULL), stats_list(NULL), - bin(NULL), bin_total(NULL), bin_all(NULL), bin_list(NULL), coord(NULL), vector(NULL) + nvalues(0), which(NULL), argindex(NULL), value2index(NULL), + ids(NULL), fp(NULL), stats_list(NULL), + bin(NULL), bin_total(NULL), bin_all(NULL), bin_list(NULL), + coord(NULL), vector(NULL) { if (narg < 10) error->all(FLERR,"Illegal fix ave/histo command"); @@ -188,9 +190,8 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : memory->sfree(earg); } - // setup and error check - // kind = inputs are all global, or all per-atom, or all local - // for fix inputs, check that fix frequency is acceptable + // check input args for kind consistency + // all inputs must all be global, per-atom, or local if (nevery <= 0 || nrepeat <= 0 || nfreq <= 0) error->all(FLERR,"Illegal fix ave/histo command"); @@ -201,40 +202,65 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (ave != RUNNING && overwrite) error->all(FLERR,"Illegal fix ave/histo command"); - int kindflag; + int kindglobal,kindperatom,kindlocal; + for (int i = 0; i < nvalues; i++) { - if (which[i] == X || which[i] == V || which[i] == F) kindflag = PERATOM; - else if (which[i] == COMPUTE) { + kindglobal = kindperatom = kindlocal = 0; + + if (which[i] == X || which[i] == V || which[i] == F) { + kindperatom = 1; + + } else if (which[i] == COMPUTE) { int c_id = modify->find_compute(ids[i]); if (c_id < 0) error->all(FLERR,"Fix ave/histo input is invalid compute"); Compute *compute = modify->compute[c_id]; + // computes can produce multiple kinds of output if (compute->scalar_flag || compute->vector_flag || compute->array_flag) - kindflag = GLOBAL; - else if (compute->peratom_flag) kindflag = PERATOM; - else if (compute->local_flag) kindflag = LOCAL; - else error->all(FLERR,"Fix ave/histo input is invalid compute"); + kindglobal = 1; + if (compute->peratom_flag) kindperatom = 1; + if (compute->local_flag) kindlocal = 1; + } else if (which[i] == FIX) { int f_id = modify->find_fix(ids[i]); if (f_id < 0) error->all(FLERR,"Fix ave/histo input is invalid fix"); Fix *fix = modify->fix[f_id]; + // fixes can produce multiple kinds of output if (fix->scalar_flag || fix->vector_flag || fix->array_flag) - kindflag = GLOBAL; - else if (fix->peratom_flag) kindflag = PERATOM; - else if (fix->local_flag) kindflag = LOCAL; - else error->all(FLERR,"Fix ave/histo input is invalid fix"); + kindglobal = 1; + if (fix->peratom_flag) kindperatom = 1; + if (fix->local_flag) kindlocal = 1; + } else if (which[i] == VARIABLE) { int ivariable = input->variable->find(ids[i]); - if (ivariable < 0) error->all(FLERR,"Fix ave/histo input is invalid variable"); - if (input->variable->equalstyle(ivariable)) kindflag = GLOBAL; - else if (input->variable->atomstyle(ivariable)) kindflag = PERATOM; - else error->all(FLERR,"Fix ave/histo input is invalid variable"); + if (ivariable < 0) + error->all(FLERR,"Fix ave/histo input is invalid variable"); + // variables only produce one kind of output + if (input->variable->equalstyle(ivariable)) kindglobal = 1; + else if (input->variable->atomstyle(ivariable)) kindperatom = 1; + else error->all(FLERR,"Fix ave/histo input is invalid kind of variable"); + } + + if (kind == DEFAULT) { + if (kindglobal + kindperatom + kindlocal > 1) + error->all(FLERR,"Fix ave/histo input kind is ambiguous"); + if (kindglobal) kind = GLOBAL; + if (kindperatom) kind = PERATOM; + if (kindlocal) kind = LOCAL; + } else if (kind == GLOBAL) { + if (!kindglobal) + error->all(FLERR,"Fix ave/histo input kind is invalid"); + } else if (kind == PERATOM) { + if (!kindperatom) + error->all(FLERR,"Fix ave/histo input kind is invalid"); + } else if (kind == LOCAL) { + if (!kindlocal) + error->all(FLERR,"Fix ave/histo input kind is invalid"); } - if (i == 0) kind = kindflag; - else if (kindflag != kind) - error->all(FLERR, - "Fix ave/histo inputs are not all global, peratom, or local"); } + // more error checks + // for fix inputs, check that fix frequency is acceptable + if (kind == PERATOM && mode == SCALAR) error->all(FLERR, "Fix ave/histo cannot input per-atom values in scalar mode"); @@ -919,6 +945,7 @@ void FixAveHisto::options(int iarg, int narg, char **arg) // option defaults fp = NULL; + kind = DEFAULT; ave = ONE; startstep = 0; mode = SCALAR; @@ -942,6 +969,13 @@ void FixAveHisto::options(int iarg, int narg, char **arg) } } iarg += 2; + } else if (strcmp(arg[iarg],"kind") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/histo command"); + if (strcmp(arg[iarg+1],"global") == 0) kind = GLOBAL; + else if (strcmp(arg[iarg+1],"peratom") == 0) kind = PERATOM; + else if (strcmp(arg[iarg+1],"local") == 0) kind = LOCAL; + else error->all(FLERR,"Illegal fix ave/histo command"); + iarg += 2; } else if (strcmp(arg[iarg],"ave") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/histo command"); if (strcmp(arg[iarg+1],"one") == 0) ave = ONE; diff --git a/src/thermo.cpp b/src/thermo.cpp index ddbbd0f496..3e777edf82 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -380,9 +380,8 @@ void Thermo::compute(int flag) loc += sprintf(&line[loc],format[ifield],dvalue); else if (vtype[ifield] == INT) loc += sprintf(&line[loc],format[ifield],ivalue); - else if (vtype[ifield] == BIGINT) { + else if (vtype[ifield] == BIGINT) loc += sprintf(&line[loc],format[ifield],bivalue); - } } // print line to screen and logfile From ab0c35be9357d36f3d0600206679753fb14a86ae Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 4 Mar 2019 08:04:11 -0700 Subject: [PATCH 042/243] Commit JT 030419 - correction of pair_spin calculations - corrects an error between i and ii lists in single/pair calc. --- src/SPIN/pair_spin_dmi.cpp | 104 ++++++++++++++++++----------- src/SPIN/pair_spin_exchange.cpp | 88 +++++++++++++++--------- src/SPIN/pair_spin_magelec.cpp | 56 ++++++++++------ src/SPIN/pair_spin_neel.cpp | 114 ++++++++++++++++++++------------ 4 files changed, 228 insertions(+), 134 deletions(-) diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 18682fdb9f..8496e40f99 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -329,7 +329,9 @@ void PairSpinDmi::compute(int eflag, int vflag) } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + update the pair interactions fmi acting on the spin ii +------------------------------------------------------------------------- */ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) { @@ -341,52 +343,76 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,jnum,itype,jtype,ntypes; + int k,locflag; + int *jlist,*numneigh,**firstneigh; double rsq, inorm; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; + + // check if interaction applies to type of ii - i = ilist[ii]; - itype = type[i]; - - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (int jj = 0; jj < jnum; jj++) { - - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - - delx = xi[0] - x[j][0]; - dely = xi[1] - x[j][1]; - delz = xi[2] - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - inorm = 1.0/sqrt(rsq); - eij[0] = -inorm*delx; - eij[1] = -inorm*dely; - eij[2] = -inorm*delz; - - local_cut2 = cut_spin_dmi[itype][jtype]*cut_spin_dmi[itype][jtype]; - - if (rsq <= local_cut2) { - compute_dmi(i,j,eij,fmi,spj); - } - + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); } + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction + + //i = ilist[ii]; + if (locflag == 1) { + + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; + + jlist = firstneigh[ii]; + jnum = numneigh[ii]; + + for (int jj = 0; jj < jnum; jj++) { + + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + inorm = 1.0/sqrt(rsq); + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; + + local_cut2 = cut_spin_dmi[itype][jtype]*cut_spin_dmi[itype][jtype]; + + if (rsq <= local_cut2) { + compute_dmi(ii,j,eij,fmi,spj); + } + } + } } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 67229c2423..b2955aafb2 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -318,7 +318,6 @@ void PairSpinExchange::compute(int eflag, int vflag) void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) { - int *type = atom->type; double **x = atom->x; double **sp = atom->sp; @@ -327,46 +326,70 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,jnum,itype,jtype,ntypes; + int k,locflag; + int *jlist,*numneigh,**firstneigh; double rsq; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - i = ilist[ii]; - itype = type[i]; + // check if interaction applies to type of ii - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (int jj = 0; jj < jnum; jj++) { - - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - local_cut2 = cut_spin_exchange[itype][jtype]*cut_spin_exchange[itype][jtype]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - - delx = xi[0] - x[j][0]; - dely = xi[1] - x[j][1]; - delz = xi[2] - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq <= local_cut2) { - compute_exchange(i,j,rsq,fmi,spj); - } + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); } + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction + + if (locflag == 1) { + + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; + + jlist = firstneigh[ii]; + jnum = numneigh[ii]; + + for (int jj = 0; jj < jnum; jj++) { + + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + local_cut2 = cut_spin_exchange[itype][jtype]*cut_spin_exchange[itype][jtype]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq <= local_cut2) { + compute_exchange(ii,j,rsq,fmi,spj); + } + } + } } /* ---------------------------------------------------------------------- @@ -528,3 +551,4 @@ void PairSpinExchange::read_restart_settings(FILE *fp) MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } + diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index f85d69e222..a7357f61e3 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -319,7 +319,9 @@ void PairSpinMagelec::compute(int eflag, int vflag) } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + update the pair interactions fmi acting on the spin ii +------------------------------------------------------------------------- */ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) { @@ -331,30 +333,48 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,inum,jnum,itype,jtype; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,jnum,itype,jtype,ntypes; + int k,locflag; + int *jlist,*numneigh,**firstneigh; double rsq, inorm; - inum = list->inum; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; + + // check if interaction applies to type of ii - // compute pair if + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); + } - if (ii < inum) { + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction - i = ilist[ii]; - itype = type[i]; + if (locflag == 1) { - xi[0] = xi[1] = xi[2] = 0.0; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; - jlist = firstneigh[i]; - jnum = numneigh[i]; + jlist = firstneigh[ii]; + jnum = numneigh[ii]; for (int jj = 0; jj < jnum; jj++) { @@ -377,12 +397,10 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) eij[2] = -inorm*delz; if (rsq <= local_cut2) { - compute_magelec(i,j,eij,fmi,spj); + compute_magelec(ii,j,eij,fmi,spj); } } - - } - + } } /* ---------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 55f537cf4f..bd12832a8d 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -330,7 +330,9 @@ void PairSpinNeel::compute(int eflag, int vflag) } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + update the pair interactions fmi acting on the spin ii +------------------------------------------------------------------------- */ void PairSpinNeel::compute_single_pair(int ii, double fmi[3]) { @@ -342,57 +344,81 @@ void PairSpinNeel::compute_single_pair(int ii, double fmi[3]) double xi[3], rij[3], eij[3]; double spi[3], spj[3]; - int i,j,jnum,itype,jtype; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,jnum,itype,jtype,ntypes; + int k,locflag; + int *jlist,*numneigh,**firstneigh; double rsq, inorm; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; + + // check if interaction applies to type of ii - i = ilist[ii]; - itype = type[i]; - - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - - eij[0] = eij[1] = eij[2] = 0.0; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (int jj = 0; jj < jnum; jj++) { - - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - local_cut2 = cut_spin_neel[itype][jtype]*cut_spin_neel[itype][jtype]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - inorm = 1.0/sqrt(rsq); - eij[0] = inorm*rij[0]; - eij[1] = inorm*rij[1]; - eij[2] = inorm*rij[2]; - - if (rsq <= local_cut2) { - compute_neel(i,j,rsq,eij,fmi,spi,spj); - } + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); } + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction + + if (locflag == 1) { + + spi[0] = sp[ii][0]; + spi[1] = sp[ii][1]; + spi[2] = sp[ii][2]; + + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; + + eij[0] = eij[1] = eij[2] = 0.0; + + jlist = firstneigh[ii]; + jnum = numneigh[ii]; + + for (int jj = 0; jj < jnum; jj++) { + + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + local_cut2 = cut_spin_neel[itype][jtype]*cut_spin_neel[itype][jtype]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + inorm = 1.0/sqrt(rsq); + eij[0] = inorm*rij[0]; + eij[1] = inorm*rij[1]; + eij[2] = inorm*rij[2]; + + if (rsq <= local_cut2) { + compute_neel(ii,j,rsq,eij,fmi,spi,spj); + } + } + } } /* ---------------------------------------------------------------------- */ From 0d1524526a807b618617b1af5a0930f1bebd6a7b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Mar 2019 17:26:55 -0500 Subject: [PATCH 043/243] work around the remaining variable length array cases. fix an off-by-one error, too. --- src/USER-SMTBQ/pair_smtbq.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index 1931754427..f3b85e9a9b 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -2895,11 +2895,12 @@ void PairSMTBQ::groupSurface_QEq() void PairSMTBQ::groupQEqAllParallel_QEq() { int ii,i,jj,j,kk,k,itype,jtype,ktype,jnum,m,gp,zz,z,kgp; - int iproc,team_elt[10][nproc],team_QEq[10][nproc][5]; + int iproc; // ,team_elt[10][nproc],team_QEq[10][nproc][5]; + int **team_elt,***team_QEq; int *ilist,*jlist,*numneigh,**firstneigh,ngp,igp; double delr[3],xtmp,ytmp,ztmp,rsq; int **flag_gp, *nelt, **tab_gp; - int QEq,QEqall[nproc]; + int QEq,*QEqall; double **x = atom->x; int *type = atom->type; @@ -2927,6 +2928,9 @@ void PairSMTBQ::groupQEqAllParallel_QEq() memory->create(nelt,nall,"pair:nelt"); memory->create(tab_gp,10,nall,"pair:flag_gp"); + memory->create(team_elt,10,nproc,"pair:team_elt"); + memory->create(team_QEq,10,nproc,5,"pair:team_QEq"); + memory->create(QEqall,nproc,"pair:QEqall"); for (i = 0; i < nall ; i++) { flag_QEq[i] = 0; } for (i = 0; i < 10*nproc; i++) { @@ -3002,6 +3006,9 @@ void PairSMTBQ::groupQEqAllParallel_QEq() memory->destroy(tab_gp); memory->destroy(nelt); + memory->destroy(team_elt); + memory->destroy(team_QEq); + memory->destroy(QEqall); return; } // ::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -3339,6 +3346,9 @@ void PairSMTBQ::groupQEqAllParallel_QEq() memory->destroy(tab_gp); memory->destroy(nelt); + memory->destroy(team_elt); + memory->destroy(team_QEq); + memory->destroy(QEqall); } /* ---------------------------------------------------------------------- */ @@ -3346,7 +3356,8 @@ void PairSMTBQ::groupQEqAllParallel_QEq() void PairSMTBQ::Init_charge(int * /*nQEq*/, int * /*nQEqa*/, int * /*nQEqc*/) { int ii,i,gp,itype; - int *ilist,test[nteam],init[nteam]; + int *ilist; + std::vector test(cluster),init(cluster); double bound,tot,totll; int inum = list->inum; @@ -3376,7 +3387,8 @@ void PairSMTBQ::Init_charge(int * /*nQEq*/, int * /*nQEqa*/, int * /*nQEqc*/) } } - MPI_Allreduce(test,init,nteam+1,MPI_INT,MPI_SUM,world); + // TODO + MPI_Allreduce(test.data(),init.data(),cluster,MPI_INT,MPI_SUM,world); // On fait que sur les atomes hybrides!!! // ---------------------------------------- From 6ed8fbbd515ddae8543b6342433f73728f8ef3b5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Mar 2019 18:01:55 -0500 Subject: [PATCH 044/243] handle uninitialized data access issues and out-of-bounds access for single element calculations --- src/USER-SMTBQ/pair_smtbq.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index f3b85e9a9b..91ba612986 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -405,7 +405,13 @@ void PairSMTBQ::read_file(char *file) verbose = 1; verbose = 0; - // open file on all processors + coordOxBB = 0.0; + coordOxBulk = 0.0; + coordOxSurf = 0.0; + ROxBB = 0.0; + ROxSurf = 0.0; + + // open file on all processors FILE *fp; fp = force->open_potential(file); if ( fp == NULL ) { @@ -455,14 +461,12 @@ void PairSMTBQ::read_file(char *file) // load up parameter settings and error check their values - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), + nparams = maxparam = num_atom_types; + params = (Param *) memory->create(params,maxparam*sizeof(Param), "pair:params"); - maxintparam += m; - intparams = (Intparam *) memory->srealloc(intparams,(maxintparam+1)*sizeof(Intparam), + maxintparam = m; + intparams = (Intparam *) memory->create(intparams,(maxintparam+1)*sizeof(Intparam), "pair:intparams"); - } for (i=0; i < num_atom_types; i++) params[i].nom = (char*) malloc(sizeof(char)*3); @@ -839,7 +843,8 @@ void PairSMTBQ::read_file(char *file) } //A adapter au STO - ncov = min((params[0].sto)*(params[0].n0),(params[1].sto)*(params[1].n0)); + for (i=1,ncov=params[0].sto*params[0].n0; i < nparams; ++i) + ncov = min(ncov,(params[1].sto)*(params[1].n0)); if (verbose) printf (" Parametre ncov = %f\n",ncov); if (verbose) printf (" ********************************************* \n"); From fa7b5ecfa3c284c3724d3cf3dcd05126be134c47 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 5 Mar 2019 00:45:40 -0500 Subject: [PATCH 045/243] disable chimet array in pair style smtbq, which was never set anywhere --- src/USER-SMTBQ/pair_smtbq.cpp | 10 ++-------- src/USER-SMTBQ/pair_smtbq.h | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index 91ba612986..5c3189fc31 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -123,7 +123,6 @@ PairSMTBQ::PairSMTBQ(LAMMPS *lmp) : Pair(lmp) sbcov = NULL; coord = NULL; sbmet = NULL; - chimet = NULL; ecov = NULL; potmad = NULL; @@ -210,7 +209,6 @@ PairSMTBQ::~PairSMTBQ() memory->destroy(potmad); memory->destroy(potself); memory->destroy(potcov); - memory->destroy(chimet); memory->destroy(nvsm); memory->destroy(vsm);; @@ -875,7 +873,6 @@ void PairSMTBQ::compute(int eflag, int vflag) memory->destroy(sbcov); memory->destroy(coord); memory->destroy(sbmet); - memory->destroy(chimet); memory->destroy(flag_QEq); memory->destroy(qf); memory->destroy(q1); @@ -891,7 +888,6 @@ void PairSMTBQ::compute(int eflag, int vflag) memory->create(sbcov,nmax,"pair:sbcov"); memory->create(coord,nmax,"pair:coord"); memory->create(sbmet,nmax,"pair:sbmet"); - memory->create(chimet,nmax,"pair:chimet"); memory->create(flag_QEq,nmax,"pair:flag_QEq"); memory->create(qf,nmax,"pair:qf"); memory->create(q1,nmax,"pair:q1"); @@ -1328,10 +1324,7 @@ void PairSMTBQ::tabqeq() memory->create(sbcov,nmax,"pair:sbcov"); memory->create(coord,nmax,"pair:coord"); memory->create(sbmet,nmax,"pair:sbmet"); - memory->create(chimet,nmax,"pair:chimet"); - // memory->create(nvsm,nmax,"pair:nvsm"); - // memory->create(vsm,nmax,nmax,"pair:vsm"); memory->create(flag_QEq,nmax,"pair:flag_QEq"); memory->create(qf,nmax,"pair:qf"); @@ -2681,7 +2674,8 @@ void PairSMTBQ::Charge() gp = flag_QEq[i]; qf[i] = 0.0; - qf[i] = potself[i]+potmad[i]+potcov[i]+chimet[i] ; + // AK: chimet is not set anywhere + qf[i] = potself[i]+potmad[i]+potcov[i]; // +chimet[i]; Transf[gp] += qf[i]; } diff --git a/src/USER-SMTBQ/pair_smtbq.h b/src/USER-SMTBQ/pair_smtbq.h index ac8ed70ac0..05e4b67242 100644 --- a/src/USER-SMTBQ/pair_smtbq.h +++ b/src/USER-SMTBQ/pair_smtbq.h @@ -90,7 +90,7 @@ protected: double coordOxBulk,coordOxSurf,ROxSurf,coordOxBB,ROxBB; // Covalent interaction - double *ecov, *potmad, *potself, *potcov, *chimet; + double *ecov, *potmad, *potself, *potcov; //, *chimet; double **tabsmb,**dtabsmb, **tabsmr, **dtabsmr, *sbcov, *sbmet; double ncov; From 1e573bd557e6b79b0d94fc7bed1b048f76b2c2ac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 5 Mar 2019 08:35:53 -0500 Subject: [PATCH 046/243] when compiling LAMMPS in a git checkout, embed and print git branch and revision info into the executable --- cmake/CMakeLists.txt | 28 +++++++++++++++++++++++++++- src/Makefile | 21 +++++++++++++++++++-- src/Purge.list | 1 + src/info.cpp | 10 +++++++--- src/lammps.cpp | 5 +++++ src/lammps.h | 1 + 6 files changed, 60 insertions(+), 6 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index d9c87bdf5b..f54cf9d887 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -11,6 +11,8 @@ get_filename_component(LAMMPS_LIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../lib get_filename_component(LAMMPS_LIB_BINARY_DIR ${CMAKE_BINARY_DIR}/lib ABSOLUTE) get_filename_component(LAMMPS_DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../doc ABSOLUTE) +find_package(Git) + # by default, install into $HOME/.local (not /usr/local), so that no root access (and sudo!!) is needed if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "default install path" FORCE ) @@ -85,7 +87,7 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" BTYPE) # this is fast, so check for it all the time message(STATUS "Running check for auto-generated files from make-based build system") file(GLOB SRC_AUTOGEN_FILES ${LAMMPS_SOURCE_DIR}/style_*.h) -list(APPEND SRC_AUTOGEN_FILES ${LAMMPS_SOURCE_DIR}/lmpinstalledpkgs.h) +list(APPEND SRC_AUTOGEN_FILES ${LAMMPS_SOURCE_DIR}/lmpinstalledpkgs.h ${LAMMPS_SOURCE_DIR}/lmpgitversion.h) foreach(_SRC ${SRC_AUTOGEN_FILES}) get_filename_component(FILENAME "${_SRC}" NAME) if(EXISTS ${LAMMPS_SOURCE_DIR}/${FILENAME}) @@ -1326,6 +1328,30 @@ message(STATUS "Generating lmpinstalledpkgs.h...") file(WRITE "${LAMMPS_STYLE_HEADERS_DIR}/lmpinstalledpkgs.h.tmp" "${temp}" ) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HEADERS_DIR}/lmpinstalledpkgs.h.tmp" "${LAMMPS_STYLE_HEADERS_DIR}/lmpinstalledpkgs.h") +###################################### +# Generate lmpgitversion.h +###################################### +set(temp "#ifndef LMP_GIT_VERSION_H\n#define LMP_GIT_VERSION_H\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_version[] =") +if(GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe HEAD + OUTPUT_VARIABLE temp_git_version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE temp_git_branch + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(temp_git "${temp_git_branch} / ${temp_git_version}") +else() + set(temp_git "") +endif() + +set(temp "${temp} \"${temp_git}\";\n#endif\n\n") +message(STATUS "Generating lmpgitversion.h...") +file(WRITE "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${temp}" ) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h") + ########################################### # Actually add executable and lib to build ############################################ diff --git a/src/Makefile b/src/Makefile index f954d84e5d..058a415238 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,7 +19,7 @@ OBJDIR = Obj_$@ OBJSHDIR = Obj_shared_$@ SRC = $(wildcard *.cpp) -INC = $(filter-out lmpinstalledpkgs.h,$(wildcard *.h)) +INC = $(filter-out lmpinstalledpkgs.h lmpgitversion.h,$(wildcard *.h)) OBJ = $(SRC:.cpp=.o) SRCLIB = $(filter-out main.cpp,$(SRC)) @@ -167,6 +167,23 @@ lmpinstalledpkgs.h: $(SRC) $(INC) mv ${TMPNAME}.lmpinstalled lmpinstalledpkgs.h || rm ${TMPNAME}.lmpinstalled ; \ else mv ${TMPNAME}.lmpinstalled lmpinstalledpkgs.h ; fi +gitversion: + @echo 'Gathering git version information' + @echo '#ifndef LMP_GIT_VERSION_H' > ${TMPNAME}.lmpgitversion + @echo '#define LMP_GIT_VERSION_H' >> ${TMPNAME}.lmpgitversion + @echo 'const char LAMMPS_NS::LAMMPS::git_version[] = ' >> ${TMPNAME}.lmpgitversion + @if (type git && git describe HEAD ) >> /dev/null 2>> /dev/null ; then \ + export v1=$$(git rev-parse --abbrev-ref HEAD); export v2=$$(git describe HEAD); \ + echo "\"$${v1} / $${v2}\";" >> ${TMPNAME}.lmpgitversion ; \ + else \ + echo '"";' >> ${TMPNAME}.lmpgitversion ; \ + fi + @echo '#endif' >> ${TMPNAME}.lmpgitversion + @if [ -f lmpgitversion.h ]; \ + then test "`diff --brief ${TMPNAME}.lmpgitversion lmpgitversion.h`" != "" && \ + mv ${TMPNAME}.lmpgitversion lmpgitversion.h || rm ${TMPNAME}.lmpgitversion ; \ + else mv ${TMPNAME}.lmpgitversion lmpgitversion.h ; fi + # Build LAMMPS in one of 4 modes # exe = exe with static compile in Obj_machine (default) # shexe = exe with shared compile in Obj_shared_machine @@ -180,7 +197,7 @@ lmpinstalledpkgs.h: $(SRC) $(INC) -f MAKE/MACHINES/Makefile.$@ -o -f MAKE/MINE/Makefile.$@ @if [ ! -d $(objdir) ]; then mkdir $(objdir); fi @$(SHELL) Make.sh style - @$(MAKE) $(MFLAGS) lmpinstalledpkgs.h + @$(MAKE) $(MFLAGS) lmpinstalledpkgs.h gitversion @echo 'Compiling LAMMPS for machine $@' @if [ -f MAKE/MACHINES/Makefile.$@ ]; \ then cp MAKE/MACHINES/Makefile.$@ $(objdir)/Makefile; fi diff --git a/src/Purge.list b/src/Purge.list index 32b42f5ef1..59c35efca5 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -24,6 +24,7 @@ style_nstencil.h style_ntopo.h # other auto-generated files lmpinstalledpkgs.h +lmpgitversion.h # renamed on 7 January 2019 pair_lebedeva.cpp pair_lebedeva.h diff --git a/src/info.cpp b/src/info.cpp index 983a1e9e92..f17a00b8d2 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -260,9 +260,13 @@ void Info::command(int narg, char **arg) fprintf(out,"Printed on %s\n",ctime(&now)); if (flags & CONFIG) { - fprintf(out,"\nLAMMPS version: %s / %s\n\n", - universe->version, universe->num_ver); - + if (strlen(lmp->git_version) > 0) { + fprintf(out,"\nLAMMPS version: %s / %s\nGit revision: %s\n\n", + universe->version, universe->num_ver,lmp->git_version); + } else { + fprintf(out,"\nLAMMPS version: %s / %s\n\n", + universe->version, universe->num_ver); + } const char *infobuf = get_os_info(); fprintf(out,"OS information: %s\n\n",infobuf); delete[] infobuf; diff --git a/src/lammps.cpp b/src/lammps.cpp index 8a23a4297b..80ea1d8c9d 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -52,6 +52,7 @@ #include "error.h" #include "lmpinstalledpkgs.h" +#include "lmpgitversion.h" using namespace LAMMPS_NS; @@ -418,6 +419,10 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((universe->me == 0) && !helpflag) { if (screen) fprintf(screen,"LAMMPS (%s)\n",universe->version); if (logfile) fprintf(logfile,"LAMMPS (%s)\n",universe->version); + if (strlen(git_version) > 0) { + if (screen) fprintf(screen,"Git revision (%s)\n",git_version); + if (logfile) fprintf(logfile,"Git revision (%s)\n",git_version); + } } // universe is one or more worlds, as setup by partition switch diff --git a/src/lammps.h b/src/lammps.h index 151b4fc49b..7ae7ab7ecb 100644 --- a/src/lammps.h +++ b/src/lammps.h @@ -64,6 +64,7 @@ class LAMMPS { class CiteMe *citeme; // citation info static const char * installed_packages[]; + static const char git_version[]; LAMMPS(int, char **, MPI_Comm); ~LAMMPS(); From 1c7d1919882e76a688ab2e37962a51c999bbbdbf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 5 Mar 2019 09:03:12 -0500 Subject: [PATCH 047/243] also print git version (if available) in multi-partition runs and in help message --- src/lammps.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lammps.cpp b/src/lammps.cpp index 80ea1d8c9d..126a88b3e1 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -497,11 +497,15 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((universe->me == 0) && (!helpflag)) { if (universe->uscreen) { fprintf(universe->uscreen,"LAMMPS (%s)\n",universe->version); + if (strlen(git_version) > 0) + fprintf(universe->uscreen,"Git revision (%s)\n",git_version); fprintf(universe->uscreen,"Running on %d partitions of processors\n", universe->nworlds); } if (universe->ulogfile) { fprintf(universe->ulogfile,"LAMMPS (%s)\n",universe->version); + if (strlen(git_version) > 0) + fprintf(universe->ulogfile,"Git revision (%s)\n",git_version); fprintf(universe->ulogfile,"Running on %d partitions of processors\n", universe->nworlds); } @@ -510,10 +514,14 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((me == 0) && (!helpflag)) { if (screen) { fprintf(screen,"LAMMPS (%s)\n",universe->version); + if (strlen(git_version) > 0) + fprintf(screen,"Git revision (%s)\n",git_version); fprintf(screen,"Processor partition = %d\n",universe->iworld); } if (logfile) { fprintf(logfile,"LAMMPS (%s)\n",universe->version); + if (strlen(git_version) > 0) + fprintf(logfile,"Git revision (%s)\n",git_version); fprintf(logfile,"Processor partition = %d\n",universe->iworld); } } @@ -903,9 +911,16 @@ void LAMMPS::help() // general help message about command line and flags + if (strlen(git_version) > 0) { + fprintf(fp, + "\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " + LAMMPS_VERSION "\nGit revision (%s)\n\n",git_version); + } else { + fprintf(fp, + "\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " + LAMMPS_VERSION "\n\n"); + } fprintf(fp, - "\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " - LAMMPS_VERSION "\n\n" "Usage example: %s -var t 300 -echo screen -in in.alloy\n\n" "List of command line options supported by this LAMMPS executable:\n\n" "-echo none/screen/log/both : echoing of input script (-e)\n" From bfa950a7e906b0f09233b72f177a978887fdeaa7 Mon Sep 17 00:00:00 2001 From: mkanski Date: Tue, 5 Mar 2019 22:40:10 +0100 Subject: [PATCH 048/243] Added initialization for grown arrays --- src/USER-REAXC/fix_reaxc.cpp | 12 ++++++++---- src/USER-REAXC/fix_reaxc.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/USER-REAXC/fix_reaxc.cpp b/src/USER-REAXC/fix_reaxc.cpp index 1323ff4da7..361733f3ca 100644 --- a/src/USER-REAXC/fix_reaxc.cpp +++ b/src/USER-REAXC/fix_reaxc.cpp @@ -41,16 +41,15 @@ FixReaxC::FixReaxC(LAMMPS *lmp,int narg, char **arg) : { // perform initial allocation of atom-based arrays // register with atom class - + + oldnmax = 0; num_bonds = NULL; num_hbonds = NULL; grow_arrays(atom->nmax); atom->add_callback(0); // initialize arrays to MIN so atom migration is OK the 1st time - - for (int i = 0; i < atom->nmax; i++) - num_bonds[i] = num_hbonds[i] = MIN_REAX_BONDS; + // it is done in grow_arrays() now // set comm sizes needed by this fix @@ -98,6 +97,11 @@ void FixReaxC::grow_arrays(int nmax) { memory->grow(num_bonds,nmax,"reaxc:num_bonds"); memory->grow(num_hbonds,nmax,"reaxc:num_hbonds"); + for (int i = oldnmax; i < nmax; i++) { + num_hbonds[i] = MIN_REAX_HBONDS; + num_bonds[i] = MIN_REAX_BONDS; + } + oldnmax = nmax; } /* ---------------------------------------------------------------------- diff --git a/src/USER-REAXC/fix_reaxc.h b/src/USER-REAXC/fix_reaxc.h index 0e173f5ece..6a37002847 100644 --- a/src/USER-REAXC/fix_reaxc.h +++ b/src/USER-REAXC/fix_reaxc.h @@ -56,6 +56,7 @@ class FixReaxC : public Fix { int maxhbonds; // max # of Hbonds for any atom int *num_bonds; // # of bonds for each atom int *num_hbonds; // # of Hbonds for each atom + int oldnmax; // arrays' size before growing }; } From c5a3b034ce54ad213fe1c30f4636dc922f5607cf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 5 Mar 2019 17:29:34 -0500 Subject: [PATCH 049/243] implement various suggestions to improve the use of git information gathered --- cmake/CMakeLists.txt | 36 ++++++++++++++++++++++++++---------- src/Makefile | 18 +++++++++++++----- src/info.cpp | 7 ++++--- src/lammps.cpp | 22 ++++------------------ src/lammps.h | 6 +++++- 5 files changed, 52 insertions(+), 37 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f54cf9d887..ec32049445 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1332,22 +1332,38 @@ execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HE # Generate lmpgitversion.h ###################################### set(temp "#ifndef LMP_GIT_VERSION_H\n#define LMP_GIT_VERSION_H\n") -set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_version[] =") +set(temp_git_commit "(unknown)") +set(temp_git_branch "(unknown)") +set(temp_git_describe "(unknown)") +set(temp_git_info "false") if(GIT_FOUND) execute_process(COMMAND ${GIT_EXECUTABLE} describe HEAD - OUTPUT_VARIABLE temp_git_version + RESULT_VARIABLE temp_in_git_checkout ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE temp_git_branch - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(temp_git "${temp_git_branch} / ${temp_git_version}") -else() - set(temp_git "") + if(temp_in_git_checkout EQUAL 0) + set(temp_git_info "true") + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE temp_git_commit + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE temp_git_branch + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty=-modified + OUTPUT_VARIABLE temp_git_describe + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() endif() -set(temp "${temp} \"${temp_git}\";\n#endif\n\n") +set(temp "${temp}const bool LAMMPS_NS::LAMMPS::has_git_info = ${temp_git_info};\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_commit[] = \"${temp_git_commit}\";\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_branch[] = \"${temp_git_branch}\";\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_descriptor[] = \"${temp_git_describe}\";\n") +set(temp "${temp}#endif\n\n") + message(STATUS "Generating lmpgitversion.h...") file(WRITE "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${temp}" ) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h") diff --git a/src/Makefile b/src/Makefile index 058a415238..f720abe6ec 100644 --- a/src/Makefile +++ b/src/Makefile @@ -171,13 +171,21 @@ gitversion: @echo 'Gathering git version information' @echo '#ifndef LMP_GIT_VERSION_H' > ${TMPNAME}.lmpgitversion @echo '#define LMP_GIT_VERSION_H' >> ${TMPNAME}.lmpgitversion - @echo 'const char LAMMPS_NS::LAMMPS::git_version[] = ' >> ${TMPNAME}.lmpgitversion @if (type git && git describe HEAD ) >> /dev/null 2>> /dev/null ; then \ - export v1=$$(git rev-parse --abbrev-ref HEAD); export v2=$$(git describe HEAD); \ - echo "\"$${v1} / $${v2}\";" >> ${TMPNAME}.lmpgitversion ; \ + git='true'; \ + commit=$$(git rev-parse HEAD); \ + branch=$$(git rev-parse --abbrev-ref HEAD); \ + describe=$$(git describe --dirty=-modified); \ else \ - echo '"";' >> ${TMPNAME}.lmpgitversion ; \ - fi + git='false' ; \ + commit='(unknown)' ; \ + branch='(unknown)' ; \ + describe='(unknown)' ; \ + fi ; \ + echo "const bool LAMMPS_NS::LAMMPS::has_git_info = $${git};" >> ${TMPNAME}.lmpgitversion ; \ + echo "const char LAMMPS_NS::LAMMPS::git_commit[] = \"$${commit}\";" >> ${TMPNAME}.lmpgitversion ; \ + echo "const char LAMMPS_NS::LAMMPS::git_branch[] = \"$${branch}\";" >> ${TMPNAME}.lmpgitversion ; \ + echo "const char LAMMPS_NS::LAMMPS::git_descriptor[] = \"$${describe}\";" >> ${TMPNAME}.lmpgitversion @echo '#endif' >> ${TMPNAME}.lmpgitversion @if [ -f lmpgitversion.h ]; \ then test "`diff --brief ${TMPNAME}.lmpgitversion lmpgitversion.h`" != "" && \ diff --git a/src/info.cpp b/src/info.cpp index f17a00b8d2..3d8a8d7b9e 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -260,9 +260,10 @@ void Info::command(int narg, char **arg) fprintf(out,"Printed on %s\n",ctime(&now)); if (flags & CONFIG) { - if (strlen(lmp->git_version) > 0) { - fprintf(out,"\nLAMMPS version: %s / %s\nGit revision: %s\n\n", - universe->version, universe->num_ver,lmp->git_version); + if (lmp->has_git_info) { + fprintf(out,"\nLAMMPS version: %s / %s\nGit info: %s / %s / %s\n\n", + universe->version, universe->num_ver,lmp->git_branch, + lmp->git_descriptor,lmp->git_commit); } else { fprintf(out,"\nLAMMPS version: %s / %s\n\n", universe->version, universe->num_ver); diff --git a/src/lammps.cpp b/src/lammps.cpp index 126a88b3e1..2b3f001b09 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -419,10 +419,6 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((universe->me == 0) && !helpflag) { if (screen) fprintf(screen,"LAMMPS (%s)\n",universe->version); if (logfile) fprintf(logfile,"LAMMPS (%s)\n",universe->version); - if (strlen(git_version) > 0) { - if (screen) fprintf(screen,"Git revision (%s)\n",git_version); - if (logfile) fprintf(logfile,"Git revision (%s)\n",git_version); - } } // universe is one or more worlds, as setup by partition switch @@ -497,15 +493,11 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((universe->me == 0) && (!helpflag)) { if (universe->uscreen) { fprintf(universe->uscreen,"LAMMPS (%s)\n",universe->version); - if (strlen(git_version) > 0) - fprintf(universe->uscreen,"Git revision (%s)\n",git_version); fprintf(universe->uscreen,"Running on %d partitions of processors\n", universe->nworlds); } if (universe->ulogfile) { fprintf(universe->ulogfile,"LAMMPS (%s)\n",universe->version); - if (strlen(git_version) > 0) - fprintf(universe->ulogfile,"Git revision (%s)\n",git_version); fprintf(universe->ulogfile,"Running on %d partitions of processors\n", universe->nworlds); } @@ -514,14 +506,10 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if ((me == 0) && (!helpflag)) { if (screen) { fprintf(screen,"LAMMPS (%s)\n",universe->version); - if (strlen(git_version) > 0) - fprintf(screen,"Git revision (%s)\n",git_version); fprintf(screen,"Processor partition = %d\n",universe->iworld); } if (logfile) { fprintf(logfile,"LAMMPS (%s)\n",universe->version); - if (strlen(git_version) > 0) - fprintf(logfile,"Git revision (%s)\n",git_version); fprintf(logfile,"Processor partition = %d\n",universe->iworld); } } @@ -911,13 +899,11 @@ void LAMMPS::help() // general help message about command line and flags - if (strlen(git_version) > 0) { - fprintf(fp, - "\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " - LAMMPS_VERSION "\nGit revision (%s)\n\n",git_version); + if (has_git_info) { + fprintf(fp,"\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " + LAMMPS_VERSION "\nGit info (%s / %s)\n\n",git_branch, git_descriptor); } else { - fprintf(fp, - "\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " + fprintf(fp,"\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " LAMMPS_VERSION "\n\n"); } fprintf(fp, diff --git a/src/lammps.h b/src/lammps.h index 7ae7ab7ecb..2e052e5ed2 100644 --- a/src/lammps.h +++ b/src/lammps.h @@ -64,7 +64,11 @@ class LAMMPS { class CiteMe *citeme; // citation info static const char * installed_packages[]; - static const char git_version[]; + + static const bool has_git_info; + static const char git_commit[]; + static const char git_branch[]; + static const char git_descriptor[]; LAMMPS(int, char **, MPI_Comm); ~LAMMPS(); From b628e3b1b612a9ffbfd18d2a45439f339634631c Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 6 Mar 2019 10:26:03 -0600 Subject: [PATCH 050/243] Update openkim.org urls in various places --- doc/src/Build_extras.txt | 8 ++------ doc/src/pair_kim.txt | 8 ++------ lib/kim/Install.py | 4 ++-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 8691f64a09..cbbd9db2f3 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -181,14 +181,10 @@ library with all its models, may take around 30 min to build. Of course you only need to do that once. See the list of KIM model drivers here: -https://openkim.org/kim-items/model-drivers/alphabetical +https://openkim.org/browse/model-drivers/alphabetical See the list of all KIM models here: -https://openkim.org/kim-items/models/by-model-drivers - -See the list of example KIM models included by default here: -https://openkim.org/kim-api on the "What is in the KIM API source -package?" page. +https://openkim.org/browse/models/by-model-drivers [CMake build]: diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 67ab0b6c07..c5d42403e3 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -31,14 +31,10 @@ element or alloy and set of parameters, e.g. EAM for Cu with a specific EAM potential file. See the current list of "KIM model -drivers"_https://openkim.org/kim-items/model-drivers/alphabetical. +drivers"_https://openkim.org/browse/model-drivers/alphabetical. See the current list of all "KIM -models"_https://openkim.org/kim-items/models/by-model-drivers - -See the list of "example KIM models"_https://openkim.org/kim-api which -are included in the KIM library by default, in the "What is in the KIM -API source package?" section. +models"_https://openkim.org/browse/models/by-model-drivers To use this pair style, you must first download and install the KIM API library from the "OpenKIM website"_https://openkim.org. The KIM diff --git a/lib/kim/Install.py b/lib/kim/Install.py index 7a3d9c148d..dfb6bc53dc 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -40,10 +40,10 @@ make lib-kim args="-b -a everything" # install KIM API lib with all models make lib-kim args="-n -a EAM_Dynamo_Ackland_2003_W__MO_141627196590_005" # only add one model or model driver See the list of KIM model drivers here: -https://openkim.org/kim-items/model-drivers/alphabetical +https://openkim.org/browse/model-drivers/alphabetical See the list of all KIM models here: -https://openkim.org/kim-items/models/by-model-drivers +https://openkim.org/browse/models/by-model-drivers """ pgroup = parser.add_mutually_exclusive_group() From 9a6dc2ff11dd846f4e2cf7b4cada63af21dcb110 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 6 Mar 2019 13:54:32 -0700 Subject: [PATCH 051/243] Removed several files that should not have been included --- src/GRANULAR/pair_gran_dmt_rolling.cpp | 721 -------- src/GRANULAR/pair_gran_dmt_rolling.h | 55 - src/GRANULAR/pair_gran_dmt_rolling2.cpp | 719 -------- .../pair_gran_hooke_history_multi.cpp | 915 ---------- src/GRANULAR/pair_gran_hooke_history_multi.h | 109 -- src/GRANULAR/pair_gran_jkr_rolling.cpp | 763 -------- src/GRANULAR/pair_gran_jkr_rolling.h | 56 - src/GRANULAR/pair_gran_jkr_rolling_multi.cpp | 1181 ------------ src/GRANULAR/pair_gran_jkr_rolling_multi.h | 87 - src/GRANULAR/pair_granular_multi.cpp | 1624 ----------------- src/GRANULAR/pair_granular_multi.h | 107 -- 11 files changed, 6337 deletions(-) delete mode 100644 src/GRANULAR/pair_gran_dmt_rolling.cpp delete mode 100644 src/GRANULAR/pair_gran_dmt_rolling.h delete mode 100644 src/GRANULAR/pair_gran_dmt_rolling2.cpp delete mode 100644 src/GRANULAR/pair_gran_hooke_history_multi.cpp delete mode 100644 src/GRANULAR/pair_gran_hooke_history_multi.h delete mode 100644 src/GRANULAR/pair_gran_jkr_rolling.cpp delete mode 100644 src/GRANULAR/pair_gran_jkr_rolling.h delete mode 100644 src/GRANULAR/pair_gran_jkr_rolling_multi.cpp delete mode 100644 src/GRANULAR/pair_gran_jkr_rolling_multi.h delete mode 100644 src/GRANULAR/pair_granular_multi.cpp delete mode 100644 src/GRANULAR/pair_granular_multi.h diff --git a/src/GRANULAR/pair_gran_dmt_rolling.cpp b/src/GRANULAR/pair_gran_dmt_rolling.cpp deleted file mode 100644 index f293998e92..0000000000 --- a/src/GRANULAR/pair_gran_dmt_rolling.cpp +++ /dev/null @@ -1,721 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. - ------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) - ------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_gran_dmt_rolling.h" -#include "atom.h" -#include "update.h" -#include "force.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "comm.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define TWOTHIRDS 0.6666666666666666 -#define EPSILON 1e-10 - -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; - -/* ---------------------------------------------------------------------- */ - -PairGranDMTRolling::PairGranDMTRolling(LAMMPS *lmp) : - PairGranHookeHistory(lmp, 7), - E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), - Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) -{ - int ntypes = atom->ntypes; - memory->create(E,ntypes+1,ntypes+1,"pair:E"); - memory->create(G,ntypes+1,ntypes+1,"pair:G"); - memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); - memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); - memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); - memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); - memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); - memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); - memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); -} - -/* ---------------------------------------------------------------------- */ -PairGranDMTRolling::~PairGranDMTRolling() -{ - delete [] E_one; - delete [] G_one; - delete [] pois; - delete [] muS_one; - delete [] cor; - delete [] alpha_one; - delete [] Ecoh_one; - delete [] kR_one; - delete [] muR_one; - delete [] etaR_one; - //TODO: Make all this work with standard pair coeff type commands. - //Also these should not be in the destructor. - memory->destroy(E); - memory->destroy(G); - memory->destroy(alpha); - memory->destroy(gamman); - memory->destroy(muS); - memory->destroy(Ecoh); - memory->destroy(kR); - memory->destroy(muR); - memory->destroy(etaR); -} -/* ---------------------------------------------------------------------- */ - -void PairGranDMTRolling::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum; - int itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; - double overlap; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int shearupdate = 1; - if (update->setupflag) shearupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firstshear = fix_history->firstvalue; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - jtype = type[j]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum){ - // unset non-touching neighbors - touch[jj] = 0; - shear = &allshear[size_history*jj]; - for (int k = 0; k < size_history; k++) - shear[k] = 0.0; - } else { - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - //**************************************** - //Normal force = Hertzian contact + DMT + damping - //**************************************** - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*E[itype][jtype]*a; - Fhz = kn*overlap; - - //Damping (based on Tsuji et al) - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - //DMT - Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; - - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; - - //**************************************** - //Tangential force, including shear history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - //delta/2, i.e. instead of radi, use distance to center of contact point? - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - touch[jj] = 1; - shear = &allshear[size_history*jj]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } - - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - - //**************************************** - // Rolling force, including shear history effects - //**************************************** - - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } - - k_R = kR[itype][jtype]; - if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*shear[3] - eta_R*vrl1; - fr2 = -k_R*shear[4] - eta_R*vrl2; - fr3 = -k_R*shear[5] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne); - - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - - - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit){ - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - -/* ---------------------------------------------------------------------- - global settings - ------------------------------------------------------------------------- */ - -void PairGranDMTRolling::settings(int narg, char **arg) -{ - if (narg < 6) error->all(FLERR,"Illegal pair_style command"); - - int ntypes = atom->ntypes; - - if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); - - E_one = new double[ntypes+1]; - G_one = new double[ntypes+1]; - pois = new double[ntypes+1]; - muS_one = new double[ntypes+1]; - cor = new double[ntypes+1]; - alpha_one = new double[ntypes+1]; - Ecoh_one = new double[ntypes+1]; - kR_one = new double[ntypes+1]; - muR_one = new double[ntypes+1]; - etaR_one = new double[ntypes+1]; - - for (int i=0; i < ntypes;i++){ - E_one[i+1] = force->numeric(FLERR, arg[i]); - G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); - muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); - cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); - Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); - kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); - muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); - etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); - } - - //Defaults - normaldamp = TSUJI; - rollingdamp = INDEP; - - int iarg = 8*ntypes; - while (iarg < narg){ - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else{ - iarg +=1; - } - } - - //Derived from inputs - for (int i=1; i <= ntypes; i++){ - pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; - alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; - for (int j=i; j <= ntypes; j++){ - E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); - G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); - if (normaldamp == TSUJI){ - alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); - } - else if (normaldamp == BRILLIANTOV){ - gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); - } - muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); - Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); - kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); - etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); - muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); - } - } -} - -/* ---------------------------------------------------------------------- */ - -double PairGranDMTRolling::single(int i, int j, int itype, int jtype, - double rsq, - double factor_coul, double factor_lj, - double &fforce) -{ - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double overlap, a; - double mi,mj,meff,damp,kn,kt; - double Fhz,Fdamp,Fdmt,Fne,Fntot,Fscrit; - double eta_N,eta_T; - double vtr1,vtr2,vtr3,vrel; - double fs1,fs2,fs3,fs; - double shrmag; - - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum) { - fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; - return 0.0; - } - - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/radsum; - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - - // normal force = Hertzian contact + normal velocity damping - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*E[itype][jtype]*a; - Fhz = kn*overlap; - - //Damping (based on Tsuji et al) - - eta_N=alpha[itype][jtype]*sqrt(meff*kn); - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - //DMT - Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; - - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; - - // relative velocities - - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allshear = fix_history->firstvalue[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - - double *shear = &allshear[size_history*neighprev]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // tangential forces = shear + tangential velocity damping - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; - fs1 = -kt*shear[0] - eta_T*vtr1; - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - Fscrit= muS[itype][jtype] * fabs(Fne); - - if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; - } - - // set all forces and return no energy - - fforce = Fntot; - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; - return 0.0; -} diff --git a/src/GRANULAR/pair_gran_dmt_rolling.h b/src/GRANULAR/pair_gran_dmt_rolling.h deleted file mode 100644 index 8f4ae2005e..0000000000 --- a/src/GRANULAR/pair_gran_dmt_rolling.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(gran/dmt/rolling,PairGranDMTRolling) - -#else - -#ifndef LMP_PAIR_GRAN_DMT_ROLLING_H -#define LMP_PAIR_GRAN_DMT_ROLLING_H - -#include "pair_gran_hooke_history.h" - -namespace LAMMPS_NS { - -class PairGranDMTRolling : public PairGranHookeHistory { -public: - PairGranDMTRolling(class LAMMPS *); - virtual ~PairGranDMTRolling(); - virtual void compute(int, int); - void settings(int, char **); //Eventually set this through coeff method so that user can specify a particular i-j set of coefficients - double single(int, int, int, int, double, double, double, double &); - double *E_one, *G_one, *pois, *muS_one, *cor, *alpha_one, *Ecoh_one, *kR_one, *muR_one, *etaR_one; //Public so as to be accessible to fix/wall/gran -private: - double **E, **G, **alpha, **muS, **Ecoh, **kR, **muR, **etaR, **gamman; - int normaldamp, rollingdamp; - - -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - - */ diff --git a/src/GRANULAR/pair_gran_dmt_rolling2.cpp b/src/GRANULAR/pair_gran_dmt_rolling2.cpp deleted file mode 100644 index 5c1211cbc5..0000000000 --- a/src/GRANULAR/pair_gran_dmt_rolling2.cpp +++ /dev/null @@ -1,719 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. - ------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) - ------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_gran_dmt_rolling.h" -#include "atom.h" -#include "update.h" -#include "force.h" -#include "fix.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "comm.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define TWOTHIRDS 0.6666666666666666 -#define EPSILON 1e-10 - -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; - -/* ---------------------------------------------------------------------- */ - -PairGranDMTRolling::PairGranDMTRolling(LAMMPS *lmp) : - PairGranHookeHistory(lmp, 7), - E_one(0), G_one(0), pois(0), muS_one(0), cor(0), alpha_one(0), - Ecoh_one(0), kR_one(0), muR_one(0), etaR_one(0) -{ - int ntypes = atom->ntypes; - memory->create(E,ntypes+1,ntypes+1,"pair:E"); - memory->create(G,ntypes+1,ntypes+1,"pair:G"); - memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); - memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); - memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); - memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); - memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); - memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); - memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); -} - -/* ---------------------------------------------------------------------- */ -PairGranDMTRolling::~PairGranDMTRolling() -{ - delete [] E_one; - delete [] G_one; - delete [] pois; - delete [] muS_one; - delete [] cor; - delete [] alpha_one; - delete [] Ecoh_one; - delete [] kR_one; - delete [] muR_one; - delete [] etaR_one; - //TODO: Make all this work with standard pair coeff type commands. - //Also these should not be in the destructor. - memory->destroy(E); - memory->destroy(G); - memory->destroy(alpha); - memory->destroy(gamman); - memory->destroy(muS); - memory->destroy(Ecoh); - memory->destroy(kR); - memory->destroy(muR); - memory->destroy(etaR); -} -/* ---------------------------------------------------------------------- */ - -void PairGranDMTRolling::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum; - int itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fhz, Fdamp, Fdmt, Fne, Fntot, Fscrit, Frcrit; - double overlap; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int shearupdate = 1; - if (update->setupflag) shearupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - jtype = type[j]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum){ - // unset non-touching neighbors - touch[jj] = 0; - shear = &allshear[nsheardim*jj]; - for (int k = 0; k < nsheardim; k++) - shear[k] = 0.0; - } else { - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - //**************************************** - //Normal force = Hertzian contact + DMT + damping - //**************************************** - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*E[itype][jtype]*a; - Fhz = kn*overlap; - - //Damping (based on Tsuji et al) - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - //DMT - Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; - - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; - - //**************************************** - //Tangential force, including shear history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - //delta/2, i.e. instead of radi, use distance to center of contact point? - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - touch[jj] = 1; - shear = &allshear[nsheardim*jj]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } - - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - - //**************************************** - // Rolling force, including shear history effects - //**************************************** - - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } - - k_R = kR[itype][jtype]; - if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*shear[3] - eta_R*vrl1; - fr2 = -k_R*shear[4] - eta_R*vrl2; - fr3 = -k_R*shear[5] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne); - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - - - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit){ - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - -/* ---------------------------------------------------------------------- - global settings - ------------------------------------------------------------------------- */ - -void PairGranDMTRolling::settings(int narg, char **arg) -{ - if (narg < 6) error->all(FLERR,"Illegal pair_style command"); - - int ntypes = atom->ntypes; - - if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); - - E_one = new double[ntypes+1]; - G_one = new double[ntypes+1]; - pois = new double[ntypes+1]; - muS_one = new double[ntypes+1]; - cor = new double[ntypes+1]; - alpha_one = new double[ntypes+1]; - Ecoh_one = new double[ntypes+1]; - kR_one = new double[ntypes+1]; - muR_one = new double[ntypes+1]; - etaR_one = new double[ntypes+1]; - - for (int i=0; i < ntypes;i++){ - E_one[i+1] = force->numeric(FLERR, arg[i]); - G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); - muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); - cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); - Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); - kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); - muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); - etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); - } - - //Defaults - normaldamp = TSUJI; - rollingdamp = INDEP; - - int iarg = 8*ntypes; - while (iarg < narg){ - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else{ - iarg +=1; - } - } - - //Derived from inputs - for (int i=1; i <= ntypes; i++){ - pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; - alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; - for (int j=i; j <= ntypes; j++){ - E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); - G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); - if (normaldamp == TSUJI){ - alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); - } - else if (normaldamp == BRILLIANTOV){ - gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); - } - muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); - Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); - kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); - etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); - muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); - } - } -} - -/* ---------------------------------------------------------------------- */ - -double PairGranDMTRolling::single(int i, int j, int itype, int jtype, - double rsq, - double factor_coul, double factor_lj, - double &fforce) -{ - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double overlap, a; - double mi,mj,meff,damp,kn,kt; - double Fhz,Fdamp,Fdmt,Fne,Fntot,Fscrit; - double eta_N,eta_T; - double vtr1,vtr2,vtr3,vrel; - double fs1,fs2,fs3,fs; - double shrmag; - - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum) { - fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; - return 0.0; - } - - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/radsum; - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - - // normal force = Hertzian contact + normal velocity damping - overlap = radsum - r; - a = sqrt(R*overlap); - kn = 4.0/3.0*E[itype][jtype]*a; - Fhz = kn*overlap; - - //Damping (based on Tsuji et al) - - eta_N=alpha[itype][jtype]*sqrt(meff*kn); - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - //DMT - Fdmt = -4*MY_PI*Ecoh[itype][jtype]*R; - - Fne = Fhz + Fdmt; - Fntot = Fne + Fdamp; - - // relative velocities - - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allshear = list->listhistory->firstdouble[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - - double *shear = &allshear[nsheardim*neighprev]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // tangential forces = shear + tangential velocity damping - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; - fs1 = -kt*shear[0] - eta_T*vtr1; - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - Fscrit= muS[itype][jtype] * fabs(Fne); - - if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; - } - - // set all forces and return no energy - - fforce = Fntot; - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; - return 0.0; -} diff --git a/src/GRANULAR/pair_gran_hooke_history_multi.cpp b/src/GRANULAR/pair_gran_hooke_history_multi.cpp deleted file mode 100644 index 48e793bbb3..0000000000 --- a/src/GRANULAR/pair_gran_hooke_history_multi.cpp +++ /dev/null @@ -1,915 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_gran_hooke_history_multi.h" -#include "atom.h" -#include "atom_vec.h" -#include "domain.h" -#include "force.h" -#include "update.h" -#include "modify.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" - -using namespace LAMMPS_NS; - -#define BIG 1.0e20 - -/* ---------------------------------------------------------------------- */ - -PairGranHookeHistoryMulti::PairGranHookeHistoryMulti(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 1; - no_virial_fdotr_compute = 1; - history = 1; - fix_history = NULL; - - single_extra = 10; - svector = new double[10]; - - neighprev = 0; - - nmax = 0; - mass_rigid = NULL; - - // set comm size needed by this Pair if used with fix rigid - - comm_forward = 1; -} - -/* ---------------------------------------------------------------------- */ - -PairGranHookeHistoryMulti::~PairGranHookeHistoryMulti() -{ - delete [] svector; - if (fix_history) modify->delete_fix("NEIGH_HISTORY"); - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(cut); - memory->destroy(kn); - memory->destroy(kt); - memory->destroy(gamman); - memory->destroy(gammat); - memory->destroy(xmu); - memory->destroy(dampflag); - - delete [] onerad_dynamic; - delete [] onerad_frozen; - delete [] maxrad_dynamic; - delete [] maxrad_frozen; - } - memory->destroy(mass_rigid); -} - -/* ---------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz; - double radi,radj,radsum,rsq,r,rinv,rsqinv; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double fn,fs,fs1,fs2,fs3; - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int shearupdate = 1; - if (update->setupflag) shearupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0) { - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - int *type = atom->type; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *mask = atom->mask; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firstshear = fix_history->firstvalue; - - // 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]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum) { - - // unset non-touching neighbors - - touch[jj] = 0; - shear = &allshear[3*jj]; - shear[0] = 0.0; - shear[1] = 0.0; - shear[2] = 0.0; - - } else { - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*delx + vr2*dely + vr3*delz; - vn1 = delx*vnnr * rsqinv; - vn2 = dely*vnnr * rsqinv; - vn3 = delz*vnnr * rsqinv; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv; - wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv; - wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - // normal forces = Hookian contact + normal velocity damping - - damp = meff*gamman[itype][jtype]*vnnr*rsqinv; - ccel = kn[itype][jtype]*(radsum-r)*rinv - damp; - - // relative velocities - - vtr1 = vt1 - (delz*wr2-dely*wr3); - vtr2 = vt2 - (delx*wr3-delz*wr1); - vtr3 = vt3 - (dely*wr1-delx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - - touch[jj] = 1; - shear = &allshear[3*jj]; - - if (shearupdate) { - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // rotate shear displacements - - rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz; - rsht *= rsqinv; - if (shearupdate) { - shear[0] -= rsht*delx; - shear[1] -= rsht*dely; - shear[2] -= rsht*delz; - } - - // tangential forces = shear + tangential velocity damping - - fs1 = - (kt[itype][jtype]*shear[0] + meff*gammat[itype][jtype]*vtr1); - fs2 = - (kt[itype][jtype]*shear[1] + meff*gammat[itype][jtype]*vtr2); - fs3 = - (kt[itype][jtype]*shear[2] + meff*gammat[itype][jtype]*vtr3); - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - fn = xmu[itype][jtype] * fabs(ccel*r); - - if (fs > fn) { - if (shrmag != 0.0) { - shear[0] = (fn/fs) * (shear[0] + - meff*gammat[itype][jtype]*vtr1/kt[itype][jtype]) - - meff*gammat[itype][jtype]*vtr1/kt[itype][jtype]; - shear[1] = (fn/fs) * (shear[1] + - meff*gammat[itype][jtype]*vtr2/kt[itype][jtype]) - - meff*gammat[itype][jtype]*vtr2/kt[itype][jtype]; - shear[2] = (fn/fs) * (shear[2] + - meff*gammat[itype][jtype]*vtr3/kt[itype][jtype]) - - meff*gammat[itype][jtype]*vtr3/kt[itype][jtype]; - fs1 *= fn/fs; - fs2 *= fn/fs; - fs3 *= fn/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - - // forces & torques - - fx = delx*ccel + fs1; - fy = dely*ccel + fs2; - fz = delz*ccel + fs3; - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = rinv * (dely*fs3 - delz*fs2); - tor2 = rinv * (delz*fs1 - delx*fs3); - tor3 = rinv * (delx*fs2 - dely*fs1); - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - if (newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - } - - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } - - if (vflag_fdotr) virial_fdotr_compute(); -} - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(kn,n+1,n+1,"pair:kn"); - memory->create(kt,n+1,n+1,"pair:kt"); - memory->create(gamman,n+1,n+1,"pair:gamman"); - memory->create(gammat,n+1,n+1,"pair:gammat"); - memory->create(xmu,n+1,n+1,"pair:xmu"); - memory->create(dampflag,n+1,n+1,"pair:dampflag"); - - onerad_dynamic = new double[n+1]; - onerad_frozen = new double[n+1]; - maxrad_dynamic = new double[n+1]; - maxrad_frozen = new double[n+1]; -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::settings(int narg, char **arg) -{ - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - - if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; - else cut_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::coeff(int narg, char **arg) -{ - if (narg < 8 || narg > 9) - error->all(FLERR,"Incorrect args for pair coefficients"); - - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double kn_one = force->numeric(FLERR,arg[2]); - double kt_one; - if (strcmp(arg[3],"NULL") == 0) kt_one = kn_one * 2.0/7.0; - else kt_one = force->numeric(FLERR,arg[3]); - - double gamman_one = force->numeric(FLERR,arg[4]); - double gammat_one; - if (strcmp(arg[5],"NULL") == 0) gammat_one = 0.5 * gamman_one; - else gammat_one = force->numeric(FLERR,arg[5]); - - double xmu_one = force->numeric(FLERR,arg[6]); - int dampflag_one = force->inumeric(FLERR,arg[7]); - if (dampflag_one == 0) gammat_one = 0.0; - - if (kn_one < 0.0 || kt_one < 0.0 || gamman_one < 0.0 || gammat_one < 0.0 || - xmu_one < 0.0 || xmu_one > 10000.0 || dampflag_one < 0 || dampflag_one > 1) - error->all(FLERR,"Illegal pair_style command"); - - // convert Kn and Kt from pressure units to force/distance^2 - kn_one /= force->nktv2p; - kt_one /= force->nktv2p; - - double cut_one = cut_global; - if (narg==9) { - if (strcmp(arg[8],"NULL") == 0) cut_one = -1.0; - else cut_one = force->numeric(FLERR,arg[8]); - } - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - kn[i][j] = kn_one; - kt[i][j] = kt_one; - gamman[i][j] = gamman_one; - gammat[i][j] = gammat_one; - xmu[i][j] = xmu_one; - dampflag[i][j] = dampflag_one; - cut[i][j] = cut_one; - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::init_style() -{ - int i; - - // error and warning checks - - if (!atom->radius_flag || !atom->rmass_flag) - error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); - if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - - // need a granular neigh list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->size = 1; - if (history) neighbor->requests[irequest]->history = 1; - - dt = update->dt; - - // if shear history is stored: - // if first init, create Fix needed for storing shear history - - if (history && fix_history == NULL) { - char dnumstr[16]; - sprintf(dnumstr,"%d",3); - char **fixarg = new char*[4]; - fixarg[0] = (char *) "NEIGH_HISTORY"; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "NEIGH_HISTORY"; - fixarg[3] = dnumstr; - modify->add_fix(4,fixarg,1); - delete [] fixarg; - fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; - fix_history->pair = this; - } - - // check for FixFreeze and set freeze_group_bit - - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; - - // check for FixRigid so can extract rigid body masses - - fix_rigid = NULL; - for (i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) break; - if (i < modify->nfix) fix_rigid = modify->fix[i]; - - // check for FixPour and FixDeposit so can extract particle radii - - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; - - // set maxrad_dynamic and maxrad_frozen for each type - // include future FixPour and FixDeposit particles as dynamic - - int itype; - for (i = 1; i <= atom->ntypes; i++) { - onerad_dynamic[i] = onerad_frozen[i] = 0.0; - if (ipour >= 0) { - itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[ipour]->extract("radius",itype)); - } - if (idep >= 0) { - itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[idep]->extract("radius",itype)); - } - } - - double *radius = atom->radius; - int *mask = atom->mask; - int *type = atom->type; - int nlocal = atom->nlocal; - - for (i = 0; i < nlocal; i++) - if (mask[i] & freeze_group_bit) - onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); - else - onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); - - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - - // set fix which stores history info - - if (history) { - int ifix = modify->find_fix("NEIGH_HISTORY"); - if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; - } -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::init_one(int i, int j) -{ - if (setflag[i][j] == 0) { - kn[i][j] = mix_stiffness(kn[i][i],kn[j][j]); - kt[i][j] = mix_stiffness(kt[i][i],kt[j][j]); - gamman[i][j] = mix_damping(gamman[i][i],gamman[j][j]); - gammat[i][j] = mix_damping(gammat[i][i],gammat[j][j]); - xmu[i][j] = mix_friction(xmu[i][i],xmu[j][j]); - - dampflag[i][j] = 0; - if (dampflag[i][i] || dampflag[j][j]) dampflag[i][j] = 1; - - } - - kn[j][i] = kn[i][j]; - kt[j][i] = kt[i][j]; - gamman[j][i] = gamman[i][j]; - gammat[j][i] = gammat[i][j]; - xmu[j][i] = xmu[i][j]; - dampflag[j][i] = dampflag[i][j]; - - double cutoff = cut[i][j]; - - // It is likely that cut[i][j] at this point is still 0.0. This can happen when - // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates - // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size - // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only - // if there is no current information about radius/cutoff of type i and j). - // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. - - if (cut[i][j] < 0.0) { - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } - } - return cutoff; -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&kn[i][j],sizeof(double),1,fp); - fwrite(&kt[i][j],sizeof(double),1,fp); - fwrite(&gamman[i][j],sizeof(double),1,fp); - fwrite(&gammat[i][j],sizeof(double),1,fp); - fwrite(&xmu[i][j],sizeof(double),1,fp); - fwrite(&dampflag[i][j],sizeof(int),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&kn[i][j],sizeof(double),1,fp); - fread(&kt[i][j],sizeof(double),1,fp); - fread(&gamman[i][j],sizeof(double),1,fp); - fread(&gammat[i][j],sizeof(double),1,fp); - fread(&xmu[i][j],sizeof(double),1,fp); - fread(&dampflag[i][j],sizeof(int),1,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&kn[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&kt[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&gammat[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&xmu[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&dampflag[i][j],1,MPI_INT,0,world); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&cut_global,sizeof(double),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); -} - -/* ---------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::reset_dt() -{ - dt = update->dt; -} - -/* ---------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::single(int i, int j, int itype, int jtype, - double rsq, - double factor_coul, double factor_lj, - double &fforce) -{ - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double mi,mj,meff,damp,ccel; - double vtr1,vtr2,vtr3,vrel,shrmag,rsht; - double fs1,fs2,fs3,fs,fn; - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - - if (rsq >= radsum*radsum) { - fforce = 0.0; - for (int m = 0; m < single_extra; m++) svector[m] = 0.0; - return 0.0; - } - - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - vnnr = vr1*delx + vr2*dely + vr3*delz; - vn1 = delx*vnnr * rsqinv; - vn2 = dely*vnnr * rsqinv; - vn3 = delz*vnnr * rsqinv; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv; - wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv; - wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - double *rmass = atom->rmass; - int *mask = atom->mask; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: insure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - // normal forces = Hookian contact + normal velocity damping - - damp = meff*gamman[itype][jtype]*vnnr*rsqinv; - ccel = kn[itype][jtype]*(radsum-r)*rinv - damp; - - // relative velocities - - vtr1 = vt1 - (delz*wr2-dely*wr3); - vtr2 = vt2 - (delx*wr3-delz*wr1); - vtr3 = vt3 - (dely*wr1-delx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allshear = fix_history->firstvalue[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - - double *shear = &allshear[3*neighprev]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // rotate shear displacements - - rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz; - rsht *= rsqinv; - - // tangential forces = shear + tangential velocity damping - - fs1 = - (kt[itype][jtype]*shear[0] + meff*gammat[itype][jtype]*vtr1); - fs2 = - (kt[itype][jtype]*shear[1] + meff*gammat[itype][jtype]*vtr2); - fs3 = - (kt[itype][jtype]*shear[2] + meff*gammat[itype][jtype]*vtr3); - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - fn = xmu[itype][jtype] * fabs(ccel*r); - - if (fs > fn) { - if (shrmag != 0.0) { - fs1 *= fn/fs; - fs2 *= fn/fs; - fs3 *= fn/fs; - fs *= fn/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; - } - - // set force and return no energy - - fforce = ccel; - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; - - return 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int PairGranHookeHistoryMulti::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - - m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = mass_rigid[j]; - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void PairGranHookeHistoryMulti::unpack_forward_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) - mass_rigid[i] = buf[m++]; -} - -/* ---------------------------------------------------------------------- - memory usage of local atom-based arrays -------------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::memory_usage() -{ - double bytes = nmax * sizeof(double); - return bytes; -} - -/* ---------------------------------------------------------------------- - mixing of stiffness -------------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::mix_stiffness(double kii, double kjj) -{ - return kii*kjj/(kii + kjj); -} - -/* ---------------------------------------------------------------------- - mixing of damping -------------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::mix_damping(double gammaii, double gammajj) -{ - return sqrt(gammaii*gammajj); -} - -/* ---------------------------------------------------------------------- - mixing of friction -------------------------------------------------------------------------- */ - -double PairGranHookeHistoryMulti::mix_friction(double xmuii, double xmujj) -{ - return MAX(xmuii,xmujj); -} - diff --git a/src/GRANULAR/pair_gran_hooke_history_multi.h b/src/GRANULAR/pair_gran_hooke_history_multi.h deleted file mode 100644 index f302ede96c..0000000000 --- a/src/GRANULAR/pair_gran_hooke_history_multi.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(gran/hooke/history/multi,PairGranHookeHistoryMulti) - -#else - -#ifndef LMP_PAIR_GRAN_HOOKE_HISTORY_MULTI_H -#define LMP_PAIR_GRAN_HOOKE_HISTORY_MULTI_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairGranHookeHistoryMulti : public Pair { - public: - PairGranHookeHistoryMulti(class LAMMPS *); - virtual ~PairGranHookeHistoryMulti(); - virtual void compute(int, int); - virtual void settings(int, char **); - virtual void coeff(int, char **); // Made Virtual by IS Oct 7 2017 - void init_style(); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - void reset_dt(); - virtual double single(int, int, int, int, double, double, double, double &); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - double memory_usage(); - - protected: - double cut_global; - double **kn,**kt,**gamman,**gammat,**xmu,**cut; - int **dampflag; - double dt; - int freeze_group_bit; - int history; - - int neighprev; - double *onerad_dynamic,*onerad_frozen; - double *maxrad_dynamic,*maxrad_frozen; - - class FixNeighHistory *fix_history; - - // storage of rigid body masses for use in granular interactions - - class Fix *fix_rigid; // ptr to rigid body fix, NULL if none - double *mass_rigid; // rigid mass for owned+ghost atoms - int nmax; // allocated size of mass_rigid - - virtual void allocate(); // Made Virtual by IS Oct 7 2017 - -private: - double mix_stiffness(double kii, double kjj); - double mix_damping(double gammaii, double gammajj); - double mix_friction(double xmuii, double xmujj); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - -E: Incorrect args for pair coefficients - -Self-explanatory. Check the input script or data file. - -E: Pair granular requires atom attributes radius, rmass - -The atom style defined does not have these attributes. - -E: Pair granular requires ghost atoms store velocity - -Use the comm_modify vel yes command to enable this. - -E: Pair granular with shear history requires newton pair off - -This is a current restriction of the implementation of pair -granular styles with history. - -E: Could not find pair fix ID - -A fix is created internally by the pair style to store shear -history information. You cannot delete it. - -*/ diff --git a/src/GRANULAR/pair_gran_jkr_rolling.cpp b/src/GRANULAR/pair_gran_jkr_rolling.cpp deleted file mode 100644 index ce109cccbc..0000000000 --- a/src/GRANULAR/pair_gran_jkr_rolling.cpp +++ /dev/null @@ -1,763 +0,0 @@ -/* ---------------------------------------------------------------------- - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. - ------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) - ------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_gran_jkr_rolling.h" -#include "atom.h" -#include "update.h" -#include "force.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "comm.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define ONETHIRD 0.33333333333333333 -#define TWOTHIRDS 0.66666666666666666 -#define POW6ONE 0.550321208149104 //6^(-1/3) -#define POW6TWO 0.30285343213869 //6^(-2/3) - -#define EPSILON 1e-10 - -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; - -/* ---------------------------------------------------------------------- */ - -PairGranJKRRolling::PairGranJKRRolling(LAMMPS *lmp) : - PairGranHookeHistory(lmp, 7) -{ - E_one = NULL; - G_one = NULL; - pois = NULL; - muS_one = NULL; - cor = NULL; - alpha_one = NULL; - Ecoh_one = NULL; - kR_one = NULL; - muR_one = NULL; - etaR_one = NULL; - int ntypes = atom->ntypes; - memory->create(E,ntypes+1,ntypes+1,"pair:E"); - memory->create(G,ntypes+1,ntypes+1,"pair:G"); - memory->create(alpha,ntypes+1,ntypes+1,"pair:alpha"); - memory->create(gamman,ntypes+1,ntypes+1,"pair:gamman"); - memory->create(muS,ntypes+1,ntypes+1,"pair:muS"); - memory->create(Ecoh,ntypes+1,ntypes+1,"pair:Ecoh"); - memory->create(kR,ntypes+1,ntypes+1,"pair:kR"); - memory->create(muR,ntypes+1,ntypes+1,"pair:muR"); - memory->create(etaR,ntypes+1,ntypes+1,"pair:etaR"); -} - -/* ---------------------------------------------------------------------- */ -PairGranJKRRolling::~PairGranJKRRolling() -{ - delete [] E_one; - delete [] G_one; - delete [] pois; - delete [] muS_one; - delete [] cor; - delete [] alpha_one; - delete [] Ecoh_one; - delete [] kR_one; - delete [] muR_one; - delete [] etaR_one; - //TODO: Make all this work with standard pair coeff type commands. - //Also these should not be in the destructor. - memory->destroy(E); - memory->destroy(G); - memory->destroy(alpha); - memory->destroy(gamman); - memory->destroy(muS); - memory->destroy(Ecoh); - memory->destroy(kR); - memory->destroy(muR); - memory->destroy(etaR); -} -/* ---------------------------------------------------------------------- */ - -void PairGranJKRRolling::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum; - int itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; - double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int shearupdate = 1; - if (update->setupflag) shearupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firstshear = fix_history->firstvalue; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - jtype = type[j]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; - - if ((rsq >= radsum*radsum && touch[jj] == 0) || - (rsq >= (radsum+delta_C)*(radsum+delta_C))){ - // unset non-touching neighbors - touch[jj] = 0; - shear = &allshear[size_history*jj]; - for (int k = 0; k < size_history; k++) - shear[k] = 0.0; - } else { - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - //**************************************** - //Normal force = JKR-adjusted Hertzian contact + damping - //**************************************** - if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; - else delta_Cinv = 1.0; - overlap = (radsum - r)*delta_Cinv; - olapsq = overlap*overlap; - olapcubed = olapsq*overlap; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) - - Fne = F_C*foverFc; - - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - Fntot = Fne + Fdamp; - - //**************************************** - //Tangential force, including shear history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - //Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - //delta/2, i.e. instead of radi, use distance to center of contact point? - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - touch[jj] = 1; - shear = &allshear[size_history*jj]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } - - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - - //**************************************** - // Rolling force, including shear history effects - //**************************************** - - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } - - k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); - if (rollingdamp == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*shear[3] - eta_R*vrl1; - fr2 = -k_R*shear[4] - eta_R*vrl2; - fr3 = -k_R*shear[5] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - - - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - //shear[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - -/* ---------------------------------------------------------------------- - global settings - ------------------------------------------------------------------------- */ - -void PairGranJKRRolling::settings(int narg, char **arg) -{ - if (narg < 6) error->all(FLERR,"Illegal pair_style command"); - - int ntypes = atom->ntypes; - - if (narg < 8*ntypes) error->all(FLERR,"Illegal pair_style command"); - - E_one = new double[ntypes+1]; - G_one = new double[ntypes+1]; - pois = new double[ntypes+1]; - muS_one = new double[ntypes+1]; - cor = new double[ntypes+1]; - alpha_one = new double[ntypes+1]; - Ecoh_one = new double[ntypes+1]; - kR_one = new double[ntypes+1]; - muR_one = new double[ntypes+1]; - etaR_one = new double[ntypes+1]; - - //Defaults - normaldamp = TSUJI; - rollingdamp = INDEP; - - int iarg = 8*ntypes; - while (iarg < narg){ - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg +=2; - } - else iarg += 1; - } - - for (int i=0; i < ntypes;i++){ - - E_one[i+1] = force->numeric(FLERR, arg[i]); - G_one[i+1] = force->numeric(FLERR, arg[ntypes+i]); - muS_one[i+1] = force->numeric(FLERR, arg[2*ntypes+i]); - cor[i+1] = force->numeric(FLERR, arg[3*ntypes+i]); - Ecoh_one[i+1] = force->numeric(FLERR, arg[4*ntypes+i]); - kR_one[i+1] = force->numeric(FLERR, arg[5*ntypes+i]); - muR_one[i+1] = force->numeric(FLERR, arg[6*ntypes+i]); - etaR_one[i+1] = force->numeric(FLERR, arg[7*ntypes+i]); - } - - //Optional keywords: - // normaldamp tsuji, or normaldamp brilliantov - // rollingdamp brilliantov - - //Derived from inputs - for (int i=1; i <= ntypes; i++){ - pois[i] = E_one[i]/(2.0*G_one[i]) - 1.0; - alpha_one[i] = 1.2728-4.2783*cor[i]+11.087*cor[i]*cor[i]-22.348*cor[i]*cor[i]*cor[i]+27.467*cor[i]*cor[i]*cor[i]*cor[i]-18.022*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]+4.8218*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]*cor[i]; - for (int j=i; j <= ntypes; j++){ - E[i][j] = E[j][i] = 1/((1-pois[i]*pois[i])/E_one[i]+(1-pois[j]*pois[j])/E_one[j]); - G[i][j] = G[j][i] = 1/((2-pois[i])/G_one[i]+(2-pois[j])/G_one[j]); - if (normaldamp == TSUJI){ - alpha[i][j] = alpha[j][i] = sqrt(alpha_one[i]*alpha_one[j]); - } - else if (normaldamp == BRILLIANTOV){ - gamman[i][j] = gamman[j][i] = sqrt(cor[i]*cor[j]); - } - muS[i][j] = muS[j][i] = sqrt(muS_one[i]*muS_one[j]); - Ecoh[i][j] = Ecoh[j][i] = sqrt(Ecoh_one[i]*Ecoh_one[j]); - kR[i][j] = kR[j][i] = sqrt(kR_one[i]*kR_one[j]); - etaR[i][j] = etaR[j][i] = sqrt(etaR_one[i]*etaR_one[j]); - muR[i][j] = muR[j][i] = sqrt(muR_one[i]*muR_one[j]); - } - } -} - -/* ---------------------------------------------------------------------- */ - -double PairGranJKRRolling::single(int i, int j, int itype, int jtype, - double rsq, - double factor_coul, double factor_lj, - double &fforce) -{//TODO: update PairGranJKRRolling::single for JKR - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double overlap, a; - double mi,mj,meff,damp,kn,kt; - double Fdamp,Fne,Fntot,Fscrit; - double eta_N,eta_T; - double vtr1,vtr2,vtr3,vrel; - double fs1,fs2,fs3,fs; - double shrmag; - double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; - - int *touch = fix_history->firstflag[i]; - if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| - (rsq >= radsum*radsum && touch[j])){ - fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; - return 0.0; - } - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - - // normal force = JKR - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; - overlap = radsum - r; - olapsq = overlap*overlap; - olapcubed = olapsq*olapsq; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) - - Fne = F_C*foverFc; - - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - Fntot = Fne + Fdamp; - - // relative velocities - - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allshear = fix_history->firstvalue[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - - double *shear = &allshear[size_history*neighprev]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // tangential forces = shear + tangential velocity damping - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; - fs1 = -kt*shear[0] - eta_T*vtr1; - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); - - if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; - } - - // set all forces and return no energy - - fforce = Fntot; - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; - return 0.0; -} diff --git a/src/GRANULAR/pair_gran_jkr_rolling.h b/src/GRANULAR/pair_gran_jkr_rolling.h deleted file mode 100644 index 8c4b339eb3..0000000000 --- a/src/GRANULAR/pair_gran_jkr_rolling.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(gran/jkr/rolling,PairGranJKRRolling) - -#else - -#ifndef LMP_PAIR_GRAN_JKR_ROLLING_H -#define LMP_PAIR_GRAN_JKR_ROLLING_H - -#include "pair_gran_hooke_history.h" - -namespace LAMMPS_NS { - -class PairGranJKRRolling : public PairGranHookeHistory { -public: - PairGranJKRRolling(class LAMMPS *); - virtual ~PairGranJKRRolling(); - virtual void compute(int, int); - void settings(int, char **); //Eventually set this through coeff method so that user can specify a particular i-j set of coefficients - double single(int, int, int, int, double, double, double, double &); - double *E_one, *G_one, *pois, *muS_one, *cor, *alpha_one, *Ecoh_one, *kR_one, *muR_one, *etaR_one; //Public so as to be accessible to fix/wall/gran -private: - double **E, **G, **alpha, **muS, **Ecoh, **kR, **muR, **etaR, **gamman; - int normaldamp, rollingdamp; - - - -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - - */ diff --git a/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp b/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp deleted file mode 100644 index a9156390e5..0000000000 --- a/src/GRANULAR/pair_gran_jkr_rolling_multi.cpp +++ /dev/null @@ -1,1181 +0,0 @@ -/* ---------------------------------------------------------------------- -http://lammps.sandia.gov, Sandia National Laboratories -Steve Plimpton, sjplimp@sandia.gov - -Copyright (2003) Sandia Corporation. Under the terms of Contract -DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains -certain rights in this software. This software is distributed under -the GNU General Public License. - -See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) - ------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_gran_jkr_rolling_multi.h" -#include "atom.h" -#include "atom_vec.h" -#include "domain.h" -#include "force.h" -#include "update.h" -#include "modify.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" -//#include - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define ONETHIRD 0.33333333333333333 -#define TWOTHIRDS 0.66666666666666666 -#define POW6ONE 0.550321208149104 //6^(-1/3) -#define POW6TWO 0.30285343213869 //6^(-2/3) - -#define EPSILON 1e-10 - -enum {TSUJI, BRILLIANTOV}; -enum {INDEP, BRILLROLL}; - -/* ---------------------------------------------------------------------- */ - -PairGranJKRRollingMulti::PairGranJKRRollingMulti(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 1; - no_virial_fdotr_compute = 1; - history = 1; - fix_history = NULL; - - single_extra = 10; - svector = new double[10]; - - neighprev = 0; - - nmax = 0; - mass_rigid = NULL; - - // set comm size needed by this Pair if used with fix rigid - - comm_forward = 1; -} - -/* ---------------------------------------------------------------------- */ -PairGranJKRRollingMulti::~PairGranJKRRollingMulti() -{ - delete [] svector; - if (fix_history) modify->delete_fix("NEIGH_HISTORY"); - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(cut); - memory->destroy(E); - memory->destroy(G); - memory->destroy(normaldamp); - memory->destroy(rollingdamp); - memory->destroy(alpha); - memory->destroy(gamman); - memory->destroy(muS); - memory->destroy(Ecoh); - memory->destroy(kR); - memory->destroy(muR); - memory->destroy(etaR); - - delete [] onerad_dynamic; - delete [] onerad_frozen; - delete [] maxrad_dynamic; - delete [] maxrad_frozen; - } - memory->destroy(mass_rigid); -} -/* ---------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::compute(int eflag, int vflag) -{ -// feenableexcept(FE_INVALID | FE_OVERFLOW); - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv,R,a; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double kn, kt, k_Q, k_R, eta_N, eta_T, eta_Q, eta_R; - double Fne, Fdamp, Fntot, Fscrit, Frcrit, F_C, delta_C, delta_Cinv; - double overlap, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - double signtwist, magtwist, magtortwist, Mtcrit; - double fs,fs1,fs2,fs3,roll1,roll2,roll3,torroll1,torroll2,torroll3; - double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int shearupdate = 1; - if (update->setupflag) shearupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - int *type = atom->type; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *mask = atom->mask; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firstshear = fix_history->firstvalue; - - // 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]; - radi = radius[i]; - touch = firsttouch[i]; - allshear = firstshear[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - jtype = type[j]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; - - if ((rsq >= radsum*radsum && touch[jj] == 0) || - (rsq >= (radsum+delta_C)*(radsum+delta_C))) { - - // unset non-touching neighbors - - touch[jj] = 0; - shear = &allshear[3*jj]; - shear[0] = 0.0; - shear[1] = 0.0; - shear[2] = 0.0; - - } else { - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - //**************************************** - //Normal force = JKR-adjusted Hertzian contact + damping - //**************************************** - if (Ecoh[itype][jtype] != 0.0) delta_Cinv = 1.0/delta_C; - else delta_Cinv = 1.0; - overlap = (radsum - r)*delta_Cinv; - olapsq = overlap*overlap; - olapcubed = olapsq*overlap; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) - - Fne = F_C*foverFc; - - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - Fntot = Fne + Fdamp; - //if (screen) fprintf(screen,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); - //if (logfile) fprintf(logfile,"%d %d %16.16g %16.16g \n",itype,jtype,Ecoh[itype][jtype],E[itype][jtype]); - - //**************************************** - //Tangential force, including shear history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - // Luding Gran Matt 2008, v10,p235 suggests correcting radi and radj by subtracting - // delta/2, i.e. instead of radi, use distance to center of contact point? - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - touch[jj] = 1; - shear = &allshear[3*jj]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // Rotate and update shear displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (shearupdate) { - rsht = shear[0]*nx + shear[1]*ny + shear[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - shear[0] -= rsht*nx; - shear[1] -= rsht*ny; - shear[2] -= rsht*nz; - //Also rescale to preserve magnitude - shear[0] *= scalefac; - shear[1] *= scalefac; - shear[2] *= scalefac; - } - //Update shear history - shear[0] += vtr1*dt; - shear[1] += vtr2*dt; - shear[2] += vtr3*dt; - } - - // tangential forces = shear + tangential velocity damping - // following Zhao and Marshall Phys Fluids v20, p043302 (2008) - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; //Based on discussion in Marshall; eta_T can also be an independent parameter - fs1 = -kt*shear[0] - eta_T*vtr1; //eq 26 - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = muS[itype][jtype] * fabs(Fne + 2*F_C); - // For JKR, use eq 43 of Marshall. For DMT, use Fne instead - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - //shear[0] = (Fcrit/fs) * (shear[0] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[1] = (Fcrit/fs) * (shear[1] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - //shear[2] = (Fcrit/fs) * (shear[2] + eta_T*vtr1/kt) - eta_T*vtr1/kt; - shear[0] = -1.0/kt*(Fscrit*fs1/fs + eta_T*vtr1); //Same as above, but simpler (check!) - shear[1] = -1.0/kt*(Fscrit*fs2/fs + eta_T*vtr2); - shear[2] = -1.0/kt*(Fscrit*fs3/fs + eta_T*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - - //**************************************** - // Rolling force, including shear history effects - //**************************************** - - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = R*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = R*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = R*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - // Rolling displacement - rollmag = sqrt(shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]); - rolldotn = shear[3]*nx + shear[4]*ny + shear[5]*nz; - - if (shearupdate) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - shear[3] -= rolldotn*nx; - shear[4] -= rolldotn*ny; - shear[5] -= rolldotn*nz; - //Also rescale to preserve magnitude - shear[3] *= scalefac; - shear[4] *= scalefac; - shear[5] *= scalefac; - } - shear[3] += vrl1*dt; - shear[4] += vrl2*dt; - shear[5] += vrl3*dt; - } - - k_R = kR[itype][jtype]*4.0*F_C*pow(aovera0,1.5); - if (rollingdamp[itype][jtype] == INDEP) eta_R = etaR[itype][jtype]; - else if (rollingdamp[itype][jtype] == BRILLROLL) eta_R = muR[itype][jtype]*fabs(Fne); - fr1 = -k_R*shear[3] - eta_R*vrl1; - fr2 = -k_R*shear[4] - eta_R*vrl2; - fr3 = -k_R*shear[5] - eta_R*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = muR[itype][jtype] * fabs(Fne + 2*F_C); - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - shear[3] = -1.0/k_R*(Frcrit*fr1/fr + eta_R*vrl1); - shear[4] = -1.0/k_R*(Frcrit*fr2/fr + eta_R*vrl2); - shear[5] = -1.0/k_R*(Frcrit*fr3/fr + eta_R*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - - - //**************************************** - // Twisting torque, including shear history effects - //**************************************** - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - shear[6] += magtwist*dt; - k_Q = 0.5*kt*a*a;; //eq 32 - eta_Q = 0.5*eta_T*a*a; - magtortwist = -k_Q*shear[6] - eta_Q*magtwist;//M_t torque (eq 30) - - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit=TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - //shear[6] = Mtcrit/k_Q*magtwist/fabs(magtwist); - shear[6] = 1.0/k_Q*(Mtcrit*signtwist - eta_Q*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - //if (screen) fprintf(screen,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); - //if (logfile) fprintf(logfile,"%16.16g %16.16g %16.16g %16.16g %16.16g %16.16g %16.16g \n",fs1,fs2,fs3,Fntot,nx,ny,nz); - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - - torroll1 = R*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = R*(nz*fr1 - nx*fr3); - torroll3 = R*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - - -/* ---------------------------------------------------------------------- - allocate all arrays - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(E,n+1,n+1,"pair:E"); - memory->create(G,n+1,n+1,"pair:G"); - memory->create(normaldamp,n+1,n+1,"pair:normaldamp"); - memory->create(rollingdamp,n+1,n+1,"pair:rollingdamp"); - memory->create(alpha,n+1,n+1,"pair:alpha"); - memory->create(gamman,n+1,n+1,"pair:gamman"); - memory->create(muS,n+1,n+1,"pair:muS"); - memory->create(Ecoh,n+1,n+1,"pair:Ecoh"); - memory->create(kR,n+1,n+1,"pair:kR"); - memory->create(muR,n+1,n+1,"pair:muR"); - memory->create(etaR,n+1,n+1,"pair:etaR"); - - onerad_dynamic = new double[n+1]; - onerad_frozen = new double[n+1]; - maxrad_dynamic = new double[n+1]; - maxrad_frozen = new double[n+1]; -} - -/* ---------------------------------------------------------------------- - global settings - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::settings(int narg, char **arg) -{ - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - - if (strcmp(arg[0],"NULL") == 0 ) cut_global = -1.0; - else cut_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::coeff(int narg, char **arg) -{ - if (narg < 10 || narg > 15) - error->all(FLERR,"Incorrect args for pair coefficients2"); - - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double E_one = force->numeric(FLERR,arg[2]); - double G_one = force->numeric(FLERR,arg[3]); - double muS_one = force->numeric(FLERR,arg[4]); - double cor_one = force->numeric(FLERR,arg[5]); - double Ecoh_one = force->numeric(FLERR,arg[6]); - double kR_one = force->numeric(FLERR,arg[7]); - double muR_one = force->numeric(FLERR,arg[8]); - double etaR_one = force->numeric(FLERR,arg[9]); - - //Defaults - int normaldamp_one = TSUJI; - int rollingdamp_one = INDEP; - double cut_one = cut_global; - - int iarg = 10; - while (iarg < narg) { - if (strcmp(arg[iarg],"normaldamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"tsuji") == 0) normaldamp_one = TSUJI; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) normaldamp_one = BRILLIANTOV; - else error->all(FLERR, "Invalid normal damping model for pair/gran/dmt/rolling"); - iarg += 2; - } - else if (strcmp(arg[iarg],"rollingdamp") == 0){ - if (iarg+2 > narg) error->all(FLERR, "Invalid pair/gran/dmt/rolling entry"); - if (strcmp(arg[iarg+1],"independent") == 0) rollingdamp_one = INDEP; - else if (strcmp(arg[iarg+1],"brilliantov") == 0) rollingdamp_one = BRILLROLL; - else error->all(FLERR, "Invalid rolling damping model for pair/gran/dmt/rolling"); - iarg +=2; - } - else { - if (strcmp(arg[iarg],"NULL") == 0) cut_one = -1.0; - else cut_one = force->numeric(FLERR,arg[iarg]); - iarg += 1; - } - } - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - double pois = E_one/(2.0*G_one) - 1.0; - double alpha_one = 1.2728-4.2783*cor_one+11.087*cor_one*cor_one-22.348*cor_one*cor_one*cor_one+27.467*cor_one*cor_one*cor_one*cor_one-18.022*cor_one*cor_one*cor_one*cor_one*cor_one+4.8218*cor_one*cor_one*cor_one*cor_one*cor_one*cor_one; - - for (int j = MAX(jlo,i); j <= jhi; j++) { - E[i][j] = E_one; - G[i][j] = G_one; - if (normaldamp_one == TSUJI) { - normaldamp[i][j] = TSUJI; - alpha[i][j] = alpha_one; - } - else if (normaldamp_one == BRILLIANTOV) { - normaldamp[i][j] = BRILLIANTOV; - gamman[i][j] = cor_one; - } - if (rollingdamp_one == INDEP) { - rollingdamp[i][j] = INDEP; - } - else if (rollingdamp_one == BRILLROLL) { - rollingdamp[i][j] = BRILLROLL; - } - muS[i][j] = muS_one; - Ecoh[i][j] = Ecoh_one; - kR[i][j] = kR_one; - etaR[i][j] = etaR_one; - muR[i][j] = muR_one; - cut[i][j] = cut_one; - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients1"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::init_style() -{ - int i; - - // error and warning checks - - if (!atom->radius_flag || !atom->rmass_flag) - error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); - if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - - // need a granular neigh list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->size = 1; - if (history) neighbor->requests[irequest]->history = 1; - - dt = update->dt; - - // if shear history is stored: - // if first init, create Fix needed for storing shear history - - if (history && fix_history == NULL) { - char dnumstr[16]; - sprintf(dnumstr,"%d",3); - char **fixarg = new char*[4]; - fixarg[0] = (char *) "NEIGH_HISTORY"; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "NEIGH_HISTORY"; - fixarg[3] = dnumstr; - modify->add_fix(4,fixarg,1); - delete [] fixarg; - fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; - fix_history->pair = this; - } - - // check for FixFreeze and set freeze_group_bit - - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; - - // check for FixRigid so can extract rigid body masses - - fix_rigid = NULL; - for (i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) break; - if (i < modify->nfix) fix_rigid = modify->fix[i]; - - // check for FixPour and FixDeposit so can extract particle radii - - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; - - // set maxrad_dynamic and maxrad_frozen for each type - // include future FixPour and FixDeposit particles as dynamic - - int itype; - for (i = 1; i <= atom->ntypes; i++) { - onerad_dynamic[i] = onerad_frozen[i] = 0.0; - if (ipour >= 0) { - itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[ipour]->extract("radius",itype)); - } - if (idep >= 0) { - itype = i; - onerad_dynamic[i] = - *((double *) modify->fix[idep]->extract("radius",itype)); - } - } - - double *radius = atom->radius; - int *mask = atom->mask; - int *type = atom->type; - int nlocal = atom->nlocal; - - for (i = 0; i < nlocal; i++) - if (mask[i] & freeze_group_bit) - onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]); - else - onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); - - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - - // set fix which stores history info - - if (history) { - int ifix = modify->find_fix("NEIGH_HISTORY"); - if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; - } -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i - ------------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::init_one(int i, int j) -{ - if (setflag[i][j] == 0) { - E[i][j] = mix_stiffnessE(E[i][i],E[j][j],G[i][i],G[j][j]); - G[i][j] = mix_stiffnessG(G[i][i],E[j][j],G[i][i],G[j][j]); - if (normaldamp[i][j] == TSUJI) { - alpha[i][j] = mix_geom(alpha[i][i],alpha[j][j]); - } - else if (normaldamp[i][j] == BRILLIANTOV) { - gamman[i][j] = mix_geom(gamman[i][i],gamman[j][j]); - } - muS[i][j] = mix_geom(muS[i][i],muS[j][j]); - Ecoh[i][j] = mix_geom(Ecoh[i][i],Ecoh[j][j]); - kR[i][j] = mix_geom(kR[i][i],kR[j][j]); - etaR[i][j] = mix_geom(etaR[i][i],etaR[j][j]); - muR[i][j] = mix_geom(muR[i][i],muR[j][j]); - } - - E[j][i] = E[i][j]; - G[j][i] = G[i][j]; - normaldamp[j][i] = normaldamp[i][j]; - alpha[j][i] = alpha[i][j]; - gamman[j][i] = gamman[i][j]; - rollingdamp[j][i] = rollingdamp[i][j]; - muS[j][i] = muS[i][j]; - Ecoh[j][i] = Ecoh[i][j]; - kR[j][i] = kR[i][j]; - etaR[j][i] = etaR[i][j]; - muR[j][i] = muR[i][j]; - - double cutoff = cut[i][j]; - - // It is likely that cut[i][j] at this point is still 0.0. This can happen when - // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates - // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size - // To avoid this issue,for cases involving cut[i][j] = 0.0 (possible only - // if there is no current information about radius/cutoff of type i and j). - // we assign cutoff = min(cut[i][j]) for i,j such that cut[i][j] > 0.0. - - if (cut[i][j] < 0.0) { - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } - } - return cutoff; -} - - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&E[i][j],sizeof(double),1,fp); - fwrite(&G[i][j],sizeof(double),1,fp); - fwrite(&normaldamp[i][j],sizeof(int),1,fp); - fwrite(&rollingdamp[i][j],sizeof(int),1,fp); - fwrite(&alpha[i][j],sizeof(double),1,fp); - fwrite(&gamman[i][j],sizeof(double),1,fp); - fwrite(&muS[i][j],sizeof(double),1,fp); - fwrite(&Ecoh[i][j],sizeof(double),1,fp); - fwrite(&kR[i][j],sizeof(double),1,fp); - fwrite(&muR[i][j],sizeof(double),1,fp); - fwrite(&etaR[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&E[i][j],sizeof(double),1,fp); - fread(&G[i][j],sizeof(double),1,fp); - fread(&normaldamp[i][j],sizeof(int),1,fp); - fread(&rollingdamp[i][j],sizeof(int),1,fp); - fread(&alpha[i][j],sizeof(double),1,fp); - fread(&gamman[i][j],sizeof(double),1,fp); - fread(&muS[i][j],sizeof(double),1,fp); - fread(&Ecoh[i][j],sizeof(double),1,fp); - fread(&kR[i][j],sizeof(double),1,fp); - fread(&muR[i][j],sizeof(double),1,fp); - fread(&etaR[i][j],sizeof(double),1,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&E[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&G[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&normaldamp[i][j],1,MPI_INT,0,world); - MPI_Bcast(&rollingdamp[i][j],1,MPI_INT,0,world); - MPI_Bcast(&alpha[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&gamman[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&muS[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&Ecoh[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&kR[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&muR[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&etaR[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&cut_global,sizeof(double),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); -} - -/* ---------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::reset_dt() -{ - dt = update->dt; -} - -/* ---------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::single(int i, int j, int itype, int jtype, - double rsq, double factor_coul, double factor_lj, double &fforce) -{ -// feenableexcept(FE_INVALID | FE_OVERFLOW); - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, R; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double overlap, a; - double mi,mj,meff,damp,kn,kt; - double Fdamp,Fne,Fntot,Fscrit; - double eta_N,eta_T; - double vtr1,vtr2,vtr3,vrel; - double fs1,fs2,fs3,fs; - double shrmag; - double F_C, delta_C, olapsq, olapcubed, sqrtterm, tmp, a0; - double keyterm, keyterm2, keyterm3, aovera0, foverFc; - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - - r = sqrt(rsq); - rinv = 1.0/r; - rsqinv = 1.0/rsq; - R = radi*radj/(radi+radj); - a0 = pow(9.0*M_PI*Ecoh[itype][jtype]*R*R/E[itype][jtype],ONETHIRD); - delta_C = 0.5*a0*a0*POW6ONE/R; - - int *touch = fix_history->firstflag[i]; - if ((rsq >= (radsum+delta_C)*(radsum+delta_C) )|| - (rsq >= radsum*radsum && touch[j])){ - fforce = 0.0; - svector[0] = svector[1] = svector[2] = svector[3] = 0.0; - return 0.0; - } - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - double *rmass = atom->rmass; - int *type = atom->type; - int *mask = atom->mask; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - - // normal force = JKR - F_C = 3.0*R*M_PI*Ecoh[itype][jtype]; - overlap = radsum - r; - olapsq = overlap*overlap; - olapcubed = olapsq*olapsq; - sqrtterm = sqrt(1.0 + olapcubed); - tmp = 2.0 + olapcubed + 2.0*sqrtterm; - keyterm = pow(tmp,ONETHIRD); - keyterm2 = olapsq/keyterm; - keyterm3 = sqrt(overlap + keyterm2 + keyterm); - aovera0 = POW6TWO * (keyterm3 + - sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3));// eq 41 - a = aovera0*a0; - foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5));//F_ne/F_C (eq 40) - - Fne = F_C*foverFc; - - //Damping - kn = 4.0/3.0*E[itype][jtype]*a; - if (normaldamp[itype][jtype] == BRILLIANTOV) eta_N = a*meff*gamman[itype][jtype]; - else if (normaldamp[itype][jtype] == TSUJI) eta_N=alpha[itype][jtype]*sqrt(meff*kn); - - Fdamp = -eta_N*vnnr; //F_nd eq 23 and Zhao eq 19 - - Fntot = Fne + Fdamp; - - // relative velocities - - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // shear history effects - // neighprev = index of found neigh on previous call - // search entire jnum list of neighbors of I for neighbor J - // start from neighprev, since will typically be next neighbor - // reset neighprev to 0 as necessary - - int jnum = list->numneigh[i]; - int *jlist = list->firstneigh[i]; - double *allshear = fix_history->firstvalue[i]; - - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - - double *shear = &allshear[3*neighprev]; - shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + - shear[2]*shear[2]); - - // tangential forces = shear + tangential velocity damping - kt=8.0*G[itype][jtype]*a; - - eta_T = eta_N; - fs1 = -kt*shear[0] - eta_T*vtr1; - fs2 = -kt*shear[1] - eta_T*vtr2; - fs3 = -kt*shear[2] - eta_T*vtr3; - - // rescale frictional displacements and forces if needed - - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - Fscrit= muS[itype][jtype] * fabs(Fne + 2*F_C); - - if (fs > Fscrit) { - if (shrmag != 0.0) { - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - fs *= Fscrit/fs; - } else fs1 = fs2 = fs3 = fs = 0.0; - } - - // set all forces and return no energy - - fforce = Fntot; - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = vn1; - svector[5] = vn2; - svector[6] = vn3; - svector[7] = vt1; - svector[8] = vt2; - svector[9] = vt3; - return 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int PairGranJKRRollingMulti::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - - m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = mass_rigid[j]; - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void PairGranJKRRollingMulti::unpack_forward_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) - mass_rigid[i] = buf[m++]; -} - -/* ---------------------------------------------------------------------- - memory usage of local atom-based arrays - ------------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::memory_usage() -{ - double bytes = nmax * sizeof(double); - return bytes; -} - -/* ---------------------------------------------------------------------- - mixing of stiffness (E) - ------------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); -} - -/* ---------------------------------------------------------------------- - mixing of stiffness (G) - ------------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); -} - -/* ---------------------------------------------------------------------- - mixing of everything else - ------------------------------------------------------------------------- */ - -double PairGranJKRRollingMulti::mix_geom(double valii, double valjj) -{ - return sqrt(valii*valjj); -} diff --git a/src/GRANULAR/pair_gran_jkr_rolling_multi.h b/src/GRANULAR/pair_gran_jkr_rolling_multi.h deleted file mode 100644 index c9c75de9a6..0000000000 --- a/src/GRANULAR/pair_gran_jkr_rolling_multi.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(gran/jkr/rolling/multi,PairGranJKRRollingMulti) - -#else - -#ifndef LMP_PAIR_GRAN_JKR_ROLLING_MULTI_H -#define LMP_PAIR_GRAN_JKR_ROLLING_MULTI_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairGranJKRRollingMulti : public Pair { -public: - PairGranJKRRollingMulti(class LAMMPS *); - virtual ~PairGranJKRRollingMulti(); - virtual void compute(int, int); - virtual void settings(int, char **); - virtual void coeff(int, char **); // Made Virtual by IS Oct 7 2017 - void init_style(); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - void reset_dt(); - virtual double single(int, int, int, int, double, double, double, double &); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - double memory_usage(); - - protected: - double cut_global; - double **E,**G,**alpha,**gamman,**muS,**Ecoh,**kR,**muR,**etaR,**cut; - int **normaldamp, **rollingdamp; - double dt; - int freeze_group_bit; - int history; - - int neighprev; - double *onerad_dynamic,*onerad_frozen; - double *maxrad_dynamic,*maxrad_frozen; - - class FixNeighHistory *fix_history; - - // storage of rigid body masses for use in granular interactions - - class Fix *fix_rigid; // ptr to rigid body fix, NULL if none - double *mass_rigid; // rigid mass for owned+ghost atoms - int nmax; // allocated size of mass_rigid - - virtual void allocate(); // Made Virtual by IS Oct 7 2017 - -private: - double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); - double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); - double mix_geom(double valii, double valjj); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - - */ diff --git a/src/GRANULAR/pair_granular_multi.cpp b/src/GRANULAR/pair_granular_multi.cpp deleted file mode 100644 index 07a6cab3dd..0000000000 --- a/src/GRANULAR/pair_granular_multi.cpp +++ /dev/null @@ -1,1624 +0,0 @@ -/* ---------------------------------------------------------------------- -http://lammps.sandia.gov, Sandia National Laboratories -Steve Plimpton, sjplimp@sandia.gov - -Copyright (2003) Sandia Corporation. Under the terms of Contract -DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains -certain rights in this software. This software is distributed under -the GNU General Public License. - -See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -Contributing authors: -Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) -Leo Silbert (SNL), Gary Grest (SNL) ------------------------------------------------------------------------ */ - -#include -#include -#include -#include -#include "pair_granular_multi.h" -#include "atom.h" -#include "atom_vec.h" -#include "domain.h" -#include "force.h" -#include "update.h" -#include "modify.h" -#include "fix.h" -#include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" -#include "math_const.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define PI27SQ 266.47931882941264802866 // 27*PI**2 -#define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) -#define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) -#define INVROOT6 0.40824829046386307274 // 1/sqrt(6) -#define FOURTHIRDS 1.333333333333333 // 4/3 -#define TWOPI 6.28318530717959 // 2*PI - -#define EPSILON 1e-10 - -enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; -enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_MINDLIN}; -enum {TWIST_NONE, TWIST_NOHISTORY, TWIST_SDS, TWIST_MARSHALL}; -enum {ROLL_NONE, ROLL_NOHISTORY, ROLL_SDS}; - -/* ---------------------------------------------------------------------- */ - -PairGranularMulti::PairGranularMulti(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 1; - no_virial_fdotr_compute = 1; - fix_history = NULL; - - single_extra = 9; - svector = new double[single_extra]; - - neighprev = 0; - - nmax = 0; - mass_rigid = NULL; - - onerad_dynamic = NULL; - onerad_frozen = NULL; - maxrad_dynamic = NULL; - maxrad_frozen = NULL; - - dt = update->dt; - - // set comm size needed by this Pair if used with fix rigid - - comm_forward = 1; - - use_history = 0; - beyond_contact = 0; - nondefault_history_transfer = 0; - tangential_history_index = 0; - roll_history_index = twist_history_index = 0; - -} - -/* ---------------------------------------------------------------------- */ -PairGranularMulti::~PairGranularMulti() -{ - delete [] svector; - if (fix_history) modify->delete_fix("NEIGH_HISTORY"); - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(cut); - - memory->destroy(normal_coeffs); - memory->destroy(tangential_coeffs); - memory->destroy(roll_coeffs); - memory->destroy(twist_coeffs); - - memory->destroy(normal); - memory->destroy(damping); - memory->destroy(tangential); - memory->destroy(roll); - memory->destroy(twist); - - delete [] onerad_dynamic; - delete [] onerad_frozen; - delete [] maxrad_dynamic; - delete [] maxrad_frozen; - } - memory->destroy(mass_rigid); -} - -void PairGranularMulti::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; - double radi,radj,radsum,rsq,r,rinv,rsqinv; - double Reff, delta, dR, dR2; - - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - - double knfac, damp_normal; - double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; - - //For JKR - double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; - double t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; - - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - - //Rolling - double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - - //Twisting - double k_twist, damp_twist, mu_twist; - double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; - - double shrmag,rsht; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *history,*allhistory,**firsthistory; - - bool touchflag; - - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int historyupdate = 1; - if (update->setupflag) historyupdate = 0; - - // update rigid body info for owned & ghost atoms if using FixRigid masses - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (fix_rigid && neighbor->ago == 0){ - int tmp; - int *body = (int *) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"pair:mass_rigid"); - } - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - comm->forward_comm_pair(this); - } - - double **x = atom->x; - double **v = atom->v; - double **f = atom->f; - int *type = atom->type; - double **omega = atom->omega; - double **torque = atom->torque; - double *radius = atom->radius; - double *rmass = atom->rmass; - int *mask = atom->mask; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firsthistory = fix_history->firstvalue; - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - radi = radius[i]; - touch = firsttouch[i]; - allhistory = firsthistory[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++){ - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - jtype = type[j]; - rsq = delx*delx + dely*dely + delz*delz; - radj = radius[j]; - radsum = radi + radj; - - E = normal_coeffs[itype][jtype][0]; - Reff = radi*radj/(radi+radj); - touchflag = false; - - if (normal[itype][jtype] == JKR){ - if (touch[jj]){ - R2 = Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); - dist_pulloff = radsum-delta_pulloff; - touchflag = (rsq < dist_pulloff*dist_pulloff); - } - else{ - touchflag = (rsq < radsum*radsum); - } - } - else{ - touchflag = (rsq < radsum*radsum); - } - - if (!touchflag){ - // unset non-touching neighbors - touch[jj] = 0; - history = &allhistory[size_history*jj]; - for (int k = 0; k < size_history; k++) history[k] = 0.0; - } - else{ - r = sqrt(rsq); - rinv = 1.0/r; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - if (normal[itype][jtype] == JKR){ - touch[jj] = 1; - R2=Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - dR2 = dR*dR; - t0 = coh*coh*R2*R2*E; - t1 = PI27SQ*t0; - t2 = 8*dR*dR2*E*E*E; - t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); - t5 = t3/t4 + t4/E; - sqrt2 = MAX(0, 2*dR + t5); - t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); - a = INVROOT6*(t6 + sqrt(sqrt3)); - a2 = a*a; - knfac = FOURTHIRDS*E*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ - knfac = E; //Hooke - Fne = knfac*delta; - if (normal[itype][jtype] != HOOKE) - a = sqrt(dR); - Fne *= a; - if (normal[itype][jtype] == DMT) - Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; - } - - //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping[itype][jtype] == VELOCITY){ - damp_normal = 1; - } - else if (damping[itype][jtype] == VISCOELASTIC){ - if (normal[itype][jtype] == HOOKE) a = sqrt(dR); - damp_normal = a*meff; - } - else if (damping[itype][jtype] == TSUJI){ - damp_normal = sqrt(meff*knfac); - } - - Fdamp = -normal_coeffs[itype][jtype][1]*damp_normal*vnnr; - - Fntot = Fne + Fdamp; - - //**************************************** - //Tangential force, including history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - // If any history is needed: - if (use_history){ - touch[jj] = 1; - history = &allhistory[size_history*jj]; - } - - if (normal[itype][jtype] == JKR){ - F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); - } - else{ - Fcrit = fabs(Fne); - } - - //------------------------------ - //Tangential forces - //------------------------------ - k_tangential = tangential_coeffs[itype][jtype][0]; - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - - if (tangential_history){ - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); - - // Rotate and update displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (historyupdate) { - rsht = history[0]*nx + history[1]*ny + history[2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - history[0] -= rsht*nx; - history[1] -= rsht*ny; - history[2] -= rsht*nz; - //Also rescale to preserve magnitude - history[0] *= scalefac; - history[1] *= scalefac; - history[2] *= scalefac; - } - //Update history - history[0] += vtr1*dt; - history[1] += vtr2*dt; - history[2] += vtr3*dt; - } - - // tangential forces = history + tangential velocity damping - fs1 = -k_tangential*history[0] - damp_tangential*vtr1; - fs2 = -k_tangential*history[1] - damp_tangential*vtr2; - fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - } - else{ //Classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; - else Ft = 0.0; - fs1 = -Ft*vtr1; - fs2 = -Ft*vtr2; - fs3 = -Ft*vtr3; - } - - //**************************************** - // Rolling resistance - //**************************************** - - if (roll[itype][jtype] != ROLL_NONE){ - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - if (roll_history){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; - - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); - - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - - if (historyupdate){ - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - history[rhist0] -= rolldotn*nx; - history[rhist1] -= rolldotn*ny; - history[rhist2] -= rolldotn*nz; - //Also rescale to preserve magnitude - history[rhist0] *= scalefac; - history[rhist1] *= scalefac; - history[rhist2] *= scalefac; - } - history[rhist0] += vrl1*dt; - history[rhist1] += vrl2*dt; - history[rhist2] += vrl3*dt; - } - - - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; - } - } - - //**************************************** - // Twisting torque, including history effects - //**************************************** - if (twist[itype][jtype] != TWIST_NONE){ - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist[itype][jtype] == TWIST_MARSHALL){ - k_twist = 0.5*k_tangential*a*a;; //eq 32 - damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; - } - else{ - k_twist = twist_coeffs[itype][jtype][0]; - damp_twist = twist_coeffs[itype][jtype][1]; - mu_twist = twist_coeffs[itype][jtype][2]; - } - if (twist[itype][jtype] > 1){ - if (historyupdate){ - history[twist_history_index] += magtwist*dt; - } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; - } - } - // Apply forces & torques - - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; - - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; - - if (twist[itype][jtype] != TWIST_NONE){ - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; - - torque[i][0] += tortwist1; - torque[i][1] += tortwist2; - torque[i][2] += tortwist3; - } - - if (roll[itype][jtype] != ROLL_NONE){ - torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = Reff*(nz*fr1 - nx*fr3); - torroll3 = Reff*(nx*fr2 - ny*fr1); - - torque[i][0] += torroll1; - torque[i][1] += torroll2; - torque[i][2] += torroll3; - } - - if (force->newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; - - if (twist[itype][jtype] != TWIST_NONE){ - torque[j][0] -= tortwist1; - torque[j][1] -= tortwist2; - torque[j][2] -= tortwist3; - } - if (roll[itype][jtype] != ROLL_NONE){ - torque[j][0] -= torroll1; - torque[j][1] -= torroll2; - torque[j][2] -= torroll3; - } - } - if (evflag) ev_tally_xyz(i,j,nlocal,0, - 0.0,0.0,fx,fy,fz,delx,dely,delz); - } - } - } -} - - -/* ---------------------------------------------------------------------- -allocate all arrays -------------------------------------------------------------------------- */ - -void PairGranularMulti::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(normal_coeffs,n+1,n+1,4,"pair:normal_coeffs"); - memory->create(tangential_coeffs,n+1,n+1,3,"pair:tangential_coeffs"); - memory->create(roll_coeffs,n+1,n+1,3,"pair:roll_coeffs"); - memory->create(twist_coeffs,n+1,n+1,3,"pair:twist_coeffs"); - - memory->create(normal,n+1,n+1,"pair:normal"); - memory->create(damping,n+1,n+1,"pair:damping"); - memory->create(tangential,n+1,n+1,"pair:tangential"); - memory->create(roll,n+1,n+1,"pair:roll"); - memory->create(twist,n+1,n+1,"pair:twist"); - - onerad_dynamic = new double[n+1]; - onerad_frozen = new double[n+1]; - maxrad_dynamic = new double[n+1]; - maxrad_frozen = new double[n+1]; -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairGranularMulti::settings(int narg, char **arg) -{ - if (narg == 1){ - cutoff_global = force->numeric(FLERR,arg[0]); - } - else{ - cutoff_global = -1; //Will be set based on particle sizes, model choice - } - - tangential_history = 0; - roll_history = twist_history = 0; -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairGranularMulti::coeff(int narg, char **arg) -{ - int normal_local, damping_local, tangential_local, roll_local, twist_local; - - double normal_coeffs_local[4]; - double tangential_coeffs_local[4]; - double roll_coeffs_local[4]; - double twist_coeffs_local[4]; - - if (narg < 2) - error->all(FLERR,"Incorrect args for pair coefficients"); - - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - //Defaults - normal_local = tangential_local = -1; - roll_local = twist_local = 0; - damping_local = VISCOELASTIC; - - int iarg = 2; - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ - if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); - normal_local = HOOKE; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ - int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = HERTZ; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ - int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = HERTZ; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); - normal_local = DMT; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1])*FOURTHIRDS; //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+3]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); - beyond_contact = 1; - normal_local = JKR; - normal_coeffs_local[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_local[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_local[2] = force->numeric(FLERR,arg[iarg+3]); //G - normal_coeffs_local[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion - iarg += 5; - } - else if (strcmp(arg[iarg], "damp") == 0){ - if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1], "velocity") == 0){ - damping_local = VELOCITY; - iarg += 1; - } - else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ - damping_local = VISCOELASTIC; - iarg += 1; - } - else if (strcmp(arg[iarg], "tsuji") == 0){ - damping_local = TSUJI; - iarg += 1; - } - } - else if (strcmp(arg[iarg], "tangential") == 0){ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - tangential_local = TANGENTIAL_NOHISTORY; - } - else if (strcmp(arg[iarg+1], "mindlin") == 0){ - tangential_local = TANGENTIAL_MINDLIN; - tangential_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); - } - tangential_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - tangential_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - else if (strcmp(arg[iarg], "rolling") == 0){ - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ - roll_local = ROLL_NONE; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - roll_local = ROLL_NOHISTORY; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ - roll_local = ROLL_SDS; - roll_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); - } - roll_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. - iarg += 5; - } - } - else if (strcmp(arg[iarg], "twisting") == 0){ - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ - twist_local = TWIST_NONE; - iarg += 2; - } - else if (strcmp(arg[iarg+1], "marshall") == 0){ - twist_local = TWIST_MARSHALL; - twist_history = 1; - iarg += 2; - } - else{ - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); - if (strcmp(arg[iarg+1], "nohistory") == 0){ - twist_local = TWIST_NOHISTORY; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ - twist_local = TWIST_SDS; - twist_history = 1; - } - else{ - error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); - } - twist_coeffs_local[0] = force->numeric(FLERR,arg[iarg+2]); //kt - twist_coeffs_local[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - twist_coeffs_local[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. - iarg += 5; - } - } - else error->all(FLERR, "Illegal pair coeff command"); - } - - //It is an error not to specify normal or tangential model - if ((normal_local < 0) || (tangential_local < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); - - int count = 0; - double damp; - if (damping_local == TSUJI){ - double cor; - cor = normal_coeffs_local[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); - } - else damp = normal_coeffs_local[1]; - - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - normal[i][j] = normal[j][i] = normal_local; - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_local[0]; - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; - if (normal_local != HERTZ && normal_local != HOOKE) normal_coeffs[i][j][2] = normal_coeffs_local[2]; - if ((normal_local == JKR) || (normal_local == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = normal_coeffs_local[3]; - - damping[i][j] = damping[j][i] = damping_local; - - tangential[i][j] = tangential[j][i] = tangential_local; - for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_local[k]; - - roll[i][j] = roll[j][i] = roll_local; - if (roll_local != ROLL_NONE) - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = roll_coeffs_local[k]; - - twist[i][j] = twist[j][i] = twist_local; - if (twist_local != TWIST_NONE && twist_local != TWIST_MARSHALL) - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_local[k]; - - setflag[i][j] = 1; - count++; - } - } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairGranularMulti::init_style() -{ - int i; - - // error and warning checks - - if (!atom->radius_flag || !atom->rmass_flag) - error->all(FLERR,"Pair granular requires atom attributes radius, rmass"); - if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - - // Determine whether we need a granular neigh list, how large it needs to be - use_history = tangential_history || roll_history || twist_history; - - //For JKR, will need fix/neigh/history to keep track of touch arrays - for (int i = 1; i <= atom->ntypes; i++) - for (int j = 1; j <= atom->ntypes; j++) - if (normal[i][j] == JKR) use_history = 1; - - size_history = 3*tangential_history + 3*roll_history + twist_history; - - //Determine location of tangential/roll/twist histories in array - if (roll_history){ - if (tangential_history) roll_history_index = 3; - else roll_history_index = 0; - } - if (twist_history){ - if (tangential_history){ - if (roll_history) twist_history_index = 6; - else twist_history_index = 3; - } - else{ - if (roll_history) twist_history_index = 3; - else twist_history_index = 0; - } - } - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->size = 1; - if (use_history) neighbor->requests[irequest]->history = 1; - - dt = update->dt; - - // if history is stored: - // if first init, create Fix needed for storing history - - if (use_history && fix_history == NULL) { - char dnumstr[16]; - sprintf(dnumstr,"%d",size_history); - char **fixarg = new char*[4]; - fixarg[0] = (char *) "NEIGH_HISTORY"; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "NEIGH_HISTORY"; - fixarg[3] = dnumstr; - modify->add_fix(4,fixarg,1); - delete [] fixarg; - fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; - fix_history->pair = this; - } - - // check for FixFreeze and set freeze_group_bit - - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; - - // check for FixRigid so can extract rigid body masses - - fix_rigid = NULL; - for (i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) break; - if (i < modify->nfix) fix_rigid = modify->fix[i]; - - // check for FixPour and FixDeposit so can extract particle radii - - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; - - // set maxrad_dynamic and maxrad_frozen for each type - // include future FixPour and FixDeposit particles as dynamic - - int itype; - for (i = 1; i <= atom->ntypes; i++) { - onerad_dynamic[i] = onerad_frozen[i] = 0.0; - if (ipour >= 0) { - itype = i; - double radmax = *((double *) modify->fix[ipour]->extract("radius",itype)); - if (normal[itype][itype] == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); - onerad_dynamic[i] = radmax; - } - if (idep >= 0) { - itype = i; - double radmax = *((double *) modify->fix[idep]->extract("radius",itype)); - if (normal[itype][itype] == JKR) radmax = radmax - 0.5*pulloff_distance(radmax, itype); - onerad_dynamic[i] = radmax; - } - } - - double *radius = atom->radius; - int *mask = atom->mask; - int *type = atom->type; - int nlocal = atom->nlocal; - - for (i = 0; i < nlocal; i++){ - double radius_cut = radius[i]; - if (normal[type[i]][type[i]] == JKR){ - radius_cut = radius[i] - 0.5*pulloff_distance(radius[i], type[i]); - } - if (mask[i] & freeze_group_bit){ - onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); - } - else{ - onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); - } - } - - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - - // set fix which stores history info - - if (size_history > 0){ - int ifix = modify->find_fix("NEIGH_HISTORY"); - if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; - } -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairGranularMulti::init_one(int i, int j) -{ - double cutoff; - if (setflag[i][j] == 0) { - if ((normal[i][i] != normal[j][j]) || - (damping[i][i] != damping[j][j]) || - (tangential[i][i] != tangential[j][j]) || - (roll[i][i] != roll[j][j]) || - (twist[i][i] != twist[j][j])){ - - char str[512]; - sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); - error->one(FLERR,str); - } - - if (normal[i][j] != HOOKE && normal[i][j] != HERTZ){ - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - normal_coeffs[i][j][2] = normal_coeffs[j][i][2] = mix_stiffnessG(normal_coeffs[i][i][0], normal_coeffs[j][j][0], - normal_coeffs[i][i][2], normal_coeffs[j][j][2]); - } - else{ - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); - } - - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); - if ((normal[i][i] == JKR) || (normal[i][i] == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); - - for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = normal_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - - - if (roll[i][i] != ROLL_NONE){ - for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); - } - - if (twist[i][i] != TWIST_NONE && twist[i][i] != TWIST_MARSHALL){ - for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); - } - } - - // It is possible that cut[i][j] at this point is still 0.0. This can happen when - // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates - // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size - // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only - // if there is no current information about radius/cutoff of type i and j). - // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. - - if (cutoff_global < 0){ - if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || - ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; - cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]); - cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) - double cutmax = 0.0; - for (int k = 1; k <= atom->ntypes; k++) { - cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); - cutmax = MAX(cutmax,2.0*maxrad_frozen[k]); - } - cutoff = cutmax; - } - } - else{ - cutoff = cutoff_global; - } - return cutoff; -} - - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ - -void PairGranularMulti::write_restart(FILE *fp) -{ - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&normal[i][j],sizeof(int),1,fp); - fwrite(&damping[i][j],sizeof(int),1,fp); - fwrite(&tangential[i][j],sizeof(int),1,fp); - fwrite(&roll[i][j],sizeof(int),1,fp); - fwrite(&twist[i][j],sizeof(int),1,fp); - fwrite(&normal_coeffs[i][j],sizeof(double),4,fp); - fwrite(&tangential_coeffs[i][j],sizeof(double),3,fp); - fwrite(&roll_coeffs[i][j],sizeof(double),3,fp); - fwrite(&twist_coeffs[i][j],sizeof(double),3,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ - -void PairGranularMulti::read_restart(FILE *fp) -{ - allocate(); - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&normal[i][j],sizeof(int),1,fp); - fread(&damping[i][j],sizeof(int),1,fp); - fread(&tangential[i][j],sizeof(int),1,fp); - fread(&roll[i][j],sizeof(int),1,fp); - fread(&twist[i][j],sizeof(int),1,fp); - fread(&normal_coeffs[i][j],sizeof(double),4,fp); - fread(&tangential_coeffs[i][j],sizeof(double),3,fp); - fread(&roll_coeffs[i][j],sizeof(double),3,fp); - fread(&twist_coeffs[i][j],sizeof(double),3,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&normal[i][j],1,MPI_INT,0,world); - MPI_Bcast(&damping[i][j],1,MPI_INT,0,world); - MPI_Bcast(&tangential[i][j],1,MPI_INT,0,world); - MPI_Bcast(&roll[i][j],1,MPI_INT,0,world); - MPI_Bcast(&twist[i][j],1,MPI_INT,0,world); - MPI_Bcast(&normal_coeffs[i][j],4,MPI_DOUBLE,0,world); - MPI_Bcast(&tangential_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&roll_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&twist_coeffs[i][j],3,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } - } -} - - -/* ---------------------------------------------------------------------- */ - -void PairGranularMulti::reset_dt() -{ - dt = update->dt; -} - -/* ---------------------------------------------------------------------- */ - -double PairGranularMulti::single(int i, int j, int itype, int jtype, - double rsq, double factor_coul, double factor_lj, double &fforce) -{ - double radi,radj,radsum; - double r,rinv,rsqinv,delx,dely,delz, nx, ny, nz, Reff; - double dR, dR2; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; - double mi,mj,meff,damp,ccel,tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; - - double knfac, damp_normal; - double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fcrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; - - //For JKR - double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; - double delta, t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3, sqrt4; - - - //Rolling - double k_roll, damp_roll; - double roll1, roll2, roll3, torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; - - //Twisting - double k_twist, damp_twist, mu_twist; - double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; - - double shrmag,rsht; - int jnum; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *history,*allhistory,**firsthistory; - - double *radius = atom->radius; - radi = radius[i]; - radj = radius[j]; - radsum = radi + radj; - Reff = radi*radj/(radi+radj); - - bool touchflag; - if (normal[itype][jtype] == JKR){ - R2 = Reff*Reff; - coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); - dist_pulloff = radsum+delta_pulloff; - touchflag = (rsq <= dist_pulloff*dist_pulloff); - } - else{ - touchflag = (rsq <= radsum*radsum); - } - - if (touchflag){ - fforce = 0.0; - for (int m = 0; m < single_extra; m++) svector[m] = 0.0; - return 0.0; - } - - double **x = atom->x; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - r = sqrt(rsq); - rinv = 1.0/r; - - nx = delx*rinv; - ny = dely*rinv; - nz = delz*rinv; - - // relative translational velocity - - double **v = atom->v; - vr1 = v[i][0] - v[j][0]; - vr2 = v[i][1] - v[j][1]; - vr3 = v[i][2] - v[j][2]; - - // normal component - - vnnr = vr1*nx + vr2*ny + vr3*nz; - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; - - double *rmass = atom->rmass; - int *mask = atom->mask; - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - - double **omega = atom->omega; - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // meff = effective mass of pair of particles - // if I or J part of rigid body, use body mass - // if I or J is frozen, meff is other particle - - int *type = atom->type; - - mi = rmass[i]; - mj = rmass[j]; - if (fix_rigid) { - // NOTE: ensure mass_rigid is current for owned+ghost atoms? - if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; - if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; - } - - meff = mi*mj / (mi+mj); - if (mask[i] & freeze_group_bit) meff = mj; - if (mask[j] & freeze_group_bit) meff = mi; - - delta = radsum - r; - dR = delta*Reff; - if (normal[itype][jtype] == JKR){ - dR2 = dR*dR; - t0 = coh*coh*R2*R2*E; - t1 = PI27SQ*t0; - t2 = 8*dR*dR2*E*E*E; - t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); - t5 = t3/t4 + t4/E; - sqrt2 = MAX(0, 2*dR + t5); - t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); - a = INVROOT6*(t6 + sqrt(sqrt3)); - a2 = a*a; - knfac = FOURTHIRDS*E*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ - knfac = E; - Fne = knfac*delta; - if (normal[itype][jtype] != HOOKE) - a = sqrt(dR); - Fne *= a; - if (normal[itype][jtype] == DMT) - Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; - } - - //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping[itype][jtype] == VELOCITY){ - damp_normal = normal_coeffs[itype][jtype][1]; - } - else if (damping[itype][jtype] == VISCOELASTIC){ - if (normal[itype][jtype] == HOOKE) a = sqrt(dR); - damp_normal = normal_coeffs[itype][jtype][1]*a*meff; - } - else if (damping[itype][jtype] == TSUJI){ - damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); - } - - Fdamp = -damp_normal*vnnr; - - Fntot = Fne + Fdamp; - - jnum = list->numneigh[i]; - jlist = list->firstneigh[i]; - - if (use_history){ - allhistory = fix_history->firstvalue[i]; - for (int jj = 0; jj < jnum; jj++) { - neighprev++; - if (neighprev >= jnum) neighprev = 0; - if (jlist[neighprev] == j) break; - } - history = &allhistory[size_history*neighprev]; - } - - //**************************************** - //Tangential force, including history effects - //**************************************** - - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // relative rotational velocity - wr1 = (radi*omega[i][0] + radj*omega[j][0]); - wr2 = (radi*omega[i][1] + radj*omega[j][1]); - wr3 = (radi*omega[i][2] + radj*omega[j][2]); - - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); - - if (normal[itype][jtype] == JKR){ - F_pulloff = 3*M_PI*coh*Reff; - Fcrit = fabs(Fne + 2*F_pulloff); - } - else{ - Fcrit = fabs(Fne); - } - - //------------------------------ - //Tangential forces - //------------------------------ - k_tangential = tangential_coeffs[itype][jtype][0]; - if (normal[itype][jtype] != HOOKE){ - k_tangential *= a; - } - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal; - - if (tangential_history){ - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); - - // tangential forces = history + tangential velocity damping - fs1 = -k_tangential*history[0] - damp_tangential*vtr1; - fs2 = -k_tangential*history[1] - damp_tangential*vtr2; - fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fcrit; - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - } - else{ //Classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; - else Ft = 0.0; - fs1 = -Ft*vtr1; - fs2 = -Ft*vtr2; - fs3 = -Ft*vtr3; - } - - //**************************************** - // Rolling resistance - //**************************************** - - if (roll[itype][jtype] != ROLL_NONE){ - relrot1 = omega[i][0] - omega[j][0]; - relrot2 = omega[i][1] - omega[j][1]; - relrot3 = omega[i][2] - omega[j][2]; - - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; - - if (roll_history){ - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; - - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); - - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - - k_roll = roll_coeffs[itype][jtype][0]; - damp_roll = roll_coeffs[itype][jtype][1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[itype][jtype][2] * Fcrit; - - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } - else{ // - fr = meff*roll_coeffs[itype][jtype][1]*vrlmag; - if (vrlmag != 0.0) fr = MIN(Fne, fr) / vrlmag; - else fr = 0.0; - fr1 = -fr*vrl1; - fr2 = -fr*vrl2; - fr3 = -fr*vrl3; - } - } - - //**************************************** - // Twisting torque, including history effects - //**************************************** - if (twist[itype][jtype] != TWIST_NONE){ - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist[itype][jtype] == TWIST_MARSHALL){ - k_twist = 0.5*k_tangential*a*a;; //eq 32 - damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a; - } - else{ - k_twist = twist_coeffs[itype][jtype][0]; - damp_twist = twist_coeffs[itype][jtype][1]; - mu_twist = twist_coeffs[itype][jtype][2]; - } - if (twist_history){ - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = TWOTHIRDS*a*Fscrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - else{ - if (magtwist > 0) magtortwist = -damp_twist*magtwist; - else magtortwist = 0; - } - } - - // set single_extra quantities - - svector[0] = fs1; - svector[1] = fs2; - svector[2] = fs3; - svector[3] = fs; - svector[4] = fr1; - svector[5] = fr2; - svector[6] = fr3; - svector[7] = fr; - svector[8] = magtortwist; - return 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int PairGranularMulti::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - - m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = mass_rigid[j]; - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void PairGranularMulti::unpack_forward_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) - mass_rigid[i] = buf[m++]; -} - -/* ---------------------------------------------------------------------- - memory usage of local atom-based arrays - ------------------------------------------------------------------------- */ - -double PairGranularMulti::memory_usage() -{ - double bytes = nmax * sizeof(double); - return bytes; -} - -/* ---------------------------------------------------------------------- - mixing of Young's modulus (E) -------------------------------------------------------------------------- */ - -double PairGranularMulti::mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((1-poisii*poisjj)/Eii+(1-poisjj*poisjj)/Ejj); -} - -/* ---------------------------------------------------------------------- - mixing of shear modulus (G) - ------------------------------------------------------------------------- */ - -double PairGranularMulti::mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj) -{ - double poisii = Eii/(2.0*Gii) - 1.0; - double poisjj = Ejj/(2.0*Gjj) - 1.0; - return 1/((2.0 -poisjj)/Gii+(2.0-poisjj)/Gjj); -} - -/* ---------------------------------------------------------------------- - mixing of everything else -------------------------------------------------------------------------- */ - -double PairGranularMulti::mix_geom(double valii, double valjj) -{ - return sqrt(valii*valjj); -} - - -/* ---------------------------------------------------------------------- - Compute pull-off distance (beyond contact) for a given radius and atom type -------------------------------------------------------------------------- */ - -double PairGranularMulti::pulloff_distance(double radius, int itype) -{ - double E, coh, a, delta_pulloff; - coh = normal_coeffs[itype][itype][3]; - E = mix_stiffnessE(normal_coeffs[itype][itype][0], normal_coeffs[itype][itype][0], - normal_coeffs[itype][itype][2], normal_coeffs[itype][itype][2]); - a = cbrt(9*M_PI*coh*radius*radius/(4*E)); - return a*a/radius - 2*sqrt(M_PI*coh*a/E); -} - diff --git a/src/GRANULAR/pair_granular_multi.h b/src/GRANULAR/pair_granular_multi.h deleted file mode 100644 index 95beb950f4..0000000000 --- a/src/GRANULAR/pair_granular_multi.h +++ /dev/null @@ -1,107 +0,0 @@ -/* ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(granular/multi,PairGranularMulti) - -#else - -#ifndef LMP_PAIR_GRANULAR_MULTI_H -#define LMP_PAIR_GRANULAR_MULTI_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairGranularMulti : public Pair { -public: - PairGranularMulti(class LAMMPS *); - virtual ~PairGranularMulti(); - virtual void compute(int, int); - virtual void settings(int, char **); - virtual void coeff(int, char **); - void init_style(); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void reset_dt(); - virtual double single(int, int, int, int, double, double, double, double &); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - double memory_usage(); - - protected: - double cut_global; - double dt; - int freeze_group_bit; - int use_history; - - int neighprev; - double *onerad_dynamic,*onerad_frozen; - double *maxrad_dynamic,*maxrad_frozen; - double **cut; - - class FixNeighHistory *fix_history; - - // storage of rigid body masses for use in granular interactions - - class Fix *fix_rigid; // ptr to rigid body fix, NULL if none - double *mass_rigid; // rigid mass for owned+ghost atoms - int nmax; // allocated size of mass_rigid - - virtual void allocate(); - -private: - int size_history; - - //Models - int **normal, **damping, **tangential, **roll, **twist; - - //History flags - int tangential_history, roll_history, twist_history; - - //Indices of history entries - int tangential_history_index; - int roll_history_index; - int twist_history_index; - - //Per-type coefficients, set in pair coeff command - double ***normal_coeffs; - double ***tangential_coeffs; - double ***roll_coeffs; - double ***twist_coeffs; - - //Optional user-specified global cutoff - double cutoff_global; - - double mix_stiffnessE(double Eii, double Ejj, double Gii, double Gjj); - double mix_stiffnessG(double Eii, double Ejj, double Gii, double Gjj); - double mix_geom(double valii, double valjj); - double pulloff_distance(double radius, int itype); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - - */ From 4ee98d18daad7150e1c53f29c1db0962b4f92a1b Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 6 Mar 2019 14:15:19 -0700 Subject: [PATCH 052/243] Fixed missing reference in pair_granular doc page --- doc/src/pair_granular.txt | 56 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 911e3cc1dc..dcc756201c 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -264,7 +264,7 @@ F_\{n0\} = \|\mathbf\{F\}_n\| \end\{equation\} For cohesive models such as {jkr} and {dmt}, the critical force is adjusted so that the critical tangential -force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#. +force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#Thornton1991. For both models, \(F_\{n0\}\) takes the form: \begin\{equation\} @@ -578,41 +578,41 @@ For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, {twisting [References:] - :link(Brill1996) +:link(Brill1996) [(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). Model for collisions in granular gases. Physical review E, 53(5), 5382. - :link(Tsuji1992) - [(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of - cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. +:link(Tsuji1992) +[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of +cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. - :link(JKR1971) - [(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). - Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. +:link(JKR1971) +[(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). +Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. - :link(DMT1975) - [Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the - adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. +:link(DMT1975) +[Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the +adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. - :link(Luding2008) - [(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. +:link(Luding2008) +[(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. - :link(Marshall2009) - [(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. - Journal of Computational Physics, 228(5), 1541-1561. +:link(Marshall2009) +[(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. +Journal of Computational Physics, 228(5), 1541-1561. - :link(Silbert2001) - [(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). - Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. +:link(Silbert2001) +[(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). +Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. - :link(Kuhn2004) - [(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. - International journal of solids and structures, 41(21), 5793-5820. +:link(Kuhn2004) +[(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. +International journal of solids and structures, 41(21), 5793-5820. - :link(Wang2015) - [(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). - Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. +:link(Wang2015) +[(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). +Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. - :link(Thornton1991) - [(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. - J. Phys. D: Appl. Phys. 24 1942 \ No newline at end of file +:link(Thornton1991) +[(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. +J. Phys. D: Appl. Phys. 24 1942 From 436e02aa6e0b7cee95d35a6cf2d56e051c7b58ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Mar 2019 16:59:17 -0500 Subject: [PATCH 053/243] small corrections/clarifications to the pull request template --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 83892035c0..9e43aa0244 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,7 +4,7 @@ _Briefly describe the new feature(s), enhancement(s), or bugfix(es) included in **Related Issues** -__If this addresses an open GitHub Issue, mention the issue number here. Use the phrases `fixes #221` or `closes #135`, when you want those issues to be automatically closed when the pull request is merged_ +_If this addresses an open GitHub issue for this project, please mention the issue number here, and describe the relation. Use the phrases `fixes #221` or `closes #135`, when you want an issue to be automatically closed when the pull request is merged_ **Author(s)** @@ -16,7 +16,7 @@ By submitting this pull request, I agree, that my contribution will be included **Backward Compatibility** -_Please state whether any changes in the pull request break backward compatibility for inputs, and - if yes - explain what has been changed and why_ +_Please state whether any changes in the pull request will break backward compatibility for inputs, and - if yes - explain what has been changed and why_ **Implementation Notes** @@ -24,7 +24,7 @@ _Provide any relevant details about how the changes are implemented, how correct **Post Submission Checklist** -_Please check the fields below as they are completed **after** the pull request has been submitted_ +_Please check the fields below as they are completed **after** the pull request has been submitted. Delete lines that don't apply_ - [ ] The feature or features in this pull request is complete - [ ] Licensing information is complete From fe56cf04bca5db169502d59801876eb5401c6a66 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Mar 2019 17:04:14 -0500 Subject: [PATCH 054/243] simplify the detection of whether the source folder is checked out from a local git repo --- cmake/CMakeLists.txt | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index ec32049445..1b0272c5e7 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1336,26 +1336,20 @@ set(temp_git_commit "(unknown)") set(temp_git_branch "(unknown)") set(temp_git_describe "(unknown)") set(temp_git_info "false") -if(GIT_FOUND) - execute_process(COMMAND ${GIT_EXECUTABLE} describe HEAD - RESULT_VARIABLE temp_in_git_checkout +if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) + set(temp_git_info "true") + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE temp_git_commit + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE temp_git_branch + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty=-modified + OUTPUT_VARIABLE temp_git_describe ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - if(temp_in_git_checkout EQUAL 0) - set(temp_git_info "true") - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - OUTPUT_VARIABLE temp_git_commit - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE temp_git_branch - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty=-modified - OUTPUT_VARIABLE temp_git_describe - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() endif() set(temp "${temp}const bool LAMMPS_NS::LAMMPS::has_git_info = ${temp_git_info};\n") From 2918dae87e23745aa7f20f81e2a5b32abe8176f1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Mar 2019 17:12:41 -0500 Subject: [PATCH 055/243] correct variable name and path to find the local .git folder --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 1b0272c5e7..12a34fabc1 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1336,7 +1336,7 @@ set(temp_git_commit "(unknown)") set(temp_git_branch "(unknown)") set(temp_git_describe "(unknown)") set(temp_git_info "false") -if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) +if(GIT_FOUND AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../.git) set(temp_git_info "true") execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD OUTPUT_VARIABLE temp_git_commit From 4e632d1b79e59d1b7bdd644a63289487412e7f55 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Mar 2019 17:32:08 -0500 Subject: [PATCH 056/243] implement another suggestion from @junghans --- cmake/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 12a34fabc1..f6f822676e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1338,15 +1338,15 @@ set(temp_git_describe "(unknown)") set(temp_git_info "false") if(GIT_FOUND AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../.git) set(temp_git_info "true") - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse HEAD OUTPUT_VARIABLE temp_git_commit ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE temp_git_branch ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty=-modified + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git describe --dirty=-modified OUTPUT_VARIABLE temp_git_describe ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) From 9408dd6e925c38819b6b207775a5b21ca720f0c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Mar 2019 18:41:43 -0500 Subject: [PATCH 057/243] use simpler way whether we are inside a git checkout in conventional build --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index f720abe6ec..f1030ae08f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -171,7 +171,7 @@ gitversion: @echo 'Gathering git version information' @echo '#ifndef LMP_GIT_VERSION_H' > ${TMPNAME}.lmpgitversion @echo '#define LMP_GIT_VERSION_H' >> ${TMPNAME}.lmpgitversion - @if (type git && git describe HEAD ) >> /dev/null 2>> /dev/null ; then \ + @if (type git && test -e ../.git ) >> /dev/null 2>> /dev/null ; then \ git='true'; \ commit=$$(git rev-parse HEAD); \ branch=$$(git rev-parse --abbrev-ref HEAD); \ From f0e48931e40d833ab964b7abcfb5a08df5f4a3d7 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 7 Mar 2019 10:17:32 -0700 Subject: [PATCH 058/243] Remove deprecated KOKKO_HAVE macros --- src/KOKKOS/angle_charmm_kokkos.cpp | 2 +- src/KOKKOS/angle_class2_kokkos.cpp | 2 +- src/KOKKOS/angle_cosine_kokkos.cpp | 2 +- src/KOKKOS/angle_harmonic_kokkos.cpp | 2 +- src/KOKKOS/atom_vec_kokkos.h | 2 +- src/KOKKOS/bond_class2_kokkos.cpp | 2 +- src/KOKKOS/bond_fene_kokkos.cpp | 2 +- src/KOKKOS/bond_harmonic_kokkos.cpp | 2 +- src/KOKKOS/compute_temp_kokkos.cpp | 2 +- src/KOKKOS/dihedral_charmm_kokkos.cpp | 2 +- src/KOKKOS/dihedral_class2_kokkos.cpp | 2 +- src/KOKKOS/dihedral_opls_kokkos.cpp | 2 +- src/KOKKOS/fix_dpd_energy_kokkos.cpp | 2 +- src/KOKKOS/fix_enforce2d_kokkos.cpp | 2 +- src/KOKKOS/fix_eos_table_rx_kokkos.cpp | 2 +- src/KOKKOS/fix_freeze_kokkos.cpp | 2 +- src/KOKKOS/fix_gravity_kokkos.cpp | 2 +- src/KOKKOS/fix_langevin_kokkos.cpp | 2 +- src/KOKKOS/fix_momentum_kokkos.cpp | 2 +- src/KOKKOS/fix_neigh_history_kokkos.cpp | 2 +- src/KOKKOS/fix_nh_kokkos.cpp | 2 +- src/KOKKOS/fix_nph_kokkos.cpp | 2 +- src/KOKKOS/fix_npt_kokkos.cpp | 2 +- src/KOKKOS/fix_nve_kokkos.cpp | 2 +- src/KOKKOS/fix_nve_sphere_kokkos.cpp | 2 +- src/KOKKOS/fix_nvt_kokkos.cpp | 2 +- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 2 +- src/KOKKOS/fix_rx_kokkos.cpp | 2 +- src/KOKKOS/fix_setforce_kokkos.cpp | 2 +- src/KOKKOS/fix_shardlow_kokkos.cpp | 2 +- src/KOKKOS/fix_wall_lj93_kokkos.cpp | 2 +- src/KOKKOS/fix_wall_reflect_kokkos.cpp | 2 +- src/KOKKOS/gridcomm_kokkos.cpp | 2 +- src/KOKKOS/improper_class2_kokkos.cpp | 2 +- src/KOKKOS/improper_harmonic_kokkos.cpp | 2 +- src/KOKKOS/kokkos.cpp | 10 +++++----- src/KOKKOS/kokkos_type.h | 10 +++++----- src/KOKKOS/nbin_kokkos.cpp | 2 +- src/KOKKOS/nbin_ssa_kokkos.cpp | 2 +- src/KOKKOS/neigh_bond_kokkos.cpp | 2 +- src/KOKKOS/neigh_list_kokkos.cpp | 2 +- src/KOKKOS/npair_copy_kokkos.cpp | 2 +- src/KOKKOS/npair_halffull_kokkos.cpp | 2 +- src/KOKKOS/npair_kokkos.cpp | 16 ++++++++-------- src/KOKKOS/npair_kokkos.h | 6 +++--- src/KOKKOS/npair_skip_kokkos.cpp | 2 +- src/KOKKOS/npair_ssa_kokkos.cpp | 2 +- src/KOKKOS/pair_buck_coul_cut_kokkos.cpp | 2 +- src/KOKKOS/pair_buck_coul_long_kokkos.cpp | 2 +- src/KOKKOS/pair_buck_kokkos.cpp | 2 +- src/KOKKOS/pair_coul_cut_kokkos.cpp | 2 +- src/KOKKOS/pair_coul_debye_kokkos.cpp | 2 +- src/KOKKOS/pair_coul_dsf_kokkos.cpp | 2 +- src/KOKKOS/pair_coul_long_kokkos.cpp | 2 +- src/KOKKOS/pair_coul_wolf_kokkos.cpp | 2 +- src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp | 2 +- src/KOKKOS/pair_eam_alloy_kokkos.cpp | 2 +- src/KOKKOS/pair_eam_fs_kokkos.cpp | 2 +- src/KOKKOS/pair_eam_kokkos.cpp | 2 +- src/KOKKOS/pair_exp6_rx_kokkos.cpp | 16 ++++++++-------- src/KOKKOS/pair_gran_hooke_history_kokkos.cpp | 2 +- ...air_lj_charmm_coul_charmm_implicit_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_class2_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_cut_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_expand_kokkos.cpp | 2 +- .../pair_lj_gromacs_coul_gromacs_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_gromacs_kokkos.cpp | 2 +- src/KOKKOS/pair_lj_sdk_kokkos.cpp | 2 +- src/KOKKOS/pair_morse_kokkos.cpp | 2 +- src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp | 2 +- src/KOKKOS/pair_reaxc_kokkos.cpp | 2 +- src/KOKKOS/pair_snap_kokkos.cpp | 2 +- src/KOKKOS/pair_sw_kokkos.cpp | 2 +- src/KOKKOS/pair_table_kokkos.cpp | 2 +- src/KOKKOS/pair_table_rx_kokkos.cpp | 2 +- src/KOKKOS/pair_tersoff_kokkos.cpp | 2 +- src/KOKKOS/pair_tersoff_mod_kokkos.cpp | 2 +- src/KOKKOS/pair_tersoff_zbl_kokkos.cpp | 2 +- src/KOKKOS/pair_vashishta_kokkos.cpp | 2 +- src/KOKKOS/pair_yukawa_kokkos.cpp | 2 +- src/KOKKOS/pair_zbl_kokkos.cpp | 2 +- src/KOKKOS/pppm_kokkos.cpp | 4 ++-- src/KOKKOS/rand_pool_wrap_kokkos.h | 2 +- src/KOKKOS/region_block_kokkos.cpp | 2 +- 92 files changed, 117 insertions(+), 117 deletions(-) diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp index 7a83e0d654..ec2955b28d 100644 --- a/src/KOKKOS/angle_charmm_kokkos.cpp +++ b/src/KOKKOS/angle_charmm_kokkos.cpp @@ -447,7 +447,7 @@ void AngleCharmmKokkos::ev_tally(EV_FLOAT &ev, const int i, const in namespace LAMMPS_NS { template class AngleCharmmKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class AngleCharmmKokkos; #endif } diff --git a/src/KOKKOS/angle_class2_kokkos.cpp b/src/KOKKOS/angle_class2_kokkos.cpp index 289753a3ee..fe5b1895fe 100644 --- a/src/KOKKOS/angle_class2_kokkos.cpp +++ b/src/KOKKOS/angle_class2_kokkos.cpp @@ -598,7 +598,7 @@ void AngleClass2Kokkos::ev_tally(EV_FLOAT &ev, const int i, const in namespace LAMMPS_NS { template class AngleClass2Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class AngleClass2Kokkos; #endif } diff --git a/src/KOKKOS/angle_cosine_kokkos.cpp b/src/KOKKOS/angle_cosine_kokkos.cpp index d22ad20f55..08faa254f4 100644 --- a/src/KOKKOS/angle_cosine_kokkos.cpp +++ b/src/KOKKOS/angle_cosine_kokkos.cpp @@ -387,7 +387,7 @@ void AngleCosineKokkos::ev_tally(EV_FLOAT &ev, const int i, const in namespace LAMMPS_NS { template class AngleCosineKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class AngleCosineKokkos; #endif } diff --git a/src/KOKKOS/angle_harmonic_kokkos.cpp b/src/KOKKOS/angle_harmonic_kokkos.cpp index 250397c8e3..8cdab2063a 100644 --- a/src/KOKKOS/angle_harmonic_kokkos.cpp +++ b/src/KOKKOS/angle_harmonic_kokkos.cpp @@ -405,7 +405,7 @@ void AngleHarmonicKokkos::ev_tally(EV_FLOAT &ev, const int i, const namespace LAMMPS_NS { template class AngleHarmonicKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class AngleHarmonicKokkos; #endif } diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index efe55c47ad..51ae226cc3 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -125,7 +125,7 @@ class AtomVecKokkos : public AtomVec { size_t buffer_size; void* buffer; - #ifdef KOKKOS_HAVE_CUDA + #ifdef KOKKOS_ENABLE_CUDA template Kokkos::View::ev_tally(EV_FLOAT &ev, const int &i, const in namespace LAMMPS_NS { template class BondClass2Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class BondClass2Kokkos; #endif } diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp index 4342223f7e..d37943ba82 100644 --- a/src/KOKKOS/bond_fene_kokkos.cpp +++ b/src/KOKKOS/bond_fene_kokkos.cpp @@ -401,7 +401,7 @@ void BondFENEKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int namespace LAMMPS_NS { template class BondFENEKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class BondFENEKokkos; #endif } diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp index 35b957ffd3..6cdd4fe856 100644 --- a/src/KOKKOS/bond_harmonic_kokkos.cpp +++ b/src/KOKKOS/bond_harmonic_kokkos.cpp @@ -340,7 +340,7 @@ void BondHarmonicKokkos::ev_tally(EV_FLOAT &ev, const int &i, const namespace LAMMPS_NS { template class BondHarmonicKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class BondHarmonicKokkos; #endif } diff --git a/src/KOKKOS/compute_temp_kokkos.cpp b/src/KOKKOS/compute_temp_kokkos.cpp index d94c6e76b5..7b76f54f57 100644 --- a/src/KOKKOS/compute_temp_kokkos.cpp +++ b/src/KOKKOS/compute_temp_kokkos.cpp @@ -153,7 +153,7 @@ void ComputeTempKokkos::operator()(TagComputeTempVector, cons namespace LAMMPS_NS { template class ComputeTempKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class ComputeTempKokkos; #endif } diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp index 9e25dda894..3931309dc1 100644 --- a/src/KOKKOS/dihedral_charmm_kokkos.cpp +++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp @@ -786,7 +786,7 @@ void DihedralCharmmKokkos::ev_tally(EVM_FLOAT &evm, const int i, con namespace LAMMPS_NS { template class DihedralCharmmKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class DihedralCharmmKokkos; #endif } diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp index de1d9c5458..c7db07a6cb 100644 --- a/src/KOKKOS/dihedral_class2_kokkos.cpp +++ b/src/KOKKOS/dihedral_class2_kokkos.cpp @@ -1127,7 +1127,7 @@ void DihedralClass2Kokkos::ev_tally(EV_FLOAT &ev, const int i1, cons namespace LAMMPS_NS { template class DihedralClass2Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class DihedralClass2Kokkos; #endif } diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp index 3f34c2f5f3..9d01cf1a54 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.cpp +++ b/src/KOKKOS/dihedral_opls_kokkos.cpp @@ -536,7 +536,7 @@ void DihedralOPLSKokkos::ev_tally(EV_FLOAT &ev, const int i1, const namespace LAMMPS_NS { template class DihedralOPLSKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class DihedralOPLSKokkos; #endif } diff --git a/src/KOKKOS/fix_dpd_energy_kokkos.cpp b/src/KOKKOS/fix_dpd_energy_kokkos.cpp index b12c6a476e..d092cb4802 100644 --- a/src/KOKKOS/fix_dpd_energy_kokkos.cpp +++ b/src/KOKKOS/fix_dpd_energy_kokkos.cpp @@ -90,7 +90,7 @@ void FixDPDenergyKokkos::final_integrate() namespace LAMMPS_NS { template class FixDPDenergyKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixDPDenergyKokkos; #endif } diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index f4f239123b..346e440f55 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -162,7 +162,7 @@ void FixEnforce2DKokkos::post_force_item( int i ) const namespace LAMMPS_NS { template class FixEnforce2DKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixEnforce2DKokkos; #endif } diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.cpp b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp index 39f612ec46..2f730d1193 100644 --- a/src/KOKKOS/fix_eos_table_rx_kokkos.cpp +++ b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp @@ -563,7 +563,7 @@ void FixEOStableRXKokkos::create_kokkos_tables() namespace LAMMPS_NS { template class FixEOStableRXKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixEOStableRXKokkos; #endif } diff --git a/src/KOKKOS/fix_freeze_kokkos.cpp b/src/KOKKOS/fix_freeze_kokkos.cpp index ccf7c7ff85..fb0c3841e6 100644 --- a/src/KOKKOS/fix_freeze_kokkos.cpp +++ b/src/KOKKOS/fix_freeze_kokkos.cpp @@ -118,7 +118,7 @@ void FixFreezeKokkos::operator()(const int i, OriginalForce &origina namespace LAMMPS_NS { template class FixFreezeKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixFreezeKokkos; #endif } diff --git a/src/KOKKOS/fix_gravity_kokkos.cpp b/src/KOKKOS/fix_gravity_kokkos.cpp index 2aff7af56c..5d3b4f62fb 100644 --- a/src/KOKKOS/fix_gravity_kokkos.cpp +++ b/src/KOKKOS/fix_gravity_kokkos.cpp @@ -115,7 +115,7 @@ void FixGravityKokkos::operator()(TagFixGravityMass, const int i, do namespace LAMMPS_NS { template class FixGravityKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixGravityKokkos; #endif } diff --git a/src/KOKKOS/fix_langevin_kokkos.cpp b/src/KOKKOS/fix_langevin_kokkos.cpp index 63b749a556..0947fee693 100644 --- a/src/KOKKOS/fix_langevin_kokkos.cpp +++ b/src/KOKKOS/fix_langevin_kokkos.cpp @@ -774,7 +774,7 @@ void FixLangevinKokkos::cleanup_copy() namespace LAMMPS_NS { template class FixLangevinKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixLangevinKokkos; #endif } diff --git a/src/KOKKOS/fix_momentum_kokkos.cpp b/src/KOKKOS/fix_momentum_kokkos.cpp index 493dffc3d9..38500531ca 100644 --- a/src/KOKKOS/fix_momentum_kokkos.cpp +++ b/src/KOKKOS/fix_momentum_kokkos.cpp @@ -199,7 +199,7 @@ void FixMomentumKokkos::end_of_step() namespace LAMMPS_NS { template class FixMomentumKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixMomentumKokkos; #endif } diff --git a/src/KOKKOS/fix_neigh_history_kokkos.cpp b/src/KOKKOS/fix_neigh_history_kokkos.cpp index ea0bd138f4..5f53950fe6 100644 --- a/src/KOKKOS/fix_neigh_history_kokkos.cpp +++ b/src/KOKKOS/fix_neigh_history_kokkos.cpp @@ -329,7 +329,7 @@ int FixNeighHistoryKokkos::unpack_exchange(int nlocal, double *buf) namespace LAMMPS_NS { template class FixNeighHistoryKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNeighHistoryKokkos; #endif } diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index 9e86e47bc9..ba6e8919ea 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -733,7 +733,7 @@ void FixNHKokkos::pre_exchange() namespace LAMMPS_NS { template class FixNHKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNHKokkos; #endif } diff --git a/src/KOKKOS/fix_nph_kokkos.cpp b/src/KOKKOS/fix_nph_kokkos.cpp index ed825ad9ee..c5072e6ae9 100644 --- a/src/KOKKOS/fix_nph_kokkos.cpp +++ b/src/KOKKOS/fix_nph_kokkos.cpp @@ -71,7 +71,7 @@ FixNPHKokkos::FixNPHKokkos(LAMMPS *lmp, int narg, char **arg) : namespace LAMMPS_NS { template class FixNPHKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNPHKokkos; #endif } diff --git a/src/KOKKOS/fix_npt_kokkos.cpp b/src/KOKKOS/fix_npt_kokkos.cpp index b33e733aee..c488c8e4f3 100644 --- a/src/KOKKOS/fix_npt_kokkos.cpp +++ b/src/KOKKOS/fix_npt_kokkos.cpp @@ -71,7 +71,7 @@ FixNPTKokkos::FixNPTKokkos(LAMMPS *lmp, int narg, char **arg) : namespace LAMMPS_NS { template class FixNPTKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNPTKokkos; #endif } diff --git a/src/KOKKOS/fix_nve_kokkos.cpp b/src/KOKKOS/fix_nve_kokkos.cpp index 621f16f420..052bf411d6 100644 --- a/src/KOKKOS/fix_nve_kokkos.cpp +++ b/src/KOKKOS/fix_nve_kokkos.cpp @@ -172,7 +172,7 @@ void FixNVEKokkos::cleanup_copy() namespace LAMMPS_NS { template class FixNVEKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNVEKokkos; #endif } diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.cpp b/src/KOKKOS/fix_nve_sphere_kokkos.cpp index 9c408d0630..95945a858f 100644 --- a/src/KOKKOS/fix_nve_sphere_kokkos.cpp +++ b/src/KOKKOS/fix_nve_sphere_kokkos.cpp @@ -149,7 +149,7 @@ void FixNVESphereKokkos::final_integrate_item(const int i) const namespace LAMMPS_NS { template class FixNVESphereKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNVESphereKokkos; #endif } diff --git a/src/KOKKOS/fix_nvt_kokkos.cpp b/src/KOKKOS/fix_nvt_kokkos.cpp index 8b2d936274..4db42a62fb 100644 --- a/src/KOKKOS/fix_nvt_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_kokkos.cpp @@ -52,7 +52,7 @@ FixNVTKokkos::FixNVTKokkos(LAMMPS *lmp, int narg, char **arg) : namespace LAMMPS_NS { template class FixNVTKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixNVTKokkos; #endif } diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 52a90eda01..9969ab7257 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -1266,7 +1266,7 @@ int FixQEqReaxKokkos::unpack_exchange(int nlocal, double *buf) namespace LAMMPS_NS { template class FixQEqReaxKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixQEqReaxKokkos; #endif } diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp index f636f6454d..80333e1e9b 100644 --- a/src/KOKKOS/fix_rx_kokkos.cpp +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -2276,7 +2276,7 @@ void FixRxKokkos::unpack_reverse_comm(int n, int *list, double *buf) namespace LAMMPS_NS { template class FixRxKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixRxKokkos; #endif } diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp index 5150c71249..5d15b88d76 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -184,7 +184,7 @@ void FixSetForceKokkos::operator()(TagFixSetForceNonConstant, const namespace LAMMPS_NS { template class FixSetForceKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixSetForceKokkos; #endif } diff --git a/src/KOKKOS/fix_shardlow_kokkos.cpp b/src/KOKKOS/fix_shardlow_kokkos.cpp index 99e51ebe38..968f877abd 100644 --- a/src/KOKKOS/fix_shardlow_kokkos.cpp +++ b/src/KOKKOS/fix_shardlow_kokkos.cpp @@ -808,7 +808,7 @@ double FixShardlowKokkos::memory_usage() namespace LAMMPS_NS { template class FixShardlowKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixShardlowKokkos; #endif } diff --git a/src/KOKKOS/fix_wall_lj93_kokkos.cpp b/src/KOKKOS/fix_wall_lj93_kokkos.cpp index 3aaa45f8a8..5dbb054175 100644 --- a/src/KOKKOS/fix_wall_lj93_kokkos.cpp +++ b/src/KOKKOS/fix_wall_lj93_kokkos.cpp @@ -98,7 +98,7 @@ void FixWallLJ93Kokkos::wall_particle_item(int i, value_type ewall) namespace LAMMPS_NS { template class FixWallLJ93Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixWallLJ93Kokkos; #endif } diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.cpp b/src/KOKKOS/fix_wall_reflect_kokkos.cpp index 2516ac6577..75a5c1a81e 100644 --- a/src/KOKKOS/fix_wall_reflect_kokkos.cpp +++ b/src/KOKKOS/fix_wall_reflect_kokkos.cpp @@ -107,7 +107,7 @@ void FixWallReflectKokkos::operator()(TagFixWallReflectPostIntegrate namespace LAMMPS_NS { template class FixWallReflectKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class FixWallReflectKokkos; #endif } diff --git a/src/KOKKOS/gridcomm_kokkos.cpp b/src/KOKKOS/gridcomm_kokkos.cpp index 64a9d6992f..14b84a5733 100644 --- a/src/KOKKOS/gridcomm_kokkos.cpp +++ b/src/KOKKOS/gridcomm_kokkos.cpp @@ -652,7 +652,7 @@ double GridCommKokkos::memory_usage() namespace LAMMPS_NS { template class GridCommKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class GridCommKokkos; #endif } diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp index 2a7e8076d4..e3af52b494 100644 --- a/src/KOKKOS/improper_class2_kokkos.cpp +++ b/src/KOKKOS/improper_class2_kokkos.cpp @@ -1134,7 +1134,7 @@ void ImproperClass2Kokkos::ev_tally(EV_FLOAT &ev, const int i1, cons namespace LAMMPS_NS { template class ImproperClass2Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class ImproperClass2Kokkos; #endif } diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp index b364d0b0c7..4d41f3ef48 100644 --- a/src/KOKKOS/improper_harmonic_kokkos.cpp +++ b/src/KOKKOS/improper_harmonic_kokkos.cpp @@ -484,7 +484,7 @@ void ImproperHarmonicKokkos::ev_tally(EV_FLOAT &ev, const int i1, co namespace LAMMPS_NS { template class ImproperHarmonicKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class ImproperHarmonicKokkos; #endif } diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 9973b5a688..295fddc6e7 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -26,7 +26,7 @@ #include "error.h" #include "memory_kokkos.h" -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA // for detecting GPU-direct support: // the function int have_gpu_direct() @@ -55,7 +55,7 @@ GPU_DIRECT_UNKNOWN GPU_DIRECT_UNKNOWN #endif -#endif // KOKKOS_HAVE_CUDA +#endif // KOKKOS_ENABLE_CUDA using namespace LAMMPS_NS; @@ -92,7 +92,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) } else if (strcmp(arg[iarg],"g") == 0 || strcmp(arg[iarg],"gpus") == 0) { -#ifndef KOKKOS_HAVE_CUDA +#ifndef KOKKOS_ENABLE_CUDA error->all(FLERR,"GPUs are requested but Kokkos has not been compiled for CUDA"); #endif if (iarg+2 > narg) error->all(FLERR,"Invalid Kokkos command-line args"); @@ -142,7 +142,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) if (logfile) fprintf(logfile," will use up to %d GPU(s) per node\n",ngpu); } -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA if (ngpu <= 0) error->all(FLERR,"Kokkos has been compiled for CUDA but no GPUs are requested"); @@ -166,7 +166,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) } #endif -#ifndef KOKKOS_HAVE_SERIAL +#ifndef KOKKOS_ENABLE_SERIAL if (num_threads == 1) error->warning(FLERR,"When using a single thread, the Kokkos Serial backend " "(i.e. Makefile.kokkos_mpi_only) gives better performance " diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index b88c92ff73..eb432cefae 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -24,7 +24,7 @@ enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u}; -#if defined(KOKKOS_HAVE_CXX11) +#if defined(KOKKOS_ENABLE_CXX11) #undef ISFINITE #define ISFINITE(x) std::isfinite(x) #endif @@ -201,7 +201,7 @@ template<> struct ExecutionSpaceFromDevice { static const LAMMPS_NS::ExecutionSpace space = LAMMPS_NS::Host; }; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template<> struct ExecutionSpaceFromDevice { static const LAMMPS_NS::ExecutionSpace space = LAMMPS_NS::Device; @@ -776,7 +776,7 @@ typedef tdual_int_64::t_dev_um t_int_64_um; }; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template <> struct ArrayTypes { @@ -1087,12 +1087,12 @@ struct params_lj_coul { F_FLOAT cut_ljsq,cut_coulsq,lj1,lj2,lj3,lj4,offset; }; -#if defined(KOKKOS_HAVE_CXX11) +#if defined(KOKKOS_ENABLE_CXX11) #undef ISFINITE #define ISFINITE(x) std::isfinite(x) #endif -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA #define LAMMPS_LAMBDA [=] __device__ #else #define LAMMPS_LAMBDA [=] diff --git a/src/KOKKOS/nbin_kokkos.cpp b/src/KOKKOS/nbin_kokkos.cpp index c35c349675..090519a5a8 100644 --- a/src/KOKKOS/nbin_kokkos.cpp +++ b/src/KOKKOS/nbin_kokkos.cpp @@ -146,7 +146,7 @@ void NBinKokkos::binatomsItem(const int &i) const namespace LAMMPS_NS { template class NBinKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NBinKokkos; #endif } diff --git a/src/KOKKOS/nbin_ssa_kokkos.cpp b/src/KOKKOS/nbin_ssa_kokkos.cpp index d040ee2c83..ecf0e08535 100644 --- a/src/KOKKOS/nbin_ssa_kokkos.cpp +++ b/src/KOKKOS/nbin_ssa_kokkos.cpp @@ -301,7 +301,7 @@ void NBinSSAKokkos::sortBin( namespace LAMMPS_NS { template class NBinSSAKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NBinSSAKokkos; #endif } diff --git a/src/KOKKOS/neigh_bond_kokkos.cpp b/src/KOKKOS/neigh_bond_kokkos.cpp index 615dc94ee2..05a6fd605c 100644 --- a/src/KOKKOS/neigh_bond_kokkos.cpp +++ b/src/KOKKOS/neigh_bond_kokkos.cpp @@ -1301,7 +1301,7 @@ void NeighBondKokkos::update_domain_variables() namespace LAMMPS_NS { template class NeighBondKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NeighBondKokkos; #endif } diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp index 93cf0af937..1c78fe3a68 100644 --- a/src/KOKKOS/neigh_list_kokkos.cpp +++ b/src/KOKKOS/neigh_list_kokkos.cpp @@ -53,7 +53,7 @@ void NeighListKokkos::grow(int nmax) namespace LAMMPS_NS { template class NeighListKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NeighListKokkos; #endif } diff --git a/src/KOKKOS/npair_copy_kokkos.cpp b/src/KOKKOS/npair_copy_kokkos.cpp index 8702816033..7dde05745c 100644 --- a/src/KOKKOS/npair_copy_kokkos.cpp +++ b/src/KOKKOS/npair_copy_kokkos.cpp @@ -53,7 +53,7 @@ void NPairCopyKokkos::build(NeighList *list) namespace LAMMPS_NS { template class NPairCopyKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NPairCopyKokkos; #endif } diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index 67481985da..cc8f663ef2 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -121,7 +121,7 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, namespace LAMMPS_NS { template class NPairHalffullKokkos; template class NPairHalffullKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NPairHalffullKokkos; template class NPairHalffullKokkos; #endif diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 88017c3f9d..5e1b7b0414 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -187,7 +187,7 @@ void NPairKokkos::build(NeighList *list_) Kokkos::deep_copy(data.resize, data.h_resize); Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA #define BINS_PER_BLOCK 2 const int factor = atoms_per_bin<64?2:1; Kokkos::TeamPolicy config((mbins+factor-1)/factor,atoms_per_bin*factor); @@ -202,7 +202,7 @@ void NPairKokkos::build(NeighList *list_) if (newton_pair) { if (SIZE) { NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA if (ExecutionSpaceFromDevice::space == Device) Kokkos::parallel_for(config, f); else @@ -212,7 +212,7 @@ void NPairKokkos::build(NeighList *list_) #endif } else { NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA if (ExecutionSpaceFromDevice::space == Device) Kokkos::parallel_for(config, f); else @@ -224,7 +224,7 @@ void NPairKokkos::build(NeighList *list_) } else { if (SIZE) { NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA if (ExecutionSpaceFromDevice::space == Device) Kokkos::parallel_for(config, f); else @@ -234,7 +234,7 @@ void NPairKokkos::build(NeighList *list_) #endif } else { NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA if (ExecutionSpaceFromDevice::space == Device) Kokkos::parallel_for(config, f); else @@ -470,7 +470,7 @@ void NeighborKokkosExecute:: /* ---------------------------------------------------------------------- */ -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA extern __shared__ X_FLOAT sharedmem[]; /* ---------------------------------------------------------------------- */ @@ -910,7 +910,7 @@ void NeighborKokkosExecute:: /* ---------------------------------------------------------------------- */ -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template template __device__ inline void NeighborKokkosExecute::build_ItemSizeCuda(typename Kokkos::TeamPolicy::member_type dev) const @@ -1093,7 +1093,7 @@ template class NPairKokkos; template class NPairKokkos; template class NPairKokkos; template class NPairKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NPairKokkos; template class NPairKokkos; template class NPairKokkos; diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 970e40c9fc..62138bd524 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -311,7 +311,7 @@ class NeighborKokkosExecute KOKKOS_FUNCTION void build_ItemSize(const int &i) const; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template __device__ inline void build_ItemCuda(typename Kokkos::TeamPolicy::member_type dev) const; @@ -388,7 +388,7 @@ struct NPairKokkosBuildFunctor { void operator() (const int & i) const { c.template build_Item(i); } -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA __device__ inline void operator() (typename Kokkos::TeamPolicy::member_type dev) const { @@ -449,7 +449,7 @@ struct NPairKokkosBuildFunctorSize { c.template build_ItemSize(i); } -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA __device__ inline void operator() (typename Kokkos::TeamPolicy::member_type dev) const { c.template build_ItemSizeCuda(dev); diff --git a/src/KOKKOS/npair_skip_kokkos.cpp b/src/KOKKOS/npair_skip_kokkos.cpp index c537afaa6b..e614e624c9 100644 --- a/src/KOKKOS/npair_skip_kokkos.cpp +++ b/src/KOKKOS/npair_skip_kokkos.cpp @@ -151,7 +151,7 @@ void NPairSkipKokkos::operator()(TagNPairSkipCountLocal, const int & namespace LAMMPS_NS { template class NPairSkipKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NPairSkipKokkos; #endif } diff --git a/src/KOKKOS/npair_ssa_kokkos.cpp b/src/KOKKOS/npair_ssa_kokkos.cpp index d17e341f15..5234c4e6d2 100644 --- a/src/KOKKOS/npair_ssa_kokkos.cpp +++ b/src/KOKKOS/npair_ssa_kokkos.cpp @@ -751,7 +751,7 @@ void NPairSSAKokkosExecute::build_ghosts_onePhase(int workPhase) con namespace LAMMPS_NS { template class NPairSSAKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class NPairSSAKokkos; #endif } diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp index 9c12d2c978..18d09965be 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp @@ -360,7 +360,7 @@ double PairBuckCoulCutKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairBuckCoulCutKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairBuckCoulCutKokkos; #endif } diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp index 4978d3d7fc..0b44a83ebb 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp @@ -522,7 +522,7 @@ double PairBuckCoulLongKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairBuckCoulLongKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairBuckCoulLongKokkos; #endif } diff --git a/src/KOKKOS/pair_buck_kokkos.cpp b/src/KOKKOS/pair_buck_kokkos.cpp index 8785700186..999aefe4c3 100644 --- a/src/KOKKOS/pair_buck_kokkos.cpp +++ b/src/KOKKOS/pair_buck_kokkos.cpp @@ -274,7 +274,7 @@ double PairBuckKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairBuckKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairBuckKokkos; #endif } diff --git a/src/KOKKOS/pair_coul_cut_kokkos.cpp b/src/KOKKOS/pair_coul_cut_kokkos.cpp index b6e36d4f0d..7d29adc625 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp @@ -280,7 +280,7 @@ double PairCoulCutKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairCoulCutKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairCoulCutKokkos; #endif } diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp index 5d15be7d76..3de83b5bc4 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp @@ -323,7 +323,7 @@ double PairCoulDebyeKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairCoulDebyeKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairCoulDebyeKokkos; #endif } diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp index a714f665f7..7d03ee4968 100644 --- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp @@ -422,7 +422,7 @@ int PairCoulDSFKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairCoulDSFKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairCoulDSFKokkos; #endif } diff --git a/src/KOKKOS/pair_coul_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp index 1e8c6c5f4e..73b9521da0 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_coul_long_kokkos.cpp @@ -471,7 +471,7 @@ double PairCoulLongKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairCoulLongKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairCoulLongKokkos; #endif } diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp index 2bff824c3d..fe9c581cc1 100644 --- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp @@ -424,7 +424,7 @@ int PairCoulWolfKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairCoulWolfKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairCoulWolfKokkos; #endif } diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp index 3282c9da1e..d2fcc81ea4 100644 --- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp @@ -795,7 +795,7 @@ int PairDPDfdtEnergyKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairDPDfdtEnergyKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairDPDfdtEnergyKokkos; #endif } diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index e198ddb85a..6039282141 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -1199,7 +1199,7 @@ void PairEAMAlloyKokkos::file2array_alloy() namespace LAMMPS_NS { template class PairEAMAlloyKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairEAMAlloyKokkos; #endif } diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index f5e4445db3..81d9ba8326 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -1208,7 +1208,7 @@ void PairEAMFSKokkos::file2array_fs() namespace LAMMPS_NS { template class PairEAMFSKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairEAMFSKokkos; #endif } diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index 6ef3d99ac3..22383f57c5 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -899,7 +899,7 @@ void PairEAMKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int & namespace LAMMPS_NS { template class PairEAMKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairEAMKokkos; #endif } diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp index f38feea5f4..df24a5f4c7 100644 --- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -232,7 +232,7 @@ void PairExp6rxKokkos::compute(int eflag_in, int vflag_in) } else Kokkos::parallel_for(Kokkos::RangePolicy(0,np_total),*this); -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA Kokkos::parallel_for(Kokkos::RangePolicy(0,np_total),*this); #else int errorFlag = 0; @@ -277,7 +277,7 @@ void PairExp6rxKokkos::compute(int eflag_in, int vflag_in) EV_FLOAT ev; -#ifdef KOKKOS_HAVE_CUDA // Use atomics +#ifdef KOKKOS_ENABLE_CUDA // Use atomics if (neighflag == HALF) { if (newton_pair) { @@ -814,7 +814,7 @@ void PairExp6rxKokkos::operator()(TagPairExp6rxComputeNoAtomics unique_token_type; unique_token_type unique_token; @@ -1156,7 +1156,7 @@ void PairExp6rxKokkos::operator()(TagPairExp6rxComputeNoAtomics::vectorized_operator(const int &ii, EV_FLOAT& Kokkos::View::value> > a_uCGnew = uCGnew; int tid = 0; -#ifndef KOKKOS_HAVE_CUDA +#ifndef KOKKOS_ENABLE_CUDA typedef Kokkos::Experimental::UniqueToken< DeviceType, Kokkos::Experimental::UniqueTokenScope::Global> unique_token_type; unique_token_type unique_token; @@ -1623,7 +1623,7 @@ void PairExp6rxKokkos::vectorized_operator(const int &ii, EV_FLOAT& t_uCGnew(tid,i) += uCGnew_i; } -#ifndef KOKKOS_HAVE_CUDA +#ifndef KOKKOS_ENABLE_CUDA unique_token.release(tid); #endif } @@ -2128,7 +2128,7 @@ void partition_range( const int begin, const int end, int &thread_begin, int &th /* ---------------------------------------------------------------------- */ -#ifndef KOKKOS_HAVE_CUDA +#ifndef KOKKOS_ENABLE_CUDA template template void PairExp6rxKokkos::getMixingWeightsVect(const int np_total, int errorFlag, @@ -2654,7 +2654,7 @@ int PairExp6rxKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairExp6rxKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairExp6rxKokkos; #endif } diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp index 09e6c709a4..189407b541 100644 --- a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp +++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp @@ -581,7 +581,7 @@ void PairGranHookeHistoryKokkos::ev_tally_xyz_atom(EV_FLOAT &ev, int namespace LAMMPS_NS { template class PairGranHookeHistoryKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairGranHookeHistoryKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp index d0d290d1f1..ce7df2bec1 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp @@ -528,7 +528,7 @@ double PairLJCharmmCoulCharmmImplicitKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCharmmCoulCharmmImplicitKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCharmmCoulCharmmImplicitKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp index 2203dfa2a0..b31282e595 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp @@ -529,7 +529,7 @@ double PairLJCharmmCoulCharmmKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCharmmCoulCharmmKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCharmmCoulCharmmKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp index e1ecfbac3c..5d8a202aa4 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp @@ -536,7 +536,7 @@ double PairLJCharmmCoulLongKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCharmmCoulLongKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCharmmCoulLongKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp index abd0183e21..6eb3028101 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp @@ -364,7 +364,7 @@ double PairLJClass2CoulCutKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJClass2CoulCutKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJClass2CoulCutKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp index 5f850689d4..a388694876 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp @@ -517,7 +517,7 @@ double PairLJClass2CoulLongKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJClass2CoulLongKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJClass2CoulLongKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_class2_kokkos.cpp b/src/KOKKOS/pair_lj_class2_kokkos.cpp index 063753f1f8..33d1477443 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp @@ -292,7 +292,7 @@ double PairLJClass2Kokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJClass2Kokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJClass2Kokkos; #endif } diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp index a2067f8cf9..6001fabbed 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp @@ -357,7 +357,7 @@ double PairLJCutCoulCutKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCutCoulCutKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCutCoulCutKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp index 277f1f658c..10923bc5da 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp @@ -386,7 +386,7 @@ double PairLJCutCoulDebyeKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCutCoulDebyeKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCutCoulDebyeKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp index 165bd97276..47aa2ea7cc 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp @@ -377,7 +377,7 @@ double PairLJCutCoulDSFKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCutCoulDSFKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCutCoulDSFKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp index d02e83eb11..fa36cb1866 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp @@ -515,7 +515,7 @@ double PairLJCutCoulLongKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCutCoulLongKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCutCoulLongKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp index daaab8d29e..9b0ff902af 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp @@ -289,7 +289,7 @@ double PairLJCutKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJCutKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJCutKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_expand_kokkos.cpp b/src/KOKKOS/pair_lj_expand_kokkos.cpp index 55c8b200ef..3b8b9343d8 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.cpp +++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp @@ -297,7 +297,7 @@ double PairLJExpandKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJExpandKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJExpandKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp index b7fb5acccb..d06ad9b44e 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp @@ -516,7 +516,7 @@ double PairLJGromacsCoulGromacsKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJGromacsCoulGromacsKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJGromacsCoulGromacsKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp index 5d2725ccdd..d447846333 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp @@ -348,7 +348,7 @@ double PairLJGromacsKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJGromacsKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJGromacsKokkos; #endif } diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.cpp b/src/KOKKOS/pair_lj_sdk_kokkos.cpp index 8f719582fa..990e464341 100644 --- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp +++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp @@ -326,7 +326,7 @@ double PairLJSDKKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairLJSDKKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairLJSDKKokkos; #endif } diff --git a/src/KOKKOS/pair_morse_kokkos.cpp b/src/KOKKOS/pair_morse_kokkos.cpp index 97c5f9be84..ab5eb817a1 100644 --- a/src/KOKKOS/pair_morse_kokkos.cpp +++ b/src/KOKKOS/pair_morse_kokkos.cpp @@ -303,7 +303,7 @@ double PairMorseKokkos::init_one(int i, int j) namespace LAMMPS_NS { template class PairMorseKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairMorseKokkos; #endif } diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp index a6af26cb0f..5f19d73dfa 100644 --- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp @@ -993,7 +993,7 @@ void PairMultiLucyRXKokkos::settings(int narg, char **arg) namespace LAMMPS_NS { template class PairMultiLucyRXKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairMultiLucyRXKokkos; #endif } diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 9930894f45..56d2ebd8aa 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -4292,7 +4292,7 @@ void PairReaxCKokkos::operator()(PairReaxFindBondSpecies, const int } template class PairReaxCKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairReaxCKokkos; #endif } diff --git a/src/KOKKOS/pair_snap_kokkos.cpp b/src/KOKKOS/pair_snap_kokkos.cpp index 32510721d3..76d6aa5462 100644 --- a/src/KOKKOS/pair_snap_kokkos.cpp +++ b/src/KOKKOS/pair_snap_kokkos.cpp @@ -16,7 +16,7 @@ namespace LAMMPS_NS { template class PairSNAPKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairSNAPKokkos; #endif } diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index 5452d2293f..24022475ab 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -972,7 +972,7 @@ void PairSWKokkos::ev_tally3_atom(EV_FLOAT &ev, const int &i, namespace LAMMPS_NS { template class PairSWKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairSWKokkos; #endif } diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index b72df04c5f..9522e94706 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -550,7 +550,7 @@ void PairTableKokkos::cleanup_copy() { namespace LAMMPS_NS { template class PairTableKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairTableKokkos; #endif diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp index 30ca54986b..376984afa2 100644 --- a/src/KOKKOS/pair_table_rx_kokkos.cpp +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -1301,7 +1301,7 @@ void PairTableRXKokkos::cleanup_copy() { namespace LAMMPS_NS { template class PairTableRXKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairTableRXKokkos; #endif diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index c3e1494d0b..a6668ca064 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -1289,7 +1289,7 @@ int PairTersoffKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairTersoffKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairTersoffKokkos; #endif } diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index 61493794ba..303d2bdfda 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -1292,7 +1292,7 @@ int PairTersoffMODKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairTersoffMODKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairTersoffMODKokkos; #endif } diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index f51da2afde..ad4a2d444e 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -1386,7 +1386,7 @@ int PairTersoffZBLKokkos::sbmask(const int& j) const { namespace LAMMPS_NS { template class PairTersoffZBLKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairTersoffZBLKokkos; #endif } diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp index 3d4bd22a3c..78ab8bfc85 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.cpp +++ b/src/KOKKOS/pair_vashishta_kokkos.cpp @@ -947,7 +947,7 @@ void PairVashishtaKokkos::ev_tally3_atom(EV_FLOAT &ev, const int &i, namespace LAMMPS_NS { template class PairVashishtaKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairVashishtaKokkos; #endif } diff --git a/src/KOKKOS/pair_yukawa_kokkos.cpp b/src/KOKKOS/pair_yukawa_kokkos.cpp index 8fc2fda120..951613a33e 100644 --- a/src/KOKKOS/pair_yukawa_kokkos.cpp +++ b/src/KOKKOS/pair_yukawa_kokkos.cpp @@ -295,7 +295,7 @@ compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, namespace LAMMPS_NS { template class PairYukawaKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairYukawaKokkos; #endif } diff --git a/src/KOKKOS/pair_zbl_kokkos.cpp b/src/KOKKOS/pair_zbl_kokkos.cpp index f57d5eaad0..bcf33b405d 100644 --- a/src/KOKKOS/pair_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_zbl_kokkos.cpp @@ -433,7 +433,7 @@ void PairZBLKokkos::cleanup_copy() { namespace LAMMPS_NS { template class PairZBLKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PairZBLKokkos; #endif } diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 7a02e973b1..bcac29ba9b 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1648,7 +1648,7 @@ void PPPMKokkos::make_rho() nlocal = atomKK->nlocal; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); copymode = 0; @@ -3121,7 +3121,7 @@ double PPPMKokkos::memory_usage() namespace LAMMPS_NS { template class PPPMKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class PPPMKokkos; #endif } diff --git a/src/KOKKOS/rand_pool_wrap_kokkos.h b/src/KOKKOS/rand_pool_wrap_kokkos.h index 12255a8a62..c1461c5216 100644 --- a/src/KOKKOS/rand_pool_wrap_kokkos.h +++ b/src/KOKKOS/rand_pool_wrap_kokkos.h @@ -50,7 +50,7 @@ class RandPoolWrap : protected Pointers { KOKKOS_INLINE_FUNCTION RandWrap get_state() const { -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA error->all(FLERR,"Cannot use Marsaglia RNG with GPUs"); #endif diff --git a/src/KOKKOS/region_block_kokkos.cpp b/src/KOKKOS/region_block_kokkos.cpp index 8ff6e8937d..730ef81466 100644 --- a/src/KOKKOS/region_block_kokkos.cpp +++ b/src/KOKKOS/region_block_kokkos.cpp @@ -167,7 +167,7 @@ void RegBlockKokkos::rotate(double &x, double &y, double &z, double namespace LAMMPS_NS { template class RegBlockKokkos; -#ifdef KOKKOS_HAVE_CUDA +#ifdef KOKKOS_ENABLE_CUDA template class RegBlockKokkos; #endif } From 0edc588458d571e3664614ab33e55f320f1ed8f3 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 7 Mar 2019 10:23:17 -0700 Subject: [PATCH 059/243] Replace deprecated Kokkos capacity() with span() --- src/KOKKOS/atom_vec_kokkos.h | 20 ++++++++++---------- src/KOKKOS/kokkos_type.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index 51ae226cc3..b36edf4e2d 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -139,11 +139,11 @@ class AtomVecKokkos : public AtomVec { Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type, Kokkos::MemoryTraits > mirror_type; if (buffer_size == 0) { - buffer = Kokkos::kokkos_malloc(src.capacity()); - buffer_size = src.capacity(); - } else if (buffer_size < src.capacity()) { - buffer = Kokkos::kokkos_realloc(buffer,src.capacity()); - buffer_size = src.capacity(); + buffer = Kokkos::kokkos_malloc(src.span()); + buffer_size = src.span(); + } else if (buffer_size < src.span()) { + buffer = Kokkos::kokkos_realloc(buffer,src.span()); + buffer_size = src.span(); } return mirror_type( buffer , src.extent(0) , @@ -165,11 +165,11 @@ class AtomVecKokkos : public AtomVec { Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type, Kokkos::MemoryTraits > mirror_type; if (buffer_size == 0) { - buffer = Kokkos::kokkos_malloc(src.capacity()*sizeof(typename ViewType::value_type)); - buffer_size = src.capacity(); - } else if (buffer_size < src.capacity()) { - buffer = Kokkos::kokkos_realloc(buffer,src.capacity()*sizeof(typename ViewType::value_type)); - buffer_size = src.capacity(); + buffer = Kokkos::kokkos_malloc(src.span()*sizeof(typename ViewType::value_type)); + buffer_size = src.span(); + } else if (buffer_size < src.span()) { + buffer = Kokkos::kokkos_realloc(buffer,src.span()*sizeof(typename ViewType::value_type)); + buffer_size = src.span(); } mirror_type tmp_view( (typename ViewType::value_type*)buffer , src.extent(0) , diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index eb432cefae..ff96684edc 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -1074,7 +1074,7 @@ void memset_kokkos (ViewType &view) { #ifndef KOKKOS_USING_DEPRECATED_VIEW Kokkos::parallel_for(view.span()*sizeof(typename ViewType::value_type)/4, f); #else - Kokkos::parallel_for(view.capacity()*sizeof(typename ViewType::value_type)/4, f); + Kokkos::parallel_for(view.span()*sizeof(typename ViewType::value_type)/4, f); #endif ViewType::execution_space::fence(); } From 9cb2a5619490b52a70edb886226f9cf379995a2c Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 7 Mar 2019 10:47:40 -0700 Subject: [PATCH 060/243] Remove deprecated Kokkos code --- src/KOKKOS/atom_vec_kokkos.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index b36edf4e2d..58f21b9cd4 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -157,7 +157,7 @@ class AtomVecKokkos : public AtomVec { } template - void perform_async_copy(const ViewType& src, unsigned int space) { + void perform_async_copy(ViewType& src, unsigned int space) { typedef Kokkos::View Date: Thu, 7 Mar 2019 15:11:33 -0500 Subject: [PATCH 061/243] fix a memory leak in fix bocs --- src/USER-BOCS/fix_bocs.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/USER-BOCS/fix_bocs.cpp b/src/USER-BOCS/fix_bocs.cpp index bf11b1d6ba..7bdb8933e3 100644 --- a/src/USER-BOCS/fix_bocs.cpp +++ b/src/USER-BOCS/fix_bocs.cpp @@ -697,6 +697,11 @@ int FixBocs::read_F_table( char *filename, int p_basis_type ) "of %d in read_F_table",p_basis_type); error->all(FLERR,errmsg); } + // cleanup + for (i = 0; i < N_columns; ++i) { + free(data[i]); + } + free(data); return n_entries; } From a5c93e75a5280464c234ebaa50c652037ee8553e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Mar 2019 15:12:22 -0500 Subject: [PATCH 062/243] ignore src/lmpgitversion.h --- src/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.gitignore b/src/.gitignore index 9670d1ca20..d405cb209e 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -6,6 +6,7 @@ /style_*.h /lmpinstalledpkgs.h +/lmpgitversion.h /*_gpu.h /*_gpu.cpp From e62746ef27dd6e55919383f9da625fc720515967 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Mar 2019 15:38:23 -0500 Subject: [PATCH 063/243] protect group command against options that require unavailble properties resulting in segfaults --- src/group.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index 3bc3f3d7bf..6c19af8bc6 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -207,6 +207,12 @@ void Group::assign(int narg, char **arg) else if (strcmp(arg[1],"molecule") == 0) category = MOLECULE; else if (strcmp(arg[1],"id") == 0) category = ID; + if ((category == MOLECULE) && (!atom->molecular)) + error->all(FLERR,"Group command requires atom attribute molecule"); + + if ((category == ID) && (!atom->tag_enable)) + error->all(FLERR,"Group command requires atom IDs"); + // args = logical condition if (narg > 3 && @@ -362,10 +368,13 @@ void Group::assign(int narg, char **arg) } else if (strcmp(arg[1],"include") == 0) { if (narg != 3) error->all(FLERR,"Illegal group command"); - if (strcmp(arg[2],"molecule") != 0) - error->all(FLERR,"Illegal group command"); + if (strcmp(arg[2],"molecule") == 0) { + if (!atom->molecular) + error->all(FLERR,"Group command requires atom attribute molecule"); - add_molecules(igroup,bit); + add_molecules(igroup,bit); + + } else error->all(FLERR,"Illegal group command"); // style = subtract From e0c935b52d9d0384cfa397b13b48e66acf02f721 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 11 Mar 2019 14:28:18 -0600 Subject: [PATCH 064/243] Additional changes to pair_granular: -added mindlin and mindlin/rescale tangential model options -torque from tangential force is now applied at the same point on both contacting particles -updated doc page to reflect changes above --- doc/src/pair_granular.txt | 56 ++++++++++++++++++---- src/GRANULAR/pair_granular.cpp | 88 +++++++++++++++++++++++++--------- src/GRANULAR/pair_granular.h | 2 + 3 files changed, 116 insertions(+), 30 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index dcc756201c..8db9567692 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -28,17 +28,17 @@ pair_style granular pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre pair_style granular -pair_coeff * * hertz 1000.0 50.0 tangential linear_history 800.0 1.0 0.4 :pre +pair_coeff * * hertz 1000.0 50.0 tangential mindlin 800.0 1.0 0.4 :pre pair_style granular pair_coeff * * hertz 1000.0 0.3 tangential linear_history 800.0 1.0 0.4 damping tsuji :pre pair_style granular -pair_coeff 1 1 jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 1 1 jkr 1000.0 50.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre pair_style granular -pair_coeff 1 1 hertz 1000.0 50.0 tangential linear_history 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre @@ -219,7 +219,9 @@ choice and associated parameters. Currently supported tangential model choices a expected parameters are as follows: {linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) -{linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) :ol +{linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) +{mindlin} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) +{mindlin_rescale} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) :ol Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) that determines the magnitude of the @@ -273,6 +275,10 @@ F_\{n0\} = \|\mathbf\{F\}_ne + 2 F_\{pulloff\}\| Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and \(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. +The remaining tangential options all use accumulated tangential displacement (i.e. contact history). This +is discussed below in the context of the {linear_history} option, but the same treatment of the +accumulated displacement applies to the other options as well. + For {tangential linear_history}, the tangential force is given by: \begin\{equation\} @@ -320,17 +326,39 @@ equation 20 and related discussion): \end\{equation\} The tangential force is added to the total normal force (elastic plus damping) to produce the total force -on the particle. The tangential force also acts at the contact point to induce a torque on each -particle according to: +on the particle. The tangential force also acts at the contact point (defined as the center of the overlap region) +to induce a torque on each particle according to: \begin\{equation\} -\mathbf\{\tau\}_i = -R_i \mathbf\{n\} \times \mathbf\{F\}_t +\mathbf\{\tau\}_i = -(R_i - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t \end\{equation\} \begin\{equation\} -\mathbf\{\tau\}_j = -R_j \mathbf\{n\} \times \mathbf\{F\}_t +\mathbf\{\tau\}_j = -(R_j - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t \end\{equation\} +For {tangential mindlin}, the Mindlin no-slip solution is used, which differs from the {linear_history} +option by an additional factor of {a}, the radius of the contact region. The tangential force is given by: + +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t a \mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} +\end\{equation\} + +Here, {a} is the radius of the contact region, given by \(a = \delta R\) for all normal contact models, +except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), +see discussion above. + +The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential +displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_n-1\}\): +\begin\{equation\} +\mathbf\{\xi\} = \mathbf\{xi_\{t_n-1\}\} \frac\{a\}\{a_\{t_n-1\}\} +\end\{equation\} + +This accounts for the fact that a decrease in the contact area upon unloading leads to the contact +being unable to support the previous tangential loading, and spurious energy is created +without the rescaling above ("Walton"_#WaltonPC). See also discussion in "Thornton et al, 2013"_#Thornton2013, +particularly equation 18(b) of that work and associated discussion. + :line The optional {rolling} keyword enables rolling friction, which resists pure rolling @@ -616,3 +644,15 @@ Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. :link(Thornton1991) [(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. J. Phys. D: Appl. Phys. 24 1942 + +:link(Mindlin1949) +[(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies in contact. +J. Appl. Mech., ASME 16, 259-268. + +:line(Thornton2013) +[(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, P. W. (2013). +An investigation of the comparative behaviour of alternative contact force models +during inelastic collisions. Powder Technology, 233, 30-46. + +:line(WaltonPC) +[(Otis R. Walton)] Walton, O.R., Personal Communication diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index caef852ab0..19633a96c2 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -52,7 +52,7 @@ using namespace MathConst; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_SDS}; @@ -77,6 +77,8 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) maxrad_dynamic = NULL; maxrad_frozen = NULL; + history_transfer_factors = NULL; + dt = update->dt; // set comm size needed by this Pair if used with fix rigid @@ -131,7 +133,7 @@ void PairGranular::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz,nx,ny,nz; double radi,radj,radsum,rsq,r,rinv; - double Reff, delta, dR, dR2; + double Reff, delta, dR, dR2, dist_to_contact; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3; @@ -397,16 +399,27 @@ void PairGranular::compute(int eflag, int vflag) damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; if (tangential_history){ - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + - history[2]*history[2]); - + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN){ + k_tangential *= a; + } + else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE){ + k_tangential *= a; + if (a < history[3]){ //On unloading, rescale the shear displacements + double factor = a/history[3]; + history[0] *= factor; + history[1] *= factor; + history[2] *= factor; + } + } // Rotate and update displacements. // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 if (historyupdate) { rsht = history[0]*nx + history[1]*ny + history[2]*nz; if (fabs(rsht) < EPSILON) rsht = 0; if (rsht > 0){ - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); + scalefac = shrmag/(shrmag - rsht); //if rsht == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! history[0] -= rsht*nx; history[1] -= rsht*ny; history[2] -= rsht*nz; @@ -419,6 +432,7 @@ void PairGranular::compute(int eflag, int vflag) history[0] += vtr1*dt; history[1] += vtr2*dt; history[2] += vtr3*dt; + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) history[3] = a; } // tangential forces = history + tangential velocity damping @@ -430,6 +444,8 @@ void PairGranular::compute(int eflag, int vflag) Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); if (shrmag != 0.0) { history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); @@ -469,16 +485,13 @@ void PairGranular::compute(int eflag, int vflag) int rhist1 = rhist0 + 1; int rhist2 = rhist1 + 1; - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - if (historyupdate){ if (fabs(rolldotn) < EPSILON) rolldotn = 0; if (rolldotn > 0){ //Rotate into tangential plane + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); scalefac = rollmag/(rollmag - rolldotn); history[rhist0] -= rolldotn*nx; history[rhist1] -= rolldotn*ny; @@ -504,6 +517,9 @@ void PairGranular::compute(int eflag, int vflag) fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); if (fr > Frcrit) { + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); if (rollmag != 0.0) { history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); @@ -555,9 +571,10 @@ void PairGranular::compute(int eflag, int vflag) tor2 = nz*fs1 - nx*fs3; tor3 = nx*fs2 - ny*fs1; - torque[i][0] -= radi*tor1; - torque[i][1] -= radi*tor2; - torque[i][2] -= radi*tor3; + dist_to_contact = radi-0.5*delta; + torque[i][0] -= dist_to_contact*tor1; + torque[i][1] -= dist_to_contact*tor2; + torque[i][2] -= dist_to_contact*tor3; if (twist_model[itype][jtype] != TWIST_NONE){ tortwist1 = magtortwist * nx; @@ -584,9 +601,10 @@ void PairGranular::compute(int eflag, int vflag) f[j][1] -= fy; f[j][2] -= fz; - torque[j][0] -= radj*tor1; - torque[j][1] -= radj*tor2; - torque[j][2] -= radj*tor3; + dist_to_contact = radj-0.5*delta; + torque[j][0] -= dist_to_contact*tor1; + torque[j][1] -= dist_to_contact*tor2; + torque[j][2] -= dist_to_contact*tor3; if (twist_model[itype][jtype] != TWIST_NONE){ torque[j][0] -= tortwist1; @@ -762,9 +780,13 @@ void PairGranular::coeff(int narg, char **arg) tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } - else if (strcmp(arg[iarg+1], "linear_history") == 0){ + else if ((strcmp(arg[iarg+1], "linear_history") == 0) || + (strcmp(arg[iarg+1], "mindlin") == 0) || + (strcmp(arg[iarg+1], "mindlin_rescale") == 0)){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - tangential_model_one = TANGENTIAL_HISTORY; + if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model_one = TANGENTIAL_HISTORY; + else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model_one = TANGENTIAL_MINDLIN; + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; tangential_history = 1; tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat @@ -896,11 +918,11 @@ void PairGranular::init_style() error->all(FLERR,"Pair granular requires ghost atoms store velocity"); // Determine whether we need a granular neigh list, how large it needs to be - use_history = tangential_history || roll_history || twist_history; + use_history = normal_history || tangential_history || roll_history || twist_history; //For JKR, will need fix/neigh/history to keep track of touch arrays for (int i = 1; i <= atom->ntypes; i++) - for (int j = 1; j <= atom->ntypes; j++) + for (int j = i; j <= atom->ntypes; j++) if (normal_model[i][j] == JKR) use_history = 1; size_history = 3*tangential_history + 3*roll_history + twist_history; @@ -920,6 +942,19 @@ void PairGranular::init_style() else twist_history_index = 0; } } + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + if (tangential_model[i][j] == TANGENTIAL_MINDLIN_RESCALE){ + size_history += 1; + roll_history_index += 1; + twist_history_index += 1; + nondefault_history_transfer = 1; + history_transfer_factors = new int[size_history]; + for (int ii = 0; ii < size_history; ++ii) + history_transfer_factors[ii] = -1; + history_transfer_factors[3] = 1; + break; + } int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->size = 1; @@ -1612,3 +1647,12 @@ double PairGranular::pulloff_distance(double radi, double radj, int itype, int j return a*a/Reff - 2*sqrt(M_PI*coh*a/E); } +/* ---------------------------------------------------------------------- + Transfer history during fix/neigh/history exchange + Only needed if any history entries i-j are not just negative of j-i entries +------------------------------------------------------------------------- */ +void PairGranular::transfer_history(double* source, double* target){ + for (int i = 0; i < size_history; i++) + target[i] = history_transfer_factors[i]*source[i]; +} + diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 7bce3831f1..ebddc17ade 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -61,9 +61,11 @@ public: int nmax; // allocated size of mass_rigid void allocate(); + void transfer_history(double*, double*); private: int size_history; + int *history_transfer_factors; //Model choices int **normal_model, **damping_model; From 2cc35ee7771f9fed8be9cba1521fd198485bad04 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 13 Mar 2019 00:42:08 -0600 Subject: [PATCH 065/243] A few additional enhancements to pair granular and fix wall granular option: - NULL option for tangential stiffness, to set it based on shear modulus - calculation of effective shear moduli from elastic moduli and Poisson's ratio - updates to doc page example syntax --- doc/src/fix_wall_gran.txt | 4 +-- doc/src/pair_granular.txt | 43 ++++++++++++++---------- src/GRANULAR/fix_wall_gran.cpp | 43 +++++++++++++++++++++--- src/GRANULAR/pair_granular.cpp | 60 ++++++++++++++++++++++++++-------- 4 files changed, 113 insertions(+), 37 deletions(-) diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt index 096bec4920..e8c2247594 100644 --- a/doc/src/fix_wall_gran.txt +++ b/doc/src/fix_wall_gran.txt @@ -49,8 +49,8 @@ fix 1 all wall/gran hooke 200000.0 NULL 50.0 NULL 0.5 0 xplane -10.0 10.0 fix 1 all wall/gran hooke/history 200000.0 NULL 50.0 NULL 0.5 0 zplane 0.0 NULL fix 2 all wall/gran hooke 100000.0 20000.0 50.0 30.0 0.5 1 zcylinder 15.0 wiggle z 3.0 2.0 fix 3 all wall/gran granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 zplane 0.0 NULL -fix 4 all wall/gran granular jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall zcylinder 15.0 wiggle z 3.0 2.0 -fix 5 all wall/gran granular dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall zplane 0.0 NULL :pre +fix 4 all wall/gran granular jkr 1000.0 50.0 0.3 5.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall zcylinder 15.0 wiggle z 3.0 2.0 +fix 5 all wall/gran granular dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall zplane 0.0 NULL :pre [Description:] diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 8db9567692..7a58435a83 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -28,10 +28,10 @@ pair_style granular pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre pair_style granular -pair_coeff * * hertz 1000.0 50.0 tangential mindlin 800.0 1.0 0.4 :pre +pair_coeff * * hertz 1000.0 50.0 tangential mindlin NULL 1.0 0.4 :pre pair_style granular -pair_coeff * * hertz 1000.0 0.3 tangential linear_history 800.0 1.0 0.4 damping tsuji :pre +pair_coeff * * hertz/material 1e8 0.3 tangential mindlin_rescale NULL 1.0 0.4 damping tsuji :pre pair_style granular pair_coeff 1 1 jkr 1000.0 50.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall @@ -39,8 +39,8 @@ pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling pair_style granular pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall -pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre +pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre [Description:] @@ -220,8 +220,8 @@ expected parameters are as follows: {linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) {linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) -{mindlin} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) -{mindlin_rescale} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) :ol +{mindlin} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) +{mindlin_rescale} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) :ol Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) that determines the magnitude of the @@ -337,7 +337,7 @@ to induce a torque on each particle according to: \mathbf\{\tau\}_j = -(R_j - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t \end\{equation\} -For {tangential mindlin}, the Mindlin no-slip solution is used, which differs from the {linear_history} +For {tangential mindlin}, the "Mindlin"_#Mindlin1949 no-slip solution is used, which differs from the {linear_history} option by an additional factor of {a}, the radius of the contact region. The tangential force is given by: \begin\{equation\} @@ -346,18 +346,27 @@ option by an additional factor of {a}, the radius of the contact region. The tan Here, {a} is the radius of the contact region, given by \(a = \delta R\) for all normal contact models, except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), -see discussion above. - -The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential -displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_n-1\}\): +see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where +\(G\) is the shear modulus, related to Young's modulus \(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) +is Poisson's ratio. This can also be achieved by specifying {NULL} for \(k_t\), in which case +a normal contact model that specifies material parameters \(E\) and \(\nu\) is required (e.g. {hertz/material}, +{dmt} or {jkr}). In this case, mixing of shear moduli for different particle types {i} and {j} is done according +to: \begin\{equation\} -\mathbf\{\xi\} = \mathbf\{xi_\{t_n-1\}\} \frac\{a\}\{a_\{t_n-1\}\} +1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j \end\{equation\} -This accounts for the fact that a decrease in the contact area upon unloading leads to the contact +The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential +displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_\{n-1\}\}\): +\begin\{equation\} +\mathbf\{\xi\} = \mathbf\{\xi_\{t_\{n-1\}\}\} \frac\{a\}\{a_\{t_\{n-1\}\}\} +\end\{equation\} + +Here, \(t_\{n-1\}\) indicates the value at the previous time step. This rescaling +accounts for the fact that a decrease in the contact area upon unloading leads to the contact being unable to support the previous tangential loading, and spurious energy is created -without the rescaling above ("Walton"_#WaltonPC). See also discussion in "Thornton et al, 2013"_#Thornton2013, -particularly equation 18(b) of that work and associated discussion. +without the rescaling above ("Walton"_#WaltonPC ). See also discussion in "Thornton et al, 2013"_#Thornton2013 +, particularly equation 18(b) of that work and associated discussion. :line @@ -649,10 +658,10 @@ J. Phys. D: Appl. Phys. 24 1942 [(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies in contact. J. Appl. Mech., ASME 16, 259-268. -:line(Thornton2013) +:link(Thornton2013) [(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, P. W. (2013). An investigation of the comparative behaviour of alternative contact force models during inelastic collisions. Powder Technology, 233, 30-46. -:line(WaltonPC) +:link(WaltonPC) [(Otis R. Walton)] Walton, O.R., Personal Communication diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 3b959e1a01..3a929771e9 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -54,7 +54,7 @@ enum{NONE,CONSTANT,EQUAL}; enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_SDS}; @@ -198,11 +198,24 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; } - else if (strcmp(arg[iarg+1], "linear_history") == 0){ + else if ((strcmp(arg[iarg+1], "linear_history") == 0) || + (strcmp(arg[iarg+1], "mindlin") == 0) || + (strcmp(arg[iarg+1], "mindlin_rescale") == 0)){ if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - tangential_model = TANGENTIAL_HISTORY; + if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model = TANGENTIAL_HISTORY; + else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model = TANGENTIAL_MINDLIN; + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model = TANGENTIAL_MINDLIN_RESCALE; + if ((tangential_model == TANGENTIAL_MINDLIN || tangential_model == TANGENTIAL_MINDLIN_RESCALE) && + (strcmp(arg[iarg+2], "NULL") == 0)){ + if (normal_model == NORMAL_HERTZ || normal_model == NORMAL_HOOKE){ + error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); + } + tangential_coeffs[0] = 4*(2-poiss)*(1+poiss)/Emod; + } + else{ + tangential_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt + } tangential_history = 1; - tangential_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; @@ -265,7 +278,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Illegal fix wall/gran command"); } } - size_history = (normal_model == JKR) + 3*tangential_history + 3*roll_history + twist_history; + size_history = 3*tangential_history + 3*roll_history + twist_history; + if (normal_model == JKR) size_history += 1; + if (tangential_model == TANGENTIAL_MINDLIN_RESCALE) size_history += 1; } // wallstyle args @@ -466,6 +481,10 @@ void FixWallGran::init() roll_history_index += 1; twist_history_index += 1; } + if (tangential_model == TANGENTIAL_MINDLIN_RESCALE){ + roll_history_index += 1; + twist_history_index += 1; + } if (damping_model == TSUJI){ double cor = normal_coeffs[1]; @@ -473,6 +492,8 @@ void FixWallGran::init() 27.467*pow(cor,4)-18.022*pow(cor,5)+ 4.8218*pow(cor,6); } + + } /* ---------------------------------------------------------------------- */ @@ -1177,6 +1198,18 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, int thist2 = thist1 + 1; if (tangential_history){ + if (tangential_model == TANGENTIAL_MINDLIN){ + k_tangential *= a; + } + else if (tangential_model == TANGENTIAL_MINDLIN_RESCALE){ + k_tangential *= a; + if (a < history[3]){ //On unloading, rescale the shear displacements + double factor = a/history[thist2+1]; + history[thist0] *= factor; + history[thist1] *= factor; + history[thist2] *= factor; + } + } shrmag = sqrt(history[thist0]*history[thist0] + history[thist1]*history[thist1] + history[thist2]*history[thist2]); diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 19633a96c2..97cf02676f 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -211,8 +211,10 @@ void PairGranular::compute(int eflag, int vflag) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = fix_history->firstflag; - firsthistory = fix_history->firstvalue; + if (use_history){ + firsttouch = fix_history->firstflag; + firsthistory = fix_history->firstvalue; + } for (ii = 0; ii < inum; ii++) { i = ilist[ii]; @@ -222,8 +224,10 @@ void PairGranular::compute(int eflag, int vflag) ztmp = x[i][2]; itype = type[i]; radi = radius[i]; - touch = firsttouch[i]; - allhistory = firsthistory[i]; + if (use_history){ + touch = firsttouch[i]; + allhistory = firsthistory[i]; + } jlist = firstneigh[i]; jnum = numneigh[i]; @@ -263,9 +267,11 @@ void PairGranular::compute(int eflag, int vflag) if (!touchflag){ // unset non-touching neighbors - touch[jj] = 0; - history = &allhistory[size_history*jj]; - for (int k = 0; k < size_history; k++) history[k] = 0.0; + if (use_history){ + touch[jj] = 0; + history = &allhistory[size_history*jj]; + for (int k = 0; k < size_history; k++) history[k] = 0.0; + } } else{ r = sqrt(rsq); @@ -788,7 +794,16 @@ void PairGranular::coeff(int narg, char **arg) else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model_one = TANGENTIAL_MINDLIN; else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; tangential_history = 1; - tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + if ((tangential_model_one == TANGENTIAL_MINDLIN || tangential_model_one == TANGENTIAL_MINDLIN_RESCALE) && + (strcmp(arg[iarg+2], "NULL") == 0)){ + if (normal_model_one == HERTZ || normal_model_one == HOOKE){ + error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); + } + tangential_coeffs_one[0] = -1; + } + else{ + tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + } tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; @@ -879,7 +894,13 @@ void PairGranular::coeff(int narg, char **arg) damping_model[i][j] = damping_model[j][i] = damping_model_one; tangential_model[i][j] = tangential_model[j][i] = tangential_model_one; - for (int k = 0; k < 3; k++) + if (tangential_coeffs_one[0] == -1){ + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = 8*mix_stiffnessG(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); + } + else{ + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = tangential_coeffs_one[0]; + } + for (int k = 1; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_one[k]; roll_model[i][j] = roll_model[j][i] = roll_model_one; @@ -1276,7 +1297,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, touchflag = (rsq <= radsum*radsum); } - if (touchflag){ + if (!touchflag){ fforce = 0.0; for (int m = 0; m < single_extra; m++) svector[m] = 0.0; return 0.0; @@ -1373,8 +1394,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, } else{ knfac = E; - a = sqrt(dR); Fne = knfac*delta; + a = sqrt(dR); if (normal_model[itype][jtype] != HOOKE){ Fne *= a; knfac *= a; @@ -1451,6 +1472,19 @@ double PairGranular::single(int i, int j, int itype, int jtype, damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; if (tangential_history){ + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN){ + k_tangential *= a; + } + else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE){ + k_tangential *= a; + if (a < history[3]){ //On unloading, rescale the shear displacements + double factor = a/history[3]; + history[0] *= factor; + history[1] *= factor; + history[2] *= factor; + } + } + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); @@ -1617,9 +1651,9 @@ double PairGranular::mix_stiffnessE(double Eii, double Ejj, double poisii, doubl mixing of shear modulus (G) ------------------------------------------------------------------------ */ -double PairGranular::mix_stiffnessG(double Gii, double Gjj, double poisii, double poisjj) +double PairGranular::mix_stiffnessG(double Eii, double Ejj, double poisii, double poisjj) { - return 1/((2.0 -poisii)/Gii+(2.0-poisjj)/Gjj); + return 1/((2*(2-poisii)*(1+poisii)/Eii) + (2*(2-poisjj)*(1+poisjj)/Ejj)); } /* ---------------------------------------------------------------------- From 3b234c167ff723805ba30dd0e6b222782f39b676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 13:46:15 +0100 Subject: [PATCH 066/243] USER-MEAMC: fix incomplete clearing of ev variables --- src/USER-MEAMC/pair_meamc.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/USER-MEAMC/pair_meamc.cpp b/src/USER-MEAMC/pair_meamc.cpp index b74416a46d..d0d97740b3 100644 --- a/src/USER-MEAMC/pair_meamc.cpp +++ b/src/USER-MEAMC/pair_meamc.cpp @@ -94,8 +94,7 @@ void PairMEAMC::compute(int eflag, int vflag) int *numneigh_full,**firstneigh_full; if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + else ev_unset(); // neighbor list info From adcd46da55303428ba26ee1846ad12b577c8bc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 6 Mar 2019 12:59:37 +0100 Subject: [PATCH 067/243] require an atom map for dynamical_matrix --- src/USER-PHONON/dynamical_matrix.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 372f4e4e31..c12bf6873e 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -138,6 +138,9 @@ void DynamicalMatrix::command(int narg, char **arg) else if (style == ESKM) options(narg-3,&arg[3]); //COME BACK else if (comm->me == 0 && screen) fprintf(screen,"Illegal Dynamical Matrix command\n"); + if (atom->map_style == 0) + error->all(FLERR,"Dynamical_matrix command requires an atom map, see atom_modify"); + // move atoms by 3-vector or specified variable(s) if (style == REGULAR) { From d30e69e87123c1c5f24d7ba4d488066b217d5bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 6 Mar 2019 13:28:44 +0100 Subject: [PATCH 068/243] fix writing binary dynmat file --- src/USER-PHONON/dynamical_matrix.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index c12bf6873e..5b571213c7 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -337,7 +337,8 @@ void DynamicalMatrix::writeMatrix(double **dynmat) if (binaryflag && fp) { clearerr(fp); - fwrite(&dynmat[0], sizeof(double), 3 * dynlen, fp); + for (int i=0; i<3; i++) + fwrite(dynmat[i], sizeof(double), dynlen, fp); if (ferror(fp)) error->one(FLERR, "Error writing to binary file"); } From bb8398b22b966d617c4ce339081547026db4b8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 6 Mar 2019 13:49:25 +0100 Subject: [PATCH 069/243] streamline writeMatrix function --- src/USER-PHONON/dynamical_matrix.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 5b571213c7..7b08e826a4 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -319,28 +319,24 @@ void DynamicalMatrix::calculateMatrix() void DynamicalMatrix::writeMatrix(double **dynmat) { - if (me != 0 || fp == NULL) return; + if (me != 0 || !fp) + return; - // print file comment lines - - if (!binaryflag && fp) { - clearerr(fp); + clearerr(fp); + if (binaryflag) { + for (int i=0; i<3; i++) + fwrite(dynmat[i], sizeof(double), dynlen, fp); + if (ferror(fp)) + error->one(FLERR, "Error writing to binary file"); + } else { for (int i = 0; i < 3; i++) { for (bigint j = 0; j < dynlen; j++) { if ((j+1)%3==0) fprintf(fp, "%4.8f\n", dynmat[i][j]); else fprintf(fp, "%4.8f ",dynmat[i][j]); } } - } - if (ferror(fp)) - error->one(FLERR,"Error writing to file"); - - if (binaryflag && fp) { - clearerr(fp); - for (int i=0; i<3; i++) - fwrite(dynmat[i], sizeof(double), dynlen, fp); if (ferror(fp)) - error->one(FLERR, "Error writing to binary file"); + error->one(FLERR,"Error writing to file"); } } From e8efa01006d574c44ca2e379f78eb7645c2132ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 6 Mar 2019 14:28:58 +0100 Subject: [PATCH 070/243] dynamical_matrix progress indicator --- src/USER-PHONON/dynamical_matrix.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 7b08e826a4..b4a676b4db 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -262,6 +262,7 @@ void DynamicalMatrix::calculateMatrix() if (comm->me == 0 && screen) fprintf(screen,"Calculating Dynamical Matrix...\n"); update->nsteps = 0; + int prog = 0; for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); for (bigint alpha=0; alpha<3; alpha++){ @@ -300,7 +301,16 @@ void DynamicalMatrix::calculateMatrix() if (me == 0) writeMatrix(fdynmat); dynmat_clear(dynmat); + if (comm->me == 0 && screen) { + int p = 10 * i / natoms; + if (p > prog) { + prog = p; + fprintf(screen," %d%%",p*10); + fflush(screen); + } + } } + if (comm->me == 0 && screen) fprintf(screen,"\n"); for (int i=0; i < 3; i++) delete [] dynmat[i]; From 7fe1cceb7656351697f0b931b6cd7131d4706bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Thu, 7 Mar 2019 16:22:04 +0100 Subject: [PATCH 071/243] fix some leftover bigint conversions, groupmap construction --- src/USER-PHONON/dynamical_matrix.cpp | 46 ++++++++++++++++++---------- src/USER-PHONON/dynamical_matrix.h | 2 +- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index b4a676b4db..d94bd11a80 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -243,7 +243,7 @@ void DynamicalMatrix::calculateMatrix() int nlocal = atom->nlocal; bigint natoms = atom->natoms; int *type = atom->type; - int *gm = groupmap; + bigint *gm = groupmap; double imass; // dynamical matrix element double *m = atom->mass; double **f = atom->f; @@ -259,21 +259,30 @@ void DynamicalMatrix::calculateMatrix() //initialize dynmat to all zeros dynmat_clear(dynmat); - if (comm->me == 0 && screen) fprintf(screen,"Calculating Dynamical Matrix...\n"); + if (comm->me == 0 && screen) { + fprintf(screen,"Calculating Dynamical Matrix ...\n"); + fprintf(screen," Total # of atoms = " BIGINT_FORMAT "\n", natoms); + fprintf(screen," Atoms in group = " BIGINT_FORMAT "\n", gcount); + fprintf(screen," Total dynamical matrix elements = " BIGINT_FORMAT "\n", (dynlen*dynlen) ); + } + + // emit dynlen rows of dimalpha*dynlen*dimbeta elements update->nsteps = 0; int prog = 0; for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); + if (gm[i-1] < 0) + continue; for (bigint alpha=0; alpha<3; alpha++){ displace_atom(local_idx, alpha, 1); update_force(); for (bigint j=1; j<=natoms; j++){ local_jdx = atom->map(j); if (local_idx >= 0 && local_jdx >= 0 && local_jdx < nlocal - && gm[i-1] >= 0 && gm[j-1] >= 0){ + && gm[j-1] >= 0){ for (int beta=0; beta<3; beta++){ - dynmat[alpha][(gm[j-1])*3+beta] -= f[local_jdx][beta]; + dynmat[alpha][gm[j-1]*3+beta] -= f[local_jdx][beta]; } } } @@ -282,15 +291,15 @@ void DynamicalMatrix::calculateMatrix() for (bigint j=1; j<=natoms; j++){ local_jdx = atom->map(j); if (local_idx >= 0 && local_jdx >= 0 && local_jdx < nlocal - && gm[i-1] >= 0 && gm[j-1] >= 0){ + && gm[j-1] >= 0){ for (bigint beta=0; beta<3; beta++){ if (atom->rmass_flag == 1) imass = sqrt(m[local_idx] * m[local_jdx]); else imass = sqrt(m[type[local_idx]] * m[type[local_jdx]]); - dynmat[alpha][(gm[j-1])*3+beta] -= -f[local_jdx][beta]; - dynmat[alpha][(gm[j-1])*3+beta] /= (2 * del * imass); - dynmat[alpha][(gm[j-1])*3+beta] *= conversion; + dynmat[alpha][gm[j-1]*3+beta] -= -f[local_jdx][beta]; + dynmat[alpha][gm[j-1]*3+beta] /= (2 * del * imass); + dynmat[alpha][gm[j-1]*3+beta] *= conversion; } } } @@ -302,7 +311,7 @@ void DynamicalMatrix::calculateMatrix() writeMatrix(fdynmat); dynmat_clear(dynmat); if (comm->me == 0 && screen) { - int p = 10 * i / natoms; + int p = 10 * gm[i-1] / gcount; if (p > prog) { prog = p; fprintf(screen," %d%%",p*10); @@ -500,6 +509,7 @@ void DynamicalMatrix::convert_units(const char *style) void DynamicalMatrix::create_groupmap() { //Create a group map which maps atom order onto group + // groupmap[global atom index-1] = output column/row int local_idx; // local index int gid = 0; //group index @@ -508,7 +518,7 @@ void DynamicalMatrix::create_groupmap() bigint natoms = atom->natoms; int *recv = new int[comm->nprocs]; int *displs = new int[comm->nprocs]; - int *temp_groupmap = new int[natoms]; + bigint *temp_groupmap = new bigint[natoms]; //find number of local atoms in the group (final_gid) for (bigint i=1; i<=natoms; i++){ @@ -517,7 +527,7 @@ void DynamicalMatrix::create_groupmap() gid += 1; // gid at the end of loop is final_Gid } //create an array of length final_gid - int *sub_groupmap = new int[gid]; + bigint *sub_groupmap = new bigint[gid]; gid = 0; //create a map between global atom id and group atom id for each proc @@ -534,7 +544,7 @@ void DynamicalMatrix::create_groupmap() recv[i] = 0; } recv[comm->me] = gid; - MPI_Allreduce(recv,displs,4,MPI_INT,MPI_SUM,world); + MPI_Allreduce(recv,displs,comm->nprocs,MPI_INT,MPI_SUM,world); for (int i=0; inprocs; i++){ recv[i]=displs[i]; if (i>0) displs[i] = displs[i-1]+recv[i-1]; @@ -542,15 +552,17 @@ void DynamicalMatrix::create_groupmap() } //combine subgroup maps into total temporary groupmap - MPI_Allgatherv(sub_groupmap,gid,MPI_INT,temp_groupmap,recv,displs,MPI_INT,world); + MPI_Allgatherv(sub_groupmap,gid,MPI_LMP_BIGINT,temp_groupmap,recv,displs,MPI_LMP_BIGINT,world); std::sort(temp_groupmap,temp_groupmap+gcount); //populate member groupmap based on temp groupmap - for (bigint i=0; i Date: Wed, 13 Mar 2019 16:34:15 +0100 Subject: [PATCH 072/243] use ev_unset for all pair styles --- src/ASPHERE/pair_gayberne.cpp | 3 +-- src/ASPHERE/pair_line_lj.cpp | 3 +-- src/ASPHERE/pair_resquared.cpp | 3 +-- src/ASPHERE/pair_tri_lj.cpp | 3 +-- src/BODY/pair_body_nparticle.cpp | 3 +-- src/BODY/pair_body_rounded_polygon.cpp | 3 +-- src/BODY/pair_body_rounded_polyhedron.cpp | 3 +-- src/CLASS2/pair_lj_class2.cpp | 3 +-- src/CLASS2/pair_lj_class2_coul_cut.cpp | 3 +-- src/CLASS2/pair_lj_class2_coul_long.cpp | 3 +-- src/COLLOID/pair_brownian.cpp | 3 +-- src/COLLOID/pair_brownian_poly.cpp | 3 +-- src/COLLOID/pair_colloid.cpp | 3 +-- src/COLLOID/pair_lubricate.cpp | 3 +-- src/COLLOID/pair_lubricateU.cpp | 3 +-- src/COLLOID/pair_lubricateU_poly.cpp | 3 +-- src/COLLOID/pair_lubricate_poly.cpp | 3 +-- src/COLLOID/pair_yukawa_colloid.cpp | 3 +-- src/CORESHELL/pair_born_coul_dsf_cs.cpp | 3 +-- src/CORESHELL/pair_born_coul_long_cs.cpp | 3 +-- src/CORESHELL/pair_born_coul_wolf_cs.cpp | 3 +-- src/CORESHELL/pair_buck_coul_long_cs.cpp | 3 +-- src/CORESHELL/pair_coul_long_cs.cpp | 3 +-- src/CORESHELL/pair_coul_wolf_cs.cpp | 3 +-- src/CORESHELL/pair_lj_cut_coul_long_cs.cpp | 6 ++---- src/DIPOLE/pair_lj_cut_dipole_cut.cpp | 3 +-- src/DIPOLE/pair_lj_cut_dipole_long.cpp | 3 +-- src/DIPOLE/pair_lj_long_dipole_long.cpp | 3 +-- src/GPU/pair_beck_gpu.cpp | 3 +-- src/GPU/pair_born_coul_long_cs_gpu.cpp | 3 +-- src/GPU/pair_born_coul_long_gpu.cpp | 3 +-- src/GPU/pair_born_coul_wolf_cs_gpu.cpp | 3 +-- src/GPU/pair_born_coul_wolf_gpu.cpp | 3 +-- src/GPU/pair_born_gpu.cpp | 3 +-- src/GPU/pair_buck_coul_cut_gpu.cpp | 3 +-- src/GPU/pair_buck_coul_long_gpu.cpp | 3 +-- src/GPU/pair_buck_gpu.cpp | 3 +-- src/GPU/pair_colloid_gpu.cpp | 3 +-- src/GPU/pair_coul_cut_gpu.cpp | 3 +-- src/GPU/pair_coul_debye_gpu.cpp | 3 +-- src/GPU/pair_coul_dsf_gpu.cpp | 3 +-- src/GPU/pair_coul_long_cs_gpu.cpp | 3 +-- src/GPU/pair_coul_long_gpu.cpp | 3 +-- src/GPU/pair_dpd_gpu.cpp | 3 +-- src/GPU/pair_dpd_tstat_gpu.cpp | 3 +-- src/GPU/pair_eam_alloy_gpu.cpp | 3 +-- src/GPU/pair_eam_fs_gpu.cpp | 3 +-- src/GPU/pair_eam_gpu.cpp | 3 +-- src/GPU/pair_gauss_gpu.cpp | 3 +-- src/GPU/pair_gayberne_gpu.cpp | 3 +-- src/GPU/pair_lj96_cut_gpu.cpp | 3 +-- src/GPU/pair_lj_charmm_coul_long_gpu.cpp | 3 +-- src/GPU/pair_lj_class2_coul_long_gpu.cpp | 3 +-- src/GPU/pair_lj_class2_gpu.cpp | 3 +-- src/GPU/pair_lj_cubic_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_coul_cut_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_coul_debye_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_coul_dsf_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_coul_long_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_coul_msm_gpu.cpp | 3 +-- src/GPU/pair_lj_cut_dipole_cut_gpu.cpp | 6 ++---- src/GPU/pair_lj_cut_dipole_long_gpu.cpp | 6 ++---- src/GPU/pair_lj_cut_gpu.cpp | 3 +-- src/GPU/pair_lj_expand_coul_long_gpu.cpp | 3 +-- src/GPU/pair_lj_expand_gpu.cpp | 3 +-- src/GPU/pair_lj_gromacs_gpu.cpp | 3 +-- src/GPU/pair_lj_sdk_coul_long_gpu.cpp | 3 +-- src/GPU/pair_lj_sdk_gpu.cpp | 3 +-- src/GPU/pair_lj_sf_dipole_sf_gpu.cpp | 6 ++---- src/GPU/pair_mie_cut_gpu.cpp | 3 +-- src/GPU/pair_morse_gpu.cpp | 3 +-- src/GPU/pair_resquared_gpu.cpp | 3 +-- src/GPU/pair_soft_gpu.cpp | 3 +-- src/GPU/pair_sw_gpu.cpp | 3 +-- src/GPU/pair_table_gpu.cpp | 3 +-- src/GPU/pair_tersoff_gpu.cpp | 3 +-- src/GPU/pair_tersoff_mod_gpu.cpp | 3 +-- src/GPU/pair_tersoff_zbl_gpu.cpp | 3 +-- src/GPU/pair_ufm_gpu.cpp | 3 +-- src/GPU/pair_vashishta_gpu.cpp | 3 +-- src/GPU/pair_yukawa_colloid_gpu.cpp | 3 +-- src/GPU/pair_yukawa_gpu.cpp | 3 +-- src/GPU/pair_zbl_gpu.cpp | 3 +-- src/GRANULAR/pair_gran_hertz_history.cpp | 3 +-- src/GRANULAR/pair_gran_hooke.cpp | 3 +-- src/GRANULAR/pair_gran_hooke_history.cpp | 3 +-- src/KIM/pair_kim.cpp | 5 +---- src/KOKKOS/pair_buck_coul_cut_kokkos.cpp | 3 +-- src/KOKKOS/pair_buck_coul_long_kokkos.cpp | 3 +-- src/KOKKOS/pair_buck_kokkos.cpp | 3 +-- src/KOKKOS/pair_coul_cut_kokkos.cpp | 3 +-- src/KOKKOS/pair_coul_debye_kokkos.cpp | 3 +-- src/KOKKOS/pair_coul_dsf_kokkos.cpp | 3 +-- src/KOKKOS/pair_coul_long_kokkos.cpp | 3 +-- src/KOKKOS/pair_coul_wolf_kokkos.cpp | 3 +-- src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp | 3 +-- src/KOKKOS/pair_eam_alloy_kokkos.cpp | 3 +-- src/KOKKOS/pair_eam_fs_kokkos.cpp | 3 +-- src/KOKKOS/pair_eam_kokkos.cpp | 3 +-- src/KOKKOS/pair_exp6_rx_kokkos.cpp | 3 +-- src/KOKKOS/pair_gran_hooke_history_kokkos.cpp | 3 +-- src/KOKKOS/pair_hybrid_kokkos.cpp | 4 +--- src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_class2_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_cut_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_expand_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_gromacs_kokkos.cpp | 3 +-- src/KOKKOS/pair_lj_sdk_kokkos.cpp | 3 +-- src/KOKKOS/pair_morse_kokkos.cpp | 3 +-- src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp | 3 +-- src/KOKKOS/pair_reaxc_kokkos.cpp | 3 +-- src/KOKKOS/pair_snap_kokkos_impl.h | 3 +-- src/KOKKOS/pair_sw_kokkos.cpp | 3 +-- src/KOKKOS/pair_table_kokkos.cpp | 3 +-- src/KOKKOS/pair_table_rx_kokkos.cpp | 3 +-- src/KOKKOS/pair_tersoff_kokkos.cpp | 3 +-- src/KOKKOS/pair_tersoff_mod_kokkos.cpp | 3 +-- src/KOKKOS/pair_tersoff_zbl_kokkos.cpp | 3 +-- src/KOKKOS/pair_vashishta_kokkos.cpp | 3 +-- src/KOKKOS/pair_yukawa_kokkos.cpp | 3 +-- src/KOKKOS/pair_zbl_kokkos.cpp | 3 +-- src/KSPACE/pair_born_coul_long.cpp | 3 +-- src/KSPACE/pair_born_coul_msm.cpp | 3 +-- src/KSPACE/pair_buck_coul_long.cpp | 3 +-- src/KSPACE/pair_buck_coul_msm.cpp | 3 +-- src/KSPACE/pair_buck_long_coul_long.cpp | 6 ++---- src/KSPACE/pair_coul_long.cpp | 3 +-- src/KSPACE/pair_coul_msm.cpp | 3 +-- src/KSPACE/pair_lj_charmm_coul_long.cpp | 6 ++---- src/KSPACE/pair_lj_charmm_coul_msm.cpp | 6 ++---- src/KSPACE/pair_lj_charmmfsw_coul_long.cpp | 6 ++---- src/KSPACE/pair_lj_cut_coul_long.cpp | 6 ++---- src/KSPACE/pair_lj_cut_coul_msm.cpp | 6 ++---- src/KSPACE/pair_lj_cut_tip4p_long.cpp | 3 +-- src/KSPACE/pair_lj_long_coul_long.cpp | 6 ++---- src/KSPACE/pair_lj_long_tip4p_long.cpp | 6 ++---- src/KSPACE/pair_tip4p_long.cpp | 3 +-- src/MANYBODY/pair_adp.cpp | 3 +-- src/MANYBODY/pair_airebo.cpp | 3 +-- src/MANYBODY/pair_atm.cpp | 3 +-- src/MANYBODY/pair_bop.cpp | 3 +-- src/MANYBODY/pair_comb.cpp | 3 +-- src/MANYBODY/pair_comb3.cpp | 3 +-- src/MANYBODY/pair_eam.cpp | 3 +-- src/MANYBODY/pair_eam_cd.cpp | 3 +-- src/MANYBODY/pair_eim.cpp | 3 +-- src/MANYBODY/pair_gw.cpp | 3 +-- src/MANYBODY/pair_lcbop.cpp | 3 +-- src/MANYBODY/pair_nb3b_harmonic.cpp | 3 +-- src/MANYBODY/pair_polymorphic.cpp | 3 +-- src/MANYBODY/pair_sw.cpp | 3 +-- src/MANYBODY/pair_tersoff.cpp | 3 +-- src/MANYBODY/pair_vashishta.cpp | 3 +-- src/MANYBODY/pair_vashishta_table.cpp | 3 +-- src/MISC/pair_nm_cut.cpp | 3 +-- src/MISC/pair_nm_cut_coul_cut.cpp | 3 +-- src/MISC/pair_nm_cut_coul_long.cpp | 3 +-- src/MOLECULE/pair_hbond_dreiding_lj.cpp | 3 +-- src/MOLECULE/pair_hbond_dreiding_morse.cpp | 3 +-- src/MOLECULE/pair_lj_charmm_coul_charmm.cpp | 3 +-- src/MOLECULE/pair_lj_charmm_coul_charmm_implicit.cpp | 3 +-- src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp | 3 +-- src/MOLECULE/pair_lj_cut_tip4p_cut.cpp | 3 +-- src/MOLECULE/pair_tip4p_cut.cpp | 3 +-- src/OPT/pair_eam_opt.cpp | 3 +-- src/OPT/pair_lj_charmm_coul_long_opt.cpp | 3 +-- src/OPT/pair_lj_cut_coul_long_opt.cpp | 3 +-- src/OPT/pair_lj_cut_opt.cpp | 3 +-- src/OPT/pair_lj_cut_tip4p_long_opt.cpp | 3 +-- src/OPT/pair_lj_long_coul_long_opt.cpp | 6 ++---- src/OPT/pair_morse_opt.cpp | 3 +-- src/OPT/pair_ufm_opt.cpp | 3 +-- src/PERI/pair_peri_eps.cpp | 3 +-- src/PERI/pair_peri_lps.cpp | 3 +-- src/PERI/pair_peri_pmb.cpp | 3 +-- src/PERI/pair_peri_ves.cpp | 3 +-- src/PYTHON/pair_python.cpp | 3 +-- src/SNAP/pair_snap.cpp | 6 ++---- src/SPIN/pair_spin_dmi.cpp | 3 +-- src/SPIN/pair_spin_exchange.cpp | 3 +-- src/SPIN/pair_spin_magelec.cpp | 3 +-- src/SPIN/pair_spin_neel.cpp | 3 +-- src/USER-AWPMD/pair_awpmd_cut.cpp | 5 +---- src/USER-CGDNA/pair_oxdna2_coaxstk.cpp | 3 +-- src/USER-CGDNA/pair_oxdna2_dh.cpp | 3 +-- src/USER-CGDNA/pair_oxdna_coaxstk.cpp | 3 +-- src/USER-CGDNA/pair_oxdna_excv.cpp | 3 +-- src/USER-CGDNA/pair_oxdna_hbond.cpp | 3 +-- src/USER-CGDNA/pair_oxdna_stk.cpp | 3 +-- src/USER-CGDNA/pair_oxdna_xstk.cpp | 3 +-- src/USER-CGSDK/pair_lj_sdk.cpp | 4 +--- src/USER-CGSDK/pair_lj_sdk_coul_long.cpp | 4 +--- src/USER-CGSDK/pair_lj_sdk_coul_msm.cpp | 4 +--- src/USER-DPD/pair_dpd_fdt.cpp | 3 +-- src/USER-DPD/pair_dpd_fdt_energy.cpp | 3 +-- src/USER-DPD/pair_exp6_rx.cpp | 3 +-- src/USER-DPD/pair_multi_lucy.cpp | 3 +-- src/USER-DPD/pair_multi_lucy_rx.cpp | 3 +-- src/USER-DPD/pair_table_rx.cpp | 3 +-- src/USER-DRUDE/pair_lj_cut_thole_long.cpp | 3 +-- src/USER-DRUDE/pair_thole.cpp | 3 +-- src/USER-EFF/pair_eff_cut.cpp | 3 +-- src/USER-FEP/pair_coul_cut_soft.cpp | 3 +-- src/USER-FEP/pair_coul_long_soft.cpp | 3 +-- src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp | 6 ++---- src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp | 3 +-- src/USER-FEP/pair_lj_class2_coul_long_soft.cpp | 3 +-- src/USER-FEP/pair_lj_class2_soft.cpp | 3 +-- src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp | 3 +-- src/USER-FEP/pair_lj_cut_coul_long_soft.cpp | 6 ++---- src/USER-FEP/pair_lj_cut_soft.cpp | 6 ++---- src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp | 3 +-- src/USER-FEP/pair_morse_soft.cpp | 3 +-- src/USER-FEP/pair_tip4p_long_soft.cpp | 3 +-- src/USER-INTEL/pair_airebo_intel.cpp | 3 +-- src/USER-INTEL/pair_buck_coul_cut_intel.cpp | 4 +--- src/USER-INTEL/pair_buck_coul_long_intel.cpp | 4 +--- src/USER-INTEL/pair_buck_intel.cpp | 4 +--- src/USER-INTEL/pair_dpd_intel.cpp | 4 +--- src/USER-INTEL/pair_eam_intel.cpp | 4 +--- src/USER-INTEL/pair_gayberne_intel.cpp | 4 +--- src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp | 4 +--- src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp | 4 +--- src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp | 4 +--- src/USER-INTEL/pair_lj_cut_intel.cpp | 4 +--- src/USER-INTEL/pair_sw_intel.cpp | 4 +--- src/USER-INTEL/pair_tersoff_intel.cpp | 4 +--- src/USER-MEAMC/pair_meamc.cpp | 3 +-- src/USER-MESO/pair_edpd.cpp | 3 +-- src/USER-MESO/pair_mdpd.cpp | 3 +-- src/USER-MESO/pair_mdpd_rhosum.cpp | 5 +---- src/USER-MESO/pair_tdpd.cpp | 3 +-- src/USER-MGPT/pair_mgpt.cpp | 3 +-- src/USER-MISC/pair_agni.cpp | 3 +-- src/USER-MISC/pair_buck_mdf.cpp | 3 +-- src/USER-MISC/pair_coul_diel.cpp | 3 +-- src/USER-MISC/pair_coul_shield.cpp | 3 +-- src/USER-MISC/pair_edip.cpp | 3 +-- src/USER-MISC/pair_edip_multi.cpp | 3 +-- src/USER-MISC/pair_extep.cpp | 3 +-- src/USER-MISC/pair_gauss_cut.cpp | 3 +-- src/USER-MISC/pair_ilp_graphene_hbn.cpp | 3 +-- src/USER-MISC/pair_kolmogorov_crespi_full.cpp | 3 +-- src/USER-MISC/pair_kolmogorov_crespi_z.cpp | 3 +-- src/USER-MISC/pair_lebedeva_z.cpp | 3 +-- src/USER-MISC/pair_lennard_mdf.cpp | 3 +-- src/USER-MISC/pair_list.cpp | 4 +--- src/USER-MISC/pair_lj_expand_coul_long.cpp | 6 ++---- src/USER-MISC/pair_lj_mdf.cpp | 3 +-- src/USER-MISC/pair_lj_sf_dipole_sf.cpp | 3 +-- src/USER-MISC/pair_meam_spline.cpp | 7 +------ src/USER-MISC/pair_meam_sw_spline.cpp | 4 +--- src/USER-MISC/pair_momb.cpp | 3 +-- src/USER-MISC/pair_morse_smooth_linear.cpp | 3 +-- src/USER-MISC/pair_srp.cpp | 5 +---- src/USER-MISC/pair_tersoff_table.cpp | 3 +-- src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp | 3 +-- src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp | 3 +-- src/USER-OMP/pair_adp_omp.cpp | 4 +--- src/USER-OMP/pair_agni_omp.cpp | 4 +--- src/USER-OMP/pair_airebo_omp.cpp | 4 +--- src/USER-OMP/pair_beck_omp.cpp | 4 +--- src/USER-OMP/pair_born_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_born_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_born_coul_wolf_omp.cpp | 4 +--- src/USER-OMP/pair_born_omp.cpp | 4 +--- src/USER-OMP/pair_brownian_omp.cpp | 4 +--- src/USER-OMP/pair_brownian_poly_omp.cpp | 4 +--- src/USER-OMP/pair_buck_coul_cut_omp.cpp | 4 +--- src/USER-OMP/pair_buck_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_buck_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_buck_long_coul_long_omp.cpp | 5 ++--- src/USER-OMP/pair_buck_omp.cpp | 4 +--- src/USER-OMP/pair_colloid_omp.cpp | 4 +--- src/USER-OMP/pair_comb_omp.cpp | 4 +--- src/USER-OMP/pair_coul_cut_omp.cpp | 4 +--- src/USER-OMP/pair_coul_cut_soft_omp.cpp | 4 +--- src/USER-OMP/pair_coul_debye_omp.cpp | 4 +--- src/USER-OMP/pair_coul_diel_omp.cpp | 4 +--- src/USER-OMP/pair_coul_dsf_omp.cpp | 4 +--- src/USER-OMP/pair_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_coul_long_soft_omp.cpp | 4 +--- src/USER-OMP/pair_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_coul_wolf_omp.cpp | 4 +--- src/USER-OMP/pair_dpd_omp.cpp | 4 +--- src/USER-OMP/pair_dpd_tstat_omp.cpp | 4 +--- src/USER-OMP/pair_eam_cd_omp.cpp | 4 +--- src/USER-OMP/pair_eam_omp.cpp | 4 +--- src/USER-OMP/pair_edip_omp.cpp | 4 +--- src/USER-OMP/pair_eim_omp.cpp | 4 +--- src/USER-OMP/pair_gauss_cut_omp.cpp | 4 +--- src/USER-OMP/pair_gauss_omp.cpp | 4 +--- src/USER-OMP/pair_gayberne_omp.cpp | 4 +--- src/USER-OMP/pair_gran_hertz_history_omp.cpp | 4 +--- src/USER-OMP/pair_gran_hooke_history_omp.cpp | 4 +--- src/USER-OMP/pair_gran_hooke_omp.cpp | 4 +--- src/USER-OMP/pair_hbond_dreiding_lj_omp.cpp | 4 +--- src/USER-OMP/pair_hbond_dreiding_morse_omp.cpp | 4 +--- src/USER-OMP/pair_lj96_cut_omp.cpp | 4 +--- src/USER-OMP/pair_lj_charmm_coul_charmm_implicit_omp.cpp | 4 +--- src/USER-OMP/pair_lj_charmm_coul_charmm_omp.cpp | 4 +--- src/USER-OMP/pair_lj_charmm_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_charmm_coul_long_soft_omp.cpp | 4 +--- src/USER-OMP/pair_lj_charmm_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_lj_class2_coul_cut_omp.cpp | 4 +--- src/USER-OMP/pair_lj_class2_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_class2_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cubic_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_cut_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_cut_soft_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_debye_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_dsf_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_long_soft_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_dipole_cut_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_soft_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_thole_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp | 3 +-- src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp | 3 +-- src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp | 3 +-- src/USER-OMP/pair_lj_expand_omp.cpp | 4 +--- src/USER-OMP/pair_lj_gromacs_coul_gromacs_omp.cpp | 4 +--- src/USER-OMP/pair_lj_gromacs_omp.cpp | 4 +--- src/USER-OMP/pair_lj_long_coul_long_omp.cpp | 5 ++--- src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_sdk_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_lj_sdk_coul_msm_omp.cpp | 4 +--- src/USER-OMP/pair_lj_sdk_omp.cpp | 4 +--- src/USER-OMP/pair_lj_sf_dipole_sf_omp.cpp | 4 +--- src/USER-OMP/pair_lj_smooth_linear_omp.cpp | 4 +--- src/USER-OMP/pair_lj_smooth_omp.cpp | 4 +--- src/USER-OMP/pair_lubricate_omp.cpp | 4 +--- src/USER-OMP/pair_lubricate_poly_omp.cpp | 4 +--- src/USER-OMP/pair_meam_spline_omp.cpp | 4 +--- src/USER-OMP/pair_morse_omp.cpp | 4 +--- src/USER-OMP/pair_morse_smooth_linear_omp.cpp | 4 +--- src/USER-OMP/pair_nm_cut_coul_cut_omp.cpp | 4 +--- src/USER-OMP/pair_nm_cut_coul_long_omp.cpp | 4 +--- src/USER-OMP/pair_nm_cut_omp.cpp | 4 +--- src/USER-OMP/pair_peri_lps_omp.cpp | 4 +--- src/USER-OMP/pair_peri_pmb_omp.cpp | 4 +--- src/USER-OMP/pair_reaxc_omp.cpp | 3 +-- src/USER-OMP/pair_resquared_omp.cpp | 4 +--- src/USER-OMP/pair_soft_omp.cpp | 4 +--- src/USER-OMP/pair_sw_omp.cpp | 4 +--- src/USER-OMP/pair_table_omp.cpp | 4 +--- src/USER-OMP/pair_tersoff_mod_c_omp.cpp | 4 +--- src/USER-OMP/pair_tersoff_mod_omp.cpp | 4 +--- src/USER-OMP/pair_tersoff_omp.cpp | 4 +--- src/USER-OMP/pair_tersoff_table_omp.cpp | 4 +--- src/USER-OMP/pair_tip4p_cut_omp.cpp | 3 +-- src/USER-OMP/pair_tip4p_long_omp.cpp | 3 +-- src/USER-OMP/pair_tip4p_long_soft_omp.cpp | 3 +-- src/USER-OMP/pair_ufm_omp.cpp | 4 +--- src/USER-OMP/pair_vashishta_omp.cpp | 4 +--- src/USER-OMP/pair_vashishta_table_omp.cpp | 4 +--- src/USER-OMP/pair_yukawa_colloid_omp.cpp | 4 +--- src/USER-OMP/pair_yukawa_omp.cpp | 4 +--- src/USER-OMP/pair_zbl_omp.cpp | 4 +--- src/USER-QUIP/pair_quip.cpp | 3 +-- src/USER-REAXC/pair_reaxc.cpp | 3 +-- src/USER-SDPD/pair_sdpd_taitwater_isothermal.cpp | 3 +-- src/USER-SMD/pair_smd_hertz.cpp | 5 +---- src/USER-SMD/pair_smd_tlsph.cpp | 5 +---- src/USER-SMD/pair_smd_triangulated_surface.cpp | 5 +---- src/USER-SMD/pair_smd_ulsph.cpp | 5 +---- src/USER-SMTBQ/pair_smtbq.cpp | 3 +-- src/USER-SPH/pair_sph_heatconduction.cpp | 5 +---- src/USER-SPH/pair_sph_idealgas.cpp | 5 +---- src/USER-SPH/pair_sph_lj.cpp | 5 +---- src/USER-SPH/pair_sph_rhosum.cpp | 5 +---- src/USER-SPH/pair_sph_taitwater.cpp | 5 +---- src/USER-SPH/pair_sph_taitwater_morris.cpp | 5 +---- src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp | 3 +-- src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp | 3 +-- src/pair.cpp | 3 +-- src/pair.h | 4 ++++ src/pair_beck.cpp | 3 +-- src/pair_born.cpp | 3 +-- src/pair_born_coul_dsf.cpp | 3 +-- src/pair_born_coul_wolf.cpp | 3 +-- src/pair_buck.cpp | 3 +-- src/pair_buck_coul_cut.cpp | 3 +-- src/pair_coul_cut.cpp | 3 +-- src/pair_coul_debye.cpp | 3 +-- src/pair_coul_dsf.cpp | 3 +-- src/pair_coul_streitz.cpp | 3 +-- src/pair_coul_wolf.cpp | 3 +-- src/pair_dpd.cpp | 3 +-- src/pair_dpd_tstat.cpp | 3 +-- src/pair_gauss.cpp | 3 +-- src/pair_hybrid.cpp | 5 ++--- src/pair_lj96_cut.cpp | 6 ++---- src/pair_lj_cubic.cpp | 3 +-- src/pair_lj_cut.cpp | 6 ++---- src/pair_lj_cut_coul_cut.cpp | 3 +-- src/pair_lj_cut_coul_debye.cpp | 3 +-- src/pair_lj_cut_coul_dsf.cpp | 3 +-- src/pair_lj_cut_coul_wolf.cpp | 3 +-- src/pair_lj_expand.cpp | 3 +-- src/pair_lj_gromacs.cpp | 3 +-- src/pair_lj_gromacs_coul_gromacs.cpp | 3 +-- src/pair_lj_smooth.cpp | 3 +-- src/pair_lj_smooth_linear.cpp | 3 +-- src/pair_mie_cut.cpp | 6 ++---- src/pair_morse.cpp | 3 +-- src/pair_soft.cpp | 3 +-- src/pair_table.cpp | 3 +-- src/pair_ufm.cpp | 3 +-- src/pair_yukawa.cpp | 3 +-- src/pair_zbl.cpp | 3 +-- src/pair_zero.cpp | 3 +-- 424 files changed, 451 insertions(+), 1036 deletions(-) diff --git a/src/ASPHERE/pair_gayberne.cpp b/src/ASPHERE/pair_gayberne.cpp index 857541957e..3d4ed3f183 100644 --- a/src/ASPHERE/pair_gayberne.cpp +++ b/src/ASPHERE/pair_gayberne.cpp @@ -94,8 +94,7 @@ void PairGayBerne::compute(int eflag, int vflag) double *iquat,*jquat; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); AtomVecEllipsoid::Bonus *bonus = avec->bonus; int *ellipsoid = atom->ellipsoid; diff --git a/src/ASPHERE/pair_line_lj.cpp b/src/ASPHERE/pair_line_lj.cpp index 963ff985c4..4873b44dc4 100644 --- a/src/ASPHERE/pair_line_lj.cpp +++ b/src/ASPHERE/pair_line_lj.cpp @@ -77,8 +77,7 @@ void PairLineLJ::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/ASPHERE/pair_resquared.cpp b/src/ASPHERE/pair_resquared.cpp index c477b1b8cf..b100a5f184 100644 --- a/src/ASPHERE/pair_resquared.cpp +++ b/src/ASPHERE/pair_resquared.cpp @@ -85,8 +85,7 @@ void PairRESquared::compute(int eflag, int vflag) RE2Vars wi,wj; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/ASPHERE/pair_tri_lj.cpp b/src/ASPHERE/pair_tri_lj.cpp index 142caf3764..cefd73f976 100644 --- a/src/ASPHERE/pair_tri_lj.cpp +++ b/src/ASPHERE/pair_tri_lj.cpp @@ -77,8 +77,7 @@ void PairTriLJ::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); AtomVecTri::Bonus *bonus = avec->bonus; double **x = atom->x; diff --git a/src/BODY/pair_body_nparticle.cpp b/src/BODY/pair_body_nparticle.cpp index 80b45beb4e..f2eb2aa520 100644 --- a/src/BODY/pair_body_nparticle.cpp +++ b/src/BODY/pair_body_nparticle.cpp @@ -77,8 +77,7 @@ void PairBodyNparticle::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index b6dcab29ae..69495ea57f 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -111,8 +111,7 @@ void PairBodyRoundedPolygon::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 1a4653ce53..60f6df3582 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -127,8 +127,7 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index e6546b1acc..b71c34d795 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -65,8 +65,7 @@ void PairLJClass2::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CLASS2/pair_lj_class2_coul_cut.cpp b/src/CLASS2/pair_lj_class2_coul_cut.cpp index 49242ecb43..7fabe3c7c7 100644 --- a/src/CLASS2/pair_lj_class2_coul_cut.cpp +++ b/src/CLASS2/pair_lj_class2_coul_cut.cpp @@ -70,8 +70,7 @@ void PairLJClass2CoulCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index bbea2ade6e..0171350443 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -82,8 +82,7 @@ void PairLJClass2CoulLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/COLLOID/pair_brownian.cpp b/src/COLLOID/pair_brownian.cpp index e532c06c86..aefa96b1fb 100644 --- a/src/COLLOID/pair_brownian.cpp +++ b/src/COLLOID/pair_brownian.cpp @@ -80,8 +80,7 @@ void PairBrownian::compute(int eflag, int vflag) double rsq,r,h_sep,radi; int *ilist,*jlist,*numneigh,**firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/COLLOID/pair_brownian_poly.cpp b/src/COLLOID/pair_brownian_poly.cpp index c6d5def2fa..389ae084b7 100644 --- a/src/COLLOID/pair_brownian_poly.cpp +++ b/src/COLLOID/pair_brownian_poly.cpp @@ -66,8 +66,7 @@ void PairBrownianPoly::compute(int eflag, int vflag) double rsq,r,h_sep,beta0,beta1,radi,radj; int *ilist,*jlist,*numneigh,**firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/COLLOID/pair_colloid.cpp b/src/COLLOID/pair_colloid.cpp index c16dbf41af..04c35a7c00 100644 --- a/src/COLLOID/pair_colloid.cpp +++ b/src/COLLOID/pair_colloid.cpp @@ -78,8 +78,7 @@ void PairColloid::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/COLLOID/pair_lubricate.cpp b/src/COLLOID/pair_lubricate.cpp index de53d91818..4e629bd442 100644 --- a/src/COLLOID/pair_lubricate.cpp +++ b/src/COLLOID/pair_lubricate.cpp @@ -88,8 +88,7 @@ void PairLubricate::compute(int eflag, int vflag) double vxmu2f = force->vxmu2f; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/COLLOID/pair_lubricateU.cpp b/src/COLLOID/pair_lubricateU.cpp index 35fe33c84e..3ea3d4fe4a 100644 --- a/src/COLLOID/pair_lubricateU.cpp +++ b/src/COLLOID/pair_lubricateU.cpp @@ -116,8 +116,7 @@ void PairLubricateU::compute(int eflag, int vflag) int nghost = atom->nghost; int nall = nlocal + nghost; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // skip compute() if called from integrate::setup() // this is b/c do not want compute() to update velocities twice on a restart diff --git a/src/COLLOID/pair_lubricateU_poly.cpp b/src/COLLOID/pair_lubricateU_poly.cpp index 90ac848d26..4fec95dcd8 100644 --- a/src/COLLOID/pair_lubricateU_poly.cpp +++ b/src/COLLOID/pair_lubricateU_poly.cpp @@ -78,8 +78,7 @@ void PairLubricateUPoly::compute(int eflag, int vflag) double **f = atom->f; double **torque = atom->torque; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // grow per-atom arrays if necessary // need to be atom->nmax in length diff --git a/src/COLLOID/pair_lubricate_poly.cpp b/src/COLLOID/pair_lubricate_poly.cpp index 5e52933364..ffbe7fce3c 100644 --- a/src/COLLOID/pair_lubricate_poly.cpp +++ b/src/COLLOID/pair_lubricate_poly.cpp @@ -72,8 +72,7 @@ void PairLubricatePoly::compute(int eflag, int vflag) double vxmu2f = force->vxmu2f; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/COLLOID/pair_yukawa_colloid.cpp b/src/COLLOID/pair_yukawa_colloid.cpp index d21bc43524..ab7d088508 100644 --- a/src/COLLOID/pair_yukawa_colloid.cpp +++ b/src/COLLOID/pair_yukawa_colloid.cpp @@ -46,8 +46,7 @@ void PairYukawaColloid::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_born_coul_dsf_cs.cpp b/src/CORESHELL/pair_born_coul_dsf_cs.cpp index 549c7c0348..f4d7447ade 100644 --- a/src/CORESHELL/pair_born_coul_dsf_cs.cpp +++ b/src/CORESHELL/pair_born_coul_dsf_cs.cpp @@ -57,8 +57,7 @@ void PairBornCoulDSFCS::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_born_coul_long_cs.cpp b/src/CORESHELL/pair_born_coul_long_cs.cpp index 76f6eb387d..a19f8c34a8 100644 --- a/src/CORESHELL/pair_born_coul_long_cs.cpp +++ b/src/CORESHELL/pair_born_coul_long_cs.cpp @@ -68,8 +68,7 @@ void PairBornCoulLongCS::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_born_coul_wolf_cs.cpp b/src/CORESHELL/pair_born_coul_wolf_cs.cpp index 84179ce50a..7b52c28664 100644 --- a/src/CORESHELL/pair_born_coul_wolf_cs.cpp +++ b/src/CORESHELL/pair_born_coul_wolf_cs.cpp @@ -53,8 +53,7 @@ void PairBornCoulWolfCS::compute(int eflag, int vflag) double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_buck_coul_long_cs.cpp b/src/CORESHELL/pair_buck_coul_long_cs.cpp index ea072d44a1..8df91f39a3 100644 --- a/src/CORESHELL/pair_buck_coul_long_cs.cpp +++ b/src/CORESHELL/pair_buck_coul_long_cs.cpp @@ -68,8 +68,7 @@ void PairBuckCoulLongCS::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_coul_long_cs.cpp b/src/CORESHELL/pair_coul_long_cs.cpp index b214653841..c8c8387d6d 100644 --- a/src/CORESHELL/pair_coul_long_cs.cpp +++ b/src/CORESHELL/pair_coul_long_cs.cpp @@ -69,8 +69,7 @@ void PairCoulLongCS::compute(int eflag, int vflag) double rsq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_coul_wolf_cs.cpp b/src/CORESHELL/pair_coul_wolf_cs.cpp index b50f14833e..36e037bfc8 100644 --- a/src/CORESHELL/pair_coul_wolf_cs.cpp +++ b/src/CORESHELL/pair_coul_wolf_cs.cpp @@ -53,8 +53,7 @@ void PairCoulWolfCS::compute(int eflag, int vflag) double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp b/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp index 8caefc0e66..56c75f0f5d 100644 --- a/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp +++ b/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp @@ -74,8 +74,7 @@ void PairLJCutCoulLongCS::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -399,8 +398,7 @@ void PairLJCutCoulLongCS::compute_outer(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp index 6af9b45724..18b78c55e0 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp @@ -69,8 +69,7 @@ void PairLJCutDipoleCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.cpp b/src/DIPOLE/pair_lj_cut_dipole_long.cpp index 817a120e3d..0806d1ee73 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_long.cpp @@ -90,8 +90,7 @@ void PairLJCutDipoleLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/DIPOLE/pair_lj_long_dipole_long.cpp b/src/DIPOLE/pair_lj_long_dipole_long.cpp index 21fc035854..fbdc47a15b 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_long_dipole_long.cpp @@ -405,8 +405,7 @@ void PairLJLongDipoleLong::compute(int eflag, int vflag) double evdwl,ecoul,fpair; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x, *x0 = x[0]; double **mu = atom->mu, *mu0 = mu[0], *imu, *jmu; diff --git a/src/GPU/pair_beck_gpu.cpp b/src/GPU/pair_beck_gpu.cpp index e65c53d194..9f76975ef1 100644 --- a/src/GPU/pair_beck_gpu.cpp +++ b/src/GPU/pair_beck_gpu.cpp @@ -84,8 +84,7 @@ PairBeckGPU::~PairBeckGPU() void PairBeckGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_born_coul_long_cs_gpu.cpp b/src/GPU/pair_born_coul_long_cs_gpu.cpp index 587c7b5215..291ad8ad1f 100644 --- a/src/GPU/pair_born_coul_long_cs_gpu.cpp +++ b/src/GPU/pair_born_coul_long_cs_gpu.cpp @@ -106,8 +106,7 @@ PairBornCoulLongCSGPU::~PairBornCoulLongCSGPU() void PairBornCoulLongCSGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_born_coul_long_gpu.cpp b/src/GPU/pair_born_coul_long_gpu.cpp index 1549ed79af..eb204691c7 100644 --- a/src/GPU/pair_born_coul_long_gpu.cpp +++ b/src/GPU/pair_born_coul_long_gpu.cpp @@ -101,8 +101,7 @@ PairBornCoulLongGPU::~PairBornCoulLongGPU() void PairBornCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_born_coul_wolf_cs_gpu.cpp b/src/GPU/pair_born_coul_wolf_cs_gpu.cpp index bf23007bca..4877a442b5 100644 --- a/src/GPU/pair_born_coul_wolf_cs_gpu.cpp +++ b/src/GPU/pair_born_coul_wolf_cs_gpu.cpp @@ -94,8 +94,7 @@ PairBornCoulWolfCSGPU::~PairBornCoulWolfCSGPU() void PairBornCoulWolfCSGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_born_coul_wolf_gpu.cpp b/src/GPU/pair_born_coul_wolf_gpu.cpp index 06a2769e10..851174988b 100644 --- a/src/GPU/pair_born_coul_wolf_gpu.cpp +++ b/src/GPU/pair_born_coul_wolf_gpu.cpp @@ -92,8 +92,7 @@ PairBornCoulWolfGPU::~PairBornCoulWolfGPU() void PairBornCoulWolfGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_born_gpu.cpp b/src/GPU/pair_born_gpu.cpp index 01e91a9c0b..253d2d7282 100644 --- a/src/GPU/pair_born_gpu.cpp +++ b/src/GPU/pair_born_gpu.cpp @@ -87,8 +87,7 @@ PairBornGPU::~PairBornGPU() void PairBornGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_buck_coul_cut_gpu.cpp b/src/GPU/pair_buck_coul_cut_gpu.cpp index ce71e9ac41..ed602f9cab 100644 --- a/src/GPU/pair_buck_coul_cut_gpu.cpp +++ b/src/GPU/pair_buck_coul_cut_gpu.cpp @@ -88,8 +88,7 @@ PairBuckCoulCutGPU::~PairBuckCoulCutGPU() void PairBuckCoulCutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_buck_coul_long_gpu.cpp b/src/GPU/pair_buck_coul_long_gpu.cpp index a2d14ea25f..d6b9e53282 100644 --- a/src/GPU/pair_buck_coul_long_gpu.cpp +++ b/src/GPU/pair_buck_coul_long_gpu.cpp @@ -97,8 +97,7 @@ PairBuckCoulLongGPU::~PairBuckCoulLongGPU() void PairBuckCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_buck_gpu.cpp b/src/GPU/pair_buck_gpu.cpp index e6479e46e8..8c85407e6e 100644 --- a/src/GPU/pair_buck_gpu.cpp +++ b/src/GPU/pair_buck_gpu.cpp @@ -85,8 +85,7 @@ PairBuckGPU::~PairBuckGPU() void PairBuckGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_colloid_gpu.cpp b/src/GPU/pair_colloid_gpu.cpp index 03e5aac5d5..0ee8708b5b 100644 --- a/src/GPU/pair_colloid_gpu.cpp +++ b/src/GPU/pair_colloid_gpu.cpp @@ -85,8 +85,7 @@ PairColloidGPU::~PairColloidGPU() void PairColloidGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_coul_cut_gpu.cpp b/src/GPU/pair_coul_cut_gpu.cpp index 436d26fb54..fb50c446b1 100644 --- a/src/GPU/pair_coul_cut_gpu.cpp +++ b/src/GPU/pair_coul_cut_gpu.cpp @@ -85,8 +85,7 @@ PairCoulCutGPU::~PairCoulCutGPU() void PairCoulCutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_coul_debye_gpu.cpp b/src/GPU/pair_coul_debye_gpu.cpp index c17e21f41f..ec771a9935 100644 --- a/src/GPU/pair_coul_debye_gpu.cpp +++ b/src/GPU/pair_coul_debye_gpu.cpp @@ -86,8 +86,7 @@ PairCoulDebyeGPU::~PairCoulDebyeGPU() void PairCoulDebyeGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_coul_dsf_gpu.cpp b/src/GPU/pair_coul_dsf_gpu.cpp index 15a15660dd..1753b8a91c 100644 --- a/src/GPU/pair_coul_dsf_gpu.cpp +++ b/src/GPU/pair_coul_dsf_gpu.cpp @@ -97,8 +97,7 @@ PairCoulDSFGPU::~PairCoulDSFGPU() void PairCoulDSFGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_coul_long_cs_gpu.cpp b/src/GPU/pair_coul_long_cs_gpu.cpp index be2a090786..6ca00d6361 100644 --- a/src/GPU/pair_coul_long_cs_gpu.cpp +++ b/src/GPU/pair_coul_long_cs_gpu.cpp @@ -99,8 +99,7 @@ PairCoulLongCSGPU::~PairCoulLongCSGPU() void PairCoulLongCSGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_coul_long_gpu.cpp b/src/GPU/pair_coul_long_gpu.cpp index 684b0049c0..f75d10b6dd 100644 --- a/src/GPU/pair_coul_long_gpu.cpp +++ b/src/GPU/pair_coul_long_gpu.cpp @@ -94,8 +94,7 @@ PairCoulLongGPU::~PairCoulLongGPU() void PairCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_dpd_gpu.cpp b/src/GPU/pair_dpd_gpu.cpp index 7d56b47fe5..b1e45fbecd 100644 --- a/src/GPU/pair_dpd_gpu.cpp +++ b/src/GPU/pair_dpd_gpu.cpp @@ -225,8 +225,7 @@ PairDPDGPU::~PairDPDGPU() void PairDPDGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_dpd_tstat_gpu.cpp b/src/GPU/pair_dpd_tstat_gpu.cpp index f093c03a2d..0693a27344 100644 --- a/src/GPU/pair_dpd_tstat_gpu.cpp +++ b/src/GPU/pair_dpd_tstat_gpu.cpp @@ -228,8 +228,7 @@ PairDPDTstatGPU::~PairDPDTstatGPU() void PairDPDTstatGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // adjust sigma if target T is changing diff --git a/src/GPU/pair_eam_alloy_gpu.cpp b/src/GPU/pair_eam_alloy_gpu.cpp index c472b91fc8..9b3412d3d1 100644 --- a/src/GPU/pair_eam_alloy_gpu.cpp +++ b/src/GPU/pair_eam_alloy_gpu.cpp @@ -94,8 +94,7 @@ double PairEAMAlloyGPU::memory_usage() void PairEAMAlloyGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // compute density on each atom on GPU diff --git a/src/GPU/pair_eam_fs_gpu.cpp b/src/GPU/pair_eam_fs_gpu.cpp index 821bb1af1c..11ef28af3e 100644 --- a/src/GPU/pair_eam_fs_gpu.cpp +++ b/src/GPU/pair_eam_fs_gpu.cpp @@ -92,8 +92,7 @@ double PairEAMFSGPU::memory_usage() void PairEAMFSGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // compute density on each atom on GPU diff --git a/src/GPU/pair_eam_gpu.cpp b/src/GPU/pair_eam_gpu.cpp index 515a349ad2..4788a72417 100644 --- a/src/GPU/pair_eam_gpu.cpp +++ b/src/GPU/pair_eam_gpu.cpp @@ -95,8 +95,7 @@ double PairEAMGPU::memory_usage() void PairEAMGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // compute density on each atom on GPU diff --git a/src/GPU/pair_gauss_gpu.cpp b/src/GPU/pair_gauss_gpu.cpp index 71fb55f4d0..c596a9d644 100644 --- a/src/GPU/pair_gauss_gpu.cpp +++ b/src/GPU/pair_gauss_gpu.cpp @@ -82,8 +82,7 @@ PairGaussGPU::~PairGaussGPU() void PairGaussGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_gayberne_gpu.cpp b/src/GPU/pair_gayberne_gpu.cpp index 32b8b979cd..4ed2750e57 100644 --- a/src/GPU/pair_gayberne_gpu.cpp +++ b/src/GPU/pair_gayberne_gpu.cpp @@ -92,8 +92,7 @@ PairGayBerneGPU::~PairGayBerneGPU() void PairGayBerneGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj96_cut_gpu.cpp b/src/GPU/pair_lj96_cut_gpu.cpp index 707d632d9a..5bc30c809d 100644 --- a/src/GPU/pair_lj96_cut_gpu.cpp +++ b/src/GPU/pair_lj96_cut_gpu.cpp @@ -82,8 +82,7 @@ PairLJ96CutGPU::~PairLJ96CutGPU() void PairLJ96CutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_charmm_coul_long_gpu.cpp b/src/GPU/pair_lj_charmm_coul_long_gpu.cpp index ebc9f88943..134295c69f 100644 --- a/src/GPU/pair_lj_charmm_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_charmm_coul_long_gpu.cpp @@ -99,8 +99,7 @@ PairLJCharmmCoulLongGPU::~PairLJCharmmCoulLongGPU() void PairLJCharmmCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_class2_coul_long_gpu.cpp b/src/GPU/pair_lj_class2_coul_long_gpu.cpp index 797680c032..fdffb06a8d 100644 --- a/src/GPU/pair_lj_class2_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_class2_coul_long_gpu.cpp @@ -96,8 +96,7 @@ PairLJClass2CoulLongGPU::~PairLJClass2CoulLongGPU() void PairLJClass2CoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_class2_gpu.cpp b/src/GPU/pair_lj_class2_gpu.cpp index 8a9b2b31e8..bbb9168169 100644 --- a/src/GPU/pair_lj_class2_gpu.cpp +++ b/src/GPU/pair_lj_class2_gpu.cpp @@ -81,8 +81,7 @@ PairLJClass2GPU::~PairLJClass2GPU() void PairLJClass2GPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cubic_gpu.cpp b/src/GPU/pair_lj_cubic_gpu.cpp index 669eae4ee4..95eee6ae8f 100644 --- a/src/GPU/pair_lj_cubic_gpu.cpp +++ b/src/GPU/pair_lj_cubic_gpu.cpp @@ -86,8 +86,7 @@ PairLJCubicGPU::~PairLJCubicGPU() void PairLJCubicGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_coul_cut_gpu.cpp b/src/GPU/pair_lj_cut_coul_cut_gpu.cpp index 99c7bb1c66..69fefbcdea 100644 --- a/src/GPU/pair_lj_cut_coul_cut_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_cut_gpu.cpp @@ -87,8 +87,7 @@ PairLJCutCoulCutGPU::~PairLJCutCoulCutGPU() void PairLJCutCoulCutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_coul_debye_gpu.cpp b/src/GPU/pair_lj_cut_coul_debye_gpu.cpp index 450eca5c47..de86c58647 100644 --- a/src/GPU/pair_lj_cut_coul_debye_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_debye_gpu.cpp @@ -89,8 +89,7 @@ ljcd_gpu_clear(); void PairLJCutCoulDebyeGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_coul_dsf_gpu.cpp b/src/GPU/pair_lj_cut_coul_dsf_gpu.cpp index abe7394a8c..87eac52749 100644 --- a/src/GPU/pair_lj_cut_coul_dsf_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_dsf_gpu.cpp @@ -98,8 +98,7 @@ PairLJCutCoulDSFGPU::~PairLJCutCoulDSFGPU() void PairLJCutCoulDSFGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_coul_long_gpu.cpp b/src/GPU/pair_lj_cut_coul_long_gpu.cpp index 943d12b0fe..c854dab83d 100644 --- a/src/GPU/pair_lj_cut_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_long_gpu.cpp @@ -99,8 +99,7 @@ PairLJCutCoulLongGPU::~PairLJCutCoulLongGPU() void PairLJCutCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_coul_msm_gpu.cpp b/src/GPU/pair_lj_cut_coul_msm_gpu.cpp index 46cf6f19bc..f87dc0ec91 100644 --- a/src/GPU/pair_lj_cut_coul_msm_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_msm_gpu.cpp @@ -88,8 +88,7 @@ PairLJCutCoulMSMGPU::~PairLJCutCoulMSMGPU() void PairLJCutCoulMSMGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_cut_dipole_cut_gpu.cpp b/src/GPU/pair_lj_cut_dipole_cut_gpu.cpp index 1f4528cb88..d2c925d950 100644 --- a/src/GPU/pair_lj_cut_dipole_cut_gpu.cpp +++ b/src/GPU/pair_lj_cut_dipole_cut_gpu.cpp @@ -89,8 +89,7 @@ PairLJCutDipoleCutGPU::~PairLJCutDipoleCutGPU() void PairLJCutDipoleCutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; @@ -199,8 +198,7 @@ void PairLJCutDipoleCutGPU::cpu_compute(int start, int inum, int eflag, int vfla int *jlist; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/GPU/pair_lj_cut_dipole_long_gpu.cpp b/src/GPU/pair_lj_cut_dipole_long_gpu.cpp index b209fa0ee7..774ff2fae4 100644 --- a/src/GPU/pair_lj_cut_dipole_long_gpu.cpp +++ b/src/GPU/pair_lj_cut_dipole_long_gpu.cpp @@ -100,8 +100,7 @@ PairLJCutDipoleLongGPU::~PairLJCutDipoleLongGPU() void PairLJCutDipoleLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; @@ -228,8 +227,7 @@ void PairLJCutDipoleLongGPU::cpu_compute(int start, int inum, int eflag, int vfl int *jlist; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/GPU/pair_lj_cut_gpu.cpp b/src/GPU/pair_lj_cut_gpu.cpp index 9a6be3aab9..6dde9689f7 100644 --- a/src/GPU/pair_lj_cut_gpu.cpp +++ b/src/GPU/pair_lj_cut_gpu.cpp @@ -86,8 +86,7 @@ PairLJCutGPU::~PairLJCutGPU() void PairLJCutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_expand_coul_long_gpu.cpp b/src/GPU/pair_lj_expand_coul_long_gpu.cpp index 4161155980..31f4fd651c 100644 --- a/src/GPU/pair_lj_expand_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_expand_coul_long_gpu.cpp @@ -99,8 +99,7 @@ PairLJExpandCoulLongGPU::~PairLJExpandCoulLongGPU() void PairLJExpandCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_expand_gpu.cpp b/src/GPU/pair_lj_expand_gpu.cpp index 36378bf10e..a2e1cf54e3 100644 --- a/src/GPU/pair_lj_expand_gpu.cpp +++ b/src/GPU/pair_lj_expand_gpu.cpp @@ -85,8 +85,7 @@ PairLJExpandGPU::~PairLJExpandGPU() void PairLJExpandGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_gromacs_gpu.cpp b/src/GPU/pair_lj_gromacs_gpu.cpp index cc7010b295..e03f4b2e50 100644 --- a/src/GPU/pair_lj_gromacs_gpu.cpp +++ b/src/GPU/pair_lj_gromacs_gpu.cpp @@ -87,8 +87,7 @@ PairLJGromacsGPU::~PairLJGromacsGPU() void PairLJGromacsGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_sdk_coul_long_gpu.cpp b/src/GPU/pair_lj_sdk_coul_long_gpu.cpp index 4dbd8874d6..f5029df5dc 100644 --- a/src/GPU/pair_lj_sdk_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_sdk_coul_long_gpu.cpp @@ -102,8 +102,7 @@ PairLJSDKCoulLongGPU::~PairLJSDKCoulLongGPU() void PairLJSDKCoulLongGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_sdk_gpu.cpp b/src/GPU/pair_lj_sdk_gpu.cpp index 84d224a8c4..4797a34408 100644 --- a/src/GPU/pair_lj_sdk_gpu.cpp +++ b/src/GPU/pair_lj_sdk_gpu.cpp @@ -87,8 +87,7 @@ PairLJSDKGPU::~PairLJSDKGPU() void PairLJSDKGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp b/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp index a5ebb1dbc1..dd25a70eee 100644 --- a/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp +++ b/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp @@ -88,8 +88,7 @@ PairLJSFDipoleSFGPU::~PairLJSFDipoleSFGPU() void PairLJSFDipoleSFGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; @@ -202,8 +201,7 @@ void PairLJSFDipoleSFGPU::cpu_compute(int start, int inum, int eflag, int vflag, int *jlist; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/GPU/pair_mie_cut_gpu.cpp b/src/GPU/pair_mie_cut_gpu.cpp index e52577ee4c..838d28033f 100644 --- a/src/GPU/pair_mie_cut_gpu.cpp +++ b/src/GPU/pair_mie_cut_gpu.cpp @@ -83,8 +83,7 @@ PairMIECutGPU::~PairMIECutGPU() void PairMIECutGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_morse_gpu.cpp b/src/GPU/pair_morse_gpu.cpp index 7abf78ff30..1f94643e3a 100644 --- a/src/GPU/pair_morse_gpu.cpp +++ b/src/GPU/pair_morse_gpu.cpp @@ -81,8 +81,7 @@ PairMorseGPU::~PairMorseGPU() void PairMorseGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_resquared_gpu.cpp b/src/GPU/pair_resquared_gpu.cpp index b6fada0897..5e90f788bf 100644 --- a/src/GPU/pair_resquared_gpu.cpp +++ b/src/GPU/pair_resquared_gpu.cpp @@ -94,8 +94,7 @@ PairRESquaredGPU::~PairRESquaredGPU() void PairRESquaredGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_soft_gpu.cpp b/src/GPU/pair_soft_gpu.cpp index eed1bd5db3..42adb02553 100644 --- a/src/GPU/pair_soft_gpu.cpp +++ b/src/GPU/pair_soft_gpu.cpp @@ -86,8 +86,7 @@ PairSoftGPU::~PairSoftGPU() void PairSoftGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_sw_gpu.cpp b/src/GPU/pair_sw_gpu.cpp index 5368bee959..0cc858e57d 100644 --- a/src/GPU/pair_sw_gpu.cpp +++ b/src/GPU/pair_sw_gpu.cpp @@ -93,8 +93,7 @@ PairSWGPU::~PairSWGPU() void PairSWGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_table_gpu.cpp b/src/GPU/pair_table_gpu.cpp index d0185b85e8..a0b6562e5e 100644 --- a/src/GPU/pair_table_gpu.cpp +++ b/src/GPU/pair_table_gpu.cpp @@ -89,8 +89,7 @@ PairTableGPU::~PairTableGPU() void PairTableGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_tersoff_gpu.cpp b/src/GPU/pair_tersoff_gpu.cpp index 535b56163e..cd0c5e6693 100644 --- a/src/GPU/pair_tersoff_gpu.cpp +++ b/src/GPU/pair_tersoff_gpu.cpp @@ -97,8 +97,7 @@ PairTersoffGPU::~PairTersoffGPU() void PairTersoffGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_tersoff_mod_gpu.cpp b/src/GPU/pair_tersoff_mod_gpu.cpp index f8b6c50db5..fd55ddc6e6 100644 --- a/src/GPU/pair_tersoff_mod_gpu.cpp +++ b/src/GPU/pair_tersoff_mod_gpu.cpp @@ -90,8 +90,7 @@ PairTersoffMODGPU::~PairTersoffMODGPU() void PairTersoffMODGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_tersoff_zbl_gpu.cpp b/src/GPU/pair_tersoff_zbl_gpu.cpp index b45503d759..d3828962e2 100644 --- a/src/GPU/pair_tersoff_zbl_gpu.cpp +++ b/src/GPU/pair_tersoff_zbl_gpu.cpp @@ -98,8 +98,7 @@ PairTersoffZBLGPU::~PairTersoffZBLGPU() void PairTersoffZBLGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_ufm_gpu.cpp b/src/GPU/pair_ufm_gpu.cpp index 688e3ef4dc..31422b0f4d 100644 --- a/src/GPU/pair_ufm_gpu.cpp +++ b/src/GPU/pair_ufm_gpu.cpp @@ -88,8 +88,7 @@ PairUFMGPU::~PairUFMGPU() void PairUFMGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_vashishta_gpu.cpp b/src/GPU/pair_vashishta_gpu.cpp index 84936f2c26..b496359b8a 100644 --- a/src/GPU/pair_vashishta_gpu.cpp +++ b/src/GPU/pair_vashishta_gpu.cpp @@ -94,8 +94,7 @@ PairVashishtaGPU::~PairVashishtaGPU() void PairVashishtaGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_yukawa_colloid_gpu.cpp b/src/GPU/pair_yukawa_colloid_gpu.cpp index 556dece7f8..3645f392a2 100644 --- a/src/GPU/pair_yukawa_colloid_gpu.cpp +++ b/src/GPU/pair_yukawa_colloid_gpu.cpp @@ -84,8 +84,7 @@ PairYukawaColloidGPU::~PairYukawaColloidGPU() void PairYukawaColloidGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_yukawa_gpu.cpp b/src/GPU/pair_yukawa_gpu.cpp index 9d3ea6f5a7..90317fea34 100644 --- a/src/GPU/pair_yukawa_gpu.cpp +++ b/src/GPU/pair_yukawa_gpu.cpp @@ -83,8 +83,7 @@ PairYukawaGPU::~PairYukawaGPU() void PairYukawaGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GPU/pair_zbl_gpu.cpp b/src/GPU/pair_zbl_gpu.cpp index c9b8dd75a1..99471cbe90 100644 --- a/src/GPU/pair_zbl_gpu.cpp +++ b/src/GPU/pair_zbl_gpu.cpp @@ -86,8 +86,7 @@ PairZBLGPU::~PairZBLGPU() void PairZBLGPU::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int nall = atom->nlocal + atom->nghost; int inum, host_start; diff --git a/src/GRANULAR/pair_gran_hertz_history.cpp b/src/GRANULAR/pair_gran_hertz_history.cpp index d1f3c7bbe1..728491c17a 100644 --- a/src/GRANULAR/pair_gran_hertz_history.cpp +++ b/src/GRANULAR/pair_gran_hertz_history.cpp @@ -55,8 +55,7 @@ void PairGranHertzHistory::compute(int eflag, int vflag) int *touch,**firsttouch; double *shear,*allshear,**firstshear; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int shearupdate = 1; if (update->setupflag) shearupdate = 0; diff --git a/src/GRANULAR/pair_gran_hooke.cpp b/src/GRANULAR/pair_gran_hooke.cpp index 5244396ead..cfcc2743ba 100644 --- a/src/GRANULAR/pair_gran_hooke.cpp +++ b/src/GRANULAR/pair_gran_hooke.cpp @@ -51,8 +51,7 @@ void PairGranHooke::compute(int eflag, int vflag) double fn,fs,ft,fs1,fs2,fs3; int *ilist,*jlist,*numneigh,**firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // update rigid body info for owned & ghost atoms if using FixRigid masses // body[i] = which body atom I is in, -1 if none diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 83f75c221d..cec825316c 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -98,8 +98,7 @@ void PairGranHookeHistory::compute(int eflag, int vflag) int *touch,**firsttouch; double *shear,*allshear,**firstshear; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int shearupdate = 1; if (update->setupflag) shearupdate = 0; diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index a4517b848c..84842f87cc 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -191,10 +191,7 @@ void PairKIM::compute(int eflag , int vflag) { int kimerror; - if (eflag || vflag) - ev_setup(eflag,vflag); - else - ev_unset(); + ev_init(eflag,vflag); // grow kim_particleSpecies and kim_particleContributing array if necessary // needs to be atom->nmax in length diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp index 18d09965be..57ac3a9c57 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp @@ -92,8 +92,7 @@ void PairBuckCoulCutKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp index 0b44a83ebb..349c4c0601 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp @@ -111,8 +111,7 @@ void PairBuckCoulLongKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_buck_kokkos.cpp b/src/KOKKOS/pair_buck_kokkos.cpp index 999aefe4c3..02c02c986e 100644 --- a/src/KOKKOS/pair_buck_kokkos.cpp +++ b/src/KOKKOS/pair_buck_kokkos.cpp @@ -81,8 +81,7 @@ void PairBuckKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_coul_cut_kokkos.cpp b/src/KOKKOS/pair_coul_cut_kokkos.cpp index 7d29adc625..54ba0b63ce 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp @@ -80,8 +80,7 @@ void PairCoulCutKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp index 3de83b5bc4..8966e30394 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp @@ -87,8 +87,7 @@ void PairCoulDebyeKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp index 7d03ee4968..748fed71a7 100644 --- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp @@ -80,8 +80,7 @@ void PairCoulDSFKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_coul_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp index 73b9521da0..a21cb050ff 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_coul_long_kokkos.cpp @@ -104,8 +104,7 @@ void PairCoulLongKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp index fe9c581cc1..20391d9530 100644 --- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp @@ -75,8 +75,7 @@ void PairCoulWolfKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp index d2fcc81ea4..a44ef1790e 100644 --- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp @@ -165,8 +165,7 @@ void PairDPDfdtEnergyKokkos::compute(int eflag_in, int vflag_in) vflag = vflag_in; if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index 6039282141..b580f00ed0 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -74,8 +74,7 @@ void PairEAMAlloyKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 81d9ba8326..1b1ec5c31e 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -74,8 +74,7 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index 22383f57c5..d423f2c927 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -68,8 +68,7 @@ void PairEAMKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp index df24a5f4c7..fa10c6d30f 100644 --- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -147,8 +147,7 @@ void PairExp6rxKokkos::compute(int eflag_in, int vflag_in) vflag = vflag_in; if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp index 189407b541..068580b525 100644 --- a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp +++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp @@ -111,8 +111,7 @@ void PairGranHookeHistoryKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); int shearupdate = 1; if (update->setupflag) shearupdate = 0; diff --git a/src/KOKKOS/pair_hybrid_kokkos.cpp b/src/KOKKOS/pair_hybrid_kokkos.cpp index 03ad77c34a..00df4a8f3c 100644 --- a/src/KOKKOS/pair_hybrid_kokkos.cpp +++ b/src/KOKKOS/pair_hybrid_kokkos.cpp @@ -78,9 +78,7 @@ void PairHybridKokkos::compute(int eflag, int vflag) if (no_virial_fdotr_compute && vflag % 4 == 2) vflag = 1 + vflag/4 * 4; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // check if global component of incoming vflag = 2 // if so, reset vflag passed to substyle as if it were 0 diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp index ce7df2bec1..510740112a 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp @@ -112,8 +112,7 @@ void PairLJCharmmCoulCharmmImplicitKokkos::compute(int eflag_in, int if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp index b31282e595..51c96354f9 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp @@ -112,8 +112,7 @@ void PairLJCharmmCoulCharmmKokkos::compute(int eflag_in, int vflag_i if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp index 5d8a202aa4..22faa98935 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp @@ -112,8 +112,7 @@ void PairLJCharmmCoulLongKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp index 6eb3028101..60d480188b 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp @@ -89,8 +89,7 @@ void PairLJClass2CoulCutKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp index a388694876..4c8aea8e92 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp @@ -97,8 +97,7 @@ void PairLJClass2CoulLongKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_class2_kokkos.cpp b/src/KOKKOS/pair_lj_class2_kokkos.cpp index 33d1477443..dd42baa4e0 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp @@ -89,8 +89,7 @@ void PairLJClass2Kokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp index 6001fabbed..cb5ab96871 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp @@ -89,8 +89,7 @@ void PairLJCutCoulCutKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp index 10923bc5da..800092a09b 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp @@ -93,8 +93,7 @@ void PairLJCutCoulDebyeKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp index 47aa2ea7cc..f793485b47 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp @@ -101,8 +101,7 @@ void PairLJCutCoulDSFKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp index fa36cb1866..02150586f4 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp @@ -101,8 +101,7 @@ void PairLJCutCoulLongKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp index 9b0ff902af..4ba8c00f88 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp @@ -89,8 +89,7 @@ void PairLJCutKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_expand_kokkos.cpp b/src/KOKKOS/pair_lj_expand_kokkos.cpp index 3b8b9343d8..5ea6c9e438 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.cpp +++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp @@ -88,8 +88,7 @@ void PairLJExpandKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp index d06ad9b44e..2421d059da 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp @@ -103,8 +103,7 @@ void PairLJGromacsCoulGromacsKokkos::compute(int eflag_in, int vflag if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp index d447846333..09a0261ae1 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp @@ -100,8 +100,7 @@ void PairLJGromacsKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.cpp b/src/KOKKOS/pair_lj_sdk_kokkos.cpp index 990e464341..c2375fa7a8 100644 --- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp +++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp @@ -88,8 +88,7 @@ void PairLJSDKKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_morse_kokkos.cpp b/src/KOKKOS/pair_morse_kokkos.cpp index ab5eb817a1..b308330ead 100644 --- a/src/KOKKOS/pair_morse_kokkos.cpp +++ b/src/KOKKOS/pair_morse_kokkos.cpp @@ -93,8 +93,7 @@ void PairMorseKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp index 5f19d73dfa..7d17ac3f43 100644 --- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp @@ -148,8 +148,7 @@ void PairMultiLucyRXKokkos::compute_style(int eflag_in, int vflag_in vflag = vflag_in; if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 56d2ebd8aa..c6ee50c6ac 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -677,8 +677,7 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); atomKK->sync(execution_space,datamask_read); k_params_sing.template sync(); diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 998e75fabe..569783f926 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -137,8 +137,7 @@ void PairSNAPKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index 24022475ab..da4737a2c1 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -80,8 +80,7 @@ void PairSWKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index 9522e94706..737d600d1e 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -86,8 +86,7 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp index 376984afa2..ec7a2ffb94 100644 --- a/src/KOKKOS/pair_table_rx_kokkos.cpp +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -619,8 +619,7 @@ void PairTableRXKokkos::compute_style(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); if (eflag_atom) { memoryKK->destroy_kokkos(k_eatom,eatom); diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index a6668ca064..9252e3de52 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -164,8 +164,7 @@ void PairTersoffKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index 303d2bdfda..585074b128 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -164,8 +164,7 @@ void PairTersoffMODKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index ad4a2d444e..e1e2211ab5 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -178,8 +178,7 @@ void PairTersoffZBLKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp index 78ab8bfc85..4a1f291b17 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.cpp +++ b/src/KOKKOS/pair_vashishta_kokkos.cpp @@ -79,8 +79,7 @@ void PairVashishtaKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_yukawa_kokkos.cpp b/src/KOKKOS/pair_yukawa_kokkos.cpp index 951613a33e..27e18533a2 100644 --- a/src/KOKKOS/pair_yukawa_kokkos.cpp +++ b/src/KOKKOS/pair_yukawa_kokkos.cpp @@ -177,8 +177,7 @@ void PairYukawaKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/pair_zbl_kokkos.cpp b/src/KOKKOS/pair_zbl_kokkos.cpp index bcf33b405d..06c84e5189 100644 --- a/src/KOKKOS/pair_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_zbl_kokkos.cpp @@ -129,8 +129,7 @@ void PairZBLKokkos::compute(int eflag_in, int vflag_in) if (neighflag == FULL) no_virial_fdotr_compute = 1; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KSPACE/pair_born_coul_long.cpp b/src/KSPACE/pair_born_coul_long.cpp index d55a5a3afe..f12f5779d9 100644 --- a/src/KSPACE/pair_born_coul_long.cpp +++ b/src/KSPACE/pair_born_coul_long.cpp @@ -87,8 +87,7 @@ void PairBornCoulLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_born_coul_msm.cpp b/src/KSPACE/pair_born_coul_msm.cpp index 775d26df95..eaa1c116c1 100644 --- a/src/KSPACE/pair_born_coul_msm.cpp +++ b/src/KSPACE/pair_born_coul_msm.cpp @@ -82,8 +82,7 @@ void PairBornCoulMSM::compute(int eflag, int vflag) } evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_buck_coul_long.cpp b/src/KSPACE/pair_buck_coul_long.cpp index a37e4ab4e9..0d24ff2497 100644 --- a/src/KSPACE/pair_buck_coul_long.cpp +++ b/src/KSPACE/pair_buck_coul_long.cpp @@ -82,8 +82,7 @@ void PairBuckCoulLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_buck_coul_msm.cpp b/src/KSPACE/pair_buck_coul_msm.cpp index fc72f1a4d6..257d1b661f 100644 --- a/src/KSPACE/pair_buck_coul_msm.cpp +++ b/src/KSPACE/pair_buck_coul_msm.cpp @@ -79,8 +79,7 @@ void PairBuckCoulMSM::compute(int eflag, int vflag) } evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_buck_long_coul_long.cpp b/src/KSPACE/pair_buck_long_coul_long.cpp index d5bb7b6c5b..c7a4a4b2f6 100644 --- a/src/KSPACE/pair_buck_long_coul_long.cpp +++ b/src/KSPACE/pair_buck_long_coul_long.cpp @@ -445,8 +445,7 @@ void PairBuckLongCoulLong::compute(int eflag, int vflag) double evdwl,ecoul,fpair; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x, *x0 = x[0]; double **f = atom->f, *f0 = f[0], *fi = f0; @@ -785,8 +784,7 @@ void PairBuckLongCoulLong::compute_outer(int eflag, int vflag) { double evdwl,ecoul,fpair,fvirial; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x, *x0 = x[0]; double **f = atom->f, *f0 = f[0], *fi = f0; diff --git a/src/KSPACE/pair_coul_long.cpp b/src/KSPACE/pair_coul_long.cpp index 8db5979b39..7d519eee0a 100644 --- a/src/KSPACE/pair_coul_long.cpp +++ b/src/KSPACE/pair_coul_long.cpp @@ -79,8 +79,7 @@ void PairCoulLong::compute(int eflag, int vflag) double rsq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_coul_msm.cpp b/src/KSPACE/pair_coul_msm.cpp index ab59dfa4c1..960505142c 100644 --- a/src/KSPACE/pair_coul_msm.cpp +++ b/src/KSPACE/pair_coul_msm.cpp @@ -67,8 +67,7 @@ void PairCoulMSM::compute(int eflag, int vflag) } ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_charmm_coul_long.cpp b/src/KSPACE/pair_lj_charmm_coul_long.cpp index 749d9657aa..df2b943af2 100644 --- a/src/KSPACE/pair_lj_charmm_coul_long.cpp +++ b/src/KSPACE/pair_lj_charmm_coul_long.cpp @@ -96,8 +96,7 @@ void PairLJCharmmCoulLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -404,8 +403,7 @@ void PairLJCharmmCoulLong::compute_outer(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_charmm_coul_msm.cpp b/src/KSPACE/pair_lj_charmm_coul_msm.cpp index aecadcf127..72a8e340bc 100644 --- a/src/KSPACE/pair_lj_charmm_coul_msm.cpp +++ b/src/KSPACE/pair_lj_charmm_coul_msm.cpp @@ -87,8 +87,7 @@ void PairLJCharmmCoulMSM::compute(int eflag, int vflag) } evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -265,8 +264,7 @@ void PairLJCharmmCoulMSM::compute_outer(int eflag, int vflag) "for rRESPA with kspace_style MSM"); evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp index 614980117e..0057197064 100644 --- a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp +++ b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp @@ -121,8 +121,7 @@ void PairLJCharmmfswCoulLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -452,8 +451,7 @@ void PairLJCharmmfswCoulLong::compute_outer(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_cut_coul_long.cpp b/src/KSPACE/pair_lj_cut_coul_long.cpp index c9530fe157..fde7fa8e35 100644 --- a/src/KSPACE/pair_lj_cut_coul_long.cpp +++ b/src/KSPACE/pair_lj_cut_coul_long.cpp @@ -90,8 +90,7 @@ void PairLJCutCoulLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -397,8 +396,7 @@ void PairLJCutCoulLong::compute_outer(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_cut_coul_msm.cpp b/src/KSPACE/pair_lj_cut_coul_msm.cpp index 78c364bd6a..c2e566a117 100644 --- a/src/KSPACE/pair_lj_cut_coul_msm.cpp +++ b/src/KSPACE/pair_lj_cut_coul_msm.cpp @@ -87,8 +87,7 @@ void PairLJCutCoulMSM::compute(int eflag, int vflag) } evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -252,8 +251,7 @@ void PairLJCutCoulMSM::compute_outer(int eflag, int vflag) "for rRESPA with kspace_style MSM"); evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KSPACE/pair_lj_cut_tip4p_long.cpp b/src/KSPACE/pair_lj_cut_tip4p_long.cpp index d622a83b39..f5889fd520 100644 --- a/src/KSPACE/pair_lj_cut_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_cut_tip4p_long.cpp @@ -94,8 +94,7 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/KSPACE/pair_lj_long_coul_long.cpp b/src/KSPACE/pair_lj_long_coul_long.cpp index 2de527ab39..493866a895 100644 --- a/src/KSPACE/pair_lj_long_coul_long.cpp +++ b/src/KSPACE/pair_lj_long_coul_long.cpp @@ -441,8 +441,7 @@ void PairLJLongCoulLong::compute(int eflag, int vflag) { double evdwl,ecoul,fpair; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x, *x0 = x[0]; double **f = atom->f, *f0 = f[0], *fi = f0; @@ -778,8 +777,7 @@ void PairLJLongCoulLong::compute_outer(int eflag, int vflag) { double evdwl,ecoul,fvirial,fpair; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x, *x0 = x[0]; double **f = atom->f, *f0 = f[0], *fi = f0; diff --git a/src/KSPACE/pair_lj_long_tip4p_long.cpp b/src/KSPACE/pair_lj_long_tip4p_long.cpp index a571e30fc3..3137b9d79a 100644 --- a/src/KSPACE/pair_lj_long_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_long_tip4p_long.cpp @@ -92,8 +92,7 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred @@ -1004,8 +1003,7 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) int respa_flag; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/KSPACE/pair_tip4p_long.cpp b/src/KSPACE/pair_tip4p_long.cpp index ac428d483a..9419fdf196 100644 --- a/src/KSPACE/pair_tip4p_long.cpp +++ b/src/KSPACE/pair_tip4p_long.cpp @@ -90,8 +90,7 @@ void PairTIP4PLong::compute(int eflag, int vflag) double rsq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/MANYBODY/pair_adp.cpp b/src/MANYBODY/pair_adp.cpp index 4fd19a36c4..68511b8709 100644 --- a/src/MANYBODY/pair_adp.cpp +++ b/src/MANYBODY/pair_adp.cpp @@ -133,8 +133,7 @@ void PairADP::compute(int eflag, int vflag) double sumlamxx,sumlamyy,sumlamzz,sumlamyz,sumlamxz,sumlamxy; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // grow local arrays if necessary // need to be atom->nmax in length diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index f8221e6381..4502bd9a82 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -108,8 +108,7 @@ PairAIREBO::~PairAIREBO() void PairAIREBO::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); pvector[0] = pvector[1] = pvector[2] = 0.0; REBO_neigh(); diff --git a/src/MANYBODY/pair_atm.cpp b/src/MANYBODY/pair_atm.cpp index e3be72443e..c157e0763c 100644 --- a/src/MANYBODY/pair_atm.cpp +++ b/src/MANYBODY/pair_atm.cpp @@ -82,8 +82,7 @@ void PairATM::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index 6540dedf98..ac157e071c 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -297,8 +297,7 @@ void PairBOP::compute(int eflag, int vflag) ilist = list->ilist; firstneigh = list->firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // BOP Neighbor lists must be updated every timestep maxnall=nall; diff --git a/src/MANYBODY/pair_comb.cpp b/src/MANYBODY/pair_comb.cpp index 85ea4812bf..980aa84b2a 100644 --- a/src/MANYBODY/pair_comb.cpp +++ b/src/MANYBODY/pair_comb.cpp @@ -144,8 +144,7 @@ void PairComb::compute(int eflag, int vflag) int sht_jnum, *sht_jlist, nj; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); // Build short range neighbor list diff --git a/src/MANYBODY/pair_comb3.cpp b/src/MANYBODY/pair_comb3.cpp index d82f6dfed0..097f235ff2 100644 --- a/src/MANYBODY/pair_comb3.cpp +++ b/src/MANYBODY/pair_comb3.cpp @@ -987,8 +987,7 @@ void PairComb3::compute(int eflag, int vflag) evdwl = eng_tmp = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); // Build short range neighbor list Short_neigh(); diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index f4b4901075..b7957349b6 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -142,8 +142,7 @@ void PairEAM::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // grow energy and fp arrays if necessary // need to be atom->nmax in length diff --git a/src/MANYBODY/pair_eam_cd.cpp b/src/MANYBODY/pair_eam_cd.cpp index 8db1b6dd9a..c111c6d950 100644 --- a/src/MANYBODY/pair_eam_cd.cpp +++ b/src/MANYBODY/pair_eam_cd.cpp @@ -73,8 +73,7 @@ void PairEAMCD::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // Grow per-atom arrays if necessary diff --git a/src/MANYBODY/pair_eim.cpp b/src/MANYBODY/pair_eim.cpp index b0fa1b1eef..f1c028ef38 100644 --- a/src/MANYBODY/pair_eim.cpp +++ b/src/MANYBODY/pair_eim.cpp @@ -113,8 +113,7 @@ void PairEIM::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); // grow energy array if necessary diff --git a/src/MANYBODY/pair_gw.cpp b/src/MANYBODY/pair_gw.cpp index 7649090a99..e4b74f7a29 100644 --- a/src/MANYBODY/pair_gw.cpp +++ b/src/MANYBODY/pair_gw.cpp @@ -87,8 +87,7 @@ void PairGW::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index 0c8b3ef2a6..05cdea8055 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -87,8 +87,7 @@ PairLCBOP::~PairLCBOP() void PairLCBOP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); SR_neigh(); FSR(eflag,vflag); diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index ce449e4890..a61b403459 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -87,8 +87,7 @@ void PairNb3bHarmonic::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_polymorphic.cpp b/src/MANYBODY/pair_polymorphic.cpp index 41c5892d4e..d3aca4e889 100644 --- a/src/MANYBODY/pair_polymorphic.cpp +++ b/src/MANYBODY/pair_polymorphic.cpp @@ -117,8 +117,7 @@ void PairPolymorphic::compute(int eflag, int vflag) double emb; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_sw.cpp b/src/MANYBODY/pair_sw.cpp index 91e11b3d26..5a148fb152 100644 --- a/src/MANYBODY/pair_sw.cpp +++ b/src/MANYBODY/pair_sw.cpp @@ -91,8 +91,7 @@ void PairSW::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_tersoff.cpp b/src/MANYBODY/pair_tersoff.cpp index 54101aef9e..213b1037bb 100644 --- a/src/MANYBODY/pair_tersoff.cpp +++ b/src/MANYBODY/pair_tersoff.cpp @@ -93,8 +93,7 @@ void PairTersoff::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_vashishta.cpp b/src/MANYBODY/pair_vashishta.cpp index b4c3086ca8..3d4b1d900e 100644 --- a/src/MANYBODY/pair_vashishta.cpp +++ b/src/MANYBODY/pair_vashishta.cpp @@ -93,8 +93,7 @@ void PairVashishta::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MANYBODY/pair_vashishta_table.cpp b/src/MANYBODY/pair_vashishta_table.cpp index 1055db99fa..d4eaa59f1a 100644 --- a/src/MANYBODY/pair_vashishta_table.cpp +++ b/src/MANYBODY/pair_vashishta_table.cpp @@ -64,8 +64,7 @@ void PairVashishtaTable::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MISC/pair_nm_cut.cpp b/src/MISC/pair_nm_cut.cpp index 4b1611b137..124832b63e 100644 --- a/src/MISC/pair_nm_cut.cpp +++ b/src/MISC/pair_nm_cut.cpp @@ -70,8 +70,7 @@ void PairNMCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MISC/pair_nm_cut_coul_cut.cpp b/src/MISC/pair_nm_cut_coul_cut.cpp index 999fab1d6e..6a09d579b7 100644 --- a/src/MISC/pair_nm_cut_coul_cut.cpp +++ b/src/MISC/pair_nm_cut_coul_cut.cpp @@ -74,8 +74,7 @@ void PairNMCutCoulCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MISC/pair_nm_cut_coul_long.cpp b/src/MISC/pair_nm_cut_coul_long.cpp index fb82436dba..af21f02881 100644 --- a/src/MISC/pair_nm_cut_coul_long.cpp +++ b/src/MISC/pair_nm_cut_coul_long.cpp @@ -90,8 +90,7 @@ void PairNMCutCoulLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_hbond_dreiding_lj.cpp b/src/MOLECULE/pair_hbond_dreiding_lj.cpp index c0c885d4d4..ddc1110081 100644 --- a/src/MOLECULE/pair_hbond_dreiding_lj.cpp +++ b/src/MOLECULE/pair_hbond_dreiding_lj.cpp @@ -91,8 +91,7 @@ void PairHbondDreidingLJ::compute(int eflag, int vflag) tagint *klist; evdwl = ehbond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_hbond_dreiding_morse.cpp b/src/MOLECULE/pair_hbond_dreiding_morse.cpp index f464d2c621..055f0ed46b 100644 --- a/src/MOLECULE/pair_hbond_dreiding_morse.cpp +++ b/src/MOLECULE/pair_hbond_dreiding_morse.cpp @@ -61,8 +61,7 @@ void PairHbondDreidingMorse::compute(int eflag, int vflag) tagint *klist; evdwl = ehbond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp b/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp index 688c675815..98e272d99a 100644 --- a/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp +++ b/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp @@ -75,8 +75,7 @@ void PairLJCharmmCoulCharmm::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_lj_charmm_coul_charmm_implicit.cpp b/src/MOLECULE/pair_lj_charmm_coul_charmm_implicit.cpp index 6c083a49b0..d68d5e8f6d 100644 --- a/src/MOLECULE/pair_lj_charmm_coul_charmm_implicit.cpp +++ b/src/MOLECULE/pair_lj_charmm_coul_charmm_implicit.cpp @@ -39,8 +39,7 @@ void PairLJCharmmCoulCharmmImplicit::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp index 4b9147c169..7ce2417716 100644 --- a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp +++ b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp @@ -103,8 +103,7 @@ void PairLJCharmmfswCoulCharmmfsh::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp index 92dead8435..2b3d2c60f5 100644 --- a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp +++ b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp @@ -91,8 +91,7 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) double *x1,*x2,*xH1,*xH2; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/MOLECULE/pair_tip4p_cut.cpp b/src/MOLECULE/pair_tip4p_cut.cpp index 79dd79b180..e6fb9aab99 100644 --- a/src/MOLECULE/pair_tip4p_cut.cpp +++ b/src/MOLECULE/pair_tip4p_cut.cpp @@ -79,8 +79,7 @@ void PairTIP4PCut::compute(int eflag, int vflag) double *x1,*x2,*xH1,*xH2; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/OPT/pair_eam_opt.cpp b/src/OPT/pair_eam_opt.cpp index 5345d7f8d6..fc2b6731ee 100644 --- a/src/OPT/pair_eam_opt.cpp +++ b/src/OPT/pair_eam_opt.cpp @@ -38,8 +38,7 @@ PairEAMOpt::PairEAMOpt(LAMMPS *lmp) : PairEAM(lmp) {} void PairEAMOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/OPT/pair_lj_charmm_coul_long_opt.cpp b/src/OPT/pair_lj_charmm_coul_long_opt.cpp index 43f4ba7f5a..d80d3d1ec4 100644 --- a/src/OPT/pair_lj_charmm_coul_long_opt.cpp +++ b/src/OPT/pair_lj_charmm_coul_long_opt.cpp @@ -44,8 +44,7 @@ PairLJCharmmCoulLongOpt::PairLJCharmmCoulLongOpt(LAMMPS *lmp) : void PairLJCharmmCoulLongOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/OPT/pair_lj_cut_coul_long_opt.cpp b/src/OPT/pair_lj_cut_coul_long_opt.cpp index 98683a67a4..a25010cf1f 100644 --- a/src/OPT/pair_lj_cut_coul_long_opt.cpp +++ b/src/OPT/pair_lj_cut_coul_long_opt.cpp @@ -38,8 +38,7 @@ PairLJCutCoulLongOpt::PairLJCutCoulLongOpt(LAMMPS *lmp) : PairLJCutCoulLong(lmp) void PairLJCutCoulLongOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (!ncoultablebits) { if (evflag) { diff --git a/src/OPT/pair_lj_cut_opt.cpp b/src/OPT/pair_lj_cut_opt.cpp index ed35178c1f..c6684461be 100644 --- a/src/OPT/pair_lj_cut_opt.cpp +++ b/src/OPT/pair_lj_cut_opt.cpp @@ -34,8 +34,7 @@ PairLJCutOpt::PairLJCutOpt(LAMMPS *lmp) : PairLJCut(lmp) {} void PairLJCutOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/OPT/pair_lj_cut_tip4p_long_opt.cpp b/src/OPT/pair_lj_cut_tip4p_long_opt.cpp index 4842cc4fc0..92facca43e 100644 --- a/src/OPT/pair_lj_cut_tip4p_long_opt.cpp +++ b/src/OPT/pair_lj_cut_tip4p_long_opt.cpp @@ -53,8 +53,7 @@ PairLJCutTIP4PLongOpt::PairLJCutTIP4PLongOpt(LAMMPS *lmp) : void PairLJCutTIP4PLongOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/OPT/pair_lj_long_coul_long_opt.cpp b/src/OPT/pair_lj_long_coul_long_opt.cpp index 6bd1e8cb96..243b64391f 100644 --- a/src/OPT/pair_lj_long_coul_long_opt.cpp +++ b/src/OPT/pair_lj_long_coul_long_opt.cpp @@ -44,8 +44,7 @@ PairLJLongCoulLongOpt::PairLJLongCoulLongOpt(LAMMPS *lmp) : PairLJLongCoulLong(l void PairLJLongCoulLongOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int order1 = ewald_order&(1<<1), order6 = ewald_order&(1<<6); if (order6) { @@ -290,8 +289,7 @@ void PairLJLongCoulLongOpt::compute(int eflag, int vflag) void PairLJLongCoulLongOpt::compute_outer(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int order1 = ewald_order&(1<<1), order6 = ewald_order&(1<<6); if (order6) { diff --git a/src/OPT/pair_morse_opt.cpp b/src/OPT/pair_morse_opt.cpp index 6299136f46..c9c6bba355 100644 --- a/src/OPT/pair_morse_opt.cpp +++ b/src/OPT/pair_morse_opt.cpp @@ -35,8 +35,7 @@ PairMorseOpt::PairMorseOpt(LAMMPS *lmp) : PairMorse(lmp) {} void PairMorseOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/OPT/pair_ufm_opt.cpp b/src/OPT/pair_ufm_opt.cpp index 85c76d624d..f463dac3f1 100644 --- a/src/OPT/pair_ufm_opt.cpp +++ b/src/OPT/pair_ufm_opt.cpp @@ -34,8 +34,7 @@ PairUFMOpt::PairUFMOpt(LAMMPS *lmp) : PairUFM(lmp) {} void PairUFMOpt::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/PERI/pair_peri_eps.cpp b/src/PERI/pair_peri_eps.cpp index 76267426c6..c00495ba4d 100644 --- a/src/PERI/pair_peri_eps.cpp +++ b/src/PERI/pair_peri_eps.cpp @@ -96,8 +96,7 @@ void PairPeriEPS::compute(int eflag, int vflag) double d_ij,delta,stretch; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); double **f = atom->f; double **x = atom->x; diff --git a/src/PERI/pair_peri_lps.cpp b/src/PERI/pair_peri_lps.cpp index 383b91c6f5..f0418c8c8d 100644 --- a/src/PERI/pair_peri_lps.cpp +++ b/src/PERI/pair_peri_lps.cpp @@ -93,8 +93,7 @@ void PairPeriLPS::compute(int eflag, int vflag) double d_ij,delta,stretch; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); double **f = atom->f; double **x = atom->x; diff --git a/src/PERI/pair_peri_pmb.cpp b/src/PERI/pair_peri_pmb.cpp index 772e47f2d6..ad2f3fb7c7 100644 --- a/src/PERI/pair_peri_pmb.cpp +++ b/src/PERI/pair_peri_pmb.cpp @@ -84,8 +84,7 @@ void PairPeriPMB::compute(int eflag, int vflag) double d_ij,delta,stretch; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **f = atom->f; double **x = atom->x; diff --git a/src/PERI/pair_peri_ves.cpp b/src/PERI/pair_peri_ves.cpp index 7590077f0e..24a9f92a97 100644 --- a/src/PERI/pair_peri_ves.cpp +++ b/src/PERI/pair_peri_ves.cpp @@ -98,8 +98,7 @@ void PairPeriVES::compute(int eflag, int vflag) double d_ij,delta,stretch; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); double **f = atom->f; double **x = atom->x; diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 4899e5e2ef..2148fc67b8 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -82,8 +82,7 @@ void PairPython::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 81c5e9f6d1..8b547e6e73 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -176,8 +176,7 @@ void PairSNAP::compute_regular(int eflag, int vflag) int *jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -486,8 +485,7 @@ void PairSNAP::compute_optimized(int eflag, int vflag) #pragma omp master #endif { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); } #if defined(_OPENMP) diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 8496e40f99..200cafb999 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -233,8 +233,7 @@ void PairSpinDmi::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index b2955aafb2..5b8ec60cd6 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -218,8 +218,7 @@ void PairSpinExchange::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index a7357f61e3..95c29b233d 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -225,8 +225,7 @@ void PairSpinMagelec::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index bd12832a8d..64fca23b7a 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -232,8 +232,7 @@ void PairSpinNeel::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-AWPMD/pair_awpmd_cut.cpp b/src/USER-AWPMD/pair_awpmd_cut.cpp index 806e4f3a14..1b7bf35c28 100644 --- a/src/USER-AWPMD/pair_awpmd_cut.cpp +++ b/src/USER-AWPMD/pair_awpmd_cut.cpp @@ -108,10 +108,7 @@ void PairAWPMDCut::compute(int eflag, int vflag) // pvector = [KE, Pauli, ecoul, radial_restraint] for (int i=0; i<4; i++) pvector[i] = 0.0; - if (eflag || vflag) - ev_setup(eflag,vflag); - else - evflag = vflag_fdotr = 0; //?? + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-CGDNA/pair_oxdna2_coaxstk.cpp b/src/USER-CGDNA/pair_oxdna2_coaxstk.cpp index 0b220a3275..f54197aea7 100644 --- a/src/USER-CGDNA/pair_oxdna2_coaxstk.cpp +++ b/src/USER-CGDNA/pair_oxdna2_coaxstk.cpp @@ -144,8 +144,7 @@ void PairOxdna2Coaxstk::compute(int eflag, int vflag) double df2,df4f6t1,df4t4,df4t5,df4t6,rsint; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGDNA/pair_oxdna2_dh.cpp b/src/USER-CGDNA/pair_oxdna2_dh.cpp index da6e1f8bbd..10e7121427 100644 --- a/src/USER-CGDNA/pair_oxdna2_dh.cpp +++ b/src/USER-CGDNA/pair_oxdna2_dh.cpp @@ -114,8 +114,7 @@ void PairOxdna2Dh::compute(int eflag, int vflag) int a,b,ia,ib,anum,bnum,atype,btype; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGDNA/pair_oxdna_coaxstk.cpp b/src/USER-CGDNA/pair_oxdna_coaxstk.cpp index ef0ff16150..6d3061620d 100644 --- a/src/USER-CGDNA/pair_oxdna_coaxstk.cpp +++ b/src/USER-CGDNA/pair_oxdna_coaxstk.cpp @@ -156,8 +156,7 @@ void PairOxdnaCoaxstk::compute(int eflag, int vflag) double df2,df4t1,df4t4,df4t5,df4t6,df5c3,rsint; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGDNA/pair_oxdna_excv.cpp b/src/USER-CGDNA/pair_oxdna_excv.cpp index 719a63b5f4..82af5ed1c7 100644 --- a/src/USER-CGDNA/pair_oxdna_excv.cpp +++ b/src/USER-CGDNA/pair_oxdna_excv.cpp @@ -144,8 +144,7 @@ void PairOxdnaExcv::compute(int eflag, int vflag) int a,b,ia,ib,anum,bnum,atype,btype; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGDNA/pair_oxdna_hbond.cpp b/src/USER-CGDNA/pair_oxdna_hbond.cpp index d8305e30de..d2aa236a05 100644 --- a/src/USER-CGDNA/pair_oxdna_hbond.cpp +++ b/src/USER-CGDNA/pair_oxdna_hbond.cpp @@ -161,8 +161,7 @@ void PairOxdnaHbond::compute(int eflag, int vflag) double df1,df4t1,df4t4,df4t2,df4t3,df4t7,df4t8; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGDNA/pair_oxdna_stk.cpp b/src/USER-CGDNA/pair_oxdna_stk.cpp index f713e4d27c..4cbc0317dd 100644 --- a/src/USER-CGDNA/pair_oxdna_stk.cpp +++ b/src/USER-CGDNA/pair_oxdna_stk.cpp @@ -154,8 +154,7 @@ void PairOxdnaStk::compute(int eflag, int vflag) double tptofp; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // loop over stacking interaction neighours using bond topology diff --git a/src/USER-CGDNA/pair_oxdna_xstk.cpp b/src/USER-CGDNA/pair_oxdna_xstk.cpp index a354a604fd..071886556c 100644 --- a/src/USER-CGDNA/pair_oxdna_xstk.cpp +++ b/src/USER-CGDNA/pair_oxdna_xstk.cpp @@ -153,8 +153,7 @@ void PairOxdnaXstk::compute(int eflag, int vflag) double df2,df4t1,df4t4,df4t2,df4t3,df4t7,df4t8,rsint; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); anum = list->inum; alist = list->ilist; diff --git a/src/USER-CGSDK/pair_lj_sdk.cpp b/src/USER-CGSDK/pair_lj_sdk.cpp index 3404beb58a..7dd6c04436 100644 --- a/src/USER-CGSDK/pair_lj_sdk.cpp +++ b/src/USER-CGSDK/pair_lj_sdk.cpp @@ -78,9 +78,7 @@ PairLJSDK::~PairLJSDK() void PairLJSDK::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp b/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp index c51235518b..33a1659df9 100644 --- a/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp +++ b/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp @@ -90,9 +90,7 @@ PairLJSDKCoulLong::~PairLJSDKCoulLong() void PairLJSDKCoulLong::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/USER-CGSDK/pair_lj_sdk_coul_msm.cpp b/src/USER-CGSDK/pair_lj_sdk_coul_msm.cpp index c4882fdbdb..d26f8efcdc 100644 --- a/src/USER-CGSDK/pair_lj_sdk_coul_msm.cpp +++ b/src/USER-CGSDK/pair_lj_sdk_coul_msm.cpp @@ -57,9 +57,7 @@ void PairLJSDKCoulMSM::compute(int eflag, int vflag) if (force->kspace->scalar_pressure_flag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' with Pair style"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (evflag) { if (eflag) { diff --git a/src/USER-DPD/pair_dpd_fdt.cpp b/src/USER-DPD/pair_dpd_fdt.cpp index 12e6d9f257..07ef8190f0 100644 --- a/src/USER-DPD/pair_dpd_fdt.cpp +++ b/src/USER-DPD/pair_dpd_fdt.cpp @@ -76,8 +76,7 @@ void PairDPDfdt::compute(int eflag, int vflag) double gamma_ij; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/USER-DPD/pair_dpd_fdt_energy.cpp b/src/USER-DPD/pair_dpd_fdt_energy.cpp index 42c23e3ad2..12e6989c00 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.cpp +++ b/src/USER-DPD/pair_dpd_fdt_energy.cpp @@ -85,8 +85,7 @@ void PairDPDfdtEnergy::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/USER-DPD/pair_exp6_rx.cpp b/src/USER-DPD/pair_exp6_rx.cpp index 0251f019c5..13521b52b1 100644 --- a/src/USER-DPD/pair_exp6_rx.cpp +++ b/src/USER-DPD/pair_exp6_rx.cpp @@ -121,8 +121,7 @@ void PairExp6rx::compute(int eflag, int vflag) evdwlOld = 0.0; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-DPD/pair_multi_lucy.cpp b/src/USER-DPD/pair_multi_lucy.cpp index 19a4a02f0b..ffc1562f88 100644 --- a/src/USER-DPD/pair_multi_lucy.cpp +++ b/src/USER-DPD/pair_multi_lucy.cpp @@ -95,8 +95,7 @@ void PairMultiLucy::compute(int eflag, int vflag) int tlm1 = tablength - 1; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-DPD/pair_multi_lucy_rx.cpp b/src/USER-DPD/pair_multi_lucy_rx.cpp index f3ad86eb2f..801e8ff039 100644 --- a/src/USER-DPD/pair_multi_lucy_rx.cpp +++ b/src/USER-DPD/pair_multi_lucy_rx.cpp @@ -111,8 +111,7 @@ void PairMultiLucyRX::compute(int eflag, int vflag) evdwlOld = 0.0; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-DPD/pair_table_rx.cpp b/src/USER-DPD/pair_table_rx.cpp index 1e7bc440d1..f2d0d7b1fb 100644 --- a/src/USER-DPD/pair_table_rx.cpp +++ b/src/USER-DPD/pair_table_rx.cpp @@ -78,8 +78,7 @@ void PairTableRX::compute(int eflag, int vflag) evdwlOld = 0.0; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp index f9da40dfb9..1ebe4a4c2d 100644 --- a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp +++ b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp @@ -98,8 +98,7 @@ void PairLJCutTholeLong::compute(int eflag, int vflag) int di_closest; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-DRUDE/pair_thole.cpp b/src/USER-DRUDE/pair_thole.cpp index 5a518d819b..1bb75af825 100644 --- a/src/USER-DRUDE/pair_thole.cpp +++ b/src/USER-DRUDE/pair_thole.cpp @@ -64,8 +64,7 @@ void PairThole::compute(int eflag, int vflag) double dcoul,asr,exp_asr; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-EFF/pair_eff_cut.cpp b/src/USER-EFF/pair_eff_cut.cpp index b4e9011e33..f566922ef7 100644 --- a/src/USER-EFF/pair_eff_cut.cpp +++ b/src/USER-EFF/pair_eff_cut.cpp @@ -81,8 +81,7 @@ void PairEffCut::compute(int eflag, int vflag) // pvector = [KE, Pauli, ecoul, radial_restraint] for (i=0; i<4; i++) pvector[i] = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_coul_cut_soft.cpp b/src/USER-FEP/pair_coul_cut_soft.cpp index 529ffe6b09..86a6d02819 100644 --- a/src/USER-FEP/pair_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_coul_cut_soft.cpp @@ -60,8 +60,7 @@ void PairCoulCutSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_coul_long_soft.cpp b/src/USER-FEP/pair_coul_long_soft.cpp index e45dbe72d6..9d3ffc0da1 100644 --- a/src/USER-FEP/pair_coul_long_soft.cpp +++ b/src/USER-FEP/pair_coul_long_soft.cpp @@ -78,8 +78,7 @@ void PairCoulLongSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp b/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp index 34758b159b..ac6f1e6384 100644 --- a/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp @@ -92,8 +92,7 @@ void PairLJCharmmCoulLongSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -415,8 +414,7 @@ void PairLJCharmmCoulLongSoft::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp b/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp index 7970097cfe..54643f7305 100644 --- a/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp @@ -72,8 +72,7 @@ void PairLJClass2CoulCutSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp b/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp index 13096a64c6..4dfafbb268 100644 --- a/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp @@ -82,8 +82,7 @@ void PairLJClass2CoulLongSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_class2_soft.cpp b/src/USER-FEP/pair_lj_class2_soft.cpp index b7f21fc59c..858e5a727e 100644 --- a/src/USER-FEP/pair_lj_class2_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_soft.cpp @@ -68,8 +68,7 @@ void PairLJClass2Soft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp b/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp index fc887fbec5..35c9162dbc 100644 --- a/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp @@ -73,8 +73,7 @@ void PairLJCutCoulCutSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp index a9032ab4d7..79253d2b9c 100644 --- a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp @@ -89,8 +89,7 @@ void PairLJCutCoulLongSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -390,8 +389,7 @@ void PairLJCutCoulLongSoft::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_cut_soft.cpp b/src/USER-FEP/pair_lj_cut_soft.cpp index 1322565473..4192d6546b 100644 --- a/src/USER-FEP/pair_lj_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_soft.cpp @@ -77,8 +77,7 @@ void PairLJCutSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -323,8 +322,7 @@ void PairLJCutSoft::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp index 8653800ee6..8ac28f9fa9 100644 --- a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp @@ -92,8 +92,7 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/USER-FEP/pair_morse_soft.cpp b/src/USER-FEP/pair_morse_soft.cpp index f4c5a4b910..21f616a082 100644 --- a/src/USER-FEP/pair_morse_soft.cpp +++ b/src/USER-FEP/pair_morse_soft.cpp @@ -53,8 +53,7 @@ void PairMorseSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-FEP/pair_tip4p_long_soft.cpp b/src/USER-FEP/pair_tip4p_long_soft.cpp index 5e8c5000f8..9b6a6841fe 100644 --- a/src/USER-FEP/pair_tip4p_long_soft.cpp +++ b/src/USER-FEP/pair_tip4p_long_soft.cpp @@ -91,8 +91,7 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) double rsq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh & newsite if necessary // initialize hneigh[0] to -1 on steps when reneighboring occurred diff --git a/src/USER-INTEL/pair_airebo_intel.cpp b/src/USER-INTEL/pair_airebo_intel.cpp index 198f8798fa..f330e3ec86 100644 --- a/src/USER-INTEL/pair_airebo_intel.cpp +++ b/src/USER-INTEL/pair_airebo_intel.cpp @@ -292,8 +292,7 @@ template void PairAIREBOIntel::compute( int eflag, int vflag, IntelBuffers * buffers ) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); pvector[0] = pvector[1] = pvector[2] = 0.0; const int inum = list->inum; diff --git a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp index f82f4c1c7a..3f2d64fb93 100644 --- a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp @@ -73,9 +73,7 @@ void PairBuckCoulCutIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_buck_coul_long_intel.cpp b/src/USER-INTEL/pair_buck_coul_long_intel.cpp index 059413c3d9..2ddcd55663 100644 --- a/src/USER-INTEL/pair_buck_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_long_intel.cpp @@ -73,9 +73,7 @@ void PairBuckCoulLongIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_buck_intel.cpp b/src/USER-INTEL/pair_buck_intel.cpp index 0e0bd0f56f..34af3462e2 100644 --- a/src/USER-INTEL/pair_buck_intel.cpp +++ b/src/USER-INTEL/pair_buck_intel.cpp @@ -66,9 +66,7 @@ void PairBuckIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_dpd_intel.cpp b/src/USER-INTEL/pair_dpd_intel.cpp index 5d67a60c4b..016f3b5ca0 100644 --- a/src/USER-INTEL/pair_dpd_intel.cpp +++ b/src/USER-INTEL/pair_dpd_intel.cpp @@ -82,9 +82,7 @@ void PairDPDIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_eam_intel.cpp b/src/USER-INTEL/pair_eam_intel.cpp index 95d0272d33..7f4806c87c 100644 --- a/src/USER-INTEL/pair_eam_intel.cpp +++ b/src/USER-INTEL/pair_eam_intel.cpp @@ -78,9 +78,7 @@ void PairEAMIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_gayberne_intel.cpp b/src/USER-INTEL/pair_gayberne_intel.cpp index 51524355d5..1d9ee7d4cd 100644 --- a/src/USER-INTEL/pair_gayberne_intel.cpp +++ b/src/USER-INTEL/pair_gayberne_intel.cpp @@ -72,9 +72,7 @@ void PairGayBerneIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); const int inum = list->inum; const int nall = atom->nlocal + atom->nghost; diff --git a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp index 0b6ac3ffa5..9689c0bf50 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -66,9 +66,7 @@ void PairLJCharmmCoulCharmmIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp index 753a9afdd9..8de4ced549 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -70,9 +70,7 @@ void PairLJCharmmCoulLongIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp index 35ed9061ce..8ad1823d97 100644 --- a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp @@ -71,9 +71,7 @@ void PairLJCutCoulLongIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_cut_intel.cpp b/src/USER-INTEL/pair_lj_cut_intel.cpp index 94133a7f47..74dae7e096 100644 --- a/src/USER-INTEL/pair_lj_cut_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_intel.cpp @@ -62,9 +62,7 @@ void PairLJCutIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_sw_intel.cpp b/src/USER-INTEL/pair_sw_intel.cpp index 9e00516087..8482895fb6 100644 --- a/src/USER-INTEL/pair_sw_intel.cpp +++ b/src/USER-INTEL/pair_sw_intel.cpp @@ -95,9 +95,7 @@ void PairSWIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_tersoff_intel.cpp b/src/USER-INTEL/pair_tersoff_intel.cpp index 5d4c5f2cb6..668cb0cf33 100644 --- a/src/USER-INTEL/pair_tersoff_intel.cpp +++ b/src/USER-INTEL/pair_tersoff_intel.cpp @@ -107,9 +107,7 @@ void PairTersoffIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-MEAMC/pair_meamc.cpp b/src/USER-MEAMC/pair_meamc.cpp index d0d97740b3..3a934694bf 100644 --- a/src/USER-MEAMC/pair_meamc.cpp +++ b/src/USER-MEAMC/pair_meamc.cpp @@ -93,8 +93,7 @@ void PairMEAMC::compute(int eflag, int vflag) int *ilist_half,*numneigh_half,**firstneigh_half; int *numneigh_full,**firstneigh_full; - if (eflag || vflag) ev_setup(eflag,vflag); - else ev_unset(); + ev_init(eflag,vflag); // neighbor list info diff --git a/src/USER-MESO/pair_edpd.cpp b/src/USER-MESO/pair_edpd.cpp index 1f6222944a..e428b02822 100644 --- a/src/USER-MESO/pair_edpd.cpp +++ b/src/USER-MESO/pair_edpd.cpp @@ -99,8 +99,7 @@ PairEDPD::~PairEDPD() void PairEDPD::compute(int eflag, int vflag) { double evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/USER-MESO/pair_mdpd.cpp b/src/USER-MESO/pair_mdpd.cpp index f9acd3dbe1..4102499d46 100644 --- a/src/USER-MESO/pair_mdpd.cpp +++ b/src/USER-MESO/pair_mdpd.cpp @@ -88,8 +88,7 @@ void PairMDPD::compute(int eflag, int vflag) double rhoi, rhoj; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/USER-MESO/pair_mdpd_rhosum.cpp b/src/USER-MESO/pair_mdpd_rhosum.cpp index 806a63f898..2fd238088c 100644 --- a/src/USER-MESO/pair_mdpd_rhosum.cpp +++ b/src/USER-MESO/pair_mdpd_rhosum.cpp @@ -84,10 +84,7 @@ void PairMDPDRhoSum::compute(int eflag, int vflag) { // neighbor list variables int inum, *ilist, *numneigh, **firstneigh; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **x = atom->x; double *rho = atom->rho; diff --git a/src/USER-MESO/pair_tdpd.cpp b/src/USER-MESO/pair_tdpd.cpp index a41282c0d8..7df9d6d163 100644 --- a/src/USER-MESO/pair_tdpd.cpp +++ b/src/USER-MESO/pair_tdpd.cpp @@ -91,8 +91,7 @@ PairTDPD::~PairTDPD() void PairTDPD::compute(int eflag, int vflag) { double evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/USER-MGPT/pair_mgpt.cpp b/src/USER-MGPT/pair_mgpt.cpp index 347bc9cc69..91c624eec5 100644 --- a/src/USER-MGPT/pair_mgpt.cpp +++ b/src/USER-MGPT/pair_mgpt.cpp @@ -1673,8 +1673,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, void PairMGPT::compute(int eflag, int vflag) { - if(eflag || vflag) ev_setup(eflag, vflag); - else evflag = vflag_fdotr = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag, vflag); int newton_pair = force->newton_pair; double e_s,e_p,e_t,e_q; diff --git a/src/USER-MISC/pair_agni.cpp b/src/USER-MISC/pair_agni.cpp index 0277969d15..21a6f1deee 100644 --- a/src/USER-MISC/pair_agni.cpp +++ b/src/USER-MISC/pair_agni.cpp @@ -136,8 +136,7 @@ void PairAGNI::compute(int eflag, int vflag) double rsq; int *ilist,*jlist,*numneigh,**firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_buck_mdf.cpp b/src/USER-MISC/pair_buck_mdf.cpp index 38de1c7c50..b5e81417ee 100644 --- a/src/USER-MISC/pair_buck_mdf.cpp +++ b/src/USER-MISC/pair_buck_mdf.cpp @@ -68,8 +68,7 @@ void PairBuckMDF::compute(int eflag, int vflag) double dp, d, tt, dt, dd; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_coul_diel.cpp b/src/USER-MISC/pair_coul_diel.cpp index 0154e89731..a86921d296 100644 --- a/src/USER-MISC/pair_coul_diel.cpp +++ b/src/USER-MISC/pair_coul_diel.cpp @@ -58,8 +58,7 @@ void PairCoulDiel::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_coul_shield.cpp b/src/USER-MISC/pair_coul_shield.cpp index 11df975c19..f74dcfe7d8 100644 --- a/src/USER-MISC/pair_coul_shield.cpp +++ b/src/USER-MISC/pair_coul_shield.cpp @@ -64,8 +64,7 @@ void PairCoulShield::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_edip.cpp b/src/USER-MISC/pair_edip.cpp index 491268567f..0b5220fdfd 100644 --- a/src/USER-MISC/pair_edip.cpp +++ b/src/USER-MISC/pair_edip.cpp @@ -149,8 +149,7 @@ void PairEDIP::compute(int eflag, int vflag) double potential2B_factor; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp index f56650d2f6..ab48fbaa73 100644 --- a/src/USER-MISC/pair_edip_multi.cpp +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -118,8 +118,7 @@ void PairEDIPMulti::compute(int eflag, int vflag) // vflag != 0 means compute virial contributions in this step evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_extep.cpp b/src/USER-MISC/pair_extep.cpp index 364fd45016..132b857dde 100644 --- a/src/USER-MISC/pair_extep.cpp +++ b/src/USER-MISC/pair_extep.cpp @@ -190,8 +190,7 @@ void PairExTeP::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); SR_neigh(); diff --git a/src/USER-MISC/pair_gauss_cut.cpp b/src/USER-MISC/pair_gauss_cut.cpp index a000eff028..24d0b191d8 100644 --- a/src/USER-MISC/pair_gauss_cut.cpp +++ b/src/USER-MISC/pair_gauss_cut.cpp @@ -69,8 +69,7 @@ void PairGaussCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/USER-MISC/pair_ilp_graphene_hbn.cpp index 6257c1d72b..d1b8a3be38 100644 --- a/src/USER-MISC/pair_ilp_graphene_hbn.cpp +++ b/src/USER-MISC/pair_ilp_graphene_hbn.cpp @@ -117,8 +117,7 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) int *ILP_neighs_i,*ILP_neighs_j; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp index cbcf6c7934..289ed19bd3 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp @@ -115,8 +115,7 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) int *KC_neighs_i,*KC_neighs_j; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp index e9583032fe..dcea990a3b 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp @@ -87,8 +87,7 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_lebedeva_z.cpp b/src/USER-MISC/pair_lebedeva_z.cpp index 5153857c2f..0ab22e04c1 100644 --- a/src/USER-MISC/pair_lebedeva_z.cpp +++ b/src/USER-MISC/pair_lebedeva_z.cpp @@ -87,8 +87,7 @@ void PairLebedevaZ::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_lennard_mdf.cpp b/src/USER-MISC/pair_lennard_mdf.cpp index 4bc2da23f8..b51639e80e 100644 --- a/src/USER-MISC/pair_lennard_mdf.cpp +++ b/src/USER-MISC/pair_lennard_mdf.cpp @@ -65,8 +65,7 @@ void PairLJ_AB_MDF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_list.cpp b/src/USER-MISC/pair_list.cpp index aaeb586c1d..562a60aa99 100644 --- a/src/USER-MISC/pair_list.cpp +++ b/src/USER-MISC/pair_list.cpp @@ -80,9 +80,7 @@ PairList::~PairList() void PairList::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = - vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int newton_pair = force->newton_pair; diff --git a/src/USER-MISC/pair_lj_expand_coul_long.cpp b/src/USER-MISC/pair_lj_expand_coul_long.cpp index 79a3c2a497..fe21538f2d 100644 --- a/src/USER-MISC/pair_lj_expand_coul_long.cpp +++ b/src/USER-MISC/pair_lj_expand_coul_long.cpp @@ -91,8 +91,7 @@ void PairLJExpandCoulLong::compute(int eflag, int vflag) double rsq,rshift,rshiftsq,rshift2inv; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -412,8 +411,7 @@ void PairLJExpandCoulLong::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_lj_mdf.cpp b/src/USER-MISC/pair_lj_mdf.cpp index 4cd21b1dbe..ca0118ffb0 100644 --- a/src/USER-MISC/pair_lj_mdf.cpp +++ b/src/USER-MISC/pair_lj_mdf.cpp @@ -65,8 +65,7 @@ void PairLJMDF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_lj_sf_dipole_sf.cpp b/src/USER-MISC/pair_lj_sf_dipole_sf.cpp index 523b2ca71a..af7d23370d 100644 --- a/src/USER-MISC/pair_lj_sf_dipole_sf.cpp +++ b/src/USER-MISC/pair_lj_sf_dipole_sf.cpp @@ -79,8 +79,7 @@ void PairLJSFDipoleSF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_meam_spline.cpp b/src/USER-MISC/pair_meam_spline.cpp index 0300e2c7a2..f09919ce0f 100644 --- a/src/USER-MISC/pair_meam_spline.cpp +++ b/src/USER-MISC/pair_meam_spline.cpp @@ -103,12 +103,7 @@ void PairMEAMSpline::compute(int eflag, int vflag) double* const * const forces = atom->f; const int ntypes = atom->ntypes; - if (eflag || vflag) { - ev_setup(eflag, vflag); - } else { - evflag = vflag_fdotr = eflag_global = 0; - vflag_global = eflag_atom = vflag_atom = 0; - } + ev_init(eflag, vflag); // Grow per-atom array if necessary diff --git a/src/USER-MISC/pair_meam_sw_spline.cpp b/src/USER-MISC/pair_meam_sw_spline.cpp index e17c13865d..af1e8788bd 100644 --- a/src/USER-MISC/pair_meam_sw_spline.cpp +++ b/src/USER-MISC/pair_meam_sw_spline.cpp @@ -85,9 +85,7 @@ PairMEAMSWSpline::~PairMEAMSWSpline() void PairMEAMSWSpline::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag, vflag); - else evflag = vflag_fdotr = - eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag, vflag); double cutforcesq = cutoff*cutoff; diff --git a/src/USER-MISC/pair_momb.cpp b/src/USER-MISC/pair_momb.cpp index 927181ebf6..1716149a98 100644 --- a/src/USER-MISC/pair_momb.cpp +++ b/src/USER-MISC/pair_momb.cpp @@ -81,8 +81,7 @@ void PairMomb::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_morse_smooth_linear.cpp b/src/USER-MISC/pair_morse_smooth_linear.cpp index a88e7a1a27..7c7973f830 100644 --- a/src/USER-MISC/pair_morse_smooth_linear.cpp +++ b/src/USER-MISC/pair_morse_smooth_linear.cpp @@ -60,8 +60,7 @@ void PairMorseSmoothLinear::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_srp.cpp b/src/USER-MISC/pair_srp.cpp index 8f34e846c5..01deaf0fbe 100644 --- a/src/USER-MISC/pair_srp.cpp +++ b/src/USER-MISC/pair_srp.cpp @@ -143,10 +143,7 @@ void PairSRP::compute(int eflag, int vflag) { // setup energy and virial - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/pair_tersoff_table.cpp b/src/USER-MISC/pair_tersoff_table.cpp index d1044cc336..e0985d1dce 100644 --- a/src/USER-MISC/pair_tersoff_table.cpp +++ b/src/USER-MISC/pair_tersoff_table.cpp @@ -117,8 +117,7 @@ void PairTersoffTable::compute(int eflag, int vflag) double evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp index 1fc4644420..bb025e4e1e 100644 --- a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp @@ -87,8 +87,7 @@ void PairBuck6dCoulGaussDSF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp index 1ca42d864e..df54925f4e 100644 --- a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp @@ -89,8 +89,7 @@ void PairBuck6dCoulGaussLong::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-OMP/pair_adp_omp.cpp b/src/USER-OMP/pair_adp_omp.cpp index 264169773b..645d697994 100644 --- a/src/USER-OMP/pair_adp_omp.cpp +++ b/src/USER-OMP/pair_adp_omp.cpp @@ -39,9 +39,7 @@ PairADPOMP::PairADPOMP(LAMMPS *lmp) : void PairADPOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_agni_omp.cpp b/src/USER-OMP/pair_agni_omp.cpp index e8f003ea88..854bcbebf3 100644 --- a/src/USER-OMP/pair_agni_omp.cpp +++ b/src/USER-OMP/pair_agni_omp.cpp @@ -42,9 +42,7 @@ PairAGNIOMP::PairAGNIOMP(LAMMPS *lmp) : void PairAGNIOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_airebo_omp.cpp b/src/USER-OMP/pair_airebo_omp.cpp index ec5c02d727..bed6c81ee4 100644 --- a/src/USER-OMP/pair_airebo_omp.cpp +++ b/src/USER-OMP/pair_airebo_omp.cpp @@ -49,9 +49,7 @@ void PairAIREBOOMP::compute(int eflag, int vflag) { double pv0=0.0,pv1=0.0,pv2=0.0; - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); REBO_neigh_thr(); diff --git a/src/USER-OMP/pair_beck_omp.cpp b/src/USER-OMP/pair_beck_omp.cpp index 1494ec2987..90c3777932 100644 --- a/src/USER-OMP/pair_beck_omp.cpp +++ b/src/USER-OMP/pair_beck_omp.cpp @@ -38,9 +38,7 @@ PairBeckOMP::PairBeckOMP(LAMMPS *lmp) : void PairBeckOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_born_coul_long_omp.cpp b/src/USER-OMP/pair_born_coul_long_omp.cpp index f198184406..a5df8f8182 100644 --- a/src/USER-OMP/pair_born_coul_long_omp.cpp +++ b/src/USER-OMP/pair_born_coul_long_omp.cpp @@ -44,9 +44,7 @@ PairBornCoulLongOMP::PairBornCoulLongOMP(LAMMPS *lmp) : void PairBornCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_born_coul_msm_omp.cpp b/src/USER-OMP/pair_born_coul_msm_omp.cpp index 1b4757359f..ad1e5e63cd 100644 --- a/src/USER-OMP/pair_born_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_born_coul_msm_omp.cpp @@ -41,9 +41,7 @@ void PairBornCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' " "with OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_born_coul_wolf_omp.cpp b/src/USER-OMP/pair_born_coul_wolf_omp.cpp index 7904181ba5..567eddc9cb 100644 --- a/src/USER-OMP/pair_born_coul_wolf_omp.cpp +++ b/src/USER-OMP/pair_born_coul_wolf_omp.cpp @@ -38,9 +38,7 @@ PairBornCoulWolfOMP::PairBornCoulWolfOMP(LAMMPS *lmp) : void PairBornCoulWolfOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_born_omp.cpp b/src/USER-OMP/pair_born_omp.cpp index f75d4b9f35..fce2013745 100644 --- a/src/USER-OMP/pair_born_omp.cpp +++ b/src/USER-OMP/pair_born_omp.cpp @@ -36,9 +36,7 @@ PairBornOMP::PairBornOMP(LAMMPS *lmp) : void PairBornOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_brownian_omp.cpp b/src/USER-OMP/pair_brownian_omp.cpp index b1af821bba..cef9fb0955 100644 --- a/src/USER-OMP/pair_brownian_omp.cpp +++ b/src/USER-OMP/pair_brownian_omp.cpp @@ -68,9 +68,7 @@ PairBrownianOMP::~PairBrownianOMP() void PairBrownianOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int inum = list->inum; diff --git a/src/USER-OMP/pair_brownian_poly_omp.cpp b/src/USER-OMP/pair_brownian_poly_omp.cpp index 2e677ed535..239a820242 100644 --- a/src/USER-OMP/pair_brownian_poly_omp.cpp +++ b/src/USER-OMP/pair_brownian_poly_omp.cpp @@ -68,9 +68,7 @@ PairBrownianPolyOMP::~PairBrownianPolyOMP() void PairBrownianPolyOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int inum = list->inum; diff --git a/src/USER-OMP/pair_buck_coul_cut_omp.cpp b/src/USER-OMP/pair_buck_coul_cut_omp.cpp index 8fa6be06b2..b9b77dc2b6 100644 --- a/src/USER-OMP/pair_buck_coul_cut_omp.cpp +++ b/src/USER-OMP/pair_buck_coul_cut_omp.cpp @@ -36,9 +36,7 @@ PairBuckCoulCutOMP::PairBuckCoulCutOMP(LAMMPS *lmp) : void PairBuckCoulCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_buck_coul_long_omp.cpp b/src/USER-OMP/pair_buck_coul_long_omp.cpp index 4d30eb3e82..951ba0688c 100644 --- a/src/USER-OMP/pair_buck_coul_long_omp.cpp +++ b/src/USER-OMP/pair_buck_coul_long_omp.cpp @@ -44,9 +44,7 @@ PairBuckCoulLongOMP::PairBuckCoulLongOMP(LAMMPS *lmp) : void PairBuckCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_buck_coul_msm_omp.cpp b/src/USER-OMP/pair_buck_coul_msm_omp.cpp index a8bca36394..6226191627 100644 --- a/src/USER-OMP/pair_buck_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_buck_coul_msm_omp.cpp @@ -41,9 +41,7 @@ void PairBuckCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' " "with OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_buck_long_coul_long_omp.cpp b/src/USER-OMP/pair_buck_long_coul_long_omp.cpp index acb95ab76c..20d380a464 100644 --- a/src/USER-OMP/pair_buck_long_coul_long_omp.cpp +++ b/src/USER-OMP/pair_buck_long_coul_long_omp.cpp @@ -46,9 +46,8 @@ PairBuckLongCoulLongOMP::PairBuckLongCoulLongOMP(LAMMPS *lmp) : void PairBuckLongCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); + const int order1 = ewald_order&(1<<1); const int order6 = ewald_order&(1<<6); diff --git a/src/USER-OMP/pair_buck_omp.cpp b/src/USER-OMP/pair_buck_omp.cpp index f3fa32a5ea..cc7e81b9c5 100644 --- a/src/USER-OMP/pair_buck_omp.cpp +++ b/src/USER-OMP/pair_buck_omp.cpp @@ -36,9 +36,7 @@ PairBuckOMP::PairBuckOMP(LAMMPS *lmp) : void PairBuckOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_colloid_omp.cpp b/src/USER-OMP/pair_colloid_omp.cpp index 536b7644bd..64613cb31d 100644 --- a/src/USER-OMP/pair_colloid_omp.cpp +++ b/src/USER-OMP/pair_colloid_omp.cpp @@ -39,9 +39,7 @@ PairColloidOMP::PairColloidOMP(LAMMPS *lmp) : void PairColloidOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_comb_omp.cpp b/src/USER-OMP/pair_comb_omp.cpp index 8a77ab955f..be641dd0b9 100644 --- a/src/USER-OMP/pair_comb_omp.cpp +++ b/src/USER-OMP/pair_comb_omp.cpp @@ -41,9 +41,7 @@ PairCombOMP::PairCombOMP(LAMMPS *lmp) : void PairCombOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_cut_omp.cpp b/src/USER-OMP/pair_coul_cut_omp.cpp index b9ac72421e..056daf210a 100644 --- a/src/USER-OMP/pair_coul_cut_omp.cpp +++ b/src/USER-OMP/pair_coul_cut_omp.cpp @@ -36,9 +36,7 @@ PairCoulCutOMP::PairCoulCutOMP(LAMMPS *lmp) : void PairCoulCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_cut_soft_omp.cpp b/src/USER-OMP/pair_coul_cut_soft_omp.cpp index c7e8c5e560..70997da62b 100644 --- a/src/USER-OMP/pair_coul_cut_soft_omp.cpp +++ b/src/USER-OMP/pair_coul_cut_soft_omp.cpp @@ -36,9 +36,7 @@ PairCoulCutSoftOMP::PairCoulCutSoftOMP(LAMMPS *lmp) : void PairCoulCutSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_debye_omp.cpp b/src/USER-OMP/pair_coul_debye_omp.cpp index cb7a9025ce..d202e314bf 100644 --- a/src/USER-OMP/pair_coul_debye_omp.cpp +++ b/src/USER-OMP/pair_coul_debye_omp.cpp @@ -36,9 +36,7 @@ PairCoulDebyeOMP::PairCoulDebyeOMP(LAMMPS *lmp) : void PairCoulDebyeOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_diel_omp.cpp b/src/USER-OMP/pair_coul_diel_omp.cpp index c75e36b55e..f2bb6a46bf 100644 --- a/src/USER-OMP/pair_coul_diel_omp.cpp +++ b/src/USER-OMP/pair_coul_diel_omp.cpp @@ -36,9 +36,7 @@ PairCoulDielOMP::PairCoulDielOMP(LAMMPS *lmp) : void PairCoulDielOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_dsf_omp.cpp b/src/USER-OMP/pair_coul_dsf_omp.cpp index 740e3242ad..217fb844c3 100644 --- a/src/USER-OMP/pair_coul_dsf_omp.cpp +++ b/src/USER-OMP/pair_coul_dsf_omp.cpp @@ -46,9 +46,7 @@ PairCoulDSFOMP::PairCoulDSFOMP(LAMMPS *lmp) : void PairCoulDSFOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_long_omp.cpp b/src/USER-OMP/pair_coul_long_omp.cpp index eb74bb9615..1e3170c73c 100644 --- a/src/USER-OMP/pair_coul_long_omp.cpp +++ b/src/USER-OMP/pair_coul_long_omp.cpp @@ -45,9 +45,7 @@ PairCoulLongOMP::PairCoulLongOMP(LAMMPS *lmp) : void PairCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_long_soft_omp.cpp b/src/USER-OMP/pair_coul_long_soft_omp.cpp index 4e65483a17..dd1fc1030d 100644 --- a/src/USER-OMP/pair_coul_long_soft_omp.cpp +++ b/src/USER-OMP/pair_coul_long_soft_omp.cpp @@ -44,9 +44,7 @@ PairCoulLongSoftOMP::PairCoulLongSoftOMP(LAMMPS *lmp) : void PairCoulLongSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_msm_omp.cpp b/src/USER-OMP/pair_coul_msm_omp.cpp index f4bc279532..9b50b86954 100644 --- a/src/USER-OMP/pair_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_coul_msm_omp.cpp @@ -42,9 +42,7 @@ void PairCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' with " "OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_coul_wolf_omp.cpp b/src/USER-OMP/pair_coul_wolf_omp.cpp index bc86cdbf5d..0913a2b188 100644 --- a/src/USER-OMP/pair_coul_wolf_omp.cpp +++ b/src/USER-OMP/pair_coul_wolf_omp.cpp @@ -38,9 +38,7 @@ PairCoulWolfOMP::PairCoulWolfOMP(LAMMPS *lmp) : void PairCoulWolfOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_dpd_omp.cpp b/src/USER-OMP/pair_dpd_omp.cpp index 29b5568def..77db3d9183 100644 --- a/src/USER-OMP/pair_dpd_omp.cpp +++ b/src/USER-OMP/pair_dpd_omp.cpp @@ -55,9 +55,7 @@ PairDPDOMP::~PairDPDOMP() void PairDPDOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int inum = list->inum; diff --git a/src/USER-OMP/pair_dpd_tstat_omp.cpp b/src/USER-OMP/pair_dpd_tstat_omp.cpp index 0a9e96fa0c..d7233a16c5 100644 --- a/src/USER-OMP/pair_dpd_tstat_omp.cpp +++ b/src/USER-OMP/pair_dpd_tstat_omp.cpp @@ -55,9 +55,7 @@ PairDPDTstatOMP::~PairDPDTstatOMP() void PairDPDTstatOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int inum = list->inum; diff --git a/src/USER-OMP/pair_eam_cd_omp.cpp b/src/USER-OMP/pair_eam_cd_omp.cpp index 68c01c83d2..51b83f3bf5 100644 --- a/src/USER-OMP/pair_eam_cd_omp.cpp +++ b/src/USER-OMP/pair_eam_cd_omp.cpp @@ -55,9 +55,7 @@ PairEAMCDOMP::PairEAMCDOMP(LAMMPS *lmp, int _cdeamVersion) : void PairEAMCDOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_eam_omp.cpp b/src/USER-OMP/pair_eam_omp.cpp index 492ff79769..99417f27da 100644 --- a/src/USER-OMP/pair_eam_omp.cpp +++ b/src/USER-OMP/pair_eam_omp.cpp @@ -39,9 +39,7 @@ PairEAMOMP::PairEAMOMP(LAMMPS *lmp) : void PairEAMOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_edip_omp.cpp b/src/USER-OMP/pair_edip_omp.cpp index 3392160d92..144d893c1c 100644 --- a/src/USER-OMP/pair_edip_omp.cpp +++ b/src/USER-OMP/pair_edip_omp.cpp @@ -43,9 +43,7 @@ PairEDIPOMP::PairEDIPOMP(LAMMPS *lmp) : void PairEDIPOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_eim_omp.cpp b/src/USER-OMP/pair_eim_omp.cpp index 6a3e0bc529..2ecd6f8ec7 100644 --- a/src/USER-OMP/pair_eim_omp.cpp +++ b/src/USER-OMP/pair_eim_omp.cpp @@ -39,9 +39,7 @@ PairEIMOMP::PairEIMOMP(LAMMPS *lmp) : void PairEIMOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_gauss_cut_omp.cpp b/src/USER-OMP/pair_gauss_cut_omp.cpp index 9a41dcc87e..928312240b 100644 --- a/src/USER-OMP/pair_gauss_cut_omp.cpp +++ b/src/USER-OMP/pair_gauss_cut_omp.cpp @@ -36,9 +36,7 @@ PairGaussCutOMP::PairGaussCutOMP(LAMMPS *lmp) : void PairGaussCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_gauss_omp.cpp b/src/USER-OMP/pair_gauss_omp.cpp index 059c77c677..159f1c3e31 100644 --- a/src/USER-OMP/pair_gauss_omp.cpp +++ b/src/USER-OMP/pair_gauss_omp.cpp @@ -37,9 +37,7 @@ PairGaussOMP::PairGaussOMP(LAMMPS *lmp) : void PairGaussOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_gayberne_omp.cpp b/src/USER-OMP/pair_gayberne_omp.cpp index 5b0ff67afe..cfa05745ff 100644 --- a/src/USER-OMP/pair_gayberne_omp.cpp +++ b/src/USER-OMP/pair_gayberne_omp.cpp @@ -38,9 +38,7 @@ PairGayBerneOMP::PairGayBerneOMP(LAMMPS *lmp) : void PairGayBerneOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_gran_hertz_history_omp.cpp b/src/USER-OMP/pair_gran_hertz_history_omp.cpp index 9854b8f9ff..271c70e9b9 100644 --- a/src/USER-OMP/pair_gran_hertz_history_omp.cpp +++ b/src/USER-OMP/pair_gran_hertz_history_omp.cpp @@ -40,9 +40,7 @@ PairGranHertzHistoryOMP::PairGranHertzHistoryOMP(LAMMPS *lmp) : void PairGranHertzHistoryOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_gran_hooke_history_omp.cpp b/src/USER-OMP/pair_gran_hooke_history_omp.cpp index 2327fc815a..9a0e8aab76 100644 --- a/src/USER-OMP/pair_gran_hooke_history_omp.cpp +++ b/src/USER-OMP/pair_gran_hooke_history_omp.cpp @@ -41,9 +41,7 @@ PairGranHookeHistoryOMP::PairGranHookeHistoryOMP(LAMMPS *lmp) : void PairGranHookeHistoryOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int shearupdate = (update->setupflag) ? 0 : 1; diff --git a/src/USER-OMP/pair_gran_hooke_omp.cpp b/src/USER-OMP/pair_gran_hooke_omp.cpp index 876fe9c4de..d226ceaa14 100644 --- a/src/USER-OMP/pair_gran_hooke_omp.cpp +++ b/src/USER-OMP/pair_gran_hooke_omp.cpp @@ -38,9 +38,7 @@ PairGranHookeOMP::PairGranHookeOMP(LAMMPS *lmp) : void PairGranHookeOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_hbond_dreiding_lj_omp.cpp b/src/USER-OMP/pair_hbond_dreiding_lj_omp.cpp index ec9da78b16..ea56ff51b5 100644 --- a/src/USER-OMP/pair_hbond_dreiding_lj_omp.cpp +++ b/src/USER-OMP/pair_hbond_dreiding_lj_omp.cpp @@ -57,9 +57,7 @@ PairHbondDreidingLJOMP::~PairHbondDreidingLJOMP() void PairHbondDreidingLJOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_hbond_dreiding_morse_omp.cpp b/src/USER-OMP/pair_hbond_dreiding_morse_omp.cpp index 4965be43b8..1cff2de3b2 100644 --- a/src/USER-OMP/pair_hbond_dreiding_morse_omp.cpp +++ b/src/USER-OMP/pair_hbond_dreiding_morse_omp.cpp @@ -57,9 +57,7 @@ PairHbondDreidingMorseOMP::~PairHbondDreidingMorseOMP() void PairHbondDreidingMorseOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj96_cut_omp.cpp b/src/USER-OMP/pair_lj96_cut_omp.cpp index 1cca674369..9ba8e09a54 100644 --- a/src/USER-OMP/pair_lj96_cut_omp.cpp +++ b/src/USER-OMP/pair_lj96_cut_omp.cpp @@ -37,9 +37,7 @@ PairLJ96CutOMP::PairLJ96CutOMP(LAMMPS *lmp) : void PairLJ96CutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_charmm_coul_charmm_implicit_omp.cpp b/src/USER-OMP/pair_lj_charmm_coul_charmm_implicit_omp.cpp index 2f72f3851e..3dc9b77c0f 100644 --- a/src/USER-OMP/pair_lj_charmm_coul_charmm_implicit_omp.cpp +++ b/src/USER-OMP/pair_lj_charmm_coul_charmm_implicit_omp.cpp @@ -36,9 +36,7 @@ PairLJCharmmCoulCharmmImplicitOMP::PairLJCharmmCoulCharmmImplicitOMP(LAMMPS *lmp void PairLJCharmmCoulCharmmImplicitOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_charmm_coul_charmm_omp.cpp b/src/USER-OMP/pair_lj_charmm_coul_charmm_omp.cpp index b61a80a178..f9230996f0 100644 --- a/src/USER-OMP/pair_lj_charmm_coul_charmm_omp.cpp +++ b/src/USER-OMP/pair_lj_charmm_coul_charmm_omp.cpp @@ -36,9 +36,7 @@ PairLJCharmmCoulCharmmOMP::PairLJCharmmCoulCharmmOMP(LAMMPS *lmp) : void PairLJCharmmCoulCharmmOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_charmm_coul_long_omp.cpp b/src/USER-OMP/pair_lj_charmm_coul_long_omp.cpp index 5351ab9aea..4bdaa3519f 100644 --- a/src/USER-OMP/pair_lj_charmm_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_charmm_coul_long_omp.cpp @@ -37,9 +37,7 @@ PairLJCharmmCoulLongOMP::PairLJCharmmCoulLongOMP(LAMMPS *lmp) : void PairLJCharmmCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_charmm_coul_long_soft_omp.cpp b/src/USER-OMP/pair_lj_charmm_coul_long_soft_omp.cpp index ea5d739e49..1f6daf052c 100644 --- a/src/USER-OMP/pair_lj_charmm_coul_long_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_charmm_coul_long_soft_omp.cpp @@ -37,9 +37,7 @@ PairLJCharmmCoulLongSoftOMP::PairLJCharmmCoulLongSoftOMP(LAMMPS *lmp) : void PairLJCharmmCoulLongSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_charmm_coul_msm_omp.cpp b/src/USER-OMP/pair_lj_charmm_coul_msm_omp.cpp index 3baa9597a8..eab62d919e 100644 --- a/src/USER-OMP/pair_lj_charmm_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_lj_charmm_coul_msm_omp.cpp @@ -42,9 +42,7 @@ void PairLJCharmmCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' " "with OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_class2_coul_cut_omp.cpp b/src/USER-OMP/pair_lj_class2_coul_cut_omp.cpp index 38390918c7..b9ffad134b 100644 --- a/src/USER-OMP/pair_lj_class2_coul_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_class2_coul_cut_omp.cpp @@ -36,9 +36,7 @@ PairLJClass2CoulCutOMP::PairLJClass2CoulCutOMP(LAMMPS *lmp) : void PairLJClass2CoulCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_class2_coul_long_omp.cpp b/src/USER-OMP/pair_lj_class2_coul_long_omp.cpp index f47672c9bc..e5995363ad 100644 --- a/src/USER-OMP/pair_lj_class2_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_class2_coul_long_omp.cpp @@ -44,9 +44,7 @@ PairLJClass2CoulLongOMP::PairLJClass2CoulLongOMP(LAMMPS *lmp) : void PairLJClass2CoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_class2_omp.cpp b/src/USER-OMP/pair_lj_class2_omp.cpp index 7ab4626c3e..67715572ae 100644 --- a/src/USER-OMP/pair_lj_class2_omp.cpp +++ b/src/USER-OMP/pair_lj_class2_omp.cpp @@ -36,9 +36,7 @@ PairLJClass2OMP::PairLJClass2OMP(LAMMPS *lmp) : void PairLJClass2OMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cubic_omp.cpp b/src/USER-OMP/pair_lj_cubic_omp.cpp index 3e8adb33b8..5fa4f92f45 100644 --- a/src/USER-OMP/pair_lj_cubic_omp.cpp +++ b/src/USER-OMP/pair_lj_cubic_omp.cpp @@ -37,9 +37,7 @@ PairLJCubicOMP::PairLJCubicOMP(LAMMPS *lmp) : void PairLJCubicOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_cut_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_cut_omp.cpp index ea560a09bf..69cc2d3042 100644 --- a/src/USER-OMP/pair_lj_cut_coul_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_cut_omp.cpp @@ -36,9 +36,7 @@ PairLJCutCoulCutOMP::PairLJCutCoulCutOMP(LAMMPS *lmp) : void PairLJCutCoulCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_cut_soft_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_cut_soft_omp.cpp index 4ef12bb1bb..5dfa414bd4 100644 --- a/src/USER-OMP/pair_lj_cut_coul_cut_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_cut_soft_omp.cpp @@ -36,9 +36,7 @@ PairLJCutCoulCutSoftOMP::PairLJCutCoulCutSoftOMP(LAMMPS *lmp) : void PairLJCutCoulCutSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_debye_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_debye_omp.cpp index 9163e98edd..4644e565a7 100644 --- a/src/USER-OMP/pair_lj_cut_coul_debye_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_debye_omp.cpp @@ -36,9 +36,7 @@ PairLJCutCoulDebyeOMP::PairLJCutCoulDebyeOMP(LAMMPS *lmp) : void PairLJCutCoulDebyeOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_dsf_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_dsf_omp.cpp index 9d9c098f87..13d877ec07 100644 --- a/src/USER-OMP/pair_lj_cut_coul_dsf_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_dsf_omp.cpp @@ -46,9 +46,7 @@ PairLJCutCoulDSFOMP::PairLJCutCoulDSFOMP(LAMMPS *lmp) : void PairLJCutCoulDSFOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_long_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_long_omp.cpp index d2eaae4ca4..d4fe5fd2a7 100644 --- a/src/USER-OMP/pair_lj_cut_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_long_omp.cpp @@ -45,9 +45,7 @@ PairLJCutCoulLongOMP::PairLJCutCoulLongOMP(LAMMPS *lmp) : void PairLJCutCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_long_soft_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_long_soft_omp.cpp index 725bfe4724..4a0ef73f60 100644 --- a/src/USER-OMP/pair_lj_cut_coul_long_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_long_soft_omp.cpp @@ -45,9 +45,7 @@ PairLJCutCoulLongSoftOMP::PairLJCutCoulLongSoftOMP(LAMMPS *lmp) : void PairLJCutCoulLongSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_msm_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_msm_omp.cpp index 234204af93..4c34b73622 100644 --- a/src/USER-OMP/pair_lj_cut_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_msm_omp.cpp @@ -42,9 +42,7 @@ void PairLJCutCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' " "with OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp index 36ef9d54f9..052be0a2fa 100644 --- a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp @@ -38,9 +38,7 @@ PairLJCutCoulWolfOMP::PairLJCutCoulWolfOMP(LAMMPS *lmp) : void PairLJCutCoulWolfOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_dipole_cut_omp.cpp b/src/USER-OMP/pair_lj_cut_dipole_cut_omp.cpp index d4145d9835..55359db3be 100644 --- a/src/USER-OMP/pair_lj_cut_dipole_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_dipole_cut_omp.cpp @@ -36,9 +36,7 @@ PairLJCutDipoleCutOMP::PairLJCutDipoleCutOMP(LAMMPS *lmp) : void PairLJCutDipoleCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_omp.cpp b/src/USER-OMP/pair_lj_cut_omp.cpp index 319257b56b..34068185d2 100644 --- a/src/USER-OMP/pair_lj_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_omp.cpp @@ -37,9 +37,7 @@ PairLJCutOMP::PairLJCutOMP(LAMMPS *lmp) : void PairLJCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_soft_omp.cpp b/src/USER-OMP/pair_lj_cut_soft_omp.cpp index 7698f19b95..9bbe58146c 100644 --- a/src/USER-OMP/pair_lj_cut_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_soft_omp.cpp @@ -37,9 +37,7 @@ PairLJCutSoftOMP::PairLJCutSoftOMP(LAMMPS *lmp) : void PairLJCutSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp index 536d5bcb86..85cab4fe7b 100644 --- a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp @@ -57,9 +57,7 @@ PairLJCutTholeLongOMP::PairLJCutTholeLongOMP(LAMMPS *lmp) : void PairLJCutTholeLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp index 619e970bb0..288724cd77 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp @@ -62,8 +62,7 @@ PairLJCutTIP4PCutOMP::~PairLJCutTIP4PCutOMP() void PairLJCutTIP4PCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp index ca8f450dc6..e2c1da1a89 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp @@ -62,8 +62,7 @@ PairLJCutTIP4PLongOMP::~PairLJCutTIP4PLongOMP() void PairLJCutTIP4PLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp index 80b17fba96..6baba8aec4 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp @@ -62,8 +62,7 @@ PairLJCutTIP4PLongSoftOMP::~PairLJCutTIP4PLongSoftOMP() void PairLJCutTIP4PLongSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_lj_expand_omp.cpp b/src/USER-OMP/pair_lj_expand_omp.cpp index 064ea97809..6c6ddb045e 100644 --- a/src/USER-OMP/pair_lj_expand_omp.cpp +++ b/src/USER-OMP/pair_lj_expand_omp.cpp @@ -36,9 +36,7 @@ PairLJExpandOMP::PairLJExpandOMP(LAMMPS *lmp) : void PairLJExpandOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_gromacs_coul_gromacs_omp.cpp b/src/USER-OMP/pair_lj_gromacs_coul_gromacs_omp.cpp index c87f369d11..77c5bc0da0 100644 --- a/src/USER-OMP/pair_lj_gromacs_coul_gromacs_omp.cpp +++ b/src/USER-OMP/pair_lj_gromacs_coul_gromacs_omp.cpp @@ -36,9 +36,7 @@ PairLJGromacsCoulGromacsOMP::PairLJGromacsCoulGromacsOMP(LAMMPS *lmp) : void PairLJGromacsCoulGromacsOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_gromacs_omp.cpp b/src/USER-OMP/pair_lj_gromacs_omp.cpp index 1d7cec5eef..15bcb08eed 100644 --- a/src/USER-OMP/pair_lj_gromacs_omp.cpp +++ b/src/USER-OMP/pair_lj_gromacs_omp.cpp @@ -36,9 +36,7 @@ PairLJGromacsOMP::PairLJGromacsOMP(LAMMPS *lmp) : void PairLJGromacsOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_long_coul_long_omp.cpp b/src/USER-OMP/pair_lj_long_coul_long_omp.cpp index 391840285b..c9edc087b6 100644 --- a/src/USER-OMP/pair_lj_long_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_coul_long_omp.cpp @@ -46,9 +46,8 @@ PairLJLongCoulLongOMP::PairLJLongCoulLongOMP(LAMMPS *lmp) : void PairLJLongCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); + const int order1 = ewald_order&(1<<1); const int order6 = ewald_order&(1<<6); diff --git a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp index 19278d19bb..6d7c5b5638 100644 --- a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp @@ -63,9 +63,7 @@ PairLJLongTIP4PLongOMP::~PairLJLongTIP4PLongOMP() void PairLJLongTIP4PLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // reallocate hneigh_thr & newsite_thr if necessary // initialize hneigh_thr[0] to -1 on steps when reneighboring occured diff --git a/src/USER-OMP/pair_lj_sdk_coul_long_omp.cpp b/src/USER-OMP/pair_lj_sdk_coul_long_omp.cpp index c87f26204e..16c87d5ed4 100644 --- a/src/USER-OMP/pair_lj_sdk_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_sdk_coul_long_omp.cpp @@ -38,9 +38,7 @@ PairLJSDKCoulLongOMP::PairLJSDKCoulLongOMP(LAMMPS *lmp) : void PairLJSDKCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_sdk_coul_msm_omp.cpp b/src/USER-OMP/pair_lj_sdk_coul_msm_omp.cpp index 8ff0cfe921..1002cc193e 100644 --- a/src/USER-OMP/pair_lj_sdk_coul_msm_omp.cpp +++ b/src/USER-OMP/pair_lj_sdk_coul_msm_omp.cpp @@ -44,9 +44,7 @@ void PairLJSDKCoulMSMOMP::compute(int eflag, int vflag) error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' " "with OMP MSM Pair styles"); - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_sdk_omp.cpp b/src/USER-OMP/pair_lj_sdk_omp.cpp index e107399316..1e64973cbb 100644 --- a/src/USER-OMP/pair_lj_sdk_omp.cpp +++ b/src/USER-OMP/pair_lj_sdk_omp.cpp @@ -40,9 +40,7 @@ PairLJSDKOMP::PairLJSDKOMP(LAMMPS *lmp) : void PairLJSDKOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_sf_dipole_sf_omp.cpp b/src/USER-OMP/pair_lj_sf_dipole_sf_omp.cpp index 250f6ff272..aea22fc4df 100644 --- a/src/USER-OMP/pair_lj_sf_dipole_sf_omp.cpp +++ b/src/USER-OMP/pair_lj_sf_dipole_sf_omp.cpp @@ -36,9 +36,7 @@ PairLJSFDipoleSFOMP::PairLJSFDipoleSFOMP(LAMMPS *lmp) : void PairLJSFDipoleSFOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_smooth_linear_omp.cpp b/src/USER-OMP/pair_lj_smooth_linear_omp.cpp index b06de641f5..420c55b0ed 100644 --- a/src/USER-OMP/pair_lj_smooth_linear_omp.cpp +++ b/src/USER-OMP/pair_lj_smooth_linear_omp.cpp @@ -36,9 +36,7 @@ PairLJSmoothLinearOMP::PairLJSmoothLinearOMP(LAMMPS *lmp) : void PairLJSmoothLinearOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lj_smooth_omp.cpp b/src/USER-OMP/pair_lj_smooth_omp.cpp index 36935616bf..d61dc19ff1 100644 --- a/src/USER-OMP/pair_lj_smooth_omp.cpp +++ b/src/USER-OMP/pair_lj_smooth_omp.cpp @@ -36,9 +36,7 @@ PairLJSmoothOMP::PairLJSmoothOMP(LAMMPS *lmp) : void PairLJSmoothOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lubricate_omp.cpp b/src/USER-OMP/pair_lubricate_omp.cpp index a7f9fc65b5..132dbc575e 100644 --- a/src/USER-OMP/pair_lubricate_omp.cpp +++ b/src/USER-OMP/pair_lubricate_omp.cpp @@ -54,9 +54,7 @@ PairLubricateOMP::~PairLubricateOMP() void PairLubricateOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_lubricate_poly_omp.cpp b/src/USER-OMP/pair_lubricate_poly_omp.cpp index 3f0ef1dba6..3a5f03364d 100644 --- a/src/USER-OMP/pair_lubricate_poly_omp.cpp +++ b/src/USER-OMP/pair_lubricate_poly_omp.cpp @@ -54,9 +54,7 @@ PairLubricatePolyOMP::~PairLubricatePolyOMP() void PairLubricatePolyOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_meam_spline_omp.cpp b/src/USER-OMP/pair_meam_spline_omp.cpp index dfc3b978a2..e9307c8666 100644 --- a/src/USER-OMP/pair_meam_spline_omp.cpp +++ b/src/USER-OMP/pair_meam_spline_omp.cpp @@ -39,9 +39,7 @@ PairMEAMSplineOMP::PairMEAMSplineOMP(LAMMPS *lmp) : void PairMEAMSplineOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_morse_omp.cpp b/src/USER-OMP/pair_morse_omp.cpp index 922b67b463..bf57019f11 100644 --- a/src/USER-OMP/pair_morse_omp.cpp +++ b/src/USER-OMP/pair_morse_omp.cpp @@ -36,9 +36,7 @@ PairMorseOMP::PairMorseOMP(LAMMPS *lmp) : void PairMorseOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_morse_smooth_linear_omp.cpp b/src/USER-OMP/pair_morse_smooth_linear_omp.cpp index 61cef69c37..5ba6acb439 100644 --- a/src/USER-OMP/pair_morse_smooth_linear_omp.cpp +++ b/src/USER-OMP/pair_morse_smooth_linear_omp.cpp @@ -40,9 +40,7 @@ PairMorseSmoothLinearOMP::PairMorseSmoothLinearOMP(LAMMPS *lmp) : void PairMorseSmoothLinearOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_nm_cut_coul_cut_omp.cpp b/src/USER-OMP/pair_nm_cut_coul_cut_omp.cpp index fcbf5dbabb..d62b4e5c62 100644 --- a/src/USER-OMP/pair_nm_cut_coul_cut_omp.cpp +++ b/src/USER-OMP/pair_nm_cut_coul_cut_omp.cpp @@ -36,9 +36,7 @@ PairNMCutCoulCutOMP::PairNMCutCoulCutOMP(LAMMPS *lmp) : void PairNMCutCoulCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_nm_cut_coul_long_omp.cpp b/src/USER-OMP/pair_nm_cut_coul_long_omp.cpp index b31387dbfe..a8696c74a1 100644 --- a/src/USER-OMP/pair_nm_cut_coul_long_omp.cpp +++ b/src/USER-OMP/pair_nm_cut_coul_long_omp.cpp @@ -44,9 +44,7 @@ PairNMCutCoulLongOMP::PairNMCutCoulLongOMP(LAMMPS *lmp) : void PairNMCutCoulLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_nm_cut_omp.cpp b/src/USER-OMP/pair_nm_cut_omp.cpp index 79cd046311..9304b10ef0 100644 --- a/src/USER-OMP/pair_nm_cut_omp.cpp +++ b/src/USER-OMP/pair_nm_cut_omp.cpp @@ -36,9 +36,7 @@ PairNMCutOMP::PairNMCutOMP(LAMMPS *lmp) : void PairNMCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_peri_lps_omp.cpp b/src/USER-OMP/pair_peri_lps_omp.cpp index 7b174face7..61db45363e 100644 --- a/src/USER-OMP/pair_peri_lps_omp.cpp +++ b/src/USER-OMP/pair_peri_lps_omp.cpp @@ -45,9 +45,7 @@ PairPeriLPSOMP::PairPeriLPSOMP(LAMMPS *lmp) : void PairPeriLPSOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_peri_pmb_omp.cpp b/src/USER-OMP/pair_peri_pmb_omp.cpp index 8199d8aa47..b1816e4052 100644 --- a/src/USER-OMP/pair_peri_pmb_omp.cpp +++ b/src/USER-OMP/pair_peri_pmb_omp.cpp @@ -43,9 +43,7 @@ PairPeriPMBOMP::PairPeriPMBOMP(LAMMPS *lmp) : void PairPeriPMBOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 63beb61be6..7f2db420bf 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -191,8 +191,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) int *num_hbonds = fix_reax->num_hbonds; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else ev_unset(); + ev_init(eflag,vflag); if (vflag_global) control->virial = 1; else control->virial = 0; diff --git a/src/USER-OMP/pair_resquared_omp.cpp b/src/USER-OMP/pair_resquared_omp.cpp index 1736e794f5..d9e0059a9f 100644 --- a/src/USER-OMP/pair_resquared_omp.cpp +++ b/src/USER-OMP/pair_resquared_omp.cpp @@ -38,9 +38,7 @@ PairRESquaredOMP::PairRESquaredOMP(LAMMPS *lmp) : void PairRESquaredOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_soft_omp.cpp b/src/USER-OMP/pair_soft_omp.cpp index a860ad97d9..eb151bc0df 100644 --- a/src/USER-OMP/pair_soft_omp.cpp +++ b/src/USER-OMP/pair_soft_omp.cpp @@ -40,9 +40,7 @@ PairSoftOMP::PairSoftOMP(LAMMPS *lmp) : void PairSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_sw_omp.cpp b/src/USER-OMP/pair_sw_omp.cpp index e323fc4c37..745b3a1f04 100644 --- a/src/USER-OMP/pair_sw_omp.cpp +++ b/src/USER-OMP/pair_sw_omp.cpp @@ -37,9 +37,7 @@ PairSWOMP::PairSWOMP(LAMMPS *lmp) : void PairSWOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_table_omp.cpp b/src/USER-OMP/pair_table_omp.cpp index d27456e1b5..b55817e75c 100644 --- a/src/USER-OMP/pair_table_omp.cpp +++ b/src/USER-OMP/pair_table_omp.cpp @@ -37,9 +37,7 @@ PairTableOMP::PairTableOMP(LAMMPS *lmp) : void PairTableOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_tersoff_mod_c_omp.cpp b/src/USER-OMP/pair_tersoff_mod_c_omp.cpp index fad077ca12..a11bd87640 100644 --- a/src/USER-OMP/pair_tersoff_mod_c_omp.cpp +++ b/src/USER-OMP/pair_tersoff_mod_c_omp.cpp @@ -36,9 +36,7 @@ PairTersoffMODCOMP::PairTersoffMODCOMP(LAMMPS *lmp) : void PairTersoffMODCOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_tersoff_mod_omp.cpp b/src/USER-OMP/pair_tersoff_mod_omp.cpp index 04e54c6e69..da22110c1c 100644 --- a/src/USER-OMP/pair_tersoff_mod_omp.cpp +++ b/src/USER-OMP/pair_tersoff_mod_omp.cpp @@ -36,9 +36,7 @@ PairTersoffMODOMP::PairTersoffMODOMP(LAMMPS *lmp) : void PairTersoffMODOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_tersoff_omp.cpp b/src/USER-OMP/pair_tersoff_omp.cpp index a5afdc7509..661f15d64d 100644 --- a/src/USER-OMP/pair_tersoff_omp.cpp +++ b/src/USER-OMP/pair_tersoff_omp.cpp @@ -37,9 +37,7 @@ PairTersoffOMP::PairTersoffOMP(LAMMPS *lmp) : void PairTersoffOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_tersoff_table_omp.cpp b/src/USER-OMP/pair_tersoff_table_omp.cpp index de045f9c62..7e83814f95 100644 --- a/src/USER-OMP/pair_tersoff_table_omp.cpp +++ b/src/USER-OMP/pair_tersoff_table_omp.cpp @@ -61,9 +61,7 @@ PairTersoffTableOMP::~PairTersoffTableOMP() void PairTersoffTableOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_tip4p_cut_omp.cpp b/src/USER-OMP/pair_tip4p_cut_omp.cpp index 85589cf043..1900ed4394 100644 --- a/src/USER-OMP/pair_tip4p_cut_omp.cpp +++ b/src/USER-OMP/pair_tip4p_cut_omp.cpp @@ -62,8 +62,7 @@ PairTIP4PCutOMP::~PairTIP4PCutOMP() void PairTIP4PCutOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_tip4p_long_omp.cpp b/src/USER-OMP/pair_tip4p_long_omp.cpp index c6c4bfe5fc..ee65937c46 100644 --- a/src/USER-OMP/pair_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_tip4p_long_omp.cpp @@ -62,8 +62,7 @@ PairTIP4PLongOMP::~PairTIP4PLongOMP() void PairTIP4PLongOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_tip4p_long_soft_omp.cpp b/src/USER-OMP/pair_tip4p_long_soft_omp.cpp index 7e9d3b6dff..adb984a2cd 100644 --- a/src/USER-OMP/pair_tip4p_long_soft_omp.cpp +++ b/src/USER-OMP/pair_tip4p_long_soft_omp.cpp @@ -62,8 +62,7 @@ PairTIP4PLongSoftOMP::~PairTIP4PLongSoftOMP() void PairTIP4PLongSoftOMP::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nlocal = atom->nlocal; const int nall = nlocal + atom->nghost; diff --git a/src/USER-OMP/pair_ufm_omp.cpp b/src/USER-OMP/pair_ufm_omp.cpp index ff258b5b3b..08d8cc15f9 100644 --- a/src/USER-OMP/pair_ufm_omp.cpp +++ b/src/USER-OMP/pair_ufm_omp.cpp @@ -38,9 +38,7 @@ PairUFMOMP::PairUFMOMP(LAMMPS *lmp) : void PairUFMOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_vashishta_omp.cpp b/src/USER-OMP/pair_vashishta_omp.cpp index 194a3e2d86..28104013f0 100644 --- a/src/USER-OMP/pair_vashishta_omp.cpp +++ b/src/USER-OMP/pair_vashishta_omp.cpp @@ -37,9 +37,7 @@ PairVashishtaOMP::PairVashishtaOMP(LAMMPS *lmp) : void PairVashishtaOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_vashishta_table_omp.cpp b/src/USER-OMP/pair_vashishta_table_omp.cpp index e0d96d8bb6..b044902ebe 100644 --- a/src/USER-OMP/pair_vashishta_table_omp.cpp +++ b/src/USER-OMP/pair_vashishta_table_omp.cpp @@ -37,9 +37,7 @@ PairVashishtaTableOMP::PairVashishtaTableOMP(LAMMPS *lmp) : void PairVashishtaTableOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_yukawa_colloid_omp.cpp b/src/USER-OMP/pair_yukawa_colloid_omp.cpp index c1d2133a1c..86314ce7b8 100644 --- a/src/USER-OMP/pair_yukawa_colloid_omp.cpp +++ b/src/USER-OMP/pair_yukawa_colloid_omp.cpp @@ -36,9 +36,7 @@ PairYukawaColloidOMP::PairYukawaColloidOMP(LAMMPS *lmp) : void PairYukawaColloidOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_yukawa_omp.cpp b/src/USER-OMP/pair_yukawa_omp.cpp index cbfd627f97..add81e9b04 100644 --- a/src/USER-OMP/pair_yukawa_omp.cpp +++ b/src/USER-OMP/pair_yukawa_omp.cpp @@ -36,9 +36,7 @@ PairYukawaOMP::PairYukawaOMP(LAMMPS *lmp) : void PairYukawaOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/pair_zbl_omp.cpp b/src/USER-OMP/pair_zbl_omp.cpp index 788679434b..f6856c4fa0 100644 --- a/src/USER-OMP/pair_zbl_omp.cpp +++ b/src/USER-OMP/pair_zbl_omp.cpp @@ -37,9 +37,7 @@ PairZBLOMP::PairZBLOMP(LAMMPS *lmp) : void PairZBLOMP::compute(int eflag, int vflag) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-QUIP/pair_quip.cpp b/src/USER-QUIP/pair_quip.cpp index fce6313754..c3b03bc5e0 100644 --- a/src/USER-QUIP/pair_quip.cpp +++ b/src/USER-QUIP/pair_quip.cpp @@ -75,8 +75,7 @@ void PairQUIP::compute(int eflag, int vflag) double *quip_local_e, *quip_force, *quip_local_virial, *quip_virial, quip_energy, *lattice; - if (eflag || vflag) ev_setup(eflag,vflag); - else ev_unset(); + ev_init(eflag,vflag); inum = list->inum; ilist = list->ilist; diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index b68e0d0779..b9d488d8cf 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -497,8 +497,7 @@ void PairReaxC::compute(int eflag, int vflag) int *num_hbonds = fix_reax->num_hbonds; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else ev_unset(); + ev_init(eflag,vflag); if (vflag_global) control->virial = 1; else control->virial = 0; diff --git a/src/USER-SDPD/pair_sdpd_taitwater_isothermal.cpp b/src/USER-SDPD/pair_sdpd_taitwater_isothermal.cpp index 7cfc950eff..db80debe51 100644 --- a/src/USER-SDPD/pair_sdpd_taitwater_isothermal.cpp +++ b/src/USER-SDPD/pair_sdpd_taitwater_isothermal.cpp @@ -71,8 +71,7 @@ void PairSDPDTaitwaterIsothermal::compute (int eflag, int vflag) { double rsq, tmp, wfd, delVdotDelR; double prefactor, wiener[3][3], f_random[3]; - if (eflag || vflag) ev_setup (eflag, vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **v = atom->vest; double **x = atom->x; diff --git a/src/USER-SMD/pair_smd_hertz.cpp b/src/USER-SMD/pair_smd_hertz.cpp index 13f48e995e..541be9f05c 100644 --- a/src/USER-SMD/pair_smd_hertz.cpp +++ b/src/USER-SMD/pair_smd_hertz.cpp @@ -87,10 +87,7 @@ void PairHertz::compute(int eflag, int vflag) { double *rmass = atom->rmass; evdwl = 0.0; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **f = atom->f; double **x = atom->x; diff --git a/src/USER-SMD/pair_smd_tlsph.cpp b/src/USER-SMD/pair_smd_tlsph.cpp index ab6b7d2785..ac67a3279a 100644 --- a/src/USER-SMD/pair_smd_tlsph.cpp +++ b/src/USER-SMD/pair_smd_tlsph.cpp @@ -448,10 +448,7 @@ void PairTlsph::ComputeForces(int eflag, int vflag) { Matrix3d eye; eye.setIdentity(); - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); /* * iterate over pairs of particles i, j and assign forces using PK1 stress tensor diff --git a/src/USER-SMD/pair_smd_triangulated_surface.cpp b/src/USER-SMD/pair_smd_triangulated_surface.cpp index e40c876ec3..d3a4983379 100644 --- a/src/USER-SMD/pair_smd_triangulated_surface.cpp +++ b/src/USER-SMD/pair_smd_triangulated_surface.cpp @@ -96,10 +96,7 @@ void PairTriSurf::compute(int eflag, int vflag) { Vector2d w2d, rhs; evdwl = 0.0; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); tagint *mol = atom->molecule; double **f = atom->f; diff --git a/src/USER-SMD/pair_smd_ulsph.cpp b/src/USER-SMD/pair_smd_ulsph.cpp index 50af6e2356..2c4a2de989 100644 --- a/src/USER-SMD/pair_smd_ulsph.cpp +++ b/src/USER-SMD/pair_smd_ulsph.cpp @@ -386,10 +386,7 @@ void PairULSPH::compute(int eflag, int vflag) { int k; SelfAdjointEigenSolver < Matrix3d > es; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); if (atom->nmax > nmax) { //printf("... allocating in compute with nmax = %d\n", atom->nmax); diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index 5c3189fc31..ba7f8eb88c 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -899,8 +899,7 @@ void PairSMTBQ::compute(int eflag, int vflag) evdwl = ecoul = ecovtot = ErepOO = ErepMO = Eion = 0.0; Eself = 0.0; - if (eflag || vflag) { ev_setup(eflag,vflag); } - else { evflag = vflag_fdotr = vflag_atom = 0; } + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-SPH/pair_sph_heatconduction.cpp b/src/USER-SPH/pair_sph_heatconduction.cpp index c93e8040b2..bafa26be89 100644 --- a/src/USER-SPH/pair_sph_heatconduction.cpp +++ b/src/USER-SPH/pair_sph_heatconduction.cpp @@ -52,10 +52,7 @@ void PairSPHHeatConduction::compute(int eflag, int vflag) { double imass, jmass, h, ih, ihsq; double rsq, wfd, D, deltaE; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **x = atom->x; double *e = atom->e; diff --git a/src/USER-SPH/pair_sph_idealgas.cpp b/src/USER-SPH/pair_sph_idealgas.cpp index d12ee06736..db5ec964bc 100644 --- a/src/USER-SPH/pair_sph_idealgas.cpp +++ b/src/USER-SPH/pair_sph_idealgas.cpp @@ -53,10 +53,7 @@ void PairSPHIdealGas::compute(int eflag, int vflag) { double vxtmp, vytmp, vztmp, imass, jmass, fi, fj, fvisc, h, ih, ihsq; double rsq, wfd, delVdotDelR, mu, deltaE, ci, cj; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **v = atom->vest; double **x = atom->x; diff --git a/src/USER-SPH/pair_sph_lj.cpp b/src/USER-SPH/pair_sph_lj.cpp index 3a30ecb5fa..7d315c975c 100644 --- a/src/USER-SPH/pair_sph_lj.cpp +++ b/src/USER-SPH/pair_sph_lj.cpp @@ -53,10 +53,7 @@ void PairSPHLJ::compute(int eflag, int vflag) { double vxtmp, vytmp, vztmp, imass, jmass, fi, fj, fvisc, h, ih, ihsq, ihcub; double rsq, wfd, delVdotDelR, mu, deltaE, ci, cj, lrc; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **v = atom->vest; double **x = atom->x; diff --git a/src/USER-SPH/pair_sph_rhosum.cpp b/src/USER-SPH/pair_sph_rhosum.cpp index 896a422782..842dddc744 100644 --- a/src/USER-SPH/pair_sph_rhosum.cpp +++ b/src/USER-SPH/pair_sph_rhosum.cpp @@ -72,10 +72,7 @@ void PairSPHRhoSum::compute(int eflag, int vflag) { // neighbor list variables int inum, *ilist, *numneigh, **firstneigh; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **x = atom->x; double *rho = atom->rho; diff --git a/src/USER-SPH/pair_sph_taitwater.cpp b/src/USER-SPH/pair_sph_taitwater.cpp index 9d5a417e5b..cf3c0e914b 100644 --- a/src/USER-SPH/pair_sph_taitwater.cpp +++ b/src/USER-SPH/pair_sph_taitwater.cpp @@ -58,10 +58,7 @@ void PairSPHTaitwater::compute(int eflag, int vflag) { double vxtmp, vytmp, vztmp, imass, jmass, fi, fj, fvisc, h, ih, ihsq; double rsq, tmp, wfd, delVdotDelR, mu, deltaE; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **v = atom->vest; double **x = atom->x; diff --git a/src/USER-SPH/pair_sph_taitwater_morris.cpp b/src/USER-SPH/pair_sph_taitwater_morris.cpp index fb745ac7da..5cbaa5959f 100644 --- a/src/USER-SPH/pair_sph_taitwater_morris.cpp +++ b/src/USER-SPH/pair_sph_taitwater_morris.cpp @@ -58,10 +58,7 @@ void PairSPHTaitwaterMorris::compute(int eflag, int vflag) { double vxtmp, vytmp, vztmp, imass, jmass, fi, fj, fvisc, h, ih, ihsq, velx, vely, velz; double rsq, tmp, wfd, delVdotDelR, deltaE; - if (eflag || vflag) - ev_setup(eflag, vflag); - else - evflag = vflag_fdotr = 0; + ev_init(eflag, vflag); double **v = atom->vest; double **x = atom->x; diff --git a/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp b/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp index 91c75d6945..f37dcc3ed1 100644 --- a/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp +++ b/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp @@ -91,8 +91,7 @@ void PairLJSwitch3CoulGaussLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp b/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp index aa656e5b2d..931ed1d116 100644 --- a/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp +++ b/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp @@ -91,8 +91,7 @@ void PairMM3Switch3CoulGaussLong::compute(int eflag, int vflag) double rsq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair.cpp b/src/pair.cpp index 44cf3a43ea..79b94ef597 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -688,8 +688,7 @@ double Pair::mix_distance(double sig1, double sig2) void Pair::compute_dummy(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- */ diff --git a/src/pair.h b/src/pair.h index 27b6d41eef..37606ed595 100644 --- a/src/pair.h +++ b/src/pair.h @@ -220,6 +220,10 @@ class Pair : protected Pointers { virtual void ev_setup(int, int, int alloc = 1); void ev_unset(); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else ev_unset(); + } void ev_tally_full(int, double, double, double, double, double, double); void ev_tally_xyz_full(int, double, double, double, double, double, double, double, double); diff --git a/src/pair_beck.cpp b/src/pair_beck.cpp index d9c0fb902c..17731ebf0b 100644 --- a/src/pair_beck.cpp +++ b/src/pair_beck.cpp @@ -63,8 +63,7 @@ void PairBeck::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_born.cpp b/src/pair_born.cpp index 1a1db9dd90..78434c91f8 100644 --- a/src/pair_born.cpp +++ b/src/pair_born.cpp @@ -71,8 +71,7 @@ void PairBorn::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_born_coul_dsf.cpp b/src/pair_born_coul_dsf.cpp index be7f41ca2b..2e565897b5 100644 --- a/src/pair_born_coul_dsf.cpp +++ b/src/pair_born_coul_dsf.cpp @@ -77,8 +77,7 @@ void PairBornCoulDSF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_born_coul_wolf.cpp b/src/pair_born_coul_wolf.cpp index 22dcfa9f2d..3bb0e39e57 100644 --- a/src/pair_born_coul_wolf.cpp +++ b/src/pair_born_coul_wolf.cpp @@ -76,8 +76,7 @@ void PairBornCoulWolf::compute(int eflag, int vflag) double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_buck.cpp b/src/pair_buck.cpp index 8b6d79234b..a3cf1a38d6 100644 --- a/src/pair_buck.cpp +++ b/src/pair_buck.cpp @@ -66,8 +66,7 @@ void PairBuck::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_buck_coul_cut.cpp b/src/pair_buck_coul_cut.cpp index 7eecb62121..c472ab456f 100644 --- a/src/pair_buck_coul_cut.cpp +++ b/src/pair_buck_coul_cut.cpp @@ -71,8 +71,7 @@ void PairBuckCoulCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_coul_cut.cpp b/src/pair_coul_cut.cpp index 8741abdb89..e7c0e0aabb 100644 --- a/src/pair_coul_cut.cpp +++ b/src/pair_coul_cut.cpp @@ -53,8 +53,7 @@ void PairCoulCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_coul_debye.cpp b/src/pair_coul_debye.cpp index 432a015598..c8afdabb93 100644 --- a/src/pair_coul_debye.cpp +++ b/src/pair_coul_debye.cpp @@ -40,8 +40,7 @@ void PairCoulDebye::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_coul_dsf.cpp b/src/pair_coul_dsf.cpp index 8cd5f7fece..e487ff171c 100644 --- a/src/pair_coul_dsf.cpp +++ b/src/pair_coul_dsf.cpp @@ -68,8 +68,7 @@ void PairCoulDSF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_coul_streitz.cpp b/src/pair_coul_streitz.cpp index 920770ed7f..244dccda12 100644 --- a/src/pair_coul_streitz.cpp +++ b/src/pair_coul_streitz.cpp @@ -412,8 +412,7 @@ void PairCoulStreitz::compute(int eflag, int vflag) ci_jfi = ci_fifj = dci_jfi = dci_fifj = 0.0; forcecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = vflag_atom = 0; + ev_init(eflag,vflag); inum = list->inum; ilist = list->ilist; diff --git a/src/pair_coul_wolf.cpp b/src/pair_coul_wolf.cpp index 762491166e..dbf21b8bee 100644 --- a/src/pair_coul_wolf.cpp +++ b/src/pair_coul_wolf.cpp @@ -64,8 +64,7 @@ void PairCoulWolf::compute(int eflag, int vflag) double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_dpd.cpp b/src/pair_dpd.cpp index 5c5fc4254b..914b4aee17 100644 --- a/src/pair_dpd.cpp +++ b/src/pair_dpd.cpp @@ -70,8 +70,7 @@ void PairDPD::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **v = atom->v; diff --git a/src/pair_dpd_tstat.cpp b/src/pair_dpd_tstat.cpp index f2c0b157ea..1207c954eb 100644 --- a/src/pair_dpd_tstat.cpp +++ b/src/pair_dpd_tstat.cpp @@ -43,8 +43,7 @@ void PairDPDTstat::compute(int eflag, int vflag) double rsq,r,rinv,dot,wd,randnum,factor_dpd; int *ilist,*jlist,*numneigh,**firstneigh; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); // adjust sigma if target T is changing diff --git a/src/pair_gauss.cpp b/src/pair_gauss.cpp index 426389753b..2d157d6cac 100644 --- a/src/pair_gauss.cpp +++ b/src/pair_gauss.cpp @@ -68,8 +68,7 @@ void PairGauss::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); int occ = 0; double **x = atom->x; diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 2b2304718c..4961ce35c6 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -1,3 +1,4 @@ + /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories @@ -95,9 +96,7 @@ void PairHybrid::compute(int eflag, int vflag) if (no_virial_fdotr_compute && vflag % 4 == 2) vflag = 1 + vflag/4 * 4; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // check if global component of incoming vflag = 2 // if so, reset vflag passed to substyle as if it were 0 diff --git a/src/pair_lj96_cut.cpp b/src/pair_lj96_cut.cpp index 457eba0e79..cefe9b87e0 100644 --- a/src/pair_lj96_cut.cpp +++ b/src/pair_lj96_cut.cpp @@ -73,8 +73,7 @@ void PairLJ96Cut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -308,8 +307,7 @@ void PairLJ96Cut::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cubic.cpp b/src/pair_lj_cubic.cpp index 770caa6359..fdbfca608f 100644 --- a/src/pair_lj_cubic.cpp +++ b/src/pair_lj_cubic.cpp @@ -67,8 +67,7 @@ void PairLJCubic::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cut.cpp b/src/pair_lj_cut.cpp index 13a546f5a5..2a0fcde3a5 100644 --- a/src/pair_lj_cut.cpp +++ b/src/pair_lj_cut.cpp @@ -73,8 +73,7 @@ void PairLJCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -305,8 +304,7 @@ void PairLJCut::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cut_coul_cut.cpp b/src/pair_lj_cut_coul_cut.cpp index 15c06ab36a..6f2ba75309 100644 --- a/src/pair_lj_cut_coul_cut.cpp +++ b/src/pair_lj_cut_coul_cut.cpp @@ -67,8 +67,7 @@ void PairLJCutCoulCut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cut_coul_debye.cpp b/src/pair_lj_cut_coul_debye.cpp index dfd866ca7a..cc6e92b2e3 100644 --- a/src/pair_lj_cut_coul_debye.cpp +++ b/src/pair_lj_cut_coul_debye.cpp @@ -37,8 +37,7 @@ void PairLJCutCoulDebye::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cut_coul_dsf.cpp b/src/pair_lj_cut_coul_dsf.cpp index a49af13fb2..a0f9824b7f 100644 --- a/src/pair_lj_cut_coul_dsf.cpp +++ b/src/pair_lj_cut_coul_dsf.cpp @@ -81,8 +81,7 @@ void PairLJCutCoulDSF::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp index fc8a858ce1..2f796ded12 100644 --- a/src/pair_lj_cut_coul_wolf.cpp +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -77,8 +77,7 @@ void PairLJCutCoulWolf::compute(int eflag, int vflag) evdwl = 0.0; ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_expand.cpp b/src/pair_lj_expand.cpp index 9aa58b3b88..662a1f8bd2 100644 --- a/src/pair_lj_expand.cpp +++ b/src/pair_lj_expand.cpp @@ -67,8 +67,7 @@ void PairLJExpand::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_gromacs.cpp b/src/pair_lj_gromacs.cpp index 495e96c368..bd19966ea3 100644 --- a/src/pair_lj_gromacs.cpp +++ b/src/pair_lj_gromacs.cpp @@ -75,8 +75,7 @@ void PairLJGromacs::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_gromacs_coul_gromacs.cpp b/src/pair_lj_gromacs_coul_gromacs.cpp index 414bfea92a..5821f26c81 100644 --- a/src/pair_lj_gromacs_coul_gromacs.cpp +++ b/src/pair_lj_gromacs_coul_gromacs.cpp @@ -72,8 +72,7 @@ void PairLJGromacsCoulGromacs::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_smooth.cpp b/src/pair_lj_smooth.cpp index a12046bb3b..ecacadbffa 100644 --- a/src/pair_lj_smooth.cpp +++ b/src/pair_lj_smooth.cpp @@ -72,8 +72,7 @@ void PairLJSmooth::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_lj_smooth_linear.cpp b/src/pair_lj_smooth_linear.cpp index 17c789bcee..265828c4cf 100644 --- a/src/pair_lj_smooth_linear.cpp +++ b/src/pair_lj_smooth_linear.cpp @@ -62,8 +62,7 @@ void PairLJSmoothLinear::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_mie_cut.cpp b/src/pair_mie_cut.cpp index c1e1c1ff50..231832dc48 100644 --- a/src/pair_mie_cut.cpp +++ b/src/pair_mie_cut.cpp @@ -75,8 +75,7 @@ void PairMIECut::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; @@ -310,8 +309,7 @@ void PairMIECut::compute_outer(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_morse.cpp b/src/pair_morse.cpp index c1031343e1..dca1834c14 100644 --- a/src/pair_morse.cpp +++ b/src/pair_morse.cpp @@ -59,8 +59,7 @@ void PairMorse::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_soft.cpp b/src/pair_soft.cpp index d1c51ac600..7602f7b925 100644 --- a/src/pair_soft.cpp +++ b/src/pair_soft.cpp @@ -58,8 +58,7 @@ void PairSoft::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_table.cpp b/src/pair_table.cpp index 04b1e4ceee..cf9e5c3bfb 100644 --- a/src/pair_table.cpp +++ b/src/pair_table.cpp @@ -74,8 +74,7 @@ void PairTable::compute(int eflag, int vflag) int tlm1 = tablength - 1; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_ufm.cpp b/src/pair_ufm.cpp index a9f076f504..226fb6e7d9 100644 --- a/src/pair_ufm.cpp +++ b/src/pair_ufm.cpp @@ -74,8 +74,7 @@ void PairUFM::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_yukawa.cpp b/src/pair_yukawa.cpp index af520fd3da..913afbd5a1 100644 --- a/src/pair_yukawa.cpp +++ b/src/pair_yukawa.cpp @@ -55,8 +55,7 @@ void PairYukawa::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_zbl.cpp b/src/pair_zbl.cpp index f23a1e5d56..254a82ea64 100644 --- a/src/pair_zbl.cpp +++ b/src/pair_zbl.cpp @@ -78,8 +78,7 @@ void PairZBL::compute(int eflag, int vflag) int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/pair_zero.cpp b/src/pair_zero.cpp index d423e196af..143808f598 100644 --- a/src/pair_zero.cpp +++ b/src/pair_zero.cpp @@ -50,8 +50,7 @@ PairZero::~PairZero() void PairZero::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; + ev_init(eflag,vflag); if (vflag_fdotr) virial_fdotr_compute(); } From 17c81295c23f4df5aef2599216231310dcf82ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:50:10 +0100 Subject: [PATCH 073/243] use ev_init for fixes --- src/LATTE/fix_latte.cpp | 3 +-- src/MOLECULE/fix_cmap.cpp | 3 +-- src/fix.h | 4 ++++ src/fix_external.cpp | 3 +-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index d1a96d32c6..645b298e09 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -239,8 +239,7 @@ void FixLatte::pre_reverse(int eflag, int /*vflag*/) void FixLatte::post_force(int vflag) { int eflag = eflag_caller; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // compute Coulombic potential = pe[i]/q[i] // invoke compute pe/atom diff --git a/src/MOLECULE/fix_cmap.cpp b/src/MOLECULE/fix_cmap.cpp index ec2588e61b..3395c7ef14 100644 --- a/src/MOLECULE/fix_cmap.cpp +++ b/src/MOLECULE/fix_cmap.cpp @@ -341,8 +341,7 @@ void FixCMAP::post_force(int vflag) ecmap = 0.0; int eflag = eflag_caller; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); for (n = 0; n < ncrosstermlist; n++) { i1 = crosstermlist[n][0]; diff --git a/src/fix.h b/src/fix.h index 21dfc955a8..f5b3338aee 100644 --- a/src/fix.h +++ b/src/fix.h @@ -224,6 +224,10 @@ class Fix : protected Pointers { int dynamic; // recount atoms for temperature computes void ev_setup(int, int); + void ev_init(int eflag, int vflag) { + if (eflag||vflag) ev_setup(eflag, vflag); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } void ev_tally(int, int *, double, double, double *); void v_setup(int); void v_tally(int, int *, double, double *); diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 5ac9206e7f..b1ffa65e49 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -141,8 +141,7 @@ void FixExternal::post_force(int vflag) bigint ntimestep = update->ntimestep; int eflag = eflag_caller; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // invoke the callback in driver program // it will fill fexternal with forces From c7af948dfca45ecf0c1e8c367724bcdefea7acc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:50:50 +0100 Subject: [PATCH 074/243] use ev_init for impropers --- src/CLASS2/improper_class2.cpp | 3 +-- src/KOKKOS/improper_class2_kokkos.cpp | 3 +-- src/KOKKOS/improper_harmonic_kokkos.cpp | 3 +-- src/MOLECULE/improper_cvff.cpp | 3 +-- src/MOLECULE/improper_harmonic.cpp | 3 +-- src/MOLECULE/improper_umbrella.cpp | 3 +-- src/USER-INTEL/improper_cvff_intel.cpp | 3 +-- src/USER-INTEL/improper_harmonic_intel.cpp | 3 +-- src/USER-MISC/improper_cossq.cpp | 3 +-- src/USER-MISC/improper_distance.cpp | 3 +-- src/USER-MISC/improper_fourier.cpp | 3 +-- src/USER-MISC/improper_ring.cpp | 3 +-- src/USER-MOFFF/improper_inversion_harmonic.cpp | 3 +-- src/USER-OMP/improper_class2_omp.cpp | 5 +---- src/USER-OMP/improper_cossq_omp.cpp | 5 +---- src/USER-OMP/improper_cvff_omp.cpp | 5 +---- src/USER-OMP/improper_fourier_omp.cpp | 5 +---- src/USER-OMP/improper_harmonic_omp.cpp | 5 +---- src/USER-OMP/improper_ring_omp.cpp | 5 +---- src/USER-OMP/improper_umbrella_omp.cpp | 5 +---- src/USER-YAFF/improper_distharm.cpp | 3 +-- src/USER-YAFF/improper_sqdistharm.cpp | 3 +-- src/improper.h | 4 ++++ src/improper_hybrid.cpp | 3 +-- src/improper_zero.cpp | 3 +-- 25 files changed, 28 insertions(+), 62 deletions(-) diff --git a/src/CLASS2/improper_class2.cpp b/src/CLASS2/improper_class2.cpp index 77f594af9d..ccb81aebd9 100644 --- a/src/CLASS2/improper_class2.cpp +++ b/src/CLASS2/improper_class2.cpp @@ -90,8 +90,7 @@ void ImproperClass2::compute(int eflag, int vflag) double fabcd[4][3]; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp index e3af52b494..ad32e6da4e 100644 --- a/src/KOKKOS/improper_class2_kokkos.cpp +++ b/src/KOKKOS/improper_class2_kokkos.cpp @@ -71,8 +71,7 @@ void ImproperClass2Kokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp index 4d41f3ef48..bb397a2c2f 100644 --- a/src/KOKKOS/improper_harmonic_kokkos.cpp +++ b/src/KOKKOS/improper_harmonic_kokkos.cpp @@ -71,8 +71,7 @@ void ImproperHarmonicKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/MOLECULE/improper_cvff.cpp b/src/MOLECULE/improper_cvff.cpp index 641eea74a8..01e9729e80 100644 --- a/src/MOLECULE/improper_cvff.cpp +++ b/src/MOLECULE/improper_cvff.cpp @@ -61,8 +61,7 @@ void ImproperCvff::compute(int eflag, int vflag) double a33,a12,a13,a23,sx2,sy2,sz2; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/improper_harmonic.cpp b/src/MOLECULE/improper_harmonic.cpp index 091bd46316..c5421fffdb 100644 --- a/src/MOLECULE/improper_harmonic.cpp +++ b/src/MOLECULE/improper_harmonic.cpp @@ -61,8 +61,7 @@ void ImproperHarmonic::compute(int eflag, int vflag) double sx2,sy2,sz2; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/improper_umbrella.cpp b/src/MOLECULE/improper_umbrella.cpp index 8ed3d3a84c..3de46df0f3 100644 --- a/src/MOLECULE/improper_umbrella.cpp +++ b/src/MOLECULE/improper_umbrella.cpp @@ -65,8 +65,7 @@ void ImproperUmbrella::compute(int eflag, int vflag) double ax,ay,az,ra2,rh2,ra,rh,rar,rhr,arx,ary,arz,hrx,hry,hrz; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-INTEL/improper_cvff_intel.cpp b/src/USER-INTEL/improper_cvff_intel.cpp index 03bd134b40..de316250c0 100644 --- a/src/USER-INTEL/improper_cvff_intel.cpp +++ b/src/USER-INTEL/improper_cvff_intel.cpp @@ -83,8 +83,7 @@ void ImproperCvffIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/improper_harmonic_intel.cpp b/src/USER-INTEL/improper_harmonic_intel.cpp index 167095150e..846c3cfbf9 100644 --- a/src/USER-INTEL/improper_harmonic_intel.cpp +++ b/src/USER-INTEL/improper_harmonic_intel.cpp @@ -84,8 +84,7 @@ void ImproperHarmonicIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-MISC/improper_cossq.cpp b/src/USER-MISC/improper_cossq.cpp index 2483840e42..c8eb0808fb 100644 --- a/src/USER-MISC/improper_cossq.cpp +++ b/src/USER-MISC/improper_cossq.cpp @@ -63,8 +63,7 @@ void ImproperCossq::compute(int eflag, int vflag) eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/improper_distance.cpp b/src/USER-MISC/improper_distance.cpp index 2edf37ec5c..50babcc84e 100644 --- a/src/USER-MISC/improper_distance.cpp +++ b/src/USER-MISC/improper_distance.cpp @@ -67,8 +67,7 @@ void ImproperDistance::compute(int eflag, int vflag) double domega,a; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/improper_fourier.cpp b/src/USER-MISC/improper_fourier.cpp index 927478fa1a..288d888d12 100644 --- a/src/USER-MISC/improper_fourier.cpp +++ b/src/USER-MISC/improper_fourier.cpp @@ -59,8 +59,7 @@ void ImproperFourier::compute(int eflag, int vflag) int i1,i2,i3,i4,n,type; double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; int **improperlist = neighbor->improperlist; diff --git a/src/USER-MISC/improper_ring.cpp b/src/USER-MISC/improper_ring.cpp index 70124b2ed1..36ba73af0f 100644 --- a/src/USER-MISC/improper_ring.cpp +++ b/src/USER-MISC/improper_ring.cpp @@ -95,8 +95,7 @@ void ImproperRing::compute(int eflag, int vflag) double cjiji, ckjji, ckjkj, fix, fiy, fiz, fjx, fjy, fjz, fkx, fky, fkz; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); /* References to simulation data. */ double **x = atom->x; diff --git a/src/USER-MOFFF/improper_inversion_harmonic.cpp b/src/USER-MOFFF/improper_inversion_harmonic.cpp index 8404984b53..3f1e61e54a 100644 --- a/src/USER-MOFFF/improper_inversion_harmonic.cpp +++ b/src/USER-MOFFF/improper_inversion_harmonic.cpp @@ -66,8 +66,7 @@ void ImproperInversionHarmonic::compute(int eflag, int vflag) double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; double rrvb1,rrvb2,rrvb3,rr2vb1,rr2vb2,rr2vb3; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; int **improperlist = neighbor->improperlist; diff --git a/src/USER-OMP/improper_class2_omp.cpp b/src/USER-OMP/improper_class2_omp.cpp index 7184cbeb69..c2b493f425 100644 --- a/src/USER-OMP/improper_class2_omp.cpp +++ b/src/USER-OMP/improper_class2_omp.cpp @@ -43,10 +43,7 @@ ImproperClass2OMP::ImproperClass2OMP(class LAMMPS *lmp) void ImproperClass2OMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_cossq_omp.cpp b/src/USER-OMP/improper_cossq_omp.cpp index 022cfa6adf..3b328e5b78 100644 --- a/src/USER-OMP/improper_cossq_omp.cpp +++ b/src/USER-OMP/improper_cossq_omp.cpp @@ -43,10 +43,7 @@ ImproperCossqOMP::ImproperCossqOMP(class LAMMPS *lmp) void ImproperCossqOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_cvff_omp.cpp b/src/USER-OMP/improper_cvff_omp.cpp index 78c5a55e05..fe1fc45bec 100644 --- a/src/USER-OMP/improper_cvff_omp.cpp +++ b/src/USER-OMP/improper_cvff_omp.cpp @@ -43,10 +43,7 @@ ImproperCvffOMP::ImproperCvffOMP(class LAMMPS *lmp) void ImproperCvffOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_fourier_omp.cpp b/src/USER-OMP/improper_fourier_omp.cpp index 77dd36b64f..b5af428cb9 100644 --- a/src/USER-OMP/improper_fourier_omp.cpp +++ b/src/USER-OMP/improper_fourier_omp.cpp @@ -43,10 +43,7 @@ ImproperFourierOMP::ImproperFourierOMP(class LAMMPS *lmp) void ImproperFourierOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_harmonic_omp.cpp b/src/USER-OMP/improper_harmonic_omp.cpp index 3f1895142d..6e02d0968e 100644 --- a/src/USER-OMP/improper_harmonic_omp.cpp +++ b/src/USER-OMP/improper_harmonic_omp.cpp @@ -43,10 +43,7 @@ ImproperHarmonicOMP::ImproperHarmonicOMP(class LAMMPS *lmp) void ImproperHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_ring_omp.cpp b/src/USER-OMP/improper_ring_omp.cpp index 7970de3839..e198b99337 100644 --- a/src/USER-OMP/improper_ring_omp.cpp +++ b/src/USER-OMP/improper_ring_omp.cpp @@ -45,10 +45,7 @@ ImproperRingOMP::ImproperRingOMP(class LAMMPS *lmp) void ImproperRingOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/improper_umbrella_omp.cpp b/src/USER-OMP/improper_umbrella_omp.cpp index 69d41176c6..ceaca35074 100644 --- a/src/USER-OMP/improper_umbrella_omp.cpp +++ b/src/USER-OMP/improper_umbrella_omp.cpp @@ -43,10 +43,7 @@ ImproperUmbrellaOMP::ImproperUmbrellaOMP(class LAMMPS *lmp) void ImproperUmbrellaOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-YAFF/improper_distharm.cpp b/src/USER-YAFF/improper_distharm.cpp index 9a54afed9a..b45087a9ab 100644 --- a/src/USER-YAFF/improper_distharm.cpp +++ b/src/USER-YAFF/improper_distharm.cpp @@ -67,8 +67,7 @@ void ImproperDistHarm::compute(int eflag, int vflag) double domega,a; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-YAFF/improper_sqdistharm.cpp b/src/USER-YAFF/improper_sqdistharm.cpp index 763d82f1c5..ae702820cb 100644 --- a/src/USER-YAFF/improper_sqdistharm.cpp +++ b/src/USER-YAFF/improper_sqdistharm.cpp @@ -67,8 +67,7 @@ void ImproperSQDistHarm::compute(int eflag, int vflag) double domega,a; eimproper = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/improper.h b/src/improper.h index adcf6d29c8..8ee2c2996d 100644 --- a/src/improper.h +++ b/src/improper.h @@ -57,6 +57,10 @@ class Improper : protected Pointers { int maxeatom,maxvatom; void ev_setup(int, int, int alloc = 1); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } void ev_tally(int, int, int, int, int, int, double, double *, double *, double *, double, double, double, double, double, double, double, double, double); diff --git a/src/improper_hybrid.cpp b/src/improper_hybrid.cpp index 3c17e42eaf..5fdcb42a96 100644 --- a/src/improper_hybrid.cpp +++ b/src/improper_hybrid.cpp @@ -104,8 +104,7 @@ void ImproperHybrid::compute(int eflag, int vflag) // set neighbor->improperlist to sub-style improperlist before call // accumulate sub-style global/peratom energy/virial in hybrid - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); for (m = 0; m < nstyles; m++) { neighbor->nimproperlist = nimproperlist[m]; diff --git a/src/improper_zero.cpp b/src/improper_zero.cpp index 8a1fa529c6..747dd57919 100644 --- a/src/improper_zero.cpp +++ b/src/improper_zero.cpp @@ -44,8 +44,7 @@ ImproperZero::~ImproperZero() void ImproperZero::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- */ From 6e6f9038181acc6348f8e2f53057dbeb05660fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:51:41 +0100 Subject: [PATCH 075/243] use ev_init for angles --- src/CLASS2/angle_class2.cpp | 3 +-- src/KOKKOS/angle_charmm_kokkos.cpp | 3 +-- src/KOKKOS/angle_class2_kokkos.cpp | 3 +-- src/KOKKOS/angle_cosine_kokkos.cpp | 3 +-- src/KOKKOS/angle_harmonic_kokkos.cpp | 3 +-- src/MOLECULE/angle_charmm.cpp | 3 +-- src/MOLECULE/angle_cosine.cpp | 3 +-- src/MOLECULE/angle_cosine_delta.cpp | 3 +-- src/MOLECULE/angle_cosine_periodic.cpp | 3 +-- src/MOLECULE/angle_cosine_squared.cpp | 3 +-- src/MOLECULE/angle_harmonic.cpp | 3 +-- src/MOLECULE/angle_table.cpp | 3 +-- src/USER-CGSDK/angle_sdk.cpp | 3 +-- src/USER-INTEL/angle_charmm_intel.cpp | 3 +-- src/USER-INTEL/angle_harmonic_intel.cpp | 3 +-- src/USER-MISC/angle_cosine_shift.cpp | 3 +-- src/USER-MISC/angle_cosine_shift_exp.cpp | 3 +-- src/USER-MISC/angle_dipole.cpp | 3 +-- src/USER-MISC/angle_fourier.cpp | 3 +-- src/USER-MISC/angle_fourier_simple.cpp | 3 +-- src/USER-MISC/angle_quartic.cpp | 3 +-- src/USER-MOFFF/angle_class2_p6.cpp | 3 +-- src/USER-MOFFF/angle_cosine_buck6d.cpp | 3 +-- src/USER-OMP/angle_charmm_omp.cpp | 5 +---- src/USER-OMP/angle_class2_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_delta_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_periodic_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_shift_exp_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_shift_omp.cpp | 5 +---- src/USER-OMP/angle_cosine_squared_omp.cpp | 5 +---- src/USER-OMP/angle_dipole_omp.cpp | 5 +---- src/USER-OMP/angle_fourier_omp.cpp | 5 +---- src/USER-OMP/angle_fourier_simple_omp.cpp | 5 +---- src/USER-OMP/angle_harmonic_omp.cpp | 5 +---- src/USER-OMP/angle_quartic_omp.cpp | 5 +---- src/USER-OMP/angle_sdk_omp.cpp | 5 +---- src/USER-OMP/angle_table_omp.cpp | 5 +---- src/USER-YAFF/angle_cross.cpp | 3 +-- src/USER-YAFF/angle_mm3.cpp | 3 +-- src/angle.h | 4 ++++ src/angle_hybrid.cpp | 3 +-- src/angle_zero.cpp | 3 +-- 43 files changed, 46 insertions(+), 114 deletions(-) diff --git a/src/CLASS2/angle_class2.cpp b/src/CLASS2/angle_class2.cpp index 24f41bfd58..d550767e5e 100644 --- a/src/CLASS2/angle_class2.cpp +++ b/src/CLASS2/angle_class2.cpp @@ -78,8 +78,7 @@ void AngleClass2::compute(int eflag, int vflag) double vx11,vx12,vy11,vy12,vz11,vz12,vx21,vx22,vy21,vy22,vz21,vz22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp index ec2955b28d..0f46c958d6 100644 --- a/src/KOKKOS/angle_charmm_kokkos.cpp +++ b/src/KOKKOS/angle_charmm_kokkos.cpp @@ -64,8 +64,7 @@ void AngleCharmmKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/angle_class2_kokkos.cpp b/src/KOKKOS/angle_class2_kokkos.cpp index fe5b1895fe..836714764d 100644 --- a/src/KOKKOS/angle_class2_kokkos.cpp +++ b/src/KOKKOS/angle_class2_kokkos.cpp @@ -64,8 +64,7 @@ void AngleClass2Kokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/angle_cosine_kokkos.cpp b/src/KOKKOS/angle_cosine_kokkos.cpp index 08faa254f4..4a4866948f 100644 --- a/src/KOKKOS/angle_cosine_kokkos.cpp +++ b/src/KOKKOS/angle_cosine_kokkos.cpp @@ -64,8 +64,7 @@ void AngleCosineKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/angle_harmonic_kokkos.cpp b/src/KOKKOS/angle_harmonic_kokkos.cpp index 8cdab2063a..dbe705800c 100644 --- a/src/KOKKOS/angle_harmonic_kokkos.cpp +++ b/src/KOKKOS/angle_harmonic_kokkos.cpp @@ -64,8 +64,7 @@ void AngleHarmonicKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/MOLECULE/angle_charmm.cpp b/src/MOLECULE/angle_charmm.cpp index 3608601c1f..efd1c682f7 100644 --- a/src/MOLECULE/angle_charmm.cpp +++ b/src/MOLECULE/angle_charmm.cpp @@ -61,8 +61,7 @@ void AngleCharmm::compute(int eflag, int vflag) double delxUB,delyUB,delzUB,rsqUB,rUB,dr,rk,forceUB; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_cosine.cpp b/src/MOLECULE/angle_cosine.cpp index 18763e1b76..6e1b9fa2fb 100644 --- a/src/MOLECULE/angle_cosine.cpp +++ b/src/MOLECULE/angle_cosine.cpp @@ -52,8 +52,7 @@ void AngleCosine::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_cosine_delta.cpp b/src/MOLECULE/angle_cosine_delta.cpp index 6f4f5c20d7..eca10970f2 100644 --- a/src/MOLECULE/angle_cosine_delta.cpp +++ b/src/MOLECULE/angle_cosine_delta.cpp @@ -44,8 +44,7 @@ void AngleCosineDelta::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,a,cot,a11,a12,a22,b11,b12,b22,c0,s0,s; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_cosine_periodic.cpp b/src/MOLECULE/angle_cosine_periodic.cpp index e8dd970b3b..cb0a26871a 100644 --- a/src/MOLECULE/angle_cosine_periodic.cpp +++ b/src/MOLECULE/angle_cosine_periodic.cpp @@ -61,8 +61,7 @@ void AngleCosinePeriodic::compute(int eflag, int vflag) double tn,tn_1,tn_2,un,un_1,un_2; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_cosine_squared.cpp b/src/MOLECULE/angle_cosine_squared.cpp index c83ba90a60..28d63344a4 100644 --- a/src/MOLECULE/angle_cosine_squared.cpp +++ b/src/MOLECULE/angle_cosine_squared.cpp @@ -62,8 +62,7 @@ void AngleCosineSquared::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_harmonic.cpp b/src/MOLECULE/angle_harmonic.cpp index d28afd76d6..48b493d9b2 100644 --- a/src/MOLECULE/angle_harmonic.cpp +++ b/src/MOLECULE/angle_harmonic.cpp @@ -58,8 +58,7 @@ void AngleHarmonic::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/angle_table.cpp b/src/MOLECULE/angle_table.cpp index 6c1af54dcf..7dd56ffb76 100644 --- a/src/MOLECULE/angle_table.cpp +++ b/src/MOLECULE/angle_table.cpp @@ -72,8 +72,7 @@ void AngleTable::compute(int eflag, int vflag) double theta,u,mdu; //mdu: minus du, -du/dx=f eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-CGSDK/angle_sdk.cpp b/src/USER-CGSDK/angle_sdk.cpp index 6b8245b491..823c725e07 100644 --- a/src/USER-CGSDK/angle_sdk.cpp +++ b/src/USER-CGSDK/angle_sdk.cpp @@ -68,8 +68,7 @@ void AngleSDK::compute(int eflag, int vflag) double rsq1,rsq2,rsq3,r1,r2,c,s,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-INTEL/angle_charmm_intel.cpp b/src/USER-INTEL/angle_charmm_intel.cpp index f2542fc0c7..c5ada951a5 100644 --- a/src/USER-INTEL/angle_charmm_intel.cpp +++ b/src/USER-INTEL/angle_charmm_intel.cpp @@ -78,8 +78,7 @@ void AngleCharmmIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/angle_harmonic_intel.cpp b/src/USER-INTEL/angle_harmonic_intel.cpp index 6d8901a5ee..aae6fcf0a2 100644 --- a/src/USER-INTEL/angle_harmonic_intel.cpp +++ b/src/USER-INTEL/angle_harmonic_intel.cpp @@ -78,8 +78,7 @@ void AngleHarmonicIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-MISC/angle_cosine_shift.cpp b/src/USER-MISC/angle_cosine_shift.cpp index a361db4970..18c87c81e3 100644 --- a/src/USER-MISC/angle_cosine_shift.cpp +++ b/src/USER-MISC/angle_cosine_shift.cpp @@ -62,8 +62,7 @@ void AngleCosineShift::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,s,cps,kcos,ksin,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/angle_cosine_shift_exp.cpp b/src/USER-MISC/angle_cosine_shift_exp.cpp index c87c73171a..8c6282de20 100644 --- a/src/USER-MISC/angle_cosine_shift_exp.cpp +++ b/src/USER-MISC/angle_cosine_shift_exp.cpp @@ -72,8 +72,7 @@ void AngleCosineShiftExp::compute(int eflag, int vflag) double exp2,aa,uumin,cccpsss,cssmscc; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/angle_dipole.cpp b/src/USER-MISC/angle_dipole.cpp index c4186da472..781da46869 100644 --- a/src/USER-MISC/angle_dipole.cpp +++ b/src/USER-MISC/angle_dipole.cpp @@ -59,8 +59,7 @@ void AngleDipole::compute(int eflag, int vflag) double r,cosGamma,deltaGamma,kdg,rmu; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; // position vector double **mu = atom->mu; // point-dipole components and moment magnitude diff --git a/src/USER-MISC/angle_fourier.cpp b/src/USER-MISC/angle_fourier.cpp index e6cc1f1a7e..8f5074ff5d 100644 --- a/src/USER-MISC/angle_fourier.cpp +++ b/src/USER-MISC/angle_fourier.cpp @@ -67,8 +67,7 @@ void AngleFourier::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,c2,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/angle_fourier_simple.cpp b/src/USER-MISC/angle_fourier_simple.cpp index 8464fe815c..615556bbe7 100644 --- a/src/USER-MISC/angle_fourier_simple.cpp +++ b/src/USER-MISC/angle_fourier_simple.cpp @@ -65,8 +65,7 @@ void AngleFourierSimple::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,cn,th,nth,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/angle_quartic.cpp b/src/USER-MISC/angle_quartic.cpp index 356f2df5d4..21a96100aa 100644 --- a/src/USER-MISC/angle_quartic.cpp +++ b/src/USER-MISC/angle_quartic.cpp @@ -61,8 +61,7 @@ void AngleQuartic::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MOFFF/angle_class2_p6.cpp b/src/USER-MOFFF/angle_class2_p6.cpp index d2a6e21e6b..e8e6f279de 100644 --- a/src/USER-MOFFF/angle_class2_p6.cpp +++ b/src/USER-MOFFF/angle_class2_p6.cpp @@ -79,8 +79,7 @@ void AngleClass2P6::compute(int eflag, int vflag) double vx11,vx12,vy11,vy12,vz11,vz12,vx21,vx22,vy21,vy22,vz21,vz22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MOFFF/angle_cosine_buck6d.cpp b/src/USER-MOFFF/angle_cosine_buck6d.cpp index f358097802..3829d2b8dc 100644 --- a/src/USER-MOFFF/angle_cosine_buck6d.cpp +++ b/src/USER-MOFFF/angle_cosine_buck6d.cpp @@ -69,8 +69,7 @@ void AngleCosineBuck6d::compute(int eflag, int vflag) double rcu,rqu,sme,smf; eangle = evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-3 virial contribution diff --git a/src/USER-OMP/angle_charmm_omp.cpp b/src/USER-OMP/angle_charmm_omp.cpp index 1f24438df3..118ba00226 100644 --- a/src/USER-OMP/angle_charmm_omp.cpp +++ b/src/USER-OMP/angle_charmm_omp.cpp @@ -44,10 +44,7 @@ using namespace MathConst; void AngleCharmmOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_class2_omp.cpp b/src/USER-OMP/angle_class2_omp.cpp index bd13e20bcc..e072d136e1 100644 --- a/src/USER-OMP/angle_class2_omp.cpp +++ b/src/USER-OMP/angle_class2_omp.cpp @@ -44,10 +44,7 @@ AngleClass2OMP::AngleClass2OMP(class LAMMPS *lmp) void AngleClass2OMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_delta_omp.cpp b/src/USER-OMP/angle_cosine_delta_omp.cpp index b3bb3e1f8a..a6dfb20433 100644 --- a/src/USER-OMP/angle_cosine_delta_omp.cpp +++ b/src/USER-OMP/angle_cosine_delta_omp.cpp @@ -44,10 +44,7 @@ AngleCosineDeltaOMP::AngleCosineDeltaOMP(class LAMMPS *lmp) void AngleCosineDeltaOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_omp.cpp b/src/USER-OMP/angle_cosine_omp.cpp index 04b3870bc4..9097c8569c 100644 --- a/src/USER-OMP/angle_cosine_omp.cpp +++ b/src/USER-OMP/angle_cosine_omp.cpp @@ -44,10 +44,7 @@ AngleCosineOMP::AngleCosineOMP(class LAMMPS *lmp) void AngleCosineOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_periodic_omp.cpp b/src/USER-OMP/angle_cosine_periodic_omp.cpp index 8060ebec7b..3fcea7ad1d 100644 --- a/src/USER-OMP/angle_cosine_periodic_omp.cpp +++ b/src/USER-OMP/angle_cosine_periodic_omp.cpp @@ -46,10 +46,7 @@ AngleCosinePeriodicOMP::AngleCosinePeriodicOMP(class LAMMPS *lmp) void AngleCosinePeriodicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_shift_exp_omp.cpp b/src/USER-OMP/angle_cosine_shift_exp_omp.cpp index 3e00681ec9..6bd2feb023 100644 --- a/src/USER-OMP/angle_cosine_shift_exp_omp.cpp +++ b/src/USER-OMP/angle_cosine_shift_exp_omp.cpp @@ -44,10 +44,7 @@ AngleCosineShiftExpOMP::AngleCosineShiftExpOMP(class LAMMPS *lmp) void AngleCosineShiftExpOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_shift_omp.cpp b/src/USER-OMP/angle_cosine_shift_omp.cpp index 0ab3df4359..56486faac1 100644 --- a/src/USER-OMP/angle_cosine_shift_omp.cpp +++ b/src/USER-OMP/angle_cosine_shift_omp.cpp @@ -44,10 +44,7 @@ AngleCosineShiftOMP::AngleCosineShiftOMP(class LAMMPS *lmp) void AngleCosineShiftOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_cosine_squared_omp.cpp b/src/USER-OMP/angle_cosine_squared_omp.cpp index a1b1ffdf1a..6dd2a3bb3b 100644 --- a/src/USER-OMP/angle_cosine_squared_omp.cpp +++ b/src/USER-OMP/angle_cosine_squared_omp.cpp @@ -44,10 +44,7 @@ AngleCosineSquaredOMP::AngleCosineSquaredOMP(class LAMMPS *lmp) void AngleCosineSquaredOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_dipole_omp.cpp b/src/USER-OMP/angle_dipole_omp.cpp index 92a5ba092e..da2e819ee2 100644 --- a/src/USER-OMP/angle_dipole_omp.cpp +++ b/src/USER-OMP/angle_dipole_omp.cpp @@ -45,10 +45,7 @@ AngleDipoleOMP::AngleDipoleOMP(class LAMMPS *lmp) void AngleDipoleOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); if (!force->newton_bond) error->all(FLERR,"'newton' flag for bonded interactions must be 'on'"); diff --git a/src/USER-OMP/angle_fourier_omp.cpp b/src/USER-OMP/angle_fourier_omp.cpp index dfc713c372..b2f9b47e05 100644 --- a/src/USER-OMP/angle_fourier_omp.cpp +++ b/src/USER-OMP/angle_fourier_omp.cpp @@ -44,10 +44,7 @@ AngleFourierOMP::AngleFourierOMP(class LAMMPS *lmp) void AngleFourierOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_fourier_simple_omp.cpp b/src/USER-OMP/angle_fourier_simple_omp.cpp index dea7a88723..93532a30e5 100644 --- a/src/USER-OMP/angle_fourier_simple_omp.cpp +++ b/src/USER-OMP/angle_fourier_simple_omp.cpp @@ -44,10 +44,7 @@ AngleFourierSimpleOMP::AngleFourierSimpleOMP(class LAMMPS *lmp) void AngleFourierSimpleOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_harmonic_omp.cpp b/src/USER-OMP/angle_harmonic_omp.cpp index 0a71e5c9dd..824b254287 100644 --- a/src/USER-OMP/angle_harmonic_omp.cpp +++ b/src/USER-OMP/angle_harmonic_omp.cpp @@ -44,10 +44,7 @@ AngleHarmonicOMP::AngleHarmonicOMP(class LAMMPS *lmp) void AngleHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_quartic_omp.cpp b/src/USER-OMP/angle_quartic_omp.cpp index 97a9b14f1d..fff08ddb39 100644 --- a/src/USER-OMP/angle_quartic_omp.cpp +++ b/src/USER-OMP/angle_quartic_omp.cpp @@ -44,10 +44,7 @@ AngleQuarticOMP::AngleQuarticOMP(class LAMMPS *lmp) void AngleQuarticOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_sdk_omp.cpp b/src/USER-OMP/angle_sdk_omp.cpp index 9383a9af83..e8c762092c 100644 --- a/src/USER-OMP/angle_sdk_omp.cpp +++ b/src/USER-OMP/angle_sdk_omp.cpp @@ -46,10 +46,7 @@ AngleSDKOMP::AngleSDKOMP(class LAMMPS *lmp) void AngleSDKOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/angle_table_omp.cpp b/src/USER-OMP/angle_table_omp.cpp index c3d2307489..d9d80b744d 100644 --- a/src/USER-OMP/angle_table_omp.cpp +++ b/src/USER-OMP/angle_table_omp.cpp @@ -44,10 +44,7 @@ AngleTableOMP::AngleTableOMP(class LAMMPS *lmp) void AngleTableOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-YAFF/angle_cross.cpp b/src/USER-YAFF/angle_cross.cpp index 6333c2f035..2e6731f494 100644 --- a/src/USER-YAFF/angle_cross.cpp +++ b/src/USER-YAFF/angle_cross.cpp @@ -67,8 +67,7 @@ void AngleCross::compute(int eflag, int vflag) double vx11,vx12,vy11,vy12,vz11,vz12,vx21,vx22,vy21,vy22,vz21,vz22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-YAFF/angle_mm3.cpp b/src/USER-YAFF/angle_mm3.cpp index 4e44f10408..53cb11b5df 100644 --- a/src/USER-YAFF/angle_mm3.cpp +++ b/src/USER-YAFF/angle_mm3.cpp @@ -61,8 +61,7 @@ void AngleMM3::compute(int eflag, int vflag) double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22; eangle = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/angle.h b/src/angle.h index 0247fa0ff8..196c2a44d1 100644 --- a/src/angle.h +++ b/src/angle.h @@ -59,6 +59,10 @@ class Angle : protected Pointers { int maxeatom,maxvatom; void ev_setup(int, int, int alloc = 1); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } void ev_tally(int, int, int, int, int, double, double *, double *, double, double, double, double, double, double); }; diff --git a/src/angle_hybrid.cpp b/src/angle_hybrid.cpp index c29eaac2ae..6afa7413b2 100644 --- a/src/angle_hybrid.cpp +++ b/src/angle_hybrid.cpp @@ -103,8 +103,7 @@ void AngleHybrid::compute(int eflag, int vflag) // set neighbor->anglelist to sub-style anglelist before call // accumulate sub-style global/peratom energy/virial in hybrid - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); for (m = 0; m < nstyles; m++) { neighbor->nanglelist = nanglelist[m]; diff --git a/src/angle_zero.cpp b/src/angle_zero.cpp index d7b7c9cdb5..6eb127fa58 100644 --- a/src/angle_zero.cpp +++ b/src/angle_zero.cpp @@ -47,8 +47,7 @@ AngleZero::~AngleZero() void AngleZero::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- */ From fbd600592b802cdcb3a45e0bbf3126ae5c1c702c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:53:22 +0100 Subject: [PATCH 076/243] use ev_init for dihedrals --- src/CLASS2/dihedral_class2.cpp | 3 +-- src/KOKKOS/dihedral_charmm_kokkos.cpp | 3 +-- src/KOKKOS/dihedral_class2_kokkos.cpp | 3 +-- src/KOKKOS/dihedral_opls_kokkos.cpp | 3 +-- src/MOLECULE/dihedral_charmm.cpp | 3 +-- src/MOLECULE/dihedral_charmmfsw.cpp | 3 +-- src/MOLECULE/dihedral_harmonic.cpp | 3 +-- src/MOLECULE/dihedral_helix.cpp | 3 +-- src/MOLECULE/dihedral_multi_harmonic.cpp | 3 +-- src/MOLECULE/dihedral_opls.cpp | 3 +-- src/USER-INTEL/dihedral_charmm_intel.cpp | 4 +--- src/USER-INTEL/dihedral_fourier_intel.cpp | 4 +--- src/USER-INTEL/dihedral_harmonic_intel.cpp | 4 +--- src/USER-INTEL/dihedral_opls_intel.cpp | 4 +--- src/USER-MISC/dihedral_cosine_shift_exp.cpp | 3 +-- src/USER-MISC/dihedral_fourier.cpp | 3 +-- src/USER-MISC/dihedral_nharmonic.cpp | 3 +-- src/USER-MISC/dihedral_quadratic.cpp | 3 +-- src/USER-MISC/dihedral_spherical.cpp | 3 +-- src/USER-MISC/dihedral_table.cpp | 3 +-- src/USER-MISC/dihedral_table_cut.cpp | 3 +-- src/USER-OMP/dihedral_charmm_omp.cpp | 5 +---- src/USER-OMP/dihedral_class2_omp.cpp | 5 +---- src/USER-OMP/dihedral_cosine_shift_exp_omp.cpp | 5 +---- src/USER-OMP/dihedral_fourier_omp.cpp | 5 +---- src/USER-OMP/dihedral_harmonic_omp.cpp | 5 +---- src/USER-OMP/dihedral_helix_omp.cpp | 5 +---- src/USER-OMP/dihedral_multi_harmonic_omp.cpp | 5 +---- src/USER-OMP/dihedral_nharmonic_omp.cpp | 5 +---- src/USER-OMP/dihedral_opls_omp.cpp | 5 +---- src/USER-OMP/dihedral_quadratic_omp.cpp | 5 +---- src/USER-OMP/dihedral_table_omp.cpp | 5 +---- src/dihedral.h | 4 ++++ src/dihedral_hybrid.cpp | 3 +-- src/dihedral_zero.cpp | 3 +-- 35 files changed, 38 insertions(+), 94 deletions(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index c6360dd846..c471b1f353 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -118,8 +118,7 @@ void DihedralClass2::compute(int eflag, int vflag) double fabcd[4][3]; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp index 3931309dc1..61ddcc425a 100644 --- a/src/KOKKOS/dihedral_charmm_kokkos.cpp +++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp @@ -69,8 +69,7 @@ void DihedralCharmmKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp index c7db07a6cb..98436bc696 100644 --- a/src/KOKKOS/dihedral_class2_kokkos.cpp +++ b/src/KOKKOS/dihedral_class2_kokkos.cpp @@ -69,8 +69,7 @@ void DihedralClass2Kokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp index 9d01cf1a54..f50dea2c36 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.cpp +++ b/src/KOKKOS/dihedral_opls_kokkos.cpp @@ -69,8 +69,7 @@ void DihedralOPLSKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/MOLECULE/dihedral_charmm.cpp b/src/MOLECULE/dihedral_charmm.cpp index 2372fae38b..68c62eb4fd 100644 --- a/src/MOLECULE/dihedral_charmm.cpp +++ b/src/MOLECULE/dihedral_charmm.cpp @@ -76,8 +76,7 @@ void DihedralCharmm::compute(int eflag, int vflag) double forcecoul,forcelj,fpair,ecoul,evdwl; edihedral = evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/MOLECULE/dihedral_charmmfsw.cpp b/src/MOLECULE/dihedral_charmmfsw.cpp index 99a5333620..f65d01e9ed 100644 --- a/src/MOLECULE/dihedral_charmmfsw.cpp +++ b/src/MOLECULE/dihedral_charmmfsw.cpp @@ -79,8 +79,7 @@ void DihedralCharmmfsw::compute(int eflag, int vflag) double forcecoul,forcelj,fpair,ecoul,evdwl; edihedral = evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/MOLECULE/dihedral_harmonic.cpp b/src/MOLECULE/dihedral_harmonic.cpp index cb122f4bc2..ddb94dc571 100644 --- a/src/MOLECULE/dihedral_harmonic.cpp +++ b/src/MOLECULE/dihedral_harmonic.cpp @@ -67,8 +67,7 @@ void DihedralHarmonic::compute(int eflag, int vflag) double c,s,p,sx2,sy2,sz2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/dihedral_helix.cpp b/src/MOLECULE/dihedral_helix.cpp index ae23b77951..6b6d19ecdf 100644 --- a/src/MOLECULE/dihedral_helix.cpp +++ b/src/MOLECULE/dihedral_helix.cpp @@ -67,8 +67,7 @@ void DihedralHelix::compute(int eflag, int vflag) double s2,cx,cy,cz,cmag,dx,phi,si,siinv,sin2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/dihedral_multi_harmonic.cpp b/src/MOLECULE/dihedral_multi_harmonic.cpp index f6461abb6e..f0097342a8 100644 --- a/src/MOLECULE/dihedral_multi_harmonic.cpp +++ b/src/MOLECULE/dihedral_multi_harmonic.cpp @@ -64,8 +64,7 @@ void DihedralMultiHarmonic::compute(int eflag, int vflag) double s2,sin2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/dihedral_opls.cpp b/src/MOLECULE/dihedral_opls.cpp index b5103413b2..293245e411 100644 --- a/src/MOLECULE/dihedral_opls.cpp +++ b/src/MOLECULE/dihedral_opls.cpp @@ -67,8 +67,7 @@ void DihedralOPLS::compute(int eflag, int vflag) double s2,cx,cy,cz,cmag,dx,phi,si,siinv,sin2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-INTEL/dihedral_charmm_intel.cpp b/src/USER-INTEL/dihedral_charmm_intel.cpp index c9237e7309..4f4b091300 100644 --- a/src/USER-INTEL/dihedral_charmm_intel.cpp +++ b/src/USER-INTEL/dihedral_charmm_intel.cpp @@ -84,9 +84,7 @@ void DihedralCharmmIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/USER-INTEL/dihedral_fourier_intel.cpp b/src/USER-INTEL/dihedral_fourier_intel.cpp index 6ccc165c61..030d371e44 100644 --- a/src/USER-INTEL/dihedral_fourier_intel.cpp +++ b/src/USER-INTEL/dihedral_fourier_intel.cpp @@ -73,9 +73,7 @@ void DihedralFourierIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/dihedral_harmonic_intel.cpp b/src/USER-INTEL/dihedral_harmonic_intel.cpp index ae5eb914e7..d84db4f4ac 100644 --- a/src/USER-INTEL/dihedral_harmonic_intel.cpp +++ b/src/USER-INTEL/dihedral_harmonic_intel.cpp @@ -73,9 +73,7 @@ void DihedralHarmonicIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/dihedral_opls_intel.cpp b/src/USER-INTEL/dihedral_opls_intel.cpp index 7a60b62cae..eae796974b 100644 --- a/src/USER-INTEL/dihedral_opls_intel.cpp +++ b/src/USER-INTEL/dihedral_opls_intel.cpp @@ -77,9 +77,7 @@ void DihedralOPLSIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-MISC/dihedral_cosine_shift_exp.cpp b/src/USER-MISC/dihedral_cosine_shift_exp.cpp index 82da173f8e..c1396aba11 100644 --- a/src/USER-MISC/dihedral_cosine_shift_exp.cpp +++ b/src/USER-MISC/dihedral_cosine_shift_exp.cpp @@ -68,8 +68,7 @@ void DihedralCosineShiftExp::compute(int eflag, int vflag) double cccpsss,cssmscc,exp2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/dihedral_fourier.cpp b/src/USER-MISC/dihedral_fourier.cpp index 7c405ee28c..af86259c01 100644 --- a/src/USER-MISC/dihedral_fourier.cpp +++ b/src/USER-MISC/dihedral_fourier.cpp @@ -79,8 +79,7 @@ void DihedralFourier::compute(int eflag, int vflag) double dtfx,dtfy,dtfz,dtgx,dtgy,dtgz,dthx,dthy,dthz; double c,s,p_,sx2,sy2,sz2; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/dihedral_nharmonic.cpp b/src/USER-MISC/dihedral_nharmonic.cpp index f8e8850680..189555946b 100644 --- a/src/USER-MISC/dihedral_nharmonic.cpp +++ b/src/USER-MISC/dihedral_nharmonic.cpp @@ -66,8 +66,7 @@ void DihedralNHarmonic::compute(int eflag, int vflag) double s2,sin2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/dihedral_quadratic.cpp b/src/USER-MISC/dihedral_quadratic.cpp index 1b64b52faf..4c65f2fd70 100644 --- a/src/USER-MISC/dihedral_quadratic.cpp +++ b/src/USER-MISC/dihedral_quadratic.cpp @@ -65,8 +65,7 @@ void DihedralQuadratic::compute(int eflag, int vflag) double s2,cx,cy,cz,cmag,dx,phi,si,siinv,sin2; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/dihedral_spherical.cpp b/src/USER-MISC/dihedral_spherical.cpp index 77fa885b7a..97cdf13801 100644 --- a/src/USER-MISC/dihedral_spherical.cpp +++ b/src/USER-MISC/dihedral_spherical.cpp @@ -213,8 +213,7 @@ void DihedralSpherical::compute(int eflag, int vflag) // perp34on23[d] = v34[d] - proj34on23[d] edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); for (n = 0; n < ndihedrallist; n++) { diff --git a/src/USER-MISC/dihedral_table.cpp b/src/USER-MISC/dihedral_table.cpp index e221a54a82..a97ae3649f 100644 --- a/src/USER-MISC/dihedral_table.cpp +++ b/src/USER-MISC/dihedral_table.cpp @@ -549,8 +549,7 @@ void DihedralTable::compute(int eflag, int vflag) edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); for (n = 0; n < ndihedrallist; n++) { diff --git a/src/USER-MISC/dihedral_table_cut.cpp b/src/USER-MISC/dihedral_table_cut.cpp index 6ebe094e50..a11ad94969 100644 --- a/src/USER-MISC/dihedral_table_cut.cpp +++ b/src/USER-MISC/dihedral_table_cut.cpp @@ -472,8 +472,7 @@ void DihedralTableCut::compute(int eflag, int vflag) double fabcd[4][3]; edihedral = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-OMP/dihedral_charmm_omp.cpp b/src/USER-OMP/dihedral_charmm_omp.cpp index 1bed449774..b09863613e 100644 --- a/src/USER-OMP/dihedral_charmm_omp.cpp +++ b/src/USER-OMP/dihedral_charmm_omp.cpp @@ -45,10 +45,7 @@ DihedralCharmmOMP::DihedralCharmmOMP(class LAMMPS *lmp) void DihedralCharmmOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/USER-OMP/dihedral_class2_omp.cpp b/src/USER-OMP/dihedral_class2_omp.cpp index c7ae1572c7..03ac9d9bab 100644 --- a/src/USER-OMP/dihedral_class2_omp.cpp +++ b/src/USER-OMP/dihedral_class2_omp.cpp @@ -43,10 +43,7 @@ DihedralClass2OMP::DihedralClass2OMP(class LAMMPS *lmp) void DihedralClass2OMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_cosine_shift_exp_omp.cpp b/src/USER-OMP/dihedral_cosine_shift_exp_omp.cpp index c43b990028..c64cad9fc3 100644 --- a/src/USER-OMP/dihedral_cosine_shift_exp_omp.cpp +++ b/src/USER-OMP/dihedral_cosine_shift_exp_omp.cpp @@ -43,10 +43,7 @@ DihedralCosineShiftExpOMP::DihedralCosineShiftExpOMP(class LAMMPS *lmp) void DihedralCosineShiftExpOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_fourier_omp.cpp b/src/USER-OMP/dihedral_fourier_omp.cpp index 319acb0beb..94bdae3795 100644 --- a/src/USER-OMP/dihedral_fourier_omp.cpp +++ b/src/USER-OMP/dihedral_fourier_omp.cpp @@ -44,10 +44,7 @@ DihedralFourierOMP::DihedralFourierOMP(class LAMMPS *lmp) void DihedralFourierOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_harmonic_omp.cpp b/src/USER-OMP/dihedral_harmonic_omp.cpp index bb659cf262..10ccbd3d9f 100644 --- a/src/USER-OMP/dihedral_harmonic_omp.cpp +++ b/src/USER-OMP/dihedral_harmonic_omp.cpp @@ -43,10 +43,7 @@ DihedralHarmonicOMP::DihedralHarmonicOMP(class LAMMPS *lmp) void DihedralHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_helix_omp.cpp b/src/USER-OMP/dihedral_helix_omp.cpp index e40f084e54..8c8e29cac0 100644 --- a/src/USER-OMP/dihedral_helix_omp.cpp +++ b/src/USER-OMP/dihedral_helix_omp.cpp @@ -46,10 +46,7 @@ DihedralHelixOMP::DihedralHelixOMP(class LAMMPS *lmp) void DihedralHelixOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_multi_harmonic_omp.cpp b/src/USER-OMP/dihedral_multi_harmonic_omp.cpp index e10fc7b94a..38961e1746 100644 --- a/src/USER-OMP/dihedral_multi_harmonic_omp.cpp +++ b/src/USER-OMP/dihedral_multi_harmonic_omp.cpp @@ -43,10 +43,7 @@ DihedralMultiHarmonicOMP::DihedralMultiHarmonicOMP(class LAMMPS *lmp) void DihedralMultiHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_nharmonic_omp.cpp b/src/USER-OMP/dihedral_nharmonic_omp.cpp index ad758fc892..e74238265d 100644 --- a/src/USER-OMP/dihedral_nharmonic_omp.cpp +++ b/src/USER-OMP/dihedral_nharmonic_omp.cpp @@ -43,10 +43,7 @@ DihedralNHarmonicOMP::DihedralNHarmonicOMP(class LAMMPS *lmp) void DihedralNHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_opls_omp.cpp b/src/USER-OMP/dihedral_opls_omp.cpp index 53fddf51cb..64eaffe6fe 100644 --- a/src/USER-OMP/dihedral_opls_omp.cpp +++ b/src/USER-OMP/dihedral_opls_omp.cpp @@ -44,10 +44,7 @@ DihedralOPLSOMP::DihedralOPLSOMP(class LAMMPS *lmp) void DihedralOPLSOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_quadratic_omp.cpp b/src/USER-OMP/dihedral_quadratic_omp.cpp index f6110cd505..8df622b847 100644 --- a/src/USER-OMP/dihedral_quadratic_omp.cpp +++ b/src/USER-OMP/dihedral_quadratic_omp.cpp @@ -44,10 +44,7 @@ DihedralQuadraticOMP::DihedralQuadraticOMP(class LAMMPS *lmp) void DihedralQuadraticOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/dihedral_table_omp.cpp b/src/USER-OMP/dihedral_table_omp.cpp index 1457f7b2bf..792ee90c26 100644 --- a/src/USER-OMP/dihedral_table_omp.cpp +++ b/src/USER-OMP/dihedral_table_omp.cpp @@ -111,10 +111,7 @@ DihedralTableOMP::DihedralTableOMP(class LAMMPS *lmp) void DihedralTableOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/dihedral.h b/src/dihedral.h index 627104871b..0769d79163 100644 --- a/src/dihedral.h +++ b/src/dihedral.h @@ -57,6 +57,10 @@ class Dihedral : protected Pointers { int maxeatom,maxvatom; void ev_setup(int, int, int alloc = 1); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } void ev_tally(int, int, int, int, int, int, double, double *, double *, double *, double, double, double, double, double, double, double, double, double); diff --git a/src/dihedral_hybrid.cpp b/src/dihedral_hybrid.cpp index b9107ac874..f3e4823d53 100644 --- a/src/dihedral_hybrid.cpp +++ b/src/dihedral_hybrid.cpp @@ -104,8 +104,7 @@ void DihedralHybrid::compute(int eflag, int vflag) // set neighbor->dihedrallist to sub-style dihedrallist before call // accumulate sub-style global/peratom energy/virial in hybrid - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); for (m = 0; m < nstyles; m++) { neighbor->ndihedrallist = ndihedrallist[m]; diff --git a/src/dihedral_zero.cpp b/src/dihedral_zero.cpp index 46facdb6db..8145d5f32d 100644 --- a/src/dihedral_zero.cpp +++ b/src/dihedral_zero.cpp @@ -44,8 +44,7 @@ DihedralZero::~DihedralZero() void DihedralZero::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- */ From ff2d8e55c99dca2a55a537b12f6e3dcf30b87b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:54:10 +0100 Subject: [PATCH 077/243] use ev_init for bonds --- src/CLASS2/bond_class2.cpp | 3 +-- src/KOKKOS/bond_class2_kokkos.cpp | 3 +-- src/KOKKOS/bond_fene_kokkos.cpp | 3 +-- src/KOKKOS/bond_harmonic_kokkos.cpp | 3 +-- src/MOLECULE/bond_fene.cpp | 3 +-- src/MOLECULE/bond_fene_expand.cpp | 3 +-- src/MOLECULE/bond_gromos.cpp | 3 +-- src/MOLECULE/bond_harmonic.cpp | 3 +-- src/MOLECULE/bond_morse.cpp | 3 +-- src/MOLECULE/bond_nonlinear.cpp | 3 +-- src/MOLECULE/bond_quartic.cpp | 3 +-- src/MOLECULE/bond_table.cpp | 3 +-- src/USER-CGDNA/bond_oxdna_fene.cpp | 3 +-- src/USER-INTEL/bond_fene_intel.cpp | 3 +-- src/USER-INTEL/bond_harmonic_intel.cpp | 3 +-- src/USER-MISC/bond_harmonic_shift.cpp | 3 +-- src/USER-MISC/bond_harmonic_shift_cut.cpp | 3 +-- src/USER-OMP/bond_class2_omp.cpp | 5 +---- src/USER-OMP/bond_fene_expand_omp.cpp | 5 +---- src/USER-OMP/bond_fene_omp.cpp | 5 +---- src/USER-OMP/bond_gromos_omp.cpp | 5 +---- src/USER-OMP/bond_harmonic_omp.cpp | 5 +---- src/USER-OMP/bond_harmonic_shift_cut_omp.cpp | 5 +---- src/USER-OMP/bond_harmonic_shift_omp.cpp | 5 +---- src/USER-OMP/bond_morse_omp.cpp | 5 +---- src/USER-OMP/bond_nonlinear_omp.cpp | 5 +---- src/USER-OMP/bond_quartic_omp.cpp | 5 +---- src/USER-OMP/bond_table_omp.cpp | 5 +---- src/USER-YAFF/bond_mm3.cpp | 3 +-- src/bond.h | 4 ++++ src/bond_hybrid.cpp | 3 +-- src/bond_zero.cpp | 3 +-- 32 files changed, 35 insertions(+), 84 deletions(-) diff --git a/src/CLASS2/bond_class2.cpp b/src/CLASS2/bond_class2.cpp index af20313e0a..26c4e63a4d 100644 --- a/src/CLASS2/bond_class2.cpp +++ b/src/CLASS2/bond_class2.cpp @@ -56,8 +56,7 @@ void BondClass2::compute(int eflag, int vflag) double rsq,r,dr,dr2,dr3,dr4,de_bond; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp index d84b3d390c..798fb41c92 100644 --- a/src/KOKKOS/bond_class2_kokkos.cpp +++ b/src/KOKKOS/bond_class2_kokkos.cpp @@ -60,8 +60,7 @@ void BondClass2Kokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp index d37943ba82..b5cdc1a05a 100644 --- a/src/KOKKOS/bond_fene_kokkos.cpp +++ b/src/KOKKOS/bond_fene_kokkos.cpp @@ -69,8 +69,7 @@ void BondFENEKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp index 6cdd4fe856..51a9fa4389 100644 --- a/src/KOKKOS/bond_harmonic_kokkos.cpp +++ b/src/KOKKOS/bond_harmonic_kokkos.cpp @@ -61,8 +61,7 @@ void BondHarmonicKokkos::compute(int eflag_in, int vflag_in) eflag = eflag_in; vflag = vflag_in; - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = 0; + ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary diff --git a/src/MOLECULE/bond_fene.cpp b/src/MOLECULE/bond_fene.cpp index 671290b0ad..c023a7e81e 100644 --- a/src/MOLECULE/bond_fene.cpp +++ b/src/MOLECULE/bond_fene.cpp @@ -54,8 +54,7 @@ void BondFENE::compute(int eflag, int vflag) double rsq,r0sq,rlogarg,sr2,sr6; ebond = sr6 = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_fene_expand.cpp b/src/MOLECULE/bond_fene_expand.cpp index 3e191683fb..b1bfdc6a1b 100644 --- a/src/MOLECULE/bond_fene_expand.cpp +++ b/src/MOLECULE/bond_fene_expand.cpp @@ -56,8 +56,7 @@ void BondFENEExpand::compute(int eflag, int vflag) double r,rshift,rshiftsq; ebond = sr6 = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_gromos.cpp b/src/MOLECULE/bond_gromos.cpp index 57091903af..f65adeb2cb 100644 --- a/src/MOLECULE/bond_gromos.cpp +++ b/src/MOLECULE/bond_gromos.cpp @@ -55,8 +55,7 @@ void BondGromos::compute(int eflag, int vflag) double delx,dely,delz,ebond,fbond; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_harmonic.cpp b/src/MOLECULE/bond_harmonic.cpp index fb4581d0d6..cb8434ce6e 100644 --- a/src/MOLECULE/bond_harmonic.cpp +++ b/src/MOLECULE/bond_harmonic.cpp @@ -52,8 +52,7 @@ void BondHarmonic::compute(int eflag, int vflag) double rsq,r,dr,rk; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_morse.cpp b/src/MOLECULE/bond_morse.cpp index 06af28f2b0..91dd2dbc49 100644 --- a/src/MOLECULE/bond_morse.cpp +++ b/src/MOLECULE/bond_morse.cpp @@ -53,8 +53,7 @@ void BondMorse::compute(int eflag, int vflag) double rsq,r,dr,ralpha; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_nonlinear.cpp b/src/MOLECULE/bond_nonlinear.cpp index 645b081779..9999ead47f 100644 --- a/src/MOLECULE/bond_nonlinear.cpp +++ b/src/MOLECULE/bond_nonlinear.cpp @@ -49,8 +49,7 @@ void BondNonlinear::compute(int eflag, int vflag) double rsq,r,dr,drsq,lamdasq,denom,denomsq; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/MOLECULE/bond_quartic.cpp b/src/MOLECULE/bond_quartic.cpp index f200030d6c..895202ff00 100644 --- a/src/MOLECULE/bond_quartic.cpp +++ b/src/MOLECULE/bond_quartic.cpp @@ -60,8 +60,7 @@ void BondQuartic::compute(int eflag, int vflag) double r,rsq,dr,r2,ra,rb,sr2,sr6; ebond = evdwl = sr6 = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index c75779922a..94e843eb65 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -68,8 +68,7 @@ void BondTable::compute(int eflag, int vflag) double u,mdu; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-CGDNA/bond_oxdna_fene.cpp b/src/USER-CGDNA/bond_oxdna_fene.cpp index 34a25a9b5a..8271668e3f 100644 --- a/src/USER-CGDNA/bond_oxdna_fene.cpp +++ b/src/USER-CGDNA/bond_oxdna_fene.cpp @@ -96,8 +96,7 @@ void BondOxdnaFene::compute(int eflag, int vflag) int newton_bond = force->newton_bond; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); // loop over FENE bonds diff --git a/src/USER-INTEL/bond_fene_intel.cpp b/src/USER-INTEL/bond_fene_intel.cpp index bff3722a44..bd8bc94c18 100644 --- a/src/USER-INTEL/bond_fene_intel.cpp +++ b/src/USER-INTEL/bond_fene_intel.cpp @@ -74,8 +74,7 @@ void BondFENEIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/bond_harmonic_intel.cpp b/src/USER-INTEL/bond_harmonic_intel.cpp index 65894efa05..4424b868eb 100644 --- a/src/USER-INTEL/bond_harmonic_intel.cpp +++ b/src/USER-INTEL/bond_harmonic_intel.cpp @@ -74,8 +74,7 @@ void BondHarmonicIntel::compute(int eflag, int vflag, IntelBuffers *buffers, const ForceConst &fc) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-MISC/bond_harmonic_shift.cpp b/src/USER-MISC/bond_harmonic_shift.cpp index b34f71e888..c7e4444cce 100644 --- a/src/USER-MISC/bond_harmonic_shift.cpp +++ b/src/USER-MISC/bond_harmonic_shift.cpp @@ -53,8 +53,7 @@ void BondHarmonicShift::compute(int eflag, int vflag) double rsq,r,dr,rk; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-MISC/bond_harmonic_shift_cut.cpp b/src/USER-MISC/bond_harmonic_shift_cut.cpp index a58df70878..5b396f5d72 100644 --- a/src/USER-MISC/bond_harmonic_shift_cut.cpp +++ b/src/USER-MISC/bond_harmonic_shift_cut.cpp @@ -53,8 +53,7 @@ void BondHarmonicShiftCut::compute(int eflag, int vflag) double rsq,r,dr,rk; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/USER-OMP/bond_class2_omp.cpp b/src/USER-OMP/bond_class2_omp.cpp index 1f9bcaa320..fdd73c20b0 100644 --- a/src/USER-OMP/bond_class2_omp.cpp +++ b/src/USER-OMP/bond_class2_omp.cpp @@ -40,10 +40,7 @@ BondClass2OMP::BondClass2OMP(class LAMMPS *lmp) void BondClass2OMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_fene_expand_omp.cpp b/src/USER-OMP/bond_fene_expand_omp.cpp index d002d454dd..a8eec11760 100644 --- a/src/USER-OMP/bond_fene_expand_omp.cpp +++ b/src/USER-OMP/bond_fene_expand_omp.cpp @@ -41,10 +41,7 @@ BondFENEExpandOMP::BondFENEExpandOMP(class LAMMPS *lmp) void BondFENEExpandOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_fene_omp.cpp b/src/USER-OMP/bond_fene_omp.cpp index ba958e1d6f..be7dcd4b49 100644 --- a/src/USER-OMP/bond_fene_omp.cpp +++ b/src/USER-OMP/bond_fene_omp.cpp @@ -41,10 +41,7 @@ BondFENEOMP::BondFENEOMP(class LAMMPS *lmp) void BondFENEOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_gromos_omp.cpp b/src/USER-OMP/bond_gromos_omp.cpp index bcfde436d5..8f0926c0e9 100644 --- a/src/USER-OMP/bond_gromos_omp.cpp +++ b/src/USER-OMP/bond_gromos_omp.cpp @@ -39,10 +39,7 @@ BondGromosOMP::BondGromosOMP(class LAMMPS *lmp) void BondGromosOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_harmonic_omp.cpp b/src/USER-OMP/bond_harmonic_omp.cpp index 46a93cbbdd..a3bb69c53c 100644 --- a/src/USER-OMP/bond_harmonic_omp.cpp +++ b/src/USER-OMP/bond_harmonic_omp.cpp @@ -39,10 +39,7 @@ BondHarmonicOMP::BondHarmonicOMP(class LAMMPS *lmp) void BondHarmonicOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_harmonic_shift_cut_omp.cpp b/src/USER-OMP/bond_harmonic_shift_cut_omp.cpp index 5f39bb1b64..5c16e27a32 100644 --- a/src/USER-OMP/bond_harmonic_shift_cut_omp.cpp +++ b/src/USER-OMP/bond_harmonic_shift_cut_omp.cpp @@ -39,10 +39,7 @@ BondHarmonicShiftCutOMP::BondHarmonicShiftCutOMP(class LAMMPS *lmp) void BondHarmonicShiftCutOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_harmonic_shift_omp.cpp b/src/USER-OMP/bond_harmonic_shift_omp.cpp index 8c260bfc9b..39e957c137 100644 --- a/src/USER-OMP/bond_harmonic_shift_omp.cpp +++ b/src/USER-OMP/bond_harmonic_shift_omp.cpp @@ -39,10 +39,7 @@ BondHarmonicShiftOMP::BondHarmonicShiftOMP(class LAMMPS *lmp) void BondHarmonicShiftOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_morse_omp.cpp b/src/USER-OMP/bond_morse_omp.cpp index 0c3cded71a..c0203de0d6 100644 --- a/src/USER-OMP/bond_morse_omp.cpp +++ b/src/USER-OMP/bond_morse_omp.cpp @@ -39,10 +39,7 @@ BondMorseOMP::BondMorseOMP(class LAMMPS *lmp) void BondMorseOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_nonlinear_omp.cpp b/src/USER-OMP/bond_nonlinear_omp.cpp index cdc70eac8d..8fa3daf8ab 100644 --- a/src/USER-OMP/bond_nonlinear_omp.cpp +++ b/src/USER-OMP/bond_nonlinear_omp.cpp @@ -39,10 +39,7 @@ BondNonlinearOMP::BondNonlinearOMP(class LAMMPS *lmp) void BondNonlinearOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-OMP/bond_quartic_omp.cpp b/src/USER-OMP/bond_quartic_omp.cpp index b2b1696bb4..fd0ccaf79d 100644 --- a/src/USER-OMP/bond_quartic_omp.cpp +++ b/src/USER-OMP/bond_quartic_omp.cpp @@ -40,10 +40,7 @@ BondQuarticOMP::BondQuarticOMP(class LAMMPS *lmp) void BondQuarticOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/USER-OMP/bond_table_omp.cpp b/src/USER-OMP/bond_table_omp.cpp index 71dc237496..1616988385 100644 --- a/src/USER-OMP/bond_table_omp.cpp +++ b/src/USER-OMP/bond_table_omp.cpp @@ -39,10 +39,7 @@ BondTableOMP::BondTableOMP(class LAMMPS *lmp) void BondTableOMP::compute(int eflag, int vflag) { - - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = 0; + ev_init(eflag,vflag); const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; diff --git a/src/USER-YAFF/bond_mm3.cpp b/src/USER-YAFF/bond_mm3.cpp index 1c464ff895..ee1ebcdd61 100644 --- a/src/USER-YAFF/bond_mm3.cpp +++ b/src/USER-YAFF/bond_mm3.cpp @@ -54,8 +54,7 @@ void BondMM3::compute(int eflag, int vflag) double rsq,r,dr,dr2,de_bond,K3,K4; ebond = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; diff --git a/src/bond.h b/src/bond.h index 9c353a1a6d..1082748403 100644 --- a/src/bond.h +++ b/src/bond.h @@ -65,6 +65,10 @@ class Bond : protected Pointers { int maxeatom,maxvatom; void ev_setup(int, int, int alloc = 1); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } void ev_tally(int, int, int, int, double, double, double, double, double); }; diff --git a/src/bond_hybrid.cpp b/src/bond_hybrid.cpp index 4e5a26f731..65609b4b6e 100644 --- a/src/bond_hybrid.cpp +++ b/src/bond_hybrid.cpp @@ -103,8 +103,7 @@ void BondHybrid::compute(int eflag, int vflag) // set neighbor->bondlist to sub-style bondlist before call // accumulate sub-style global/peratom energy/virial in hybrid - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); for (m = 0; m < nstyles; m++) { neighbor->nbondlist = nbondlist[m]; diff --git a/src/bond_zero.cpp b/src/bond_zero.cpp index 9fcf300b21..0847cf9e6b 100644 --- a/src/bond_zero.cpp +++ b/src/bond_zero.cpp @@ -45,8 +45,7 @@ BondZero::~BondZero() void BondZero::compute(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- */ From 985fc86aa3f8e907c8dae04321db2b6464c007eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=BCtter?= Date: Wed, 13 Mar 2019 17:55:30 +0100 Subject: [PATCH 078/243] use ev_init for kspace --- src/GPU/pppm_gpu.cpp | 4 +--- src/KOKKOS/pppm_kokkos.cpp | 3 +-- src/KSPACE/ewald.cpp | 4 +--- src/KSPACE/ewald_disp.cpp | 3 +-- src/KSPACE/msm.cpp | 4 +--- src/KSPACE/msm_cg.cpp | 4 +--- src/KSPACE/pppm.cpp | 4 +--- src/KSPACE/pppm_cg.cpp | 4 +--- src/KSPACE/pppm_disp.cpp | 4 +--- src/KSPACE/pppm_stagger.cpp | 4 +--- src/USER-INTEL/pppm_disp_intel.cpp | 4 +--- src/USER-INTEL/pppm_intel.cpp | 4 +--- src/USER-OMP/ewald_omp.cpp | 4 +--- src/USER-OMP/msm_cg_omp.cpp | 4 +--- src/USER-SCAFACOS/scafacos.cpp | 7 +------ src/kspace.cpp | 4 +--- src/kspace.h | 4 ++++ 17 files changed, 20 insertions(+), 49 deletions(-) diff --git a/src/GPU/pppm_gpu.cpp b/src/GPU/pppm_gpu.cpp index 4b460b1280..1bb1a39703 100644 --- a/src/GPU/pppm_gpu.cpp +++ b/src/GPU/pppm_gpu.cpp @@ -199,9 +199,7 @@ void PPPMGPU::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // If need per-atom energies/virials, allocate per-atom arrays here // so that particle map on host can be done concurrently with GPU calculations diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index bcac29ba9b..c233ca6264 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -615,8 +615,7 @@ void PPPMKokkos::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag,0); - else evflag = evflag_atom = eflag_global = vflag_global = + ev_init(eflag,vflag,0); eflag_atom = vflag_atom = 0; // reallocate per-atom arrays if necessary diff --git a/src/KSPACE/ewald.cpp b/src/KSPACE/ewald.cpp index 283c672bad..ccbb3ed708 100644 --- a/src/KSPACE/ewald.cpp +++ b/src/KSPACE/ewald.cpp @@ -365,9 +365,7 @@ void Ewald::compute(int eflag, int vflag) // set energy/virial flags - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // if atom count has changed, update qsum and qsqsum diff --git a/src/KSPACE/ewald_disp.cpp b/src/KSPACE/ewald_disp.cpp index 4cbdf7b9cb..0603d68eb2 100644 --- a/src/KSPACE/ewald_disp.cpp +++ b/src/KSPACE/ewald_disp.cpp @@ -688,8 +688,7 @@ void EwaldDisp::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (!peratom_allocate_flag && (eflag_atom || vflag_atom)) { allocate_peratom(); diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index d8964ffa67..d7cc3f6876 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -454,9 +454,7 @@ void MSM::compute(int eflag, int vflag) // set energy/virial flags - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = eflag_either = vflag_either = 0; + ev_init(eflag,vflag); if (scalar_pressure_flag && vflag_either) { if (vflag_atom) diff --git a/src/KSPACE/msm_cg.cpp b/src/KSPACE/msm_cg.cpp index 55435e5a6e..c7896db50c 100644 --- a/src/KSPACE/msm_cg.cpp +++ b/src/KSPACE/msm_cg.cpp @@ -90,9 +90,7 @@ void MSMCG::compute(int eflag, int vflag) // set energy/virial flags - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = eflag_either = vflag_either = 0; + ev_init(eflag,vflag); // invoke allocate_peratom() if needed for first time diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 8fd74d00dc..773305bb5e 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -630,9 +630,7 @@ void PPPM::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/KSPACE/pppm_cg.cpp b/src/KSPACE/pppm_cg.cpp index fa73588363..3285dba21c 100644 --- a/src/KSPACE/pppm_cg.cpp +++ b/src/KSPACE/pppm_cg.cpp @@ -88,9 +88,7 @@ void PPPMCG::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index 687ea0b3f9..45dce0895b 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -928,9 +928,7 @@ void PPPMDisp::compute(int eflag, int vflag) int i; // convert atoms from box to lamda coords - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/KSPACE/pppm_stagger.cpp b/src/KSPACE/pppm_stagger.cpp index ca369cf260..a5ed6de626 100644 --- a/src/KSPACE/pppm_stagger.cpp +++ b/src/KSPACE/pppm_stagger.cpp @@ -124,9 +124,7 @@ void PPPMStagger::compute(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/USER-INTEL/pppm_disp_intel.cpp b/src/USER-INTEL/pppm_disp_intel.cpp index 795fe1a47d..9d075c78a1 100644 --- a/src/USER-INTEL/pppm_disp_intel.cpp +++ b/src/USER-INTEL/pppm_disp_intel.cpp @@ -174,9 +174,7 @@ void PPPMDispIntel::compute(int eflag, int vflag) int i; // convert atoms from box to lamda coords - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/USER-INTEL/pppm_intel.cpp b/src/USER-INTEL/pppm_intel.cpp index 59455bcf52..e3d1e7d4aa 100644 --- a/src/USER-INTEL/pppm_intel.cpp +++ b/src/USER-INTEL/pppm_intel.cpp @@ -161,9 +161,7 @@ void PPPMIntel::compute_first(int eflag, int vflag) // set energy/virial flags // invoke allocate_peratom() if needed for first time - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/USER-OMP/ewald_omp.cpp b/src/USER-OMP/ewald_omp.cpp index 1fece5c31b..b56fc25142 100644 --- a/src/USER-OMP/ewald_omp.cpp +++ b/src/USER-OMP/ewald_omp.cpp @@ -61,9 +61,7 @@ void EwaldOMP::compute(int eflag, int vflag) { // set energy/virial flags - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); // extend size of per-atom arrays if necessary diff --git a/src/USER-OMP/msm_cg_omp.cpp b/src/USER-OMP/msm_cg_omp.cpp index dee9fd85b6..8a920e05d5 100644 --- a/src/USER-OMP/msm_cg_omp.cpp +++ b/src/USER-OMP/msm_cg_omp.cpp @@ -90,9 +90,7 @@ void MSMCGOMP::compute(int eflag, int vflag) // set energy/virial flags - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = eflag_either = vflag_either = 0; + ev_init(eflag,vflag); // invoke allocate_peratom() if needed for first time diff --git a/src/USER-SCAFACOS/scafacos.cpp b/src/USER-SCAFACOS/scafacos.cpp index 4b8e10123c..497442fbe8 100644 --- a/src/USER-SCAFACOS/scafacos.cpp +++ b/src/USER-SCAFACOS/scafacos.cpp @@ -197,12 +197,7 @@ void Scafacos::compute(int eflag, int vflag) fcs_set_redistribute((FCS)fcs,0); } - if (eflag || vflag) ev_setup(eflag,vflag); - else - { - eflag_atom = 0; - vflag_global = 0; - } + ev_init(eflag,vflag); // grow xpbc, epot, efield if necessary diff --git a/src/kspace.cpp b/src/kspace.cpp index 25491cd964..0144ea59a3 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -168,9 +168,7 @@ void KSpace::triclinic_check() void KSpace::compute_dummy(int eflag, int vflag) { - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = evflag_atom = eflag_global = vflag_global = - eflag_atom = vflag_atom = 0; + ev_init(eflag,vflag); } /* ---------------------------------------------------------------------- diff --git a/src/kspace.h b/src/kspace.h index f29659d0e8..12cb16c929 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -195,6 +195,10 @@ class KSpace : protected Pointers { void pair_check(); void ev_setup(int, int, int alloc = 1); + void ev_init(int eflag, int vflag, int alloc = 1) { + if (eflag||vflag) ev_setup(eflag, vflag, alloc); + else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; + } double estimate_table_accuracy(double, double); }; From 5608f87c15a94fc4ab1ce4b0302b5a2ecc2dcd37 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Wed, 13 Mar 2019 21:55:17 -0600 Subject: [PATCH 079/243] bond/react:unfix_deletes_internal_groups --- doc/src/fix_bond_react.txt | 4 ++++ src/USER-MISC/fix_bond_react.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_bond_react.txt b/doc/src/fix_bond_react.txt index 5da0f33e3a..af443ede92 100644 --- a/doc/src/fix_bond_react.txt +++ b/doc/src/fix_bond_react.txt @@ -385,6 +385,10 @@ No parameter of this fix can be used with the {start/stop} keywords of the "run"_run.html command. This fix is not invoked during "energy minimization"_minimize.html. +When fix bond/react is 'unfixed,' all internally-created groups are +deleted. Therefore, fix bond/react can only be unfixed after unfixing +all other fixes that use any group created by fix bond/react. + [Restrictions:] This fix is part of the USER-MISC package. It is only enabled if diff --git a/src/USER-MISC/fix_bond_react.cpp b/src/USER-MISC/fix_bond_react.cpp index c5df3ed438..5d624ad7f4 100644 --- a/src/USER-MISC/fix_bond_react.cpp +++ b/src/USER-MISC/fix_bond_react.cpp @@ -457,8 +457,6 @@ FixBondReact::~FixBondReact() memory->destroy(global_mega_glove); if (stabilization_flag == 1) { - delete [] exclude_group; - // check nfix in case all fixes have already been deleted if (id_fix1 && modify->nfix) modify->delete_fix(id_fix1); delete [] id_fix1; @@ -473,6 +471,18 @@ FixBondReact::~FixBondReact() delete [] statted_id; delete [] guess_branch; delete [] pioneer_count; + + char **newarg; + newarg = new char*[2]; + newarg[0] = master_group; + newarg[1] = (char *) "delete"; + group->assign(2,newarg); + if (stabilization_flag == 1) { + newarg[0] = exclude_group; + group->assign(2,newarg); + delete [] exclude_group; + } + delete [] newarg; } /* ---------------------------------------------------------------------- */ From a3c936d2839329bfd9a0dd4c3cafb5220879d84a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 14 Mar 2019 15:13:02 -0600 Subject: [PATCH 080/243] bug fixes for new local hyperdynamics reduced comm --- src/REPLICA/fix_hyper_local.cpp | 2 +- src/comm_brick.cpp | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index a2af3dff6e..21ad2cd86a 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -1197,7 +1197,7 @@ int FixHyperLocal::pack_reverse_comm(int n, int first, double *buf) int nonzero = 0; m++; // placeholder for count of atoms for (i = first; i < last; i++) { - if (maxstrain[i] == 0.0) continue; + if (maxstrain_domain[i] == 0.0) continue; nonzero++; buf[m++] = ubuf(i-first).d; // which atom is next buf[m++] = maxstrain_domain[i]; // value diff --git a/src/comm_brick.cpp b/src/comm_brick.cpp index bf7f3e2f8f..64b21e41c9 100644 --- a/src/comm_brick.cpp +++ b/src/comm_brick.cpp @@ -1046,6 +1046,10 @@ void CommBrick::reverse_comm_fix(Fix *fix, int size) reverse communication invoked by a Fix with variable size data query fix for pack size to insure buf_send is big enough handshake sizes before each Irecv/Send to insure buf_recv is big enough + this removes the if tests on sendnum and recvnum to make MPI calls, + as in reverse_comm_fix(), b/c the caller may still want to + exchange a message even if the send/recv swap has no atoms, + e.g. a reduced count = 0 of atoms to send/recv, as in fix hyper/local ------------------------------------------------------------------------- */ void CommBrick::reverse_comm_fix_variable(Fix *fix) @@ -1069,14 +1073,13 @@ void CommBrick::reverse_comm_fix_variable(Fix *fix) MPI_Sendrecv(&nsend,1,MPI_INT,recvproc[iswap],0, &nrecv,1,MPI_INT,sendproc[iswap],0,world, MPI_STATUS_IGNORE); - if (sendnum[iswap]) { - if (nrecv > maxrecv) grow_recv(nrecv); - MPI_Irecv(buf_recv,maxrecv,MPI_DOUBLE,sendproc[iswap],0, - world,&request); - } - if (recvnum[iswap]) - MPI_Send(buf_send,nsend,MPI_DOUBLE,recvproc[iswap],0,world); - if (sendnum[iswap]) MPI_Wait(&request,MPI_STATUS_IGNORE); + + if (nrecv > maxrecv) grow_recv(nrecv); + MPI_Irecv(buf_recv,maxrecv,MPI_DOUBLE,sendproc[iswap],0, + world,&request); + + MPI_Send(buf_send,nsend,MPI_DOUBLE,recvproc[iswap],0,world); + MPI_Wait(&request,MPI_STATUS_IGNORE); buf = buf_recv; } else buf = buf_send; From 3abfce01caab080498564eaa99b093af04bfc57f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:06:03 -0400 Subject: [PATCH 081/243] remove diverged fix wall/gran/omp --- src/Purge.list | 3 + src/USER-OMP/fix_wall_gran_omp.cpp | 186 ----------------------------- src/USER-OMP/fix_wall_gran_omp.h | 38 ------ 3 files changed, 3 insertions(+), 224 deletions(-) delete mode 100644 src/USER-OMP/fix_wall_gran_omp.cpp delete mode 100644 src/USER-OMP/fix_wall_gran_omp.h diff --git a/src/Purge.list b/src/Purge.list index 6cfc580c25..430f842d7c 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -24,6 +24,9 @@ style_nstencil.h style_ntopo.h # other auto-generated files lmpinstalledpkgs.h +# removed on 15 March 2019 +fix_wall_gran_omp.h +fix_wall_gran_omp.cpp # renamed on 25 September 2018 compute_smd_triangle_mesh_vertices.h compute_smd_triangle_mesh_vertices.cpp diff --git a/src/USER-OMP/fix_wall_gran_omp.cpp b/src/USER-OMP/fix_wall_gran_omp.cpp deleted file mode 100644 index d45e748b6a..0000000000 --- a/src/USER-OMP/fix_wall_gran_omp.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer (Temple U) -------------------------------------------------------------------------- */ - -#include -#include "fix_wall_gran_omp.h" -#include "atom.h" -#include "memory.h" -#include "neighbor.h" -#include "update.h" - -using namespace LAMMPS_NS; -using namespace FixConst; - -enum{XPLANE=0,YPLANE=1,ZPLANE=2,ZCYLINDER,REGION}; // XYZ PLANE need to be 0,1,2 -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,BONDED_HISTORY}; - -#define BIG 1.0e20 - -/* ---------------------------------------------------------------------- */ - -FixWallGranOMP::FixWallGranOMP(LAMMPS *lmp, int narg, char **arg) : - FixWallGran(lmp, narg, arg) { } - -/* ---------------------------------------------------------------------- */ - -void FixWallGranOMP::post_force(int vflag) -{ - double vwall[3]; - - // if just reneighbored: - // update rigid body masses for owned atoms if using FixRigid - // body[i] = which body atom I is in, -1 if none - // mass_body = mass of each rigid body - - if (neighbor->ago == 0 && fix_rigid) { - int tmp; - const int * const body = (const int * const) fix_rigid->extract("body",tmp); - double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); - if (atom->nmax > nmax) { - memory->destroy(mass_rigid); - nmax = atom->nmax; - memory->create(mass_rigid,nmax,"wall/gran:mass_rigid"); - } - const int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) { - if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; - else mass_rigid[i] = 0.0; - } - } - - // set position of wall to initial settings and velocity to 0.0 - // if wiggle or shear, set wall position and velocity accordingly - - double wlo = lo; - double whi = hi; - vwall[0] = vwall[1] = vwall[2] = 0.0; - if (wiggle) { - double arg = omega * (update->ntimestep - time_origin) * dt; - if (wallstyle == axis) { - wlo = lo + amplitude - amplitude*cos(arg); - whi = hi + amplitude - amplitude*cos(arg); - } - vwall[axis] = amplitude*omega*sin(arg); - } else if (wshear) vwall[axis] = vshear; - - // loop over all my atoms - // rsq = distance from wall - // dx,dy,dz = signed distance from wall - // for rotating cylinder, reset vwall based on particle position - // skip atom if not close enough to wall - // if wall was set to NULL, it's skipped since lo/hi are infinity - // compute force and torque on atom if close enough to wall - // via wall potential matched to pair potential - // set shear if pair potential stores history - - double * const * const x = atom->x; - double * const * const v = atom->v; - double * const * const f = atom->f; - double * const * const omega = atom->omega; - double * const * const torque = atom->torque; - double * const radius = atom->radius; - double * const rmass = atom->rmass; - const int * const mask = atom->mask; - const int nlocal = atom->nlocal; - - shearupdate = (update->setupflag) ? 0 : 1; - - int i; -#if defined(_OPENMP) -#pragma omp parallel for private(i) default(none) firstprivate(vwall,wlo,whi) -#endif - for (i = 0; i < nlocal; i++) { - - if (mask[i] & groupbit) { - double dx,dy,dz,del1,del2,delxy,delr,rsq; - double rwall = 0.0; - - dx = dy = dz = 0.0; - - if (wallstyle == XPLANE) { - del1 = x[i][0] - wlo; - del2 = whi - x[i][0]; - if (del1 < del2) dx = del1; - else dx = -del2; - } else if (wallstyle == YPLANE) { - del1 = x[i][1] - wlo; - del2 = whi - x[i][1]; - if (del1 < del2) dy = del1; - else dy = -del2; - } else if (wallstyle == ZPLANE) { - del1 = x[i][2] - wlo; - del2 = whi - x[i][2]; - if (del1 < del2) dz = del1; - else dz = -del2; - } else if (wallstyle == ZCYLINDER) { - delxy = sqrt(x[i][0]*x[i][0] + x[i][1]*x[i][1]); - delr = cylradius - delxy; - if (delr > radius[i]) { - dz = cylradius; - rwall = 0.0; - } else { - dx = -delr/delxy * x[i][0]; - dy = -delr/delxy * x[i][1]; - rwall = (delxy < cylradius) ? -2*cylradius : 2*cylradius; - if (wshear && axis != 2) { - vwall[0] += vshear * x[i][1]/delxy; - vwall[1] += -vshear * x[i][0]/delxy; - vwall[2] = 0.0; - } - } - } - - rsq = dx*dx + dy*dy + dz*dz; - - if (rsq > radius[i]*radius[i]) { - if (history) - for (int j = 0; j < sheardim; j++) - shearone[i][j] = 0.0; - - } else { - - // meff = effective mass of sphere - // if I is part of rigid body, use body mass - - double meff = rmass[i]; - if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; - - // invoke sphere/wall interaction - - if (pairstyle == HOOKE) - hooke(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff); - else if (pairstyle == HOOKE_HISTORY) - hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); - else if (pairstyle == HERTZ_HISTORY) - hertz_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); - else if (pairstyle == BONDED_HISTORY) - bonded_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], - omega[i],torque[i],radius[i],meff,shearone[i]); - } - } - } -} - -/* ---------------------------------------------------------------------- */ - -void FixWallGranOMP::post_force_respa(int vflag, int ilevel, int iloop) -{ - if (ilevel == nlevels_respa-1) post_force(vflag); -} diff --git a/src/USER-OMP/fix_wall_gran_omp.h b/src/USER-OMP/fix_wall_gran_omp.h deleted file mode 100644 index cd26a7b40a..0000000000 --- a/src/USER-OMP/fix_wall_gran_omp.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef FIX_CLASS - -FixStyle(wall/gran/omp,FixWallGranOMP) - -#else - -#ifndef LMP_FIX_WALL_GRAN_OMP_H -#define LMP_FIX_WALL_GRAN_OMP_H - -#include "fix_wall_gran.h" - -namespace LAMMPS_NS { - -class FixWallGranOMP : public FixWallGran { - - public: - FixWallGranOMP(class LAMMPS *, int, char **); - virtual void post_force(int); - virtual void post_force_respa(int, int, int); -}; - -} - -#endif -#endif From 3f0f2383b460d219bdadb36773b9d70f6097f2ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:18:04 -0400 Subject: [PATCH 082/243] fix spelling and record false positives --- doc/src/pair_granular.txt | 21 ++++++++++----------- doc/utils/sphinx-config/false_positives.txt | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 7a58435a83..5854a8faf6 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -111,8 +111,7 @@ For the {hertz/material} model, the force is given by: Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) is the effective Young's modulus, with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that -if the elastic and shear moduli of the -two particles are the same, the {hertz/material} +if the elastic modulus and the shear modulus of the two particles are the same, the {hertz/material} model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) The {dmt} model corresponds to the "(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, @@ -188,7 +187,7 @@ for all models except {jkr}, for which it is given implicitly according to \(del In this case, \eta_\{n0\}\ is in units of 1/({time}*{distance}). The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the -damping coefficient specified as part of the normal model is intepreted +damping coefficient specified as part of the normal model is interpreted as a restitution coefficient \(e\). The damping constant \(\eta_n\) is given by: \begin\{equation\} @@ -242,7 +241,7 @@ The tangential damping force \(\mathbf\{F\}_\mathrm\{t,damp\}\) is given by: \mathbf\{F\}_\mathrm\{t,damp\} = -\eta_t \mathbf\{v\}_\{t,rel\} \end\{equation\} -The tangetial damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): +The tangential damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): \begin\{equation\} \eta_t = -x_\{\gamma,t\} \eta_n \end\{equation\} @@ -292,7 +291,7 @@ duration of the contact: \mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau \end\{equation\} -This accumlated tangential displacement must be adjusted to account for changes +This accumulated tangential displacement must be adjusted to account for changes in the frame of reference of the contacting pair of particles during contact. This occurs due to the overall motion of the contacting particles in a rigid-body-like fashion during the duration of the contact. There are two modes of motion @@ -304,7 +303,7 @@ made by rotating the accumulated displacement into the plane that is tangential to the contact vector at each step, or equivalently removing any component of the tangential displacement that lies along \(\mathbf\{n\}\), and rescaling to preserve the magnitude. -This folllows the discussion in "Luding"_#Luding2008, see equation 17 and +This follows the discussion in "Luding"_#Luding2008, see equation 17 and relevant discussion in that work: \begin\{equation\} @@ -350,7 +349,7 @@ see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\) \(G\) is the shear modulus, related to Young's modulus \(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) is Poisson's ratio. This can also be achieved by specifying {NULL} for \(k_t\), in which case a normal contact model that specifies material parameters \(E\) and \(\nu\) is required (e.g. {hertz/material}, -{dmt} or {jkr}). In this case, mixing of shear moduli for different particle types {i} and {j} is done according +{dmt} or {jkr}). In this case, mixing of the shear modulus for different particle types {i} and {j} is done according to: \begin\{equation\} 1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j @@ -381,7 +380,7 @@ If the {rolling} keyword is not specified, the model defaults to {none}. For {rolling sds}, rolling friction is computed via a spring-dashpot-slider, using a 'pseudo-force' formulation, as detailed by "Luding"_#Luding2008. Unlike the formulation in "Marshall"_#Marshall2009, this allows for the required adjustment of -rolling displacement due to changes in the frame of referenece of the contacting pair. +rolling displacement due to changes in the frame of reference of the contacting pair. The rolling pseudo-force is computed analogously to the tangential force: \begin\{equation\} @@ -487,7 +486,7 @@ Finally, the twisting torque on each particle is given by: :line LAMMPS automatically sets pairwise cutoff values for {pair_style granular} based on particle radii (and in the case -of {jkr} pulloff distances). In the vast majority of situations, this is adequate. +of {jkr} pull-off distances). In the vast majority of situations, this is adequate. However, a cutoff value can optionally be appended to the {pair_style granular} command to specify a global cutoff (i.e. a cutoff for all atom types). Additionally, the optional {cutoff} keyword can be passed to the {pair_coeff} command, followed by a cutoff value. @@ -533,7 +532,7 @@ Mixing of coefficients is carried out using geometric averaging for most quantities, e.g. if friction coefficient for type 1-type 1 interactions is set to \(\mu_1\), and friction coefficient for type 2-type 2 interactions is set to \(\mu_2\), the friction coefficient for type1-type2 interactions -is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explictly specified to +is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explicitly specified to a different value by a {pair_coeff 1 2 ...} command. The exception to this is elastic modulus, only applicable to {hertz/material}, {dmt} and {jkr} normal contact models. In that case, the effective elastic modulus is computed as: @@ -542,7 +541,7 @@ contact models. In that case, the effective elastic modulus is computed as: E_\{eff,ij\} = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\} \end\{equation\} -If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explictly specified, +If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explicitly specified, the effective modulus is computed as: \begin\{equation\} diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 08e106f6d7..c55378826e 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -155,6 +155,8 @@ ba Babadi backcolor Baczewski +Bagi +Bagnold Bal balancer Balankura @@ -343,6 +345,7 @@ Cij cis civ clearstore +Cleary Clebsch clemson Clermont @@ -369,6 +372,7 @@ Coeff CoefficientN coeffs Coeffs +cohesionless Coker Colberg coleman @@ -442,6 +446,7 @@ cuda Cuda CUDA CuH +Cummins Curk customIDs cutbond @@ -485,6 +490,7 @@ darkturquoise darkviolet Das Dasgupta +dashpot dat datafile datums @@ -521,6 +527,7 @@ Dequidt der derekt Derjagin +Derjaguin Derlet Deserno Destree @@ -1065,6 +1072,7 @@ Hyoungki hyperdynamics hyperradius hyperspherical +hysteretic Ibanez ibar ibm @@ -1124,6 +1132,7 @@ interconvert interial interlayer intermolecular +Interparticle interstitials Intr intra @@ -1141,6 +1150,7 @@ IPython Isele isenthalpic ish +Ishida iso isodemic isoenergetic @@ -1430,6 +1440,7 @@ logfile logfreq logicals Lomdahl +Lond lookups Lookups LoopVar @@ -1444,6 +1455,7 @@ lsfftw ltbbmalloc lubricateU lucy +Luding Lussetti Lustig lwsock @@ -1482,6 +1494,7 @@ manybody MANYBODY Maras Marrink +Marroquin Marsaglia Marseille Martyna @@ -1493,6 +1506,7 @@ masstotal Masuhiro Matchett Materias +mathbf matlab matplotlib Mattox @@ -1580,6 +1594,7 @@ Mie Mikami Militzer Minary +Mindlin mincap mingw minima @@ -2260,6 +2275,7 @@ rg Rg Rhaphson rheological +rheology rhodo Rhodo rhodopsin @@ -2572,6 +2588,7 @@ Tait taitwater Tajkhorshid Tamaskovics +Tanaka tanh Tartakovsky taskset @@ -2659,6 +2676,7 @@ tokyo tol toolchain topologies +Toporov Torder torsions Tosi @@ -2703,6 +2721,7 @@ Tsrd Tstart tstat Tstop +Tsuji Tsuzuki tt Tt From 8845a1a0ae8847a175a36520e88363574276cca4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:20:10 -0400 Subject: [PATCH 083/243] whitespace cleanup (remove ctrl-m, trailing whitespace) --- doc/src/pair_granular.txt | 1332 ++++++++++++++++++------------------- 1 file changed, 666 insertions(+), 666 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 5854a8faf6..73c2bbdd3b 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -1,666 +1,666 @@ - - - -"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -pair_style granular command :h3 - -[Syntax:] - -pair_style granular cutoff :pre - -cutoff = global cutoff (optional). See discussion below. :l -:ule - -[Examples:] - -pair_style granular -pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre - -pair_style granular -pair_coeff * * hertz 1000.0 50.0 tangential mindlin NULL 1.0 0.4 :pre - -pair_style granular -pair_coeff * * hertz/material 1e8 0.3 tangential mindlin_rescale NULL 1.0 0.4 damping tsuji :pre - -pair_style granular -pair_coeff 1 1 jkr 1000.0 50.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre - -pair_style granular -pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall -pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall -pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre - -[Description:] - -The {granular} styles support a variety of options for the normal, tangential, rolling and twisting -forces resulting from contact between two granular particles. This expands on the options offered -by the "pair gran/*"_pair_gran.html pair styles. The total computed forces and torques are the -sum of various models selected for the normal, tangential, rolling and twisting modes of motion. - -All model choices and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. -Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for -different combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. -If the contact model choice is the same for two particle types, the mixing for the cross-coefficients can be carried out -automatically. This is shown in the second example, where model choices are the same for type 1 - type 1 as for type 2 - type2 -interactions, but coefficients are different. In this case, the coefficients for type 2 - type interactions can be -determined from mixing rules discussed below. -For additional flexibility, coefficients as well as model forms can vary between particle types, -as shown in the third example: -type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a DMT cohesive model (see below). -In that example, 1-1 and 2-2 interactions have different model forms, in which case -mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the -{pair_coeff 1 2} command, otherwise an error would result. - -:line - -The first required keyword for the {pair_coeff} command is the normal contact model. Currently supported options -for normal contact models and their required arguments are: - -{hooke} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) -{hertz} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) -{hertz/material} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\) -{dmt} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) -{jkr} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) :ol - -Here, \(k_n\) is spring stiffness (with units that depend on model choice, see below); -\(\eta_\{n0\}\) is a damping prefactor (or, in its place a coefficient of restitution -\(e\), depending on the choice of damping mode, see below); E is Young's modulus -in units of {force}/{length}^2, i.e. {pressure}; \(\nu\) is Poisson's ratio -and \(\gamma\) is a surface energy density, in units of {energy}/{length}^2. - -For the {hooke} model, the normal, elastic component of force acting on particle {i} due to -contact with particle {j} is given by: -\begin\{equation\} -\mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} -\end\{equation\} - -Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, -\(R_i, R_j\) are the particle radii, -\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the -two particle centers (note the i-j ordering so that \(F_\{ne\}\) is positive for repulsion), -and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). -Therefore, for {hooke}, the units of the spring constant \(k_n\) are {force}/{distance}, -or equivalently {mass}/{time^2}. - -For the {hertz} model, the normal component of force is given by: -\begin\{equation\} -\mathbf\{F\}_\{ne, Hertz\} = k_N R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} -\end\{equation\} - -Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. -For {hertz}, the units of the spring constant \(k_n\) are {force}/{length}^2, or equivalently -{pressure}. - -For the {hertz/material} model, the force is given by: -\begin\{equation\} -\mathbf\{F\}_\{ne, Hertz/material\} = \frac\{4\}\{3\} E_\{eff\} R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} -\end\{equation\} - -Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) -is the effective Young's modulus, -with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that -if the elastic modulus and the shear modulus of the two particles are the same, the {hertz/material} -model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) - -The {dmt} model corresponds to the "(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, -where the force is simply Hertz with an additional attractive cohesion term: -\begin\{equation\} -\mathbf\{F\}_\{ne, dmt\} = \left(\frac\{4\}\{3\} E R^\{1/2\}\delta_\{ij\}^\{3/2\} - 4\pi\gamma R\right)\mathbf\{n\} -\end\{equation\} - -The {jkr} model is the "(Johnson-Kendall-Roberts)"_#JKR1971 model, where the force is computed as: -\begin\{equation\} -\label\{eq:force_jkr\} -\mathbf\{F\}_\{ne, jkr\} = \left(\frac\{4Ea^3\}\{3R\} - 2\pi a^2\sqrt\{\frac\{4\gamma E\}\{\pi a\}\}\right)\mathbf\{n\} -\end\{equation\} - -Here, {a} is the radius of the contact zone, related to the overlap \(\delta\) according to: -\begin\{equation\} -\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\} -\end\{equation\} - -LAMMPS internally inverts the equation above to solve for {a} in terms of \(\delta\), then solves for -the force in the previous equation. Additionally, note that the JKR model allows for a tensile force beyond -contact (i.e. for \(\delta < 0\)), up to a maximum of \(3\pi\gamma R\) (also known as -the 'pull-off' force). -Note that this is a hysteretic effect, where particles that are not contacting initially -will not experience force until they come into contact \(\delta \geq 0\); as they move apart -and (\(\delta < 0\)), they experience a tensile force up to \(3\pi\gamma R\), -at which point they lose contact. - -:line - -In addition, the normal force is augmented by a damping term of the following -general form: - -\begin\{equation\} -\mathbf\{F\}_\{n,damp\} = -\eta_n \mathbf\{v\}_\{n,rel\} -\end\{equation\} - -Here, \(\mathbf\{v\}_\{n,rel\} = (\mathbf\{v\}_j - \mathbf\{v\}_i) \cdot \mathbf\{n\}\) -is the component of relative velocity along \(\mathbf\{n\}\). - -The optional {damping} keyword to the {pair_coeff} command followed by a keyword -determines the model form of the damping factor \(\eta_n\), and the interpretation -of the \(\eta_\{n0\}\) or \(e\) coefficients specified as part of the normal contact -model settings. The {damping} keyword and corresponding -model form selection may be appended anywhere in the {pair coeff} command. -Note that the choice of damping model affects both the -normal and tangential damping (and depending on other settings, potentially also the twisting damping). -The options for the damping model currently supported are: - -{velocity} -{viscoelastic} -{tsuji} :ol - -If the {damping} keyword is not specified, the {viscoelastic} model is used by default. - -For {damping velocity}, the normal damping is simply equal to the user-specified damping -coefficient in the {normal} model: - -\begin\{equation\} -\eta_n = \eta_\{n0\}\ -\end\{equation\} - -Here, \(\gamma_n\) is the damping coefficient specified for the normal contact model, in units of {mass}/{time}, - -The {damping viscoelastic} model is based on the viscoelastic treatment of "(Brilliantov et al)"_#Brill1996, -where the normal damping is given by: -\begin\{equation\} -\eta_n = \eta_\{n0\}\ a m_\{eff\} -\end\{equation\} - -Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\) -for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). -In this case, \eta_\{n0\}\ is in units of 1/({time}*{distance}). - -The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the -damping coefficient specified as part of the normal model is interpreted -as a restitution coefficient \(e\). The damping constant \(\eta_n\) is given by: - -\begin\{equation\} -\eta_n = \alpha (m_\{eff\}k_n)^\{1/2\} -\end\{equation\} - -For normal contact models based on material parameters, \(k_n = 4/3Ea\). -The parameter \(\alpha\) is related to the restitution coefficient {e} according to: - -\begin\{equation\} -\alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 -\end\{equation\} - -The dimensionless coefficient of restitution \(e\) specified as part of the normal contact model -parameters should be between 0 and 1, but no error check is performed on this. - -The total normal force is computed as the sum of the elastic and damping components: - -\begin\{equation\} -\mathbf\{F\}_n = \mathbf\{F\}_\{ne\} + \mathbf\{F\}_\{n,damp\} -\end\{equation\} - - :line - -The {pair_coeff} command also requires specification -of the tangential contact model. The required keyword {tangential} is expected, followed by the model -choice and associated parameters. Currently supported tangential model choices and their -expected parameters are as follows: - -{linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) -{linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) -{mindlin} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) -{mindlin_rescale} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) :ol - -Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) -that determines the magnitude of the -tangential damping, \(\mu_t\) is the tangential (or sliding) friction -coefficient, and \(k_t\) is the tangential stiffness coefficient. - -For {tangential linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, -which mimics the behavior -of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: - -\begin\{equation\} -\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|\mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} -\end\{equation\} - -The tangential damping force \(\mathbf\{F\}_\mathrm\{t,damp\}\) is given by: - -\begin\{equation\} -\mathbf\{F\}_\mathrm\{t,damp\} = -\eta_t \mathbf\{v\}_\{t,rel\} -\end\{equation\} - -The tangential damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): -\begin\{equation\} -\eta_t = -x_\{\gamma,t\} \eta_n -\end\{equation\} - -The normal damping prefactor \(\eta_n\) is determined by the choice of the {damping} keyword, as discussed above. -Thus, the {damping} keyword also affects the tangential damping. -The parameter \(x_\{\gamma,t\}\) is a scaling coefficient. Several works in the literature use -\(x_\{\gamma,t\} = 1\) ("Marshall"_#Marshall2009, "Tsuji et al"_#Tsuji1992, "Silbert et al"_#Silbert2001). -The relative tangential velocity at the point of contact is given by -\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\), -where \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_r - \mathbf\{v\}_r\cdot\mathbf\{n\}\), -\(\mathbf\{v\}_r = \mathbf\{v\}_j - \mathbf\{v\}_i\). The direction of the applied force is -\(\mathbf\{t\} = \mathbf\{v_\{t,rel\}\}/\|\mathbf\{v_\{t,rel\}\}\|\). - -The normal force value \(F_\{n0\}\) used to compute the critical force -depends on the form of the contact model. For non-cohesive models -({hertz}, {hertz/material}, {hooke}), it is given by the magnitude of the normal force: - -\begin\{equation\} -F_\{n0\} = \|\mathbf\{F\}_n\| -\end\{equation\} - -For cohesive models such as {jkr} and {dmt}, the critical force is adjusted so that the critical tangential -force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#Thornton1991. -For both models, \(F_\{n0\}\) takes the form: - -\begin\{equation\} -F_\{n0\} = \|\mathbf\{F\}_ne + 2 F_\{pulloff\}\| -\end\{equation\} - -Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and \(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. - -The remaining tangential options all use accumulated tangential displacement (i.e. contact history). This -is discussed below in the context of the {linear_history} option, but the same treatment of the -accumulated displacement applies to the other options as well. - -For {tangential linear_history}, the tangential force is given by: - -\begin\{equation\} -\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t\mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} -\end\{equation\} - -Here, \(\mathbf\{\xi\}\) is the tangential displacement accumulated during the entire -duration of the contact: - -\begin\{equation\} -\mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau -\end\{equation\} - -This accumulated tangential displacement must be adjusted to account for changes -in the frame of reference -of the contacting pair of particles during contact. This occurs due to the overall motion of the contacting particles -in a rigid-body-like fashion during the duration of the contact. There are two modes of motion -that are relevant: the 'tumbling' rotation of the contacting pair, which changes the orientation of the -plane in which tangential displacement occurs; and 'spinning' rotation of the contacting pair -about the vector connecting their centers of mass (\(\mathbf\{n\}\)). -Corrections due to the former mode of motion are -made by rotating the accumulated displacement into the plane that is tangential -to the contact vector at each step, -or equivalently removing any component of the tangential displacement -that lies along \(\mathbf\{n\}\), and rescaling to preserve the magnitude. -This follows the discussion in "Luding"_#Luding2008, see equation 17 and -relevant discussion in that work: - -\begin\{equation\} -\mathbf\{\xi\} = \left(\mathbf\{\xi'\} - (\mathbf\{n\} \cdot \mathbf\{\xi'\})\mathbf\{n\}\right) \frac\{\|\mathbf\{\xi'\}\|\}\{\|\mathbf\{\xi'\}\| - \mathbf\{n\}\cdot\mathbf\{\xi'\}\} -\label\{eq:rotate_displacements\} -\end\{equation\} - -Here, \(\mathbf\{\xi'\}\) is the accumulated displacement prior to the current time step and -\(\mathbf\{\xi\}\) is the corrected displacement. Corrections to the displacement -due to the second mode of motion described above (rotations about \(\mathbf\{n\}\)) -are not currently implemented, but are expected to be minor for most simulations. - -Furthermore, when the tangential force exceeds the critical force, -the tangential displacement is re-scaled to match the value for the critical force (see "Luding"_#Luding2008, -equation 20 and related discussion): - -\begin\{equation\} -\mathbf\{\xi\} = -\frac\{1\}\{k_t\}\left(\mu_t F_\{n0\}\mathbf\{t\} + \mathbf\{F\}_\{t,damp\}\right) -\end\{equation\} - -The tangential force is added to the total normal force (elastic plus damping) to produce the total force -on the particle. The tangential force also acts at the contact point (defined as the center of the overlap region) -to induce a torque on each particle according to: - -\begin\{equation\} -\mathbf\{\tau\}_i = -(R_i - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t -\end\{equation\} - -\begin\{equation\} -\mathbf\{\tau\}_j = -(R_j - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t -\end\{equation\} - -For {tangential mindlin}, the "Mindlin"_#Mindlin1949 no-slip solution is used, which differs from the {linear_history} -option by an additional factor of {a}, the radius of the contact region. The tangential force is given by: - -\begin\{equation\} -\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t a \mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} -\end\{equation\} - -Here, {a} is the radius of the contact region, given by \(a = \delta R\) for all normal contact models, -except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), -see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where -\(G\) is the shear modulus, related to Young's modulus \(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) -is Poisson's ratio. This can also be achieved by specifying {NULL} for \(k_t\), in which case -a normal contact model that specifies material parameters \(E\) and \(\nu\) is required (e.g. {hertz/material}, -{dmt} or {jkr}). In this case, mixing of the shear modulus for different particle types {i} and {j} is done according -to: -\begin\{equation\} -1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j -\end\{equation\} - -The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential -displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_\{n-1\}\}\): -\begin\{equation\} -\mathbf\{\xi\} = \mathbf\{\xi_\{t_\{n-1\}\}\} \frac\{a\}\{a_\{t_\{n-1\}\}\} -\end\{equation\} - -Here, \(t_\{n-1\}\) indicates the value at the previous time step. This rescaling -accounts for the fact that a decrease in the contact area upon unloading leads to the contact -being unable to support the previous tangential loading, and spurious energy is created -without the rescaling above ("Walton"_#WaltonPC ). See also discussion in "Thornton et al, 2013"_#Thornton2013 -, particularly equation 18(b) of that work and associated discussion. - -:line - -The optional {rolling} keyword enables rolling friction, which resists pure rolling -motion of particles. The options currently supported are: - -{none} -{sds} : \(k_\{roll\}\), \(\gamma_\{roll\}\), \(\mu_\{roll\}\) :ol - -If the {rolling} keyword is not specified, the model defaults to {none}. - -For {rolling sds}, rolling friction is computed via a spring-dashpot-slider, using a -'pseudo-force' formulation, as detailed by "Luding"_#Luding2008. Unlike the formulation -in "Marshall"_#Marshall2009, this allows for the required adjustment of -rolling displacement due to changes in the frame of reference of the contacting pair. -The rolling pseudo-force is computed analogously to the tangential force: - -\begin\{equation\} -\mathbf\{F\}_\{roll,0\} = k_\{roll\} \mathbf\{\xi\}_\{roll\} - \gamma_\{roll\} \mathbf\{v\}_\{roll\} -\end\{equation\} - -Here, \(\mathbf\{v\}_\{roll\} = -R(\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \times \mathbf\{n\}\) is the -relative rolling velocity, as given in "Wang et al"_#Wang2015 and "Luding"_#Luding2008. This differs -from the expressions given by "Kuhn and Bagi"_#Kuhn2004 and used in "Marshall"_#Marshall2009; -see "Wang et al"_#Wang2015 for details. The rolling displacement is given by: - -\begin\{equation\} -\mathbf\{\xi\}_\{roll\} = \int_\{t_0\}^t \mathbf\{v\}_\{roll\} (\tau) \mathrm\{d\} \tau -\end\{equation\} - -A Coulomb friction criterion truncates the rolling pseudo-force if it exceeds a critical value: -\begin\{equation\} -\mathbf\{F\}_\{roll\} = min(\mu_\{roll\} F_\{n,0\}, \|\mathbf\{F\}_\{roll,0\}\|)\mathbf\{k\} -\end\{equation\} - -Here, \(\mathbf\{k\} = \mathbf\{v\}_\{roll\}/\|\mathbf\{v\}_\{roll\}\|\) is the direction of the pseudo-force. -As with tangential displacement, the rolling displacement is rescaled when the critical -force is exceeded, so that the spring length corresponds the critical force. Additionally, the -displacement is adjusted to account for rotations of the frame of reference of the two -contacting particles in a manner analogous to the tangential displacement. - -The rolling pseudo-force does not contribute to the total force on either particle (hence 'pseudo'), -but acts only to induce an equal and opposite torque on each particle, according to: - -\begin\{equation\} -\tau_\{roll,i\} = R_\{eff\} \mathbf\{n\} \times \mathbf\{F\}_\{roll\} -\end\{equation\} - -\begin\{equation\} -\tau_\{roll,j\} = -\tau_\{roll,i\} -\end\{equation\} - -:line - -The optional {twisting} keyword enables twisting friction, which resists -rotation of two contacting particles about the vector \(\mathbf\{n\}\) that connects their -centers. The options currently supported are: - -{none} -{sds} : \(k_\{twist\}\), \(\gamma_\{twist\}\), \(\mu_\{twist\}\) -{marshall} :ol - -If the {twisting} keyword is not specified, the model defaults to {none}. - -For both {twisting sds} and {twisting marshall}, a history-dependent spring-dashpot-slider is used to compute the twisting -torque. Because twisting displacement is a scalar, there is no need to adjust for changes -in the frame of reference due to rotations of the particle pair. The formulation in -"Marshall"_#Marshall2009 therefore provides the most straightforward treatment: - -\begin\{equation\} -\tau_\{twist,0\} = -k_\{twist\}\xi_\{twist\} - \gamma_\{twist\}\Omega_\{twist\} -\end\{equation\} - -Here \(\xi_\{twist\} = \int_\{t_0\}^t \Omega_\{twist\} (\tau) \mathrm\{d\}\tau\) is the twisting -angular displacement, and \(\Omega_\{twist\} = (\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \cdot \mathbf\{n\}\) -is the relative twisting angular velocity. The torque is then truncated according to: - -\begin\{equation\} -\tau_\{twist\} = min(\mu_\{twist\} F_\{n,0\}, \tau_\{twist,0\}) -\end\{equation\} - -Similar to the sliding and rolling displacement, the angular displacement is -rescaled so that it corresponds to the critical value if the twisting torque -exceeds this critical value: - -\begin\{equation\} -\xi_\{twist\} = \frac\{1\}\{k_\{twist\}\} (\mu_\{twist\} F_\{n,0\}sgn(\Omega_\{twist\}) - \gamma_\{twist\}\Omega_\{twist\}) -\end\{equation\} - -For {twisting sds}, the coefficients \(k_\{twist\}, \gamma_\{twist\}\) and \(\mu_\{twist\}\) are -simply the user input parameters that follow the {twisting sds} keywords in the {pair_coeff} command. - -For {twisting_marshall}, the coefficients are expressed in terms of sliding friction coefficients, -as discussed in "Marshall"_#Marshall2009 (see equations 32 and 33 of that work): - -\begin\{equation\} -k_\{twist\} = 0.5k_ta^2 -\end\{equation\} - -\begin\{equation\} -\eta_\{twist\} = 0.5\eta_ta^2 -\end\{equation\} - -\begin\{equation\} -\mu_\{twist\} = \frac\{2\}\{3\}a\mu_t -\end\{equation\} - -Finally, the twisting torque on each particle is given by: - -\begin\{equation\} -\mathbf\{\tau\}_\{twist,i\} = \tau_\{twist\}\mathbf\{n\} -\end\{equation\} - -\begin\{equation\} -\mathbf\{\tau\}_\{twist,j\} = -\mathbf\{\tau\}_\{twist,i\} -\end\{equation\} - -:line - -LAMMPS automatically sets pairwise cutoff values for {pair_style granular} based on particle radii (and in the case -of {jkr} pull-off distances). In the vast majority of situations, this is adequate. -However, a cutoff value can optionally be appended to the {pair_style granular} command to specify -a global cutoff (i.e. a cutoff for all atom types). Additionally, the optional {cutoff} keyword -can be passed to the {pair_coeff} command, followed by a cutoff value. -This will set a pairwise cutoff for the atom types in the {pair_coeff} command. -These options may be useful in some rare cases where the automatic cutoff determination is not sufficient, e.g. -if particle diameters are being modified via the {fix adapt} command. In that case, the global cutoff -specified as part of the {pair_style granular} command is applied to all atom types, unless it is -overridden for a given atom type combination by the {cutoff} value specified in the {pair coeff} command. -If {cutoff} is only specified in the {pair coeff} command and no global -cutoff is appended to the {pair_style granular} command, then LAMMPS will use that cutoff for the specified -atom type combination, and automatically set pairwise cutoffs for the remaining atom types. - -:line - -Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the "Speed packages"_Speed_packages.html doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, -USER-OMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the "Build -package"_Build_package.html doc page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the "-suffix command-line -switch"_Run_options.html when you invoke LAMMPS, or you can use the -"suffix"_suffix.html command in your input script. - -See the "Speed packages"_Speed_packages.html doc page for more -instructions on how to use the accelerated styles effectively. - -:line - -[Mixing, shift, table, tail correction, restart, rRESPA info]: - -The "pair_modify"_pair_modify.html mix, shift, table, and tail options -are not relevant for granular pair styles. - -Mixing of coefficients is carried out using geometric averaging for -most quantities, e.g. if friction coefficient for type 1-type 1 interactions -is set to \(\mu_1\), and friction coefficient for type 2-type 2 interactions -is set to \(\mu_2\), the friction coefficient for type1-type2 interactions -is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explicitly specified to -a different value by a {pair_coeff 1 2 ...} command. The exception to this is -elastic modulus, only applicable to {hertz/material}, {dmt} and {jkr} normal -contact models. In that case, the effective elastic modulus is computed as: - -\begin\{equation\} -E_\{eff,ij\} = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\} -\end\{equation\} - -If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explicitly specified, -the effective modulus is computed as: - -\begin\{equation\} -E_\{eff,ij\} = \left(\frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\} + \frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\}\right)^\{-1\} -\end\{equation\} - -or - -\begin\{equation\} -E_\{eff,ij\} = \frac\{E_\{ij\}\}\{2(1-\nu_\{ij\})\} -\end\{equation\} - -These pair styles write their information to "binary restart -files"_restart.html, so a pair_style command does not need to be -specified in an input script that reads a restart file. - -These pair styles can only be used via the {pair} keyword of the -"run_style respa"_run_style.html command. They do not support the -{inner}, {middle}, {outer} keywords. - -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. It also returns only the normal component of -the pairwise interaction force. However, the single() function also -calculates 10 extra pairwise quantities. The first 3 are the -components of the tangential force between particles I and J, acting -on particle I. The 4th is the magnitude of this tangential force. -The next 3 (5-7) are the components of the rolling torque acting on -particle I. The next entry (8) is the magnitude of the rolling torque. -The next entry (9) is the magnitude of the twisting torque acting -about the vector connecting the two particle centers. -The last 3 (10-12) are the components of the vector connecting -the centers of the two particles (x_I - x_J). - -These extra quantities can be accessed by the "compute -pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., -{p12}. - -:line - -[Restrictions:] - -All the granular pair styles are part of the GRANULAR package. It is -only enabled if LAMMPS was built with that package. See the "Build -package"_Build_package.html doc page for more info. - -These pair styles require that atoms store torque and angular velocity -(omega) as defined by the "atom_style"_atom_style.html. They also -require a per-particle radius is stored. The {sphere} atom style does -all of this. - -This pair style requires you to use the "comm_modify vel -yes"_comm_modify.html command so that velocities are stored by ghost -atoms. - -These pair styles will not restart exactly when using the -"read_restart"_read_restart.html command, though they should provide -statistically similar results. This is because the forces they -compute depend on atom velocities. See the -"read_restart"_read_restart.html command for more details. - -[Related commands:] - -"pair_coeff"_pair_coeff.html -"pair gran/*"_pair_gran.html - -[Default:] - -For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, {twisting none} - -[References:] - -:link(Brill1996) -[(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). -Model for collisions in granular gases. Physical review E, 53(5), 5382. - -:link(Tsuji1992) -[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of -cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. - -:link(JKR1971) -[(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). -Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. - -:link(DMT1975) -[Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the -adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. - -:link(Luding2008) -[(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. - -:link(Marshall2009) -[(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. -Journal of Computational Physics, 228(5), 1541-1561. - -:link(Silbert2001) -[(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). -Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. - -:link(Kuhn2004) -[(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. -International journal of solids and structures, 41(21), 5793-5820. - -:link(Wang2015) -[(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). -Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. - -:link(Thornton1991) -[(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. -J. Phys. D: Appl. Phys. 24 1942 - -:link(Mindlin1949) -[(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies in contact. -J. Appl. Mech., ASME 16, 259-268. - -:link(Thornton2013) -[(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, P. W. (2013). -An investigation of the comparative behaviour of alternative contact force models -during inelastic collisions. Powder Technology, 233, 30-46. - -:link(WaltonPC) -[(Otis R. Walton)] Walton, O.R., Personal Communication + + + +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands_all.html) + +:line + +pair_style granular command :h3 + +[Syntax:] + +pair_style granular cutoff :pre + +cutoff = global cutoff (optional). See discussion below. :l +:ule + +[Examples:] + +pair_style granular +pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre + +pair_style granular +pair_coeff * * hertz 1000.0 50.0 tangential mindlin NULL 1.0 0.4 :pre + +pair_style granular +pair_coeff * * hertz/material 1e8 0.3 tangential mindlin_rescale NULL 1.0 0.4 damping tsuji :pre + +pair_style granular +pair_coeff 1 1 jkr 1000.0 50.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre + +pair_style granular +pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall +pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall +pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre + +[Description:] + +The {granular} styles support a variety of options for the normal, tangential, rolling and twisting +forces resulting from contact between two granular particles. This expands on the options offered +by the "pair gran/*"_pair_gran.html pair styles. The total computed forces and torques are the +sum of various models selected for the normal, tangential, rolling and twisting modes of motion. + +All model choices and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. +Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for +different combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. +If the contact model choice is the same for two particle types, the mixing for the cross-coefficients can be carried out +automatically. This is shown in the second example, where model choices are the same for type 1 - type 1 as for type 2 - type2 +interactions, but coefficients are different. In this case, the coefficients for type 2 - type interactions can be +determined from mixing rules discussed below. +For additional flexibility, coefficients as well as model forms can vary between particle types, +as shown in the third example: +type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a DMT cohesive model (see below). +In that example, 1-1 and 2-2 interactions have different model forms, in which case +mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the +{pair_coeff 1 2} command, otherwise an error would result. + +:line + +The first required keyword for the {pair_coeff} command is the normal contact model. Currently supported options +for normal contact models and their required arguments are: + +{hooke} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) +{hertz} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) +{hertz/material} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\) +{dmt} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) +{jkr} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) :ol + +Here, \(k_n\) is spring stiffness (with units that depend on model choice, see below); +\(\eta_\{n0\}\) is a damping prefactor (or, in its place a coefficient of restitution +\(e\), depending on the choice of damping mode, see below); E is Young's modulus +in units of {force}/{length}^2, i.e. {pressure}; \(\nu\) is Poisson's ratio +and \(\gamma\) is a surface energy density, in units of {energy}/{length}^2. + +For the {hooke} model, the normal, elastic component of force acting on particle {i} due to +contact with particle {j} is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} +\end\{equation\} + +Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, +\(R_i, R_j\) are the particle radii, +\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the +two particle centers (note the i-j ordering so that \(F_\{ne\}\) is positive for repulsion), +and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). +Therefore, for {hooke}, the units of the spring constant \(k_n\) are {force}/{distance}, +or equivalently {mass}/{time^2}. + +For the {hertz} model, the normal component of force is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hertz\} = k_N R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} +\end\{equation\} + +Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. +For {hertz}, the units of the spring constant \(k_n\) are {force}/{length}^2, or equivalently +{pressure}. + +For the {hertz/material} model, the force is given by: +\begin\{equation\} +\mathbf\{F\}_\{ne, Hertz/material\} = \frac\{4\}\{3\} E_\{eff\} R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} +\end\{equation\} + +Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) +is the effective Young's modulus, +with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that +if the elastic modulus and the shear modulus of the two particles are the same, the {hertz/material} +model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) + +The {dmt} model corresponds to the "(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, +where the force is simply Hertz with an additional attractive cohesion term: +\begin\{equation\} +\mathbf\{F\}_\{ne, dmt\} = \left(\frac\{4\}\{3\} E R^\{1/2\}\delta_\{ij\}^\{3/2\} - 4\pi\gamma R\right)\mathbf\{n\} +\end\{equation\} + +The {jkr} model is the "(Johnson-Kendall-Roberts)"_#JKR1971 model, where the force is computed as: +\begin\{equation\} +\label\{eq:force_jkr\} +\mathbf\{F\}_\{ne, jkr\} = \left(\frac\{4Ea^3\}\{3R\} - 2\pi a^2\sqrt\{\frac\{4\gamma E\}\{\pi a\}\}\right)\mathbf\{n\} +\end\{equation\} + +Here, {a} is the radius of the contact zone, related to the overlap \(\delta\) according to: +\begin\{equation\} +\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\} +\end\{equation\} + +LAMMPS internally inverts the equation above to solve for {a} in terms of \(\delta\), then solves for +the force in the previous equation. Additionally, note that the JKR model allows for a tensile force beyond +contact (i.e. for \(\delta < 0\)), up to a maximum of \(3\pi\gamma R\) (also known as +the 'pull-off' force). +Note that this is a hysteretic effect, where particles that are not contacting initially +will not experience force until they come into contact \(\delta \geq 0\); as they move apart +and (\(\delta < 0\)), they experience a tensile force up to \(3\pi\gamma R\), +at which point they lose contact. + +:line + +In addition, the normal force is augmented by a damping term of the following +general form: + +\begin\{equation\} +\mathbf\{F\}_\{n,damp\} = -\eta_n \mathbf\{v\}_\{n,rel\} +\end\{equation\} + +Here, \(\mathbf\{v\}_\{n,rel\} = (\mathbf\{v\}_j - \mathbf\{v\}_i) \cdot \mathbf\{n\}\) +is the component of relative velocity along \(\mathbf\{n\}\). + +The optional {damping} keyword to the {pair_coeff} command followed by a keyword +determines the model form of the damping factor \(\eta_n\), and the interpretation +of the \(\eta_\{n0\}\) or \(e\) coefficients specified as part of the normal contact +model settings. The {damping} keyword and corresponding +model form selection may be appended anywhere in the {pair coeff} command. +Note that the choice of damping model affects both the +normal and tangential damping (and depending on other settings, potentially also the twisting damping). +The options for the damping model currently supported are: + +{velocity} +{viscoelastic} +{tsuji} :ol + +If the {damping} keyword is not specified, the {viscoelastic} model is used by default. + +For {damping velocity}, the normal damping is simply equal to the user-specified damping +coefficient in the {normal} model: + +\begin\{equation\} +\eta_n = \eta_\{n0\}\ +\end\{equation\} + +Here, \(\gamma_n\) is the damping coefficient specified for the normal contact model, in units of {mass}/{time}, + +The {damping viscoelastic} model is based on the viscoelastic treatment of "(Brilliantov et al)"_#Brill1996, +where the normal damping is given by: +\begin\{equation\} +\eta_n = \eta_\{n0\}\ a m_\{eff\} +\end\{equation\} + +Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\) +for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). +In this case, \eta_\{n0\}\ is in units of 1/({time}*{distance}). + +The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the +damping coefficient specified as part of the normal model is interpreted +as a restitution coefficient \(e\). The damping constant \(\eta_n\) is given by: + +\begin\{equation\} +\eta_n = \alpha (m_\{eff\}k_n)^\{1/2\} +\end\{equation\} + +For normal contact models based on material parameters, \(k_n = 4/3Ea\). +The parameter \(\alpha\) is related to the restitution coefficient {e} according to: + +\begin\{equation\} +\alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 +\end\{equation\} + +The dimensionless coefficient of restitution \(e\) specified as part of the normal contact model +parameters should be between 0 and 1, but no error check is performed on this. + +The total normal force is computed as the sum of the elastic and damping components: + +\begin\{equation\} +\mathbf\{F\}_n = \mathbf\{F\}_\{ne\} + \mathbf\{F\}_\{n,damp\} +\end\{equation\} + + :line + +The {pair_coeff} command also requires specification +of the tangential contact model. The required keyword {tangential} is expected, followed by the model +choice and associated parameters. Currently supported tangential model choices and their +expected parameters are as follows: + +{linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) +{linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) +{mindlin} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) +{mindlin_rescale} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) :ol + +Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) +that determines the magnitude of the +tangential damping, \(\mu_t\) is the tangential (or sliding) friction +coefficient, and \(k_t\) is the tangential stiffness coefficient. + +For {tangential linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, +which mimics the behavior +of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: + +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|\mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} +\end\{equation\} + +The tangential damping force \(\mathbf\{F\}_\mathrm\{t,damp\}\) is given by: + +\begin\{equation\} +\mathbf\{F\}_\mathrm\{t,damp\} = -\eta_t \mathbf\{v\}_\{t,rel\} +\end\{equation\} + +The tangential damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): +\begin\{equation\} +\eta_t = -x_\{\gamma,t\} \eta_n +\end\{equation\} + +The normal damping prefactor \(\eta_n\) is determined by the choice of the {damping} keyword, as discussed above. +Thus, the {damping} keyword also affects the tangential damping. +The parameter \(x_\{\gamma,t\}\) is a scaling coefficient. Several works in the literature use +\(x_\{\gamma,t\} = 1\) ("Marshall"_#Marshall2009, "Tsuji et al"_#Tsuji1992, "Silbert et al"_#Silbert2001). +The relative tangential velocity at the point of contact is given by +\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\), +where \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_r - \mathbf\{v\}_r\cdot\mathbf\{n\}\), +\(\mathbf\{v\}_r = \mathbf\{v\}_j - \mathbf\{v\}_i\). The direction of the applied force is +\(\mathbf\{t\} = \mathbf\{v_\{t,rel\}\}/\|\mathbf\{v_\{t,rel\}\}\|\). + +The normal force value \(F_\{n0\}\) used to compute the critical force +depends on the form of the contact model. For non-cohesive models +({hertz}, {hertz/material}, {hooke}), it is given by the magnitude of the normal force: + +\begin\{equation\} +F_\{n0\} = \|\mathbf\{F\}_n\| +\end\{equation\} + +For cohesive models such as {jkr} and {dmt}, the critical force is adjusted so that the critical tangential +force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#Thornton1991. +For both models, \(F_\{n0\}\) takes the form: + +\begin\{equation\} +F_\{n0\} = \|\mathbf\{F\}_ne + 2 F_\{pulloff\}\| +\end\{equation\} + +Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and \(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. + +The remaining tangential options all use accumulated tangential displacement (i.e. contact history). This +is discussed below in the context of the {linear_history} option, but the same treatment of the +accumulated displacement applies to the other options as well. + +For {tangential linear_history}, the tangential force is given by: + +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t\mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} +\end\{equation\} + +Here, \(\mathbf\{\xi\}\) is the tangential displacement accumulated during the entire +duration of the contact: + +\begin\{equation\} +\mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau +\end\{equation\} + +This accumulated tangential displacement must be adjusted to account for changes +in the frame of reference +of the contacting pair of particles during contact. This occurs due to the overall motion of the contacting particles +in a rigid-body-like fashion during the duration of the contact. There are two modes of motion +that are relevant: the 'tumbling' rotation of the contacting pair, which changes the orientation of the +plane in which tangential displacement occurs; and 'spinning' rotation of the contacting pair +about the vector connecting their centers of mass (\(\mathbf\{n\}\)). +Corrections due to the former mode of motion are +made by rotating the accumulated displacement into the plane that is tangential +to the contact vector at each step, +or equivalently removing any component of the tangential displacement +that lies along \(\mathbf\{n\}\), and rescaling to preserve the magnitude. +This follows the discussion in "Luding"_#Luding2008, see equation 17 and +relevant discussion in that work: + +\begin\{equation\} +\mathbf\{\xi\} = \left(\mathbf\{\xi'\} - (\mathbf\{n\} \cdot \mathbf\{\xi'\})\mathbf\{n\}\right) \frac\{\|\mathbf\{\xi'\}\|\}\{\|\mathbf\{\xi'\}\| - \mathbf\{n\}\cdot\mathbf\{\xi'\}\} +\label\{eq:rotate_displacements\} +\end\{equation\} + +Here, \(\mathbf\{\xi'\}\) is the accumulated displacement prior to the current time step and +\(\mathbf\{\xi\}\) is the corrected displacement. Corrections to the displacement +due to the second mode of motion described above (rotations about \(\mathbf\{n\}\)) +are not currently implemented, but are expected to be minor for most simulations. + +Furthermore, when the tangential force exceeds the critical force, +the tangential displacement is re-scaled to match the value for the critical force (see "Luding"_#Luding2008, +equation 20 and related discussion): + +\begin\{equation\} +\mathbf\{\xi\} = -\frac\{1\}\{k_t\}\left(\mu_t F_\{n0\}\mathbf\{t\} + \mathbf\{F\}_\{t,damp\}\right) +\end\{equation\} + +The tangential force is added to the total normal force (elastic plus damping) to produce the total force +on the particle. The tangential force also acts at the contact point (defined as the center of the overlap region) +to induce a torque on each particle according to: + +\begin\{equation\} +\mathbf\{\tau\}_i = -(R_i - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t +\end\{equation\} + +\begin\{equation\} +\mathbf\{\tau\}_j = -(R_j - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t +\end\{equation\} + +For {tangential mindlin}, the "Mindlin"_#Mindlin1949 no-slip solution is used, which differs from the {linear_history} +option by an additional factor of {a}, the radius of the contact region. The tangential force is given by: + +\begin\{equation\} +\mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t a \mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} +\end\{equation\} + +Here, {a} is the radius of the contact region, given by \(a = \delta R\) for all normal contact models, +except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), +see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where +\(G\) is the shear modulus, related to Young's modulus \(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) +is Poisson's ratio. This can also be achieved by specifying {NULL} for \(k_t\), in which case +a normal contact model that specifies material parameters \(E\) and \(\nu\) is required (e.g. {hertz/material}, +{dmt} or {jkr}). In this case, mixing of the shear modulus for different particle types {i} and {j} is done according +to: +\begin\{equation\} +1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j +\end\{equation\} + +The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential +displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_\{n-1\}\}\): +\begin\{equation\} +\mathbf\{\xi\} = \mathbf\{\xi_\{t_\{n-1\}\}\} \frac\{a\}\{a_\{t_\{n-1\}\}\} +\end\{equation\} + +Here, \(t_\{n-1\}\) indicates the value at the previous time step. This rescaling +accounts for the fact that a decrease in the contact area upon unloading leads to the contact +being unable to support the previous tangential loading, and spurious energy is created +without the rescaling above ("Walton"_#WaltonPC ). See also discussion in "Thornton et al, 2013"_#Thornton2013 +, particularly equation 18(b) of that work and associated discussion. + +:line + +The optional {rolling} keyword enables rolling friction, which resists pure rolling +motion of particles. The options currently supported are: + +{none} +{sds} : \(k_\{roll\}\), \(\gamma_\{roll\}\), \(\mu_\{roll\}\) :ol + +If the {rolling} keyword is not specified, the model defaults to {none}. + +For {rolling sds}, rolling friction is computed via a spring-dashpot-slider, using a +'pseudo-force' formulation, as detailed by "Luding"_#Luding2008. Unlike the formulation +in "Marshall"_#Marshall2009, this allows for the required adjustment of +rolling displacement due to changes in the frame of reference of the contacting pair. +The rolling pseudo-force is computed analogously to the tangential force: + +\begin\{equation\} +\mathbf\{F\}_\{roll,0\} = k_\{roll\} \mathbf\{\xi\}_\{roll\} - \gamma_\{roll\} \mathbf\{v\}_\{roll\} +\end\{equation\} + +Here, \(\mathbf\{v\}_\{roll\} = -R(\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \times \mathbf\{n\}\) is the +relative rolling velocity, as given in "Wang et al"_#Wang2015 and "Luding"_#Luding2008. This differs +from the expressions given by "Kuhn and Bagi"_#Kuhn2004 and used in "Marshall"_#Marshall2009; +see "Wang et al"_#Wang2015 for details. The rolling displacement is given by: + +\begin\{equation\} +\mathbf\{\xi\}_\{roll\} = \int_\{t_0\}^t \mathbf\{v\}_\{roll\} (\tau) \mathrm\{d\} \tau +\end\{equation\} + +A Coulomb friction criterion truncates the rolling pseudo-force if it exceeds a critical value: +\begin\{equation\} +\mathbf\{F\}_\{roll\} = min(\mu_\{roll\} F_\{n,0\}, \|\mathbf\{F\}_\{roll,0\}\|)\mathbf\{k\} +\end\{equation\} + +Here, \(\mathbf\{k\} = \mathbf\{v\}_\{roll\}/\|\mathbf\{v\}_\{roll\}\|\) is the direction of the pseudo-force. +As with tangential displacement, the rolling displacement is rescaled when the critical +force is exceeded, so that the spring length corresponds the critical force. Additionally, the +displacement is adjusted to account for rotations of the frame of reference of the two +contacting particles in a manner analogous to the tangential displacement. + +The rolling pseudo-force does not contribute to the total force on either particle (hence 'pseudo'), +but acts only to induce an equal and opposite torque on each particle, according to: + +\begin\{equation\} +\tau_\{roll,i\} = R_\{eff\} \mathbf\{n\} \times \mathbf\{F\}_\{roll\} +\end\{equation\} + +\begin\{equation\} +\tau_\{roll,j\} = -\tau_\{roll,i\} +\end\{equation\} + +:line + +The optional {twisting} keyword enables twisting friction, which resists +rotation of two contacting particles about the vector \(\mathbf\{n\}\) that connects their +centers. The options currently supported are: + +{none} +{sds} : \(k_\{twist\}\), \(\gamma_\{twist\}\), \(\mu_\{twist\}\) +{marshall} :ol + +If the {twisting} keyword is not specified, the model defaults to {none}. + +For both {twisting sds} and {twisting marshall}, a history-dependent spring-dashpot-slider is used to compute the twisting +torque. Because twisting displacement is a scalar, there is no need to adjust for changes +in the frame of reference due to rotations of the particle pair. The formulation in +"Marshall"_#Marshall2009 therefore provides the most straightforward treatment: + +\begin\{equation\} +\tau_\{twist,0\} = -k_\{twist\}\xi_\{twist\} - \gamma_\{twist\}\Omega_\{twist\} +\end\{equation\} + +Here \(\xi_\{twist\} = \int_\{t_0\}^t \Omega_\{twist\} (\tau) \mathrm\{d\}\tau\) is the twisting +angular displacement, and \(\Omega_\{twist\} = (\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \cdot \mathbf\{n\}\) +is the relative twisting angular velocity. The torque is then truncated according to: + +\begin\{equation\} +\tau_\{twist\} = min(\mu_\{twist\} F_\{n,0\}, \tau_\{twist,0\}) +\end\{equation\} + +Similar to the sliding and rolling displacement, the angular displacement is +rescaled so that it corresponds to the critical value if the twisting torque +exceeds this critical value: + +\begin\{equation\} +\xi_\{twist\} = \frac\{1\}\{k_\{twist\}\} (\mu_\{twist\} F_\{n,0\}sgn(\Omega_\{twist\}) - \gamma_\{twist\}\Omega_\{twist\}) +\end\{equation\} + +For {twisting sds}, the coefficients \(k_\{twist\}, \gamma_\{twist\}\) and \(\mu_\{twist\}\) are +simply the user input parameters that follow the {twisting sds} keywords in the {pair_coeff} command. + +For {twisting_marshall}, the coefficients are expressed in terms of sliding friction coefficients, +as discussed in "Marshall"_#Marshall2009 (see equations 32 and 33 of that work): + +\begin\{equation\} +k_\{twist\} = 0.5k_ta^2 +\end\{equation\} + +\begin\{equation\} +\eta_\{twist\} = 0.5\eta_ta^2 +\end\{equation\} + +\begin\{equation\} +\mu_\{twist\} = \frac\{2\}\{3\}a\mu_t +\end\{equation\} + +Finally, the twisting torque on each particle is given by: + +\begin\{equation\} +\mathbf\{\tau\}_\{twist,i\} = \tau_\{twist\}\mathbf\{n\} +\end\{equation\} + +\begin\{equation\} +\mathbf\{\tau\}_\{twist,j\} = -\mathbf\{\tau\}_\{twist,i\} +\end\{equation\} + +:line + +LAMMPS automatically sets pairwise cutoff values for {pair_style granular} based on particle radii (and in the case +of {jkr} pull-off distances). In the vast majority of situations, this is adequate. +However, a cutoff value can optionally be appended to the {pair_style granular} command to specify +a global cutoff (i.e. a cutoff for all atom types). Additionally, the optional {cutoff} keyword +can be passed to the {pair_coeff} command, followed by a cutoff value. +This will set a pairwise cutoff for the atom types in the {pair_coeff} command. +These options may be useful in some rare cases where the automatic cutoff determination is not sufficient, e.g. +if particle diameters are being modified via the {fix adapt} command. In that case, the global cutoff +specified as part of the {pair_style granular} command is applied to all atom types, unless it is +overridden for a given atom type combination by the {cutoff} value specified in the {pair coeff} command. +If {cutoff} is only specified in the {pair coeff} command and no global +cutoff is appended to the {pair_style granular} command, then LAMMPS will use that cutoff for the specified +atom type combination, and automatically set pairwise cutoffs for the remaining atom types. + +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Build +package"_Build_package.html doc page for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Run_options.html when you invoke LAMMPS, or you can use the +"suffix"_suffix.html command in your input script. + +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +The "pair_modify"_pair_modify.html mix, shift, table, and tail options +are not relevant for granular pair styles. + +Mixing of coefficients is carried out using geometric averaging for +most quantities, e.g. if friction coefficient for type 1-type 1 interactions +is set to \(\mu_1\), and friction coefficient for type 2-type 2 interactions +is set to \(\mu_2\), the friction coefficient for type1-type2 interactions +is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explicitly specified to +a different value by a {pair_coeff 1 2 ...} command. The exception to this is +elastic modulus, only applicable to {hertz/material}, {dmt} and {jkr} normal +contact models. In that case, the effective elastic modulus is computed as: + +\begin\{equation\} +E_\{eff,ij\} = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\} +\end\{equation\} + +If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explicitly specified, +the effective modulus is computed as: + +\begin\{equation\} +E_\{eff,ij\} = \left(\frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\} + \frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\}\right)^\{-1\} +\end\{equation\} + +or + +\begin\{equation\} +E_\{eff,ij\} = \frac\{E_\{ij\}\}\{2(1-\nu_\{ij\})\} +\end\{equation\} + +These pair styles write their information to "binary restart +files"_restart.html, so a pair_style command does not need to be +specified in an input script that reads a restart file. + +These pair styles can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. They do not support the +{inner}, {middle}, {outer} keywords. + +The single() function of these pair styles returns 0.0 for the energy +of a pairwise interaction, since energy is not conserved in these +dissipative potentials. It also returns only the normal component of +the pairwise interaction force. However, the single() function also +calculates 10 extra pairwise quantities. The first 3 are the +components of the tangential force between particles I and J, acting +on particle I. The 4th is the magnitude of this tangential force. +The next 3 (5-7) are the components of the rolling torque acting on +particle I. The next entry (8) is the magnitude of the rolling torque. +The next entry (9) is the magnitude of the twisting torque acting +about the vector connecting the two particle centers. +The last 3 (10-12) are the components of the vector connecting +the centers of the two particles (x_I - x_J). + +These extra quantities can be accessed by the "compute +pair/local"_compute_pair_local.html command, as {p1}, {p2}, ..., +{p12}. + +:line + +[Restrictions:] + +All the granular pair styles are part of the GRANULAR package. It is +only enabled if LAMMPS was built with that package. See the "Build +package"_Build_package.html doc page for more info. + +These pair styles require that atoms store torque and angular velocity +(omega) as defined by the "atom_style"_atom_style.html. They also +require a per-particle radius is stored. The {sphere} atom style does +all of this. + +This pair style requires you to use the "comm_modify vel +yes"_comm_modify.html command so that velocities are stored by ghost +atoms. + +These pair styles will not restart exactly when using the +"read_restart"_read_restart.html command, though they should provide +statistically similar results. This is because the forces they +compute depend on atom velocities. See the +"read_restart"_read_restart.html command for more details. + +[Related commands:] + +"pair_coeff"_pair_coeff.html +"pair gran/*"_pair_gran.html + +[Default:] + +For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, {twisting none} + +[References:] + +:link(Brill1996) +[(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). +Model for collisions in granular gases. Physical review E, 53(5), 5382. + +:link(Tsuji1992) +[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of +cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. + +:link(JKR1971) +[(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). +Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. + +:link(DMT1975) +[Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the +adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. + +:link(Luding2008) +[(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. + +:link(Marshall2009) +[(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. +Journal of Computational Physics, 228(5), 1541-1561. + +:link(Silbert2001) +[(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). +Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. + +:link(Kuhn2004) +[(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. +International journal of solids and structures, 41(21), 5793-5820. + +:link(Wang2015) +[(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). +Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. + +:link(Thornton1991) +[(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. +J. Phys. D: Appl. Phys. 24 1942 + +:link(Mindlin1949) +[(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies in contact. +J. Appl. Mech., ASME 16, 259-268. + +:link(Thornton2013) +[(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, P. W. (2013). +An investigation of the comparative behaviour of alternative contact force models +during inelastic collisions. Powder Technology, 233, 30-46. + +:link(WaltonPC) +[(Otis R. Walton)] Walton, O.R., Personal Communication From c26068a57ab28093623a0cd571064b531969b0b6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:24:45 -0400 Subject: [PATCH 084/243] use LAMMPS style indentation for class definitions --- src/GRANULAR/pair_granular.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index ebddc17ade..d85fb5ede9 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -25,8 +25,8 @@ PairStyle(granular,PairGranular) namespace LAMMPS_NS { -class PairGranular : public Pair{ -public: +class PairGranular : public Pair { + public: PairGranular(class LAMMPS *); ~PairGranular(); void compute(int, int); @@ -63,7 +63,7 @@ public: void allocate(); void transfer_history(double*, double*); -private: + private: int size_history; int *history_transfer_factors; From 28607f156ecb77dd0049d03c9fd18e4113fc3726 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:25:14 -0400 Subject: [PATCH 085/243] use C++ style include headers for accessing C library functions --- src/GRANULAR/pair_granular.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 97cf02676f..5bddd89ea8 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -16,10 +16,10 @@ Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) Leo Silbert (SNL), Gary Grest (SNL) ----------------------------------------------------------------------- */ -#include -#include -#include -#include +#include +#include +#include +#include #include "pair_granular.h" #include "atom.h" #include "atom_vec.h" From d278cfe230d58959dd89c77e7360d3d819db6486 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:10:44 -0400 Subject: [PATCH 086/243] remove pointless recursive self-include --- src/GRANULAR/pair_granular.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index d85fb5ede9..4743d271f5 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -21,7 +21,6 @@ PairStyle(granular,PairGranular) #define LMP_PAIR_GRANULAR_H #include "pair.h" -#include "pair_granular.h" namespace LAMMPS_NS { From 27510f313c1669c0c03105c7e26fcff6eb9b888a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:24:16 -0400 Subject: [PATCH 087/243] change formatting to closer resemble LAMMPS common source code format style --- src/GRANULAR/fix_wall_gran.cpp | 186 +++++++++++++++------------------ src/GRANULAR/fix_wall_gran.h | 18 ++-- 2 files changed, 91 insertions(+), 113 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 3a929771e9..c63a2c0ba8 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -54,7 +54,8 @@ enum{NONE,CONSTANT,EQUAL}; enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, + TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_SDS}; @@ -64,7 +65,8 @@ enum {ROLL_NONE, ROLL_SDS}; /* ---------------------------------------------------------------------- */ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), idregion(NULL), history_one(NULL), fix_rigid(NULL), mass_rigid(NULL) + Fix(lmp, narg, arg), idregion(NULL), history_one(NULL), + fix_rigid(NULL), mass_rigid(NULL) { if (narg < 4) error->all(FLERR,"Illegal fix wall/gran command"); @@ -116,28 +118,25 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : kt /= force->nktv2p; } iarg = 10; - } - else { + } else { iarg = 4; damping_model = VISCOELASTIC; roll_model = twist_model = NONE; - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ + while (iarg < narg) { + if (strcmp(arg[iarg], "hooke") == 0) { if (iarg + 2 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hooke option"); normal_model = NORMAL_HOOKE; normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ + } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); normal_model = NORMAL_HERTZ; normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ + } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); normal_model = HERTZ_MATERIAL; @@ -147,8 +146,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[0] = Emod/(2*(1-poiss))*FOURTHIRDS; normal_coeffs[2] = poiss; iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ + } else if (strcmp(arg[iarg], "dmt") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); normal_model = DMT; Emod = force->numeric(FLERR,arg[iarg+1]); //E @@ -158,8 +156,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[2] = poiss; normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ + } else if (strcmp(arg[iarg], "jkr") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for JKR option"); beyond_contact = 1; normal_model = JKR; @@ -170,67 +167,57 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[2] = poiss; normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; - } - else if (strcmp(arg[iarg], "damping") == 0){ + } else if (strcmp(arg[iarg], "damping") == 0) { if (iarg+1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1], "velocity") == 0){ + if (strcmp(arg[iarg+1], "velocity") == 0) { damping_model = VELOCITY; iarg += 1; - } - else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + } else if (strcmp(arg[iarg+1], "viscoelastic") == 0) { damping_model = VISCOELASTIC; iarg += 1; - } - else if (strcmp(arg[iarg+1], "tsuji") == 0){ + } else if (strcmp(arg[iarg+1], "tsuji") == 0) { damping_model = TSUJI; iarg += 1; - } - else error->all(FLERR, "Illegal wall/gran command, unrecognized damping model"); + } else error->all(FLERR, "Illegal wall/gran command, unrecognized damping model"); iarg += 1; - } - else if (strcmp(arg[iarg], "tangential") == 0){ + } else if (strcmp(arg[iarg], "tangential") == 0) { if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); - if (strcmp(arg[iarg+1], "linear_nohistory") == 0){ + if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); tangential_model = TANGENTIAL_NOHISTORY; tangential_coeffs[0] = 0; tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //gammat tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; - } - else if ((strcmp(arg[iarg+1], "linear_history") == 0) || + } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || - (strcmp(arg[iarg+1], "mindlin_rescale") == 0)){ + (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model = TANGENTIAL_HISTORY; else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model = TANGENTIAL_MINDLIN; else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model = TANGENTIAL_MINDLIN_RESCALE; if ((tangential_model == TANGENTIAL_MINDLIN || tangential_model == TANGENTIAL_MINDLIN_RESCALE) && - (strcmp(arg[iarg+2], "NULL") == 0)){ - if (normal_model == NORMAL_HERTZ || normal_model == NORMAL_HOOKE){ + (strcmp(arg[iarg+2], "NULL") == 0)) { + if (normal_model == NORMAL_HERTZ || normal_model == NORMAL_HOOKE) { error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); } tangential_coeffs[0] = 4*(2-poiss)*(1+poiss)/Emod; - } - else{ + } else { tangential_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt } tangential_history = 1; tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); } - } - else if (strcmp(arg[iarg], "rolling") == 0){ + } else if (strcmp(arg[iarg], "rolling") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ + if (strcmp(arg[iarg+1], "none") == 0) { roll_model = ROLL_NONE; iarg += 2; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ + } else if (strcmp(arg[iarg+1], "sds") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for rolling model"); roll_model = ROLL_SDS; roll_history = 1; @@ -238,23 +225,19 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : roll_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR roll_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal wall/gran command, rolling friction model not recognized"); } - } - else if (strcmp(arg[iarg], "twisting") == 0){ + } else if (strcmp(arg[iarg], "twisting") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ + if (strcmp(arg[iarg+1], "none") == 0) { twist_model = TWIST_NONE; iarg += 2; - } - else if (strcmp(arg[iarg+1], "marshall") == 0){ + } else if (strcmp(arg[iarg+1], "marshall") == 0) { twist_model = TWIST_MARSHALL; twist_history = 1; iarg += 2; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ + } else if (strcmp(arg[iarg+1], "sds") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for twist model"); twist_model = TWIST_SDS; twist_history = 1; @@ -262,19 +245,16 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : twist_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat twist_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal wall/gran command, twisting friction model not recognized"); } - } - else if (strcmp(arg[iarg], "xplane") == 0 || + } else if (strcmp(arg[iarg], "xplane") == 0 || strcmp(arg[iarg], "yplane") == 0 || strcmp(arg[iarg], "zplane") == 0 || strcmp(arg[iarg], "zcylinder") == 0 || - strcmp(arg[iarg], "region") == 0){ + strcmp(arg[iarg], "region") == 0) { break; - } - else{ + } else { error->all(FLERR, "Illegal fix wall/gran command"); } } @@ -352,7 +332,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : vshear = force->numeric(FLERR,arg[iarg+2]); wshear = 1; iarg += 3; - } else if (strcmp(arg[iarg],"store_contacts") == 0){ + } else if (strcmp(arg[iarg],"store_contacts") == 0) { peratom_flag = 1; size_peratom_cols = 8; peratom_freq = 1; @@ -407,7 +387,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : history_one[i][j] = 0.0; } - if (peratom_flag){ + if (peratom_flag) { int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) for (int m = 0; m < size_peratom_cols; m++) @@ -462,12 +442,12 @@ void FixWallGran::init() if (i < modify->nfix) fix_rigid = modify->fix[i]; tangential_history_index = 0; - if (roll_history){ + if (roll_history) { if (tangential_history) roll_history_index = 3; else roll_history_index = 0; } - if (twist_history){ - if (tangential_history){ + if (twist_history) { + if (tangential_history) { if (roll_history) twist_history_index = 6; else twist_history_index = 3; } @@ -476,17 +456,17 @@ void FixWallGran::init() else twist_history_index = 0; } } - if (normal_model == JKR){ + if (normal_model == JKR) { tangential_history_index += 1; roll_history_index += 1; twist_history_index += 1; } - if (tangential_model == TANGENTIAL_MINDLIN_RESCALE){ + if (tangential_model == TANGENTIAL_MINDLIN_RESCALE) { roll_history_index += 1; twist_history_index += 1; } - if (damping_model == TSUJI){ + if (damping_model == TSUJI) { double cor = normal_coeffs[1]; normal_coeffs[1] = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ 27.467*pow(cor,4)-18.022*pow(cor,5)+ @@ -622,7 +602,7 @@ void FixWallGran::post_force(int /*vflag*/) rsq = dx*dx + dy*dy + dz*dz; double rad; - if (pairstyle == GRANULAR && normal_model == JKR){ + if (pairstyle == GRANULAR && normal_model == JKR) { rad = radius[i] + pulloff_distance(radius[i]); } else @@ -634,8 +614,8 @@ void FixWallGran::post_force(int /*vflag*/) history_one[i][j] = 0.0; } else { - if (pairstyle == GRANULAR && normal_model == JKR && use_history){ - if ((history_one[i][0] == 0) && (rsq > radius[i]*radius[i])){ + if (pairstyle == GRANULAR && normal_model == JKR && use_history) { + if ((history_one[i][0] == 0) && (rsq > radius[i]*radius[i])) { // Particles have not contacted yet, and are outside of contact distance for (j = 0; j < size_history; j++) history_one[i][j] = 0.0; @@ -650,7 +630,7 @@ void FixWallGran::post_force(int /*vflag*/) if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; // store contact info - if (peratom_flag){ + if (peratom_flag) { array_atom[i][0] = (double)atom->tag[i]; array_atom[i][4] = x[i][0] - dx; array_atom[i][5] = x[i][1] - dy; @@ -764,7 +744,7 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, fy = dy*ccel + fs2; fz = dz*ccel + fs3; - if (peratom_flag){ + if (peratom_flag) { contact[1] = fx; contact[2] = fy; contact[3] = fz; @@ -891,7 +871,7 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, f[1] += fy; f[2] += fz; - if (peratom_flag){ + if (peratom_flag) { contact[1] = fx; contact[2] = fy; contact[3] = fz; @@ -1017,7 +997,7 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, fy = dy*ccel + fs2; fz = dz*ccel + fs3; - if (peratom_flag){ + if (peratom_flag) { contact[1] = fx; contact[2] = fy; contact[3] = fz; @@ -1056,7 +1036,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, double fs, fs1, fs2, fs3; double tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; //For JKR double R2, coh, F_pulloff, a, a2, E; @@ -1106,7 +1086,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, delta = radsum - r; dR = delta*Reff; - if (normal_model == JKR){ + if (normal_model == JKR) { history[0] = 1.0; E *= THREEQUARTERS; R2=Reff*Reff; @@ -1130,7 +1110,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, else{ knfac = E; //Hooke a = sqrt(dR); - if (normal_model != HOOKE){ + if (normal_model != HOOKE) { Fne *= a; knfac *= a; } @@ -1139,13 +1119,13 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, Fne -= 4*MY_PI*normal_coeffs[3]*Reff; } - if (damping_model == VELOCITY){ + if (damping_model == VELOCITY) { damp_normal = 1; } - else if (damping_model == VISCOELASTIC){ + else if (damping_model == VISCOELASTIC) { damp_normal = a*meff; } - else if (damping_model == TSUJI){ + else if (damping_model == TSUJI) { damp_normal = sqrt(meff*knfac); } @@ -1175,11 +1155,11 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - if (normal_model == JKR){ + if (normal_model == JKR) { F_pulloff = 3*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } - else if (normal_model == DMT){ + else if (normal_model == DMT) { F_pulloff = 4*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } @@ -1197,13 +1177,13 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, int thist1 = thist0 + 1; int thist2 = thist1 + 1; - if (tangential_history){ - if (tangential_model == TANGENTIAL_MINDLIN){ + if (tangential_history) { + if (tangential_model == TANGENTIAL_MINDLIN) { k_tangential *= a; } - else if (tangential_model == TANGENTIAL_MINDLIN_RESCALE){ + else if (tangential_model == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - if (a < history[3]){ //On unloading, rescale the shear displacements + if (a < history[3]) { //On unloading, rescale the shear displacements double factor = a/history[thist2+1]; history[thist0] *= factor; history[thist1] *= factor; @@ -1218,7 +1198,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, if (history_update) { rsht = history[thist0]*nx + history[thist1]*ny + history[thist2]*nz; if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ + if (rsht > 0) { scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! history[thist0] -= rsht*nx; history[thist1] -= rsht*ny; @@ -1266,7 +1246,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, // Rolling resistance //**************************************** - if (roll_model != ROLL_NONE){ + if (roll_model != ROLL_NONE) { relrot1 = omega[0]; relrot2 = omega[1]; relrot3 = omega[2]; @@ -1277,9 +1257,6 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); - if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; - else vrlmaginv = 0.0; int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; @@ -1292,9 +1269,9 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - if (history_update){ + if (history_update) { if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane + if (rolldotn > 0) { //Rotate into tangential plane scalefac = rollmag/(rollmag - rolldotn); history[rhist0] -= rolldotn*nx; history[rhist1] -= rolldotn*ny; @@ -1334,9 +1311,9 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, //**************************************** // Twisting torque, including history effects //**************************************** - if (twist_model != TWIST_NONE){ + if (twist_model != TWIST_NONE) { magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist_model == TWIST_MARSHALL){ + if (twist_model == TWIST_MARSHALL) { k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a*tangential_coeffs[2]; @@ -1346,7 +1323,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, damp_twist = twist_coeffs[1]; mu_twist = twist_coeffs[2]; } - if (history_update){ + if (history_update) { history[twist_history_index] += magtwist*dt; } magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) @@ -1363,7 +1340,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, fy = ny*Fntot + fs2; fz = nz*Fntot + fs3; - if (peratom_flag){ + if (peratom_flag) { contact[1] = fx; contact[2] = fy; contact[3] = fz; @@ -1381,7 +1358,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, torque[1] -= radius*tor2; torque[2] -= radius*tor3; - if (twist_model != TWIST_NONE){ + if (twist_model != TWIST_NONE) { tortwist1 = magtortwist * nx; tortwist2 = magtortwist * ny; tortwist3 = magtortwist * nz; @@ -1391,7 +1368,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, torque[2] += tortwist3; } - if (roll_model != ROLL_NONE){ + if (roll_model != ROLL_NONE) { torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -1425,7 +1402,7 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { if (use_history) memory->grow(history_one,nmax,size_history,"fix_wall_gran:history_one"); - if (peratom_flag){ + if (peratom_flag) { memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); } } @@ -1439,7 +1416,7 @@ void FixWallGran::copy_arrays(int i, int j, int /*delflag*/) if (use_history) for (int m = 0; m < size_history; m++) history_one[j][m] = history_one[i][m]; - if (peratom_flag){ + if (peratom_flag) { for (int m = 0; m < size_peratom_cols; m++) array_atom[j][m] = array_atom[i][m]; } @@ -1454,7 +1431,7 @@ void FixWallGran::set_arrays(int i) if (use_history) for (int m = 0; m < size_history; m++) history_one[i][m] = 0; - if (peratom_flag){ + if (peratom_flag) { for (int m = 0; m < size_peratom_cols; m++) array_atom[i][m] = 0; } @@ -1467,11 +1444,11 @@ void FixWallGran::set_arrays(int i) int FixWallGran::pack_exchange(int i, double *buf) { int n = 0; - if (use_history){ + if (use_history) { for (int m = 0; m < size_history; m++) buf[n++] = history_one[i][m]; } - if (peratom_flag){ + if (peratom_flag) { for (int m = 0; m < size_peratom_cols; m++) buf[n++] = array_atom[i][m]; } @@ -1485,11 +1462,11 @@ int FixWallGran::pack_exchange(int i, double *buf) int FixWallGran::unpack_exchange(int nlocal, double *buf) { int n = 0; - if (use_history){ + if (use_history) { for (int m = 0; m < size_history; m++) history_one[nlocal][m] = buf[n++]; } - if (peratom_flag){ + if (peratom_flag) { for (int m = 0; m < size_peratom_cols; m++) array_atom[nlocal][m] = buf[n++]; } @@ -1558,7 +1535,8 @@ void FixWallGran::reset_dt() dt = update->dt; } -double FixWallGran::pulloff_distance(double radius){ +double FixWallGran::pulloff_distance(double radius) +{ double coh, E, a, dist; coh = normal_coeffs[3]; E = normal_coeffs[0]*THREEQUARTERS; diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index 07c6c131cf..a81cdcb6c8 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -46,17 +46,17 @@ class FixWallGran : public Fix { virtual int maxsize_restart(); void reset_dt(); - void hooke(double, double, double, double, double *, - double *, double *, double *, double *, double, double, double*); + void hooke(double, double, double, double, double *, double *, + double *, double *, double *, double, double, double*); void hooke_history(double, double, double, double, double *, - double *, double *, double *, double *, double, double, - double *, double *); - void hertz_history(double, double, double, double, double *, double, - double *, double *, double *, double *, double, double, - double *, double *); + double *, double *, double *, double *, double, + double, double *, double *); + void hertz_history(double, double, double, double, double *, + double, double *, double *, double *, double *, + double, double, double *, double *); void granular(double, double, double, double, double *, double, - double *, double *, double *, double *, double, double, - double *, double *); + double *, double *, double *, double *, double, + double, double *, double *); double pulloff_distance(double); From 05a5ecd4d4cd17f624835602b9b221d70bdf42f6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:24:41 -0400 Subject: [PATCH 088/243] silence compiler warnings about unused parameters --- src/GRANULAR/pair_granular.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 5bddd89ea8..427bbbd7fa 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -1241,7 +1241,8 @@ void PairGranular::reset_dt() /* ---------------------------------------------------------------------- */ double PairGranular::single(int i, int j, int itype, int jtype, - double rsq, double factor_coul, double factor_lj, double &fforce) + double rsq, double /* factor_coul */, + double /* factor_lj */, double &fforce) { double radi,radj,radsum; double r,rinv,delx,dely,delz, nx, ny, nz, Reff; @@ -1604,7 +1605,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, /* ---------------------------------------------------------------------- */ int PairGranular::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) + int /* pbc_flag */, int * /* pbc */) { int i,j,m; From 4cd0ea61f24012477e58f2a315f7f280cb245af3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:33:15 -0400 Subject: [PATCH 089/243] change source code format style to be more like other LAMMPS sources --- src/GRANULAR/pair_granular.cpp | 296 ++++++++++++++------------------- 1 file changed, 122 insertions(+), 174 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 427bbbd7fa..b3046788e0 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -147,18 +147,18 @@ void PairGranular::compute(int eflag, int vflag) double mi,mj,meff; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; - //For JKR + // For JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3; - //Rolling + // Rolling double k_roll, damp_roll; double torroll1, torroll2, torroll3; double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; - //Twisting + // Twisting double k_twist, damp_twist, mu_twist; double signtwist, magtwist, magtortwist, Mtcrit; double tortwist1, tortwist2, tortwist3; @@ -180,7 +180,7 @@ void PairGranular::compute(int eflag, int vflag) // body[i] = which body atom I is in, -1 if none // mass_body = mass of each rigid body - if (fix_rigid && neighbor->ago == 0){ + if (fix_rigid && neighbor->ago == 0) { int tmp; int *body = (int *) fix_rigid->extract("body",tmp); double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); @@ -211,7 +211,7 @@ void PairGranular::compute(int eflag, int vflag) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - if (use_history){ + if (use_history) { firsttouch = fix_history->firstflag; firsthistory = fix_history->firstvalue; } @@ -224,14 +224,14 @@ void PairGranular::compute(int eflag, int vflag) ztmp = x[i][2]; itype = type[i]; radi = radius[i]; - if (use_history){ + if (use_history) { touch = firsttouch[i]; allhistory = firsthistory[i]; } jlist = firstneigh[i]; jnum = numneigh[i]; - for (jj = 0; jj < jnum; jj++){ + for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; @@ -247,33 +247,30 @@ void PairGranular::compute(int eflag, int vflag) Reff = radi*radj/radsum; touchflag = false; - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { E *= THREEQUARTERS; - if (touch[jj]){ + if (touch[jj]) { R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; a = cbrt(9.0*M_PI*coh*R2/(4*E)); delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum-delta_pulloff; touchflag = (rsq < dist_pulloff*dist_pulloff); - } - else{ + } else { touchflag = (rsq < radsum*radsum); } - } - else{ + } else { touchflag = (rsq < radsum*radsum); } - if (!touchflag){ + if (!touchflag) { // unset non-touching neighbors - if (use_history){ + if (use_history) { touch[jj] = 0; history = &allhistory[size_history*jj]; for (int k = 0; k < size_history; k++) history[k] = 0.0; } - } - else{ + } else { r = sqrt(rsq); rinv = 1.0/r; @@ -311,7 +308,7 @@ void PairGranular::compute(int eflag, int vflag) delta = radsum - r; dR = delta*Reff; - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { touch[jj] = 1; R2=Reff*Reff; coh = normal_coeffs[itype][jtype][3]; @@ -330,12 +327,11 @@ void PairGranular::compute(int eflag, int vflag) a2 = a*a; knfac = normal_coeffs[itype][jtype][0]*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ + } else { knfac = E; //Hooke Fne = knfac*delta; a = sqrt(dR); - if (normal_model[itype][jtype] != HOOKE){ + if (normal_model[itype][jtype] != HOOKE) { Fne *= a; knfac *= a; } @@ -344,13 +340,11 @@ void PairGranular::compute(int eflag, int vflag) } //Consider restricting Hooke to only have 'velocity' as an option for damping? - if (damping_model[itype][jtype] == VELOCITY){ + if (damping_model[itype][jtype] == VELOCITY) { damp_normal = 1; - } - else if (damping_model[itype][jtype] == VISCOELASTIC){ + } else if (damping_model[itype][jtype] == VISCOELASTIC) { damp_normal = a*meff; - } - else if (damping_model[itype][jtype] == TSUJI){ + } else if (damping_model[itype][jtype] == TSUJI) { damp_normal = sqrt(meff*knfac); } @@ -381,20 +375,18 @@ void PairGranular::compute(int eflag, int vflag) vrel = sqrt(vrel); // If any history is needed: - if (use_history){ + if (use_history) { touch[jj] = 1; history = &allhistory[size_history*jj]; } - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { F_pulloff = 3*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); - } - else if (normal_model[itype][jtype] == DMT){ + } else if (normal_model[itype][jtype] == DMT) { F_pulloff = 4*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); - } - else{ + } else { Fncrit = fabs(Fntot); } @@ -404,13 +396,12 @@ void PairGranular::compute(int eflag, int vflag) k_tangential = tangential_coeffs[itype][jtype][0]; damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; - if (tangential_history){ - if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN){ + if (tangential_history) { + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN) { k_tangential *= a; - } - else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE){ + } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - if (a < history[3]){ //On unloading, rescale the shear displacements + if (a < history[3]) { //On unloading, rescale the shear displacements double factor = a/history[3]; history[0] *= factor; history[1] *= factor; @@ -422,7 +413,7 @@ void PairGranular::compute(int eflag, int vflag) if (historyupdate) { rsht = history[0]*nx + history[1]*ny + history[2]*nz; if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0){ + if (rsht > 0) { shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); scalefac = shrmag/(shrmag - rsht); //if rsht == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! @@ -461,8 +452,7 @@ void PairGranular::compute(int eflag, int vflag) fs3 *= Fscrit/fs; } else fs1 = fs2 = fs3 = 0.0; } - } - else{ //Classic pair gran/hooke (no history) + } else{ //Classic pair gran/hooke (no history) fs = meff*damp_tangential*vrel; if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; else Ft = 0.0; @@ -475,7 +465,7 @@ void PairGranular::compute(int eflag, int vflag) // Rolling resistance //**************************************** - if (roll_model[itype][jtype] != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE) { relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -492,9 +482,9 @@ void PairGranular::compute(int eflag, int vflag) int rhist2 = rhist1 + 1; rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - if (historyupdate){ + if (historyupdate) { if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0){ //Rotate into tangential plane + if (rolldotn > 0) { //Rotate into tangential plane rollmag = sqrt(history[rhist0]*history[rhist0] + history[rhist1]*history[rhist1] + history[rhist2]*history[rhist2]); @@ -540,19 +530,18 @@ void PairGranular::compute(int eflag, int vflag) //**************************************** // Twisting torque, including history effects //**************************************** - if (twist_model[itype][jtype] != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE) { magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist_model[itype][jtype] == TWIST_MARSHALL){ + if (twist_model[itype][jtype] == TWIST_MARSHALL) { k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a*tangential_coeffs[itype][jtype][2]; - } - else{ + } else { k_twist = twist_coeffs[itype][jtype][0]; damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - if (historyupdate){ + if (historyupdate) { history[twist_history_index] += magtwist*dt; } magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) @@ -582,7 +571,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][1] -= dist_to_contact*tor2; torque[i][2] -= dist_to_contact*tor3; - if (twist_model[itype][jtype] != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE) { tortwist1 = magtortwist * nx; tortwist2 = magtortwist * ny; tortwist3 = magtortwist * nz; @@ -592,7 +581,7 @@ void PairGranular::compute(int eflag, int vflag) torque[i][2] += tortwist3; } - if (roll_model[itype][jtype] != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE) { torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -612,12 +601,12 @@ void PairGranular::compute(int eflag, int vflag) torque[j][1] -= dist_to_contact*tor2; torque[j][2] -= dist_to_contact*tor3; - if (twist_model[itype][jtype] != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE) { torque[j][0] -= tortwist1; torque[j][1] -= tortwist2; torque[j][2] -= tortwist3; } - if (roll_model[itype][jtype] != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE) { torque[j][0] -= torroll1; torque[j][1] -= torroll2; torque[j][2] -= torroll3; @@ -673,10 +662,9 @@ void PairGranular::allocate() void PairGranular::settings(int narg, char **arg) { - if (narg == 1){ + if (narg == 1) { cutoff_global = force->numeric(FLERR,arg[0]); - } - else{ + } else { cutoff_global = -1; //Will be set based on particle sizes, model choice } @@ -715,23 +703,21 @@ void PairGranular::coeff(int narg, char **arg) damping_model_one = VISCOELASTIC; int iarg = 2; - while (iarg < narg){ - if (strcmp(arg[iarg], "hooke") == 0){ + while (iarg < narg) { + if (strcmp(arg[iarg], "hooke") == 0) { if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); normal_model_one = HOOKE; normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += 3; - } - else if (strcmp(arg[iarg], "hertz") == 0){ + } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_model_one = HERTZ; normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "hertz/material") == 0){ + } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz/material option"); normal_model_one = HERTZ_MATERIAL; @@ -739,8 +725,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio iarg += num_coeffs+1; - } - else if (strcmp(arg[iarg], "dmt") == 0){ + } else if (strcmp(arg[iarg], "dmt") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); normal_model_one = DMT; normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E @@ -748,8 +733,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; - } - else if (strcmp(arg[iarg], "jkr") == 0){ + } else if (strcmp(arg[iarg], "jkr") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); beyond_contact = 1; normal_model_one = JKR; @@ -758,67 +742,57 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; - } - else if (strcmp(arg[iarg], "damping") == 0){ + } else if (strcmp(arg[iarg], "damping") == 0) { if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); - if (strcmp(arg[iarg+1], "velocity") == 0){ + if (strcmp(arg[iarg+1], "velocity") == 0) { damping_model_one = VELOCITY; iarg += 1; - } - else if (strcmp(arg[iarg+1], "viscoelastic") == 0){ + } else if (strcmp(arg[iarg+1], "viscoelastic") == 0) { damping_model_one = VISCOELASTIC; iarg += 1; - } - else if (strcmp(arg[iarg+1], "tsuji") == 0){ + } else if (strcmp(arg[iarg+1], "tsuji") == 0) { damping_model_one = TSUJI; iarg += 1; - } - else error->all(FLERR, "Illegal pair_coeff command, unrecognized damping model"); + } else error->all(FLERR, "Illegal pair_coeff command, unrecognized damping model"); iarg += 1; - } - else if (strcmp(arg[iarg], "tangential") == 0){ + } else if (strcmp(arg[iarg], "tangential") == 0) { if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); - if (strcmp(arg[iarg+1], "linear_nohistory") == 0){ + if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); tangential_model_one = TANGENTIAL_NOHISTORY; tangential_coeffs_one[0] = 0; tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. iarg += 4; - } - else if ((strcmp(arg[iarg+1], "linear_history") == 0) || + } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || - (strcmp(arg[iarg+1], "mindlin_rescale") == 0)){ + (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model_one = TANGENTIAL_HISTORY; else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model_one = TANGENTIAL_MINDLIN; else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; tangential_history = 1; if ((tangential_model_one == TANGENTIAL_MINDLIN || tangential_model_one == TANGENTIAL_MINDLIN_RESCALE) && - (strcmp(arg[iarg+2], "NULL") == 0)){ - if (normal_model_one == HERTZ || normal_model_one == HOOKE){ + (strcmp(arg[iarg+2], "NULL") == 0)) { + if (normal_model_one == HERTZ || normal_model_one == HOOKE) { error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); } tangential_coeffs_one[0] = -1; - } - else{ + } else { tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt } tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); } - } - else if (strcmp(arg[iarg], "rolling") == 0){ + } else if (strcmp(arg[iarg], "rolling") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ + if (strcmp(arg[iarg+1], "none") == 0) { roll_model_one = ROLL_NONE; iarg += 2; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ + } else if (strcmp(arg[iarg+1], "sds") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); roll_model_one = ROLL_SDS; roll_history = 1; @@ -826,23 +800,19 @@ void PairGranular::coeff(int narg, char **arg) roll_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR roll_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); } - } - else if (strcmp(arg[iarg], "twisting") == 0){ + } else if (strcmp(arg[iarg], "twisting") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); - if (strcmp(arg[iarg+1], "none") == 0){ + if (strcmp(arg[iarg+1], "none") == 0) { twist_model_one = TWIST_NONE; iarg += 2; - } - else if (strcmp(arg[iarg+1], "marshall") == 0){ + } else if (strcmp(arg[iarg+1], "marshall") == 0) { twist_model_one = TWIST_MARSHALL; twist_history = 1; iarg += 2; - } - else if (strcmp(arg[iarg+1], "sds") == 0){ + } else if (strcmp(arg[iarg+1], "sds") == 0) { if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); twist_model_one = TWIST_SDS; twist_history = 1; @@ -850,16 +820,13 @@ void PairGranular::coeff(int narg, char **arg) twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; - } - else{ + } else { error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); } - } - else if (strcmp(arg[iarg], "cutoff") == 0){ + } else if (strcmp(arg[iarg], "cutoff") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); cutoff_one = force->numeric(FLERR,arg[iarg+1]); - } - else error->all(FLERR, "Illegal pair coeff command"); + } else error->all(FLERR, "Illegal pair coeff command"); } //It is an error not to specify normal or tangential model @@ -867,25 +834,23 @@ void PairGranular::coeff(int narg, char **arg) int count = 0; double damp; - if (damping_model_one == TSUJI){ + if (damping_model_one == TSUJI) { double cor; cor = normal_coeffs_one[1]; damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ 27.467*pow(cor,4)-18.022*pow(cor,5)+ 4.8218*pow(cor,6); - } - else damp = normal_coeffs_one[1]; + } else damp = normal_coeffs_one[1]; for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { normal_model[i][j] = normal_model[j][i] = normal_model_one; normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = damp; - if (normal_model_one != HERTZ && normal_model_one != HOOKE){ + if (normal_model_one != HERTZ && normal_model_one != HOOKE) { Emod[i][j] = Emod[j][i] = normal_coeffs_one[0]; poiss[i][j] = poiss[j][i] = normal_coeffs_one[2]; normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = FOURTHIRDS*mix_stiffnessE(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); - } - else{ + } else { normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_one[0]; } if ((normal_model_one == JKR) || (normal_model_one == DMT)) @@ -894,10 +859,9 @@ void PairGranular::coeff(int narg, char **arg) damping_model[i][j] = damping_model[j][i] = damping_model_one; tangential_model[i][j] = tangential_model[j][i] = tangential_model_one; - if (tangential_coeffs_one[0] == -1){ + if (tangential_coeffs_one[0] == -1) { tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = 8*mix_stiffnessG(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); - } - else{ + } else { tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = tangential_coeffs_one[0]; } for (int k = 1; k < 3; k++) @@ -949,23 +913,22 @@ void PairGranular::init_style() size_history = 3*tangential_history + 3*roll_history + twist_history; //Determine location of tangential/roll/twist histories in array - if (roll_history){ + if (roll_history) { if (tangential_history) roll_history_index = 3; else roll_history_index = 0; } - if (twist_history){ - if (tangential_history){ + if (twist_history) { + if (tangential_history) { if (roll_history) twist_history_index = 6; else twist_history_index = 3; - } - else{ + } else { if (roll_history) twist_history_index = 3; else twist_history_index = 0; } } for (int i = 1; i <= atom->ntypes; i++) for (int j = i; j <= atom->ntypes; j++) - if (tangential_model[i][j] == TANGENTIAL_MINDLIN_RESCALE){ + if (tangential_model[i][j] == TANGENTIAL_MINDLIN_RESCALE) { size_history += 1; roll_history_index += 1; twist_history_index += 1; @@ -1049,24 +1012,23 @@ void PairGranular::init_style() int *type = atom->type; int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++){ + for (i = 0; i < nlocal; i++) { double radius_cut = radius[i]; - if (mask[i] & freeze_group_bit){ + if (mask[i] & freeze_group_bit) { onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius_cut); - } - else{ + } else { onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius_cut); } } MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_DOUBLE,MPI_MAX,world); MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_DOUBLE,MPI_MAX,world); // set fix which stores history info - if (size_history > 0){ + if (size_history > 0) { int ifix = modify->find_fix("NEIGH_HISTORY"); if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); fix_history = (FixNeighHistory *) modify->fix[ifix]; @@ -1081,12 +1043,12 @@ double PairGranular::init_one(int i, int j) { double cutoff; - if (setflag[i][j] == 0){ + if (setflag[i][j] == 0) { if ((normal_model[i][i] != normal_model[j][j]) || (damping_model[i][i] != damping_model[j][j]) || (tangential_model[i][i] != tangential_model[j][j]) || (roll_model[i][i] != roll_model[j][j]) || - (twist_model[i][i] != twist_model[j][j])){ + (twist_model[i][i] != twist_model[j][j])) { char str[512]; sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); @@ -1105,12 +1067,12 @@ double PairGranular::init_one(int i, int j) for (int k = 0; k < 3; k++) tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); - if (roll_model[i][j] != ROLL_NONE){ + if (roll_model[i][j] != ROLL_NONE) { for (int k = 0; k < 3; k++) roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } - if (twist_model[i][j] != TWIST_NONE && twist_model[i][j] != TWIST_MARSHALL){ + if (twist_model[i][j] != TWIST_NONE && twist_model[i][j] != TWIST_MARSHALL) { for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } @@ -1124,14 +1086,14 @@ double PairGranular::init_one(int i, int j) // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. double pulloff; - if (cutoff_type[i][j] < 0 && cutoff_global < 0){ + if (cutoff_type[i][j] < 0 && cutoff_global < 0) { if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; pulloff = 0.0; - if (normal_model[i][j] == JKR){ + if (normal_model[i][j] == JKR) { pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_dynamic[j], i, j); cutoff += pulloff; } @@ -1143,8 +1105,7 @@ double PairGranular::init_one(int i, int j) if (normal_model[i][j] == JKR) pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_frozen[j], i, j); cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]+pulloff); - } - else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + } else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) double cutmax = 0.0; for (int k = 1; k <= atom->ntypes; k++) { cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); @@ -1152,11 +1113,9 @@ double PairGranular::init_one(int i, int j) } cutoff = cutmax; } - } - else if (cutoff_type[i][j] > 0){ + } else if (cutoff_type[i][j] > 0) { cutoff = cutoff_type[i][j]; - } - else if (cutoff_global > 0){ + } else if (cutoff_global > 0) { cutoff = cutoff_global; } @@ -1285,7 +1244,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, bool touchflag; E = normal_coeffs[itype][jtype][0]; - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { E *= THREEQUARTERS; R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; @@ -1293,12 +1252,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); dist_pulloff = radsum+delta_pulloff; touchflag = (rsq <= dist_pulloff*dist_pulloff); - } - else{ - touchflag = (rsq <= radsum*radsum); - } + } else touchflag = (rsq <= radsum*radsum); - if (!touchflag){ + if (!touchflag) { fforce = 0.0; for (int m = 0; m < single_extra; m++) svector[m] = 0.0; return 0.0; @@ -1376,7 +1332,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, delta = radsum - r; dR = delta*Reff; - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { dR2 = dR*dR; t0 = coh*coh*R2*R2*E; t1 = PI27SQ*t0; @@ -1392,12 +1348,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, a2 = a*a; knfac = normal_coeffs[itype][jtype][0]*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ + } else { knfac = E; Fne = knfac*delta; a = sqrt(dR); - if (normal_model[itype][jtype] != HOOKE){ + if (normal_model[itype][jtype] != HOOKE) { Fne *= a; knfac *= a; } @@ -1405,13 +1360,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } - if (damping_model[itype][jtype] == VELOCITY){ + if (damping_model[itype][jtype] == VELOCITY) { damp_normal = normal_coeffs[itype][jtype][1]; - } - else if (damping_model[itype][jtype] == VISCOELASTIC){ + } else if (damping_model[itype][jtype] == VISCOELASTIC) { damp_normal = normal_coeffs[itype][jtype][1]*a*meff; - } - else if (damping_model[itype][jtype] == TSUJI){ + } else if (damping_model[itype][jtype] == TSUJI) { damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); } @@ -1423,7 +1376,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, jnum = list->numneigh[i]; jlist = list->firstneigh[i]; - if (use_history){ + if (use_history) { allhistory = fix_history->firstvalue[i]; for (int jj = 0; jj < jnum; jj++) { neighprev++; @@ -1454,15 +1407,13 @@ double PairGranular::single(int i, int j, int itype, int jtype, vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - if (normal_model[itype][jtype] == JKR){ + if (normal_model[itype][jtype] == JKR) { F_pulloff = 3*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); - } - else if (normal_model[itype][jtype] == DMT){ + } else if (normal_model[itype][jtype] == DMT) { F_pulloff = 4*M_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); - } - else{ + } else { Fncrit = fabs(Fntot); } @@ -1472,13 +1423,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, k_tangential = tangential_coeffs[itype][jtype][0]; damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; - if (tangential_history){ - if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN){ + if (tangential_history) { + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN) { k_tangential *= a; - } - else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE){ + } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - if (a < history[3]){ //On unloading, rescale the shear displacements + if (a < history[3]) { //On unloading, rescale the shear displacements double factor = a/history[3]; history[0] *= factor; history[1] *= factor; @@ -1507,8 +1457,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, fs3 *= Fscrit/fs; } else fs1 = fs2 = fs3 = 0.0; } - } - else{ //Classic pair gran/hooke (no history) + } else { //Classic pair gran/hooke (no history) fs = meff*damp_tangential*vrel; if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; else Ft = 0.0; @@ -1521,7 +1470,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // Rolling resistance //**************************************** - if (roll_model[itype][jtype] != ROLL_NONE){ + if (roll_model[itype][jtype] != ROLL_NONE) { relrot1 = omega[i][0] - omega[j][0]; relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; @@ -1565,14 +1514,13 @@ double PairGranular::single(int i, int j, int itype, int jtype, //**************************************** // Twisting torque, including history effects //**************************************** - if (twist_model[itype][jtype] != TWIST_NONE){ + if (twist_model[itype][jtype] != TWIST_NONE) { magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist_model[itype][jtype] == TWIST_MARSHALL){ + if (twist_model[itype][jtype] == TWIST_MARSHALL) { k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a*tangential_coeffs[itype][jtype][2];; - } - else{ + } else { k_twist = twist_coeffs[itype][jtype][0]; damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; @@ -1686,7 +1634,7 @@ double PairGranular::pulloff_distance(double radi, double radj, int itype, int j Transfer history during fix/neigh/history exchange Only needed if any history entries i-j are not just negative of j-i entries ------------------------------------------------------------------------- */ -void PairGranular::transfer_history(double* source, double* target){ +void PairGranular::transfer_history(double* source, double* target) { for (int i = 0; i < size_history; i++) target[i] = history_transfer_factors[i]*source[i]; } From a7a1fd4ee583be6bbd77ba82e194672c02e973a8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:50:44 -0400 Subject: [PATCH 090/243] remove reference to USER-OMP version of fix wall/gran --- doc/src/Commands_fix.txt | 2 +- doc/src/fix_wall_gran.txt | 23 ----------------------- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/doc/src/Commands_fix.txt b/doc/src/Commands_fix.txt index 678cc9ba0d..c8b3ef8991 100644 --- a/doc/src/Commands_fix.txt +++ b/doc/src/Commands_fix.txt @@ -224,7 +224,7 @@ OPT. "wall/body/polyhedron"_fix_wall_body_polyhedron.html, "wall/colloid"_fix_wall.html, "wall/ees"_fix_wall_ees.html, -"wall/gran (o)"_fix_wall_gran.html, +"wall/gran"_fix_wall_gran.html, "wall/gran/region"_fix_wall_gran_region.html, "wall/harmonic"_fix_wall.html, "wall/lj1043"_fix_wall.html, diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt index e8c2247594..198b22aa3f 100644 --- a/doc/src/fix_wall_gran.txt +++ b/doc/src/fix_wall_gran.txt @@ -7,7 +7,6 @@ :line fix wall/gran command :h3 -fix wall/gran/omp command :h3 [Syntax:] @@ -151,28 +150,6 @@ the clockwise direction for {vshear} > 0 or counter-clockwise for {vshear} < 0. In this case, {vshear} is the tangential velocity of the wall at whatever {radius} has been defined. -:line - -Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the "Speed packages"_Speed_packages.html doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, -USER-OMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the "Build -package"_Build_package.html doc page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the "-suffix command-line -switch"_Run_options.html when you invoke LAMMPS, or you can use the -"suffix"_suffix.html command in your input script. - -See the "Speed packages"_Speed_packages.html doc page for more -instructions on how to use the accelerated styles effectively. - [Restart, fix_modify, output, run start/stop, minimize info:] This fix writes the shear friction state of atoms interacting with the From 2bac3650811d5b30fc04e61fe85abdab195a7d90 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 15:51:08 -0400 Subject: [PATCH 091/243] support old style PDF build for new pair style granular --- doc/src/lammps.book | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 198e234f0c..8165c9d743 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -578,6 +578,7 @@ pair_extep.html pair_gauss.html pair_gayberne.html pair_gran.html +pair_granular.html pair_gromacs.html pair_gw.html pair_ilp_graphene_hbn.html From ac20d1ab41d63096f60cdeac54d1f76cb60b5dff Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 18 Mar 2019 09:52:16 -0600 Subject: [PATCH 092/243] fix corner-case issue with hyper communication, also timer --- src/REPLICA/fix_hyper_local.cpp | 12 ++++++++++-- src/REPLICA/hyper.cpp | 11 ++++++++--- src/comm_brick.cpp | 18 ++++++++---------- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index 21ad2cd86a..be4a642ebb 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -1261,16 +1261,24 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) { int i,j,k,m; - m = 0; + // return if n = 0 + // b/c if there are no atoms (n = 0), the message will not have + // been sent by Comm::reverse_comm_fix() or reverse_comm_fix_variable() + // so must not read nonzero from first buf location (would be zero anyway) + + if (n == 0) return; // STRAIN // unpack maxstrain vector // nonzero # of entries, each has offset to which atom in receiver's list // use MAX, b/c want maximum abs value strain for each atom's bonds - + + m = 0; + if (commflag == STRAIN) { int offset; int nonzero = (int) ubuf(buf[m++]).i; // # of atoms with values + for (int iatom = 0; iatom < nonzero; iatom++) { offset = (int) ubuf(buf[m++]).i; // offset into list for which atom j = list[offset]; diff --git a/src/REPLICA/hyper.cpp b/src/REPLICA/hyper.cpp index 0d8de6d060..5d820b2e27 100644 --- a/src/REPLICA/hyper.cpp +++ b/src/REPLICA/hyper.cpp @@ -181,9 +181,6 @@ void Hyper::command(int narg, char **arg) if (hyperenable) fix_hyper->init_hyper(); - timer->barrier_start(); - time_start = timer->get_wall(Timer::TOTAL); - // perform initial minimization and bond list creation int nevent = 0; @@ -198,6 +195,14 @@ void Hyper::command(int narg, char **arg) if (hyperenable) fix_hyper->build_bond_list(0); fix_event->restore_state_quench(); + // reset stats and timers to skip HD setup + + nbuild = ndanger = 0; + time_dynamics = time_quench = 0.0; + + timer->barrier_start(); + time_start = timer->get_wall(Timer::TOTAL); + // main loop: dynamics, store state, quench, check event, restore state int ecount; diff --git a/src/comm_brick.cpp b/src/comm_brick.cpp index 64b21e41c9..330551aaed 100644 --- a/src/comm_brick.cpp +++ b/src/comm_brick.cpp @@ -1046,10 +1046,6 @@ void CommBrick::reverse_comm_fix(Fix *fix, int size) reverse communication invoked by a Fix with variable size data query fix for pack size to insure buf_send is big enough handshake sizes before each Irecv/Send to insure buf_recv is big enough - this removes the if tests on sendnum and recvnum to make MPI calls, - as in reverse_comm_fix(), b/c the caller may still want to - exchange a message even if the send/recv swap has no atoms, - e.g. a reduced count = 0 of atoms to send/recv, as in fix hyper/local ------------------------------------------------------------------------- */ void CommBrick::reverse_comm_fix_variable(Fix *fix) @@ -1074,12 +1070,14 @@ void CommBrick::reverse_comm_fix_variable(Fix *fix) &nrecv,1,MPI_INT,sendproc[iswap],0,world, MPI_STATUS_IGNORE); - if (nrecv > maxrecv) grow_recv(nrecv); - MPI_Irecv(buf_recv,maxrecv,MPI_DOUBLE,sendproc[iswap],0, - world,&request); - - MPI_Send(buf_send,nsend,MPI_DOUBLE,recvproc[iswap],0,world); - MPI_Wait(&request,MPI_STATUS_IGNORE); + if (sendnum[iswap]) { + if (nrecv > maxrecv) grow_recv(nrecv); + MPI_Irecv(buf_recv,maxrecv,MPI_DOUBLE,sendproc[iswap],0, + world,&request); + } + if (recvnum[iswap]) + MPI_Send(buf_send,nsend,MPI_DOUBLE,recvproc[iswap],0,world); + if (sendnum[iswap]) MPI_Wait(&request,MPI_STATUS_IGNORE); buf = buf_recv; } else buf = buf_send; From cf8bee9b46da121e2c930b8cba2b96635a1ad92c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 11:43:29 -0400 Subject: [PATCH 093/243] remove unused and redundant data elements. no write_data support for tables. --- src/USER-MISC/dihedral_table_cut.cpp | 82 ++-------------------------- src/USER-MISC/dihedral_table_cut.h | 8 --- 2 files changed, 4 insertions(+), 86 deletions(-) diff --git a/src/USER-MISC/dihedral_table_cut.cpp b/src/USER-MISC/dihedral_table_cut.cpp index 6ebe094e50..07d0af46b6 100644 --- a/src/USER-MISC/dihedral_table_cut.cpp +++ b/src/USER-MISC/dihedral_table_cut.cpp @@ -425,17 +425,6 @@ DihedralTableCut::DihedralTableCut(LAMMPS *lmp) : Dihedral(lmp) DihedralTableCut::~DihedralTableCut() { if (allocated) { - memory->destroy(setflag); - memory->destroy(setflag_d); - memory->destroy(setflag_aat); - - memory->destroy(k1); - memory->destroy(k2); - memory->destroy(k3); - memory->destroy(phi1); - memory->destroy(phi2); - memory->destroy(phi3); - memory->destroy(aat_k); memory->destroy(aat_theta0_1); memory->destroy(aat_theta0_2); @@ -761,27 +750,15 @@ void DihedralTableCut::allocate() allocated = 1; int n = atom->ndihedraltypes; - memory->create(k1,n+1,"dihedral:k1"); - memory->create(k2,n+1,"dihedral:k2"); - memory->create(k3,n+1,"dihedral:k3"); - memory->create(phi1,n+1,"dihedral:phi1"); - memory->create(phi2,n+1,"dihedral:phi2"); - memory->create(phi3,n+1,"dihedral:phi3"); - memory->create(aat_k,n+1,"dihedral:aat_k"); memory->create(aat_theta0_1,n+1,"dihedral:aat_theta0_1"); memory->create(aat_theta0_2,n+1,"dihedral:aat_theta0_2"); - memory->create(setflag,n+1,"dihedral:setflag"); - memory->create(setflag_d,n+1,"dihedral:setflag_d"); - memory->create(setflag_aat,n+1,"dihedral:setflag_aat"); - memory->create(tabindex,n+1,"dihedral:tabindex"); - //memory->create(phi0,n+1,"dihedral:phi0"); <-equilibrium angles not supported memory->create(setflag,n+1,"dihedral:setflag"); for (int i = 1; i <= n; i++) - setflag[i] = setflag_d[i] = setflag_aat[i] = 0; + setflag[i] = 0; } void DihedralTableCut::settings(int narg, char **arg) @@ -824,9 +801,6 @@ void DihedralTableCut::coeff(int narg, char **arg) int ilo,ihi; force->bounds(FLERR,arg[0],atom->ndihedraltypes,ilo,ihi); - int count = 0; - - double k_one = force->numeric(FLERR,arg[2]); double theta0_1_one = force->numeric(FLERR,arg[3]); double theta0_2_one = force->numeric(FLERR,arg[4]); @@ -837,8 +811,6 @@ void DihedralTableCut::coeff(int narg, char **arg) aat_k[i] = k_one; aat_theta0_1[i] = theta0_1_one/180.0 * MY_PI; aat_theta0_2[i] = theta0_2_one/180.0 * MY_PI; - setflag_aat[i] = 1; - count++; } int me; @@ -998,8 +970,7 @@ void DihedralTableCut::coeff(int narg, char **arg) // To be nice and report something, I do the same thing here.) cyc_splintD(tb->phi, tb->e, tb->e2, tablength, MY_2PI,phi); f = -dU_dphi; - } - else + } else // Otherwise we calculated the tb->f[] array. Report its contents. f = tb->f[i]; if (tb->use_degrees) { @@ -1015,9 +986,8 @@ void DihedralTableCut::coeff(int narg, char **arg) } // if (me == 0) // store ptr to table in tabindex - count = 0; - for (int i = ilo; i <= ihi; i++) - { + int count = 0; + for (int i = ilo; i <= ihi; i++) { tabindex[i] = ntables; //phi0[i] = tb->phi0; <- equilibrium dihedral angles not supported setflag[i] = 1; @@ -1025,12 +995,7 @@ void DihedralTableCut::coeff(int narg, char **arg) } ntables++; - if (count == 0) error->all(FLERR,"Incorrect args for dihedral coefficients"); - - for (int i = ilo; i <= ihi; i++) - if (setflag_d[i] == 1 && setflag_aat[i] == 1 ) - setflag[i] = 1; } /* ---------------------------------------------------------------------- @@ -1041,12 +1006,6 @@ void DihedralTableCut::write_restart(FILE *fp) { fwrite(&tabstyle,sizeof(int),1,fp); fwrite(&tablength,sizeof(int),1,fp); - fwrite(&k1[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&k2[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&k3[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&phi1[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&phi2[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&phi3[1],sizeof(double),atom->ndihedraltypes,fp); fwrite(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); fwrite(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); @@ -1064,32 +1023,18 @@ void DihedralTableCut::read_restart(FILE *fp) if (comm->me == 0) { fread(&tabstyle,sizeof(int),1,fp); fread(&tablength,sizeof(int),1,fp); - fread(&k1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&k2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&k3[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi3[1],sizeof(double),atom->ndihedraltypes,fp); fread(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); fread(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); fread(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); } - MPI_Bcast(&k1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&k2[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&k3[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&phi1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&phi2[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&phi3[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&aat_k[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); MPI_Bcast(&aat_theta0_1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); MPI_Bcast(&aat_theta0_2[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); MPI_Bcast(&tabstyle,1,MPI_INT,0,world); MPI_Bcast(&tablength,1,MPI_INT,0,world); - allocate(); for (int i = 1; i <= atom->ndihedraltypes; i++) setflag[i] = 1; } @@ -1474,22 +1419,3 @@ void DihedralTableCut::bcast_table(Table *tb) } - -/* ---------------------------------------------------------------------- - proc 0 writes to data file -------------------------------------------------------------------------- */ - -void DihedralTableCut::write_data(FILE *fp) -{ - for (int i = 1; i <= atom->ndihedraltypes; i++) - fprintf(fp,"%d %g %g %g %g %g %g\n",i, - k1[i],phi1[i]*180.0/MY_PI, - k2[i],phi2[i]*180.0/MY_PI, - k3[i],phi3[i]*180.0/MY_PI); - - fprintf(fp,"\nAngleAngleTorsion Coeffs\n\n"); - for (int i = 1; i <= atom->ndihedraltypes; i++) - fprintf(fp,"%d %g %g %g\n",i,aat_k[i], - aat_theta0_1[i]*180.0/MY_PI,aat_theta0_2[i]*180.0/MY_PI); - -} diff --git a/src/USER-MISC/dihedral_table_cut.h b/src/USER-MISC/dihedral_table_cut.h index d01903c88b..723d9a0d75 100644 --- a/src/USER-MISC/dihedral_table_cut.h +++ b/src/USER-MISC/dihedral_table_cut.h @@ -20,7 +20,6 @@ DihedralStyle(table/cut,DihedralTableCut) #ifndef LMP_DIHEDRAL_TABLE_CUT_H #define LMP_DIHEDRAL_TABLE_CUT_H -#include #include "dihedral.h" namespace LAMMPS_NS { @@ -34,26 +33,19 @@ class DihedralTableCut : public Dihedral { void coeff(int, char **); void write_restart(FILE *); void read_restart(FILE *); - void write_data(FILE *); double single(int type, int i1, int i2, int i3, int i4); protected: - double *k1,*k2,*k3; - double *phi1,*phi2,*phi3; double *aat_k,*aat_theta0_1,*aat_theta0_2; - int *setflag_d; - int *setflag_aat; void allocate(); int tabstyle,tablength; - // double *phi0; <- equilibrium angles not supported char *checkU_fname; char *checkF_fname; struct Table { int ninput; - //double phi0; <-equilibrium angles not supported int f_unspecified; // boolean (but MPI does not like type "bool") int use_degrees; // boolean (but MPI does not like type "bool") double *phifile,*efile,*ffile; From c0c61268ee0a44ba21ef398f0feab233e873814e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 11:56:23 -0400 Subject: [PATCH 094/243] store only dihedral style info in restart, no coeffs --- src/USER-MISC/dihedral_table_cut.cpp | 13 ------------- src/USER-MISC/dihedral_table_cut.h | 1 - 2 files changed, 14 deletions(-) diff --git a/src/USER-MISC/dihedral_table_cut.cpp b/src/USER-MISC/dihedral_table_cut.cpp index 07d0af46b6..e9596df6c8 100644 --- a/src/USER-MISC/dihedral_table_cut.cpp +++ b/src/USER-MISC/dihedral_table_cut.cpp @@ -1006,10 +1006,6 @@ void DihedralTableCut::write_restart(FILE *fp) { fwrite(&tabstyle,sizeof(int),1,fp); fwrite(&tablength,sizeof(int),1,fp); - - fwrite(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); - fwrite(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); } /* ---------------------------------------------------------------------- @@ -1023,19 +1019,10 @@ void DihedralTableCut::read_restart(FILE *fp) if (comm->me == 0) { fread(&tabstyle,sizeof(int),1,fp); fread(&tablength,sizeof(int),1,fp); - - fread(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); } - MPI_Bcast(&aat_k[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&aat_theta0_1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); - MPI_Bcast(&aat_theta0_2[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); MPI_Bcast(&tabstyle,1,MPI_INT,0,world); MPI_Bcast(&tablength,1,MPI_INT,0,world); - - for (int i = 1; i <= atom->ndihedraltypes; i++) setflag[i] = 1; } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-MISC/dihedral_table_cut.h b/src/USER-MISC/dihedral_table_cut.h index 723d9a0d75..dd645bedda 100644 --- a/src/USER-MISC/dihedral_table_cut.h +++ b/src/USER-MISC/dihedral_table_cut.h @@ -33,7 +33,6 @@ class DihedralTableCut : public Dihedral { void coeff(int, char **); void write_restart(FILE *); void read_restart(FILE *); - double single(int type, int i1, int i2, int i3, int i4); protected: double *aat_k,*aat_theta0_1,*aat_theta0_2; From e87e215bcc9d1746e760e869420eb264fffc6a47 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 12:02:25 -0400 Subject: [PATCH 095/243] enable and correct write_data output for dihedral style spherical --- src/USER-MISC/dihedral_spherical.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/USER-MISC/dihedral_spherical.cpp b/src/USER-MISC/dihedral_spherical.cpp index 77fa885b7a..8ef41feac5 100644 --- a/src/USER-MISC/dihedral_spherical.cpp +++ b/src/USER-MISC/dihedral_spherical.cpp @@ -41,7 +41,9 @@ using namespace MathExtra; /* ---------------------------------------------------------------------- */ -DihedralSpherical::DihedralSpherical(LAMMPS *lmp) : Dihedral(lmp) {} +DihedralSpherical::DihedralSpherical(LAMMPS *lmp) : Dihedral(lmp) { + writedata = 1; +} /* ---------------------------------------------------------------------- */ @@ -817,10 +819,11 @@ void DihedralSpherical::write_data(FILE *fp) for (int i = 1; i <= atom->ndihedraltypes; i++) { fprintf(fp,"%d %d ", i , nterms[i]); for (int j = 0; j < nterms[i]; j++) { - fprintf(fp, "%g %g %g %g %g %g %g %g %g ", - phi_mult[i][j], phi_shift[i][j], phi_offset[i][j], - theta1_mult[i][j], theta1_shift[i][j], theta1_offset[i][j], - theta2_mult[i][j], theta2_shift[i][j], theta2_offset[i][j]); + fprintf(fp, "%g %g %g %g %g %g %g %g %g %g ", Ccoeff[i][j], + phi_mult[i][j], phi_shift[i][j]*180.0/MY_PI, phi_offset[i][j], + theta1_mult[i][j], theta1_shift[i][j]*180.0/MY_PI, + theta1_offset[i][j], theta2_mult[i][j], + theta2_shift[i][j]*180.0/MY_PI, theta2_offset[i][j]); } fprintf(fp,"\n"); } From 487671c46b42b3d0dd625e0df8db3c42fbf0176f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 12:10:30 -0400 Subject: [PATCH 096/243] enable write_data functionality for more dihedral styles --- src/MOLECULE/dihedral_helix.cpp | 5 ++++- src/MOLECULE/dihedral_multi_harmonic.cpp | 5 ++++- src/USER-MISC/dihedral_cosine_shift_exp.cpp | 5 ++++- src/USER-MISC/dihedral_nharmonic.cpp | 3 ++- src/USER-MISC/dihedral_quadratic.cpp | 5 ++++- src/USER-MISC/dihedral_spherical.cpp | 3 ++- 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/MOLECULE/dihedral_helix.cpp b/src/MOLECULE/dihedral_helix.cpp index ae23b77951..0998d654af 100644 --- a/src/MOLECULE/dihedral_helix.cpp +++ b/src/MOLECULE/dihedral_helix.cpp @@ -39,7 +39,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -DihedralHelix::DihedralHelix(LAMMPS *lmp) : Dihedral(lmp) {} +DihedralHelix::DihedralHelix(LAMMPS *lmp) : Dihedral(lmp) +{ + writedata = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/MOLECULE/dihedral_multi_harmonic.cpp b/src/MOLECULE/dihedral_multi_harmonic.cpp index f6461abb6e..09c90f8d81 100644 --- a/src/MOLECULE/dihedral_multi_harmonic.cpp +++ b/src/MOLECULE/dihedral_multi_harmonic.cpp @@ -34,7 +34,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -DihedralMultiHarmonic::DihedralMultiHarmonic(LAMMPS *lmp) : Dihedral(lmp) {} +DihedralMultiHarmonic::DihedralMultiHarmonic(LAMMPS *lmp) : Dihedral(lmp) +{ + writedata = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/USER-MISC/dihedral_cosine_shift_exp.cpp b/src/USER-MISC/dihedral_cosine_shift_exp.cpp index 82da173f8e..6a04228226 100644 --- a/src/USER-MISC/dihedral_cosine_shift_exp.cpp +++ b/src/USER-MISC/dihedral_cosine_shift_exp.cpp @@ -36,7 +36,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -DihedralCosineShiftExp::DihedralCosineShiftExp(LAMMPS *lmp) : Dihedral(lmp) {} +DihedralCosineShiftExp::DihedralCosineShiftExp(LAMMPS *lmp) : Dihedral(lmp) +{ + writedata = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/USER-MISC/dihedral_nharmonic.cpp b/src/USER-MISC/dihedral_nharmonic.cpp index f8e8850680..aa3f6a6f3e 100644 --- a/src/USER-MISC/dihedral_nharmonic.cpp +++ b/src/USER-MISC/dihedral_nharmonic.cpp @@ -35,7 +35,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -DihedralNHarmonic::DihedralNHarmonic(LAMMPS *lmp) : Dihedral(lmp) { +DihedralNHarmonic::DihedralNHarmonic(LAMMPS *lmp) : Dihedral(lmp) +{ writedata = 1; } diff --git a/src/USER-MISC/dihedral_quadratic.cpp b/src/USER-MISC/dihedral_quadratic.cpp index 1b64b52faf..c9bce4f02c 100644 --- a/src/USER-MISC/dihedral_quadratic.cpp +++ b/src/USER-MISC/dihedral_quadratic.cpp @@ -38,7 +38,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -DihedralQuadratic::DihedralQuadratic(LAMMPS *lmp) : Dihedral(lmp) {} +DihedralQuadratic::DihedralQuadratic(LAMMPS *lmp) : Dihedral(lmp) +{ + writedata = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/USER-MISC/dihedral_spherical.cpp b/src/USER-MISC/dihedral_spherical.cpp index 8ef41feac5..8ce58243ac 100644 --- a/src/USER-MISC/dihedral_spherical.cpp +++ b/src/USER-MISC/dihedral_spherical.cpp @@ -41,7 +41,8 @@ using namespace MathExtra; /* ---------------------------------------------------------------------- */ -DihedralSpherical::DihedralSpherical(LAMMPS *lmp) : Dihedral(lmp) { +DihedralSpherical::DihedralSpherical(LAMMPS *lmp) : Dihedral(lmp) +{ writedata = 1; } From 02b800a3bbaf1b4ec1a5e023849ee66bf2cb47ad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Aug 2018 20:25:23 -0400 Subject: [PATCH 097/243] add template for new kim_query command --- src/.gitignore | 7 ++- src/KIM/kim_query.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++ src/KIM/kim_query.h | 85 +++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 src/KIM/kim_query.cpp create mode 100644 src/KIM/kim_query.h diff --git a/src/.gitignore b/src/.gitignore index d405cb209e..27f4f8a64c 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -26,6 +26,11 @@ /*_ssa.h /*_ssa.cpp +/kim_query.cpp +/kim_query.h +/pair_kim.cpp +/pair_kim.h + /kokkos.cpp /kokkos.h /kokkos_type.h @@ -818,8 +823,6 @@ /pair_hbond_dreiding_morse.h /pair_ilp_graphene_hbn.cpp /pair_ilp_graphene_hbn.h -/pair_kim.cpp -/pair_kim.h /pair_kolmogorov_crespi_full.cpp /pair_kolmogorov_crespi_full.h /pair_kolmogorov_crespi_z.cpp diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp new file mode 100644 index 0000000000..1755b61417 --- /dev/null +++ b/src/KIM/kim_query.cpp @@ -0,0 +1,116 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + + +/* ---------------------------------------------------------------------- + Contributing authors: Axel Kohlmeyer (Temple U), + Ryan S. Elliott (UMN) +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program; if not, see . + + Linking LAMMPS statically or dynamically with other modules is making a + combined work based on LAMMPS. Thus, the terms and conditions of the GNU + General Public License cover the whole combination. + + In addition, as a special exception, the copyright holders of LAMMPS give + you permission to combine LAMMPS with free software programs or libraries + that are released under the GNU LGPL and with code included in the standard + release of the "kim-api" under the CDDL (or modified versions of such code, + with unchanged license). You may copy and distribute such a system following + the terms of the GNU GPL for LAMMPS and the licenses of the other code + concerned, provided that you include the source code of that other code + when and as the GNU GPL requires distribution of source code. + + Note that people who make modified versions of LAMMPS are not obligated to + grant this special exception for their modified versions; it is their choice + whether to do so. The GNU General Public License gives permission to release + a modified version without this exception; this exception also makes it + possible to release a modified version which carries forward this exception. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package +------------------------------------------------------------------------- */ + +#include +#include +#include "kim_query.h" +#include "comm.h" +#include "error.h" +#include "input.h" +#include "variable.h" + +using namespace LAMMPS_NS; + +static char *do_query(char *, char *, int, MPI_Comm); + +/* ---------------------------------------------------------------------- */ + +void KimQuery::command(int narg, char **arg) +{ + char *model, *property, *varname, *value; + + if (narg != 3) error->all(FLERR,"Illegal kim_query command"); + + model = arg[0]; + property = arg[1]; + varname = arg[2]; + + value = do_query(model, property, comm->me, world); + + if (comm->me == 0) + printf("property %s for model %s is %s\n",property,model,value); + + char **varcmd = new char*[3]; + varcmd[0] = varname; + varcmd[1] = (char *) "string"; + varcmd[2] = value; + + input->variable->set(3,varcmd); + + delete[] varcmd; + delete[] value; +} + + +char *do_query(char *model, char *property, int rank, MPI_Comm comm) +{ + char val[512], *retval; + int len; + + // only run query from rank 0 + if (rank == 0) { + + // fake query + strcpy(val,(const char*)"4.25"); + } + MPI_Bcast(val, 512, MPI_CHAR, 0, comm); + len = strlen(val) + 1; + retval = new char[len]; + strcpy(retval,val); + + return retval; +} diff --git a/src/KIM/kim_query.h b/src/KIM/kim_query.h new file mode 100644 index 0000000000..92972d804d --- /dev/null +++ b/src/KIM/kim_query.h @@ -0,0 +1,85 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Axel Kohlmeyer (Temple U), + Ryan S. Elliott (UMN) +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program; if not, see . + + Linking LAMMPS statically or dynamically with other modules is making a + combined work based on LAMMPS. Thus, the terms and conditions of the GNU + General Public License cover the whole combination. + + In addition, as a special exception, the copyright holders of LAMMPS give + you permission to combine LAMMPS with free software programs or libraries + that are released under the GNU LGPL and with code included in the standard + release of the "kim-api" under the CDDL (or modified versions of such code, + with unchanged license). You may copy and distribute such a system following + the terms of the GNU GPL for LAMMPS and the licenses of the other code + concerned, provided that you include the source code of that other code + when and as the GNU GPL requires distribution of source code. + + Note that people who make modified versions of LAMMPS are not obligated to + grant this special exception for their modified versions; it is their choice + whether to do so. The GNU General Public License gives permission to release + a modified version without this exception; this exception also makes it + possible to release a modified version which carries forward this exception. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package +------------------------------------------------------------------------- */ + +#ifdef COMMAND_CLASS + +CommandStyle(kim_query,KimQuery) + +#else + +#ifndef LMP_KIM_QUERY_H +#define LMP_KIM_QUERY_H + +#include "pointers.h" + +namespace LAMMPS_NS { + +class KimQuery : protected Pointers { + public: + KimQuery(class LAMMPS *lmp) : Pointers(lmp) {}; + void command(int, char **); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + + +*/ From 7a8bb5baaf938f7534c9f0aee2231ff1a744a2f8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Aug 2018 21:18:03 -0400 Subject: [PATCH 098/243] come code cleanup and refactoring --- src/KIM/kim_query.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index 1755b61417..17f993c92d 100644 --- a/src/KIM/kim_query.cpp +++ b/src/KIM/kim_query.cpp @@ -81,8 +81,13 @@ void KimQuery::command(int narg, char **arg) value = do_query(model, property, comm->me, world); - if (comm->me == 0) - printf("property %s for model %s is %s\n",property,model,value); + // check for valid result + + int len = strlen(value) + 1; + if (len == 1) { + // TODO: store more detailed error message after \0 byte. + error->all(FLERR,"Query of OpenKIM database failed"); + } char **varcmd = new char*[3]; varcmd[0] = varname; @@ -98,19 +103,21 @@ void KimQuery::command(int narg, char **arg) char *do_query(char *model, char *property, int rank, MPI_Comm comm) { - char val[512], *retval; - int len; + char value[512], *retval; // only run query from rank 0 if (rank == 0) { // fake query - strcpy(val,(const char*)"4.25"); + strcpy(value,(const char*)"4.25"); } - MPI_Bcast(val, 512, MPI_CHAR, 0, comm); - len = strlen(val) + 1; + MPI_Bcast(value, 512, MPI_CHAR, 0, comm); + + // must make a proper copy of the query, as the stack allocation + // will go out of scope + + int len = strlen(value) + 1; retval = new char[len]; - strcpy(retval,val); - + strcpy(retval,value); return retval; } From 741a7fe630d5e445163115c897db5aba74455f7f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 20 Aug 2018 18:56:40 -0400 Subject: [PATCH 099/243] final touches to support compiling with libcurl transparently --- examples/kim/in.query | 11 ++ examples/kim/log.16Aug2018.query.g++.1 | 34 ++++++ lib/kim/Makefile.lammps | 7 +- lib/kim/README | 6 + src/KIM/kim_query.cpp | 154 +++++++++++++++++++++---- 5 files changed, 190 insertions(+), 22 deletions(-) create mode 100644 examples/kim/in.query create mode 100644 examples/kim/log.16Aug2018.query.g++.1 diff --git a/examples/kim/in.query b/examples/kim/in.query new file mode 100644 index 0000000000..8538cac749 --- /dev/null +++ b/examples/kim/in.query @@ -0,0 +1,11 @@ + +# example for performing a query to the OpenKIM test database to retrieve +# a parameter to be used in the input. here it requests the aluminium +# lattice constant for a specific test used for a specific model and then +# assigns it to the variable 'latconst' + +units metal +info variables out log +kim_query latconst get_test_result test=TE_156715955670_004 species=["Al"] model=MO_800509458712_001 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] +info variables out log +lattice fcc ${latconst} diff --git a/examples/kim/log.16Aug2018.query.g++.1 b/examples/kim/log.16Aug2018.query.g++.1 new file mode 100644 index 0000000000..eb83dd84b1 --- /dev/null +++ b/examples/kim/log.16Aug2018.query.g++.1 @@ -0,0 +1,34 @@ +LAMMPS (16 Aug 2018) + +# example for performing a query to the OpenKIM test database to retrieve +# a parameter to be used in the input. here it requests the aluminium +# lattice constant for a specific test used for a specific model and then +# assigns it to the variable 'latconst' + +units metal +info variables out log + +Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info +Printed on Mon Aug 20 18:44:24 2018 + + +Variable information: + +Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info + +kim_query latconst get_test_result test=TE_156715955670_004 species=["Al"] model=MO_800509458712_001 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] +info variables out log + +Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info +Printed on Mon Aug 20 18:44:24 2018 + + +Variable information: +Variable[ 0]: latconst , style = string , def = 4.0320827961 + +Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info + +lattice fcc ${latconst} +lattice fcc 4.0320827961 +Lattice spacing in x,y,z = 4.03208 4.03208 4.03208 +Total wall time: 0:00:00 diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps index 7c9fc7c5f7..492b9ddfc6 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -17,13 +17,18 @@ ifeq ($(strip $(shell pkg-config --version)),) $(error 'pkg-config' not found, but is required to configure the KIM API) endif - kim_PREFIX := $(shell cat ../../lib/kim/kim-prefix.txt 2> /dev/null) kim_PREFIX := $(if $(kim_PREFIX),$(kim_PREFIX)/lib/pkgconfig,) kim_PREFIX := $(if $(shell printf -- "$${PKG_CONFIG_PATH}"),$(kim_PREFIX):$(shell printf -- "$${PKG_CONFIG_PATH}"),$(kim_PREFIX)) +# there is no usable libcurl installation +ifeq ($(shell curl-config --version 2> /dev/null),) kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api-v2 2> /dev/null) kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api-v2 2> /dev/null) +else +kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api-v2 2> /dev/null) $(shell curl-config --cflags) -DLMP_KIM_CURL +kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api-v2 2> /dev/null) $(shell curl-config --libs) +endif ifeq ($(strip $(kim_SYSINC)),) $(error 'pkg-config' could not find an installed KIM API library.) diff --git a/lib/kim/README b/lib/kim/README index 0e51a30870..493758561d 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -13,6 +13,12 @@ do the same thing by typing "python Install.py" from within this directory, or you can do it manually by following the instructions below. +As of KIM API version 2, the KIM package also provides a LAMMPS command +to perform queries through the OpenKIM web API. This feature requires +that the CURL library (libcurl) development package and its configuration +query tool, curl-config, are installed. The provided Makefile.lammps +is set up to automatically detect this. + ----------------- Instructions: diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index 17f993c92d..8d400ac333 100644 --- a/src/KIM/kim_query.cpp +++ b/src/KIM/kim_query.cpp @@ -57,36 +57,55 @@ #include #include +#include #include "kim_query.h" #include "comm.h" #include "error.h" #include "input.h" #include "variable.h" +#include +#include + using namespace LAMMPS_NS; -static char *do_query(char *, char *, int, MPI_Comm); +#if defined(LMP_KIM_CURL) + +struct WriteBuf { + char *dataptr; + size_t sizeleft; +}; + +static char *do_query(char *, int, char **, int, MPI_Comm); +static size_t write_callback(void *, size_t, size_t, void *); + +#endif /* ---------------------------------------------------------------------- */ void KimQuery::command(int narg, char **arg) { - char *model, *property, *varname, *value; + char *varname, *function, *value; - if (narg != 3) error->all(FLERR,"Illegal kim_query command"); + if (narg < 2) error->all(FLERR,"Illegal kim_query command"); - model = arg[0]; - property = arg[1]; - varname = arg[2]; + varname = arg[0]; + function = arg[1]; - value = do_query(model, property, comm->me, world); +#if defined(LMP_KIM_CURL) + + value = do_query(function, narg-2, arg+2, comm->me, world); // check for valid result + // on error the content of "value" is a '\0' byte + // as the first element, and then the error message + // that was returned by the web server - int len = strlen(value) + 1; - if (len == 1) { - // TODO: store more detailed error message after \0 byte. - error->all(FLERR,"Query of OpenKIM database failed"); + if (0 == strlen(value)) { + char errmsg[512]; + + sprintf(errmsg,"OpenKIM query failed: %s",value+1); + error->all(FLERR,errmsg); } char **varcmd = new char*[3]; @@ -98,26 +117,119 @@ void KimQuery::command(int narg, char **arg) delete[] varcmd; delete[] value; +#else + error->all(FLERR,"Cannot use 'kim_query' command when KIM package " + "is compiled without support for libcurl"); +#endif } +#if defined(LMP_KIM_CURL) -char *do_query(char *model, char *property, int rank, MPI_Comm comm) +// copy data to the user provided data structure, optionally in increments + +size_t write_callback(void *data, size_t size, size_t nmemb, void *userp) +{ + struct WriteBuf *buf = (struct WriteBuf *)userp; + size_t buffer_size = size*nmemb; + + // copy chunks into the buffer for as long as there is space left + if (buf->sizeleft) { + size_t copy_this_much = buf->sizeleft; + if (copy_this_much > buffer_size) + copy_this_much = buffer_size; + memcpy(buf->dataptr, data, copy_this_much); + + buf->dataptr += copy_this_much; + buf->sizeleft -= copy_this_much; + return copy_this_much; + } + return 0; // done +} + +char *do_query(char *qfunction, int narg, char **arg, int rank, MPI_Comm comm) { char value[512], *retval; - // only run query from rank 0 - if (rank == 0) { + // run the web query from rank 0 only - // fake query - strcpy(value,(const char*)"4.25"); + if (rank == 0) { + CURL *handle; + CURLcode res; + + // set up and clear receive buffer + + struct WriteBuf buf; + buf.dataptr = value; + buf.sizeleft = 511; + memset(value,0,512); + + // create curl web query instance + curl_global_init(CURL_GLOBAL_DEFAULT); + handle = curl_easy_init(); + + if (handle) { + std::string url("https://query.openkim.org/api/"); + url += qfunction; + + std::string query(arg[0]); + for (int i=1; i < narg; ++i) { + query += '&'; + query += arg[i]; + } + +#if LMP_DEBUG_CURL + curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); +#endif + +#if defined(LMP_NO_SSL_CHECK) + // disable verifying SSL certificate and host name + curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(handle, CURLOPT_POSTFIELDS, query.c_str()); + + curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION,write_callback); + curl_easy_setopt(handle, CURLOPT_WRITEDATA,&buf); + + // perform OpenKIM query and check for errors + res = curl_easy_perform(handle); + if (res != CURLE_OK) { + // on error we return an "empty" string but add error message after it + value[0]= '\0'; + strcpy(value+1,curl_easy_strerror(res)); + } + curl_easy_cleanup(handle); + } + curl_global_cleanup(); } MPI_Bcast(value, 512, MPI_CHAR, 0, comm); - // must make a proper copy of the query, as the stack allocation - // will go out of scope + // we must make a proper copy of the query, as the stack allocation + // for "value" will go out of scope. a valid query has a '[' as + // the first character. skip over it (and the last character ']', too) + // an error messages starts with a '\0' character. copy that and + // the remaining string, as that is the error message. - int len = strlen(value) + 1; - retval = new char[len]; - strcpy(retval,value); + if (value[0] == '[') { + int len = strlen(value)-1; + retval = new char[len]; + value[len] = '\0'; + strcpy(retval,value+1); + } else if (value[0] == '\0') { + int len = strlen(value+1)+2; + retval = new char[len]; + retval[0] = '\0'; + strcpy(retval+1,value+1); + } else { + // unknown response type. we should not get here. + // copy response without modifications. + int len = strlen(value)+1; + retval = new char[len]; + strcpy(retval,value); + } return retval; } +#endif From 38c373a0e41d4f4d07d0624187680eb55b46c5d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 20 Aug 2018 21:29:32 -0400 Subject: [PATCH 100/243] integrate new kim_query command into the documentation environment --- doc/src/Build_extras.txt | 4 +++- doc/src/Packages_details.txt | 2 ++ doc/src/commands_list.txt | 1 + doc/src/kim_query.txt | 46 ++++++++++++++++++++++++++++++++++++ doc/src/lammps.book | 1 + doc/src/pair_kim.txt | 9 +++---- 6 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 doc/src/kim_query.txt diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index cbbd9db2f3..c096b5901b 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -171,7 +171,9 @@ KIM package :h4,link(kim) To build with this package, the KIM library must be downloaded and built on your system. It must include the KIM models that you want to -use with LAMMPS. +use with LAMMPS. If you want to use the "kim_query"_kim_query.html +command, you also need to have libcurl installed with the matching +development headers and the curl-config tool. Note that in LAMMPS lingo, a KIM model driver is a pair style (e.g. EAM or Tersoff). A KIM model is a pair style for a particular diff --git a/doc/src/Packages_details.txt b/doc/src/Packages_details.txt index 3a362a23d0..0ab1b5e4fd 100644 --- a/doc/src/Packages_details.txt +++ b/doc/src/Packages_details.txt @@ -341,6 +341,8 @@ KIM package :link(PKG-KIM),h4 A "pair_style kim"_pair_kim.html command which is a wrapper on the Knowledge Base for Interatomic Models (KIM) repository of interatomic potentials, enabling any of them to be used in LAMMPS simulations. +Also a "kim_query"_kim_query.html command, which allows to query +the OpenKIM database for stored properties. To use this package you must have the KIM library available on your system. diff --git a/doc/src/commands_list.txt b/doc/src/commands_list.txt index 27e0906b5f..61221b26d8 100644 --- a/doc/src/commands_list.txt +++ b/doc/src/commands_list.txt @@ -53,6 +53,7 @@ Commands :h1 include info jump + kim_query kspace_modify kspace_style label diff --git a/doc/src/kim_query.txt b/doc/src/kim_query.txt new file mode 100644 index 0000000000..61f8bf12ae --- /dev/null +++ b/doc/src/kim_query.txt @@ -0,0 +1,46 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands_all.html) + +:line + +kim_query command :h3 + +[Syntax:] + +kim_query variable query_function web_query_flags :pre + +variable = name of a (string style) variable where the result of the query is stored +query_function = name of the OpenKIM web API query function to be used +web_query_flags = a series of keyword=value pairs that represent the web query; supported keywords depend on query function :ul + +[Examples:] + +kim_query latconst get_test_result test=TE_156715955670_004 model=MO_800509458712_001 & + prop=structure-cubic-crystal-npt species=\["Al"\] keys=\["a"\] units=\["angstrom"\] :pre + +[Description:] + +The kim_query command allows to retrieve properties from the OpenKIM +through a web query. The result is stored in a string style +"variable"_variable.html, the name of which must be given as the first +argument of the kim_query command. The second required argument is the +name of the actual query function (e.g. {get_test_result}). All following +arguments are parameters handed over to the web query in the format +{keyword=value}. This list of supported keywords and the type of how +the value has to be encoded depends on the query function used. +For more details on this, please refer to the OpenKIM homepage. + +[Restrictions:] + +This command is part of the KIM package. It is only enabled if +LAMMPS was built with that package. Furthermore, its correct +functioning is dependend on compiling LAMMPS with libcurl support. +See the "Build package"_Build_package.html doc page for more info. + +[Related commands:] + +"pair_style kim"_pair_kim.html, "variable"_variable.html + diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 198e234f0c..6b220ed241 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -167,6 +167,7 @@ if.html include.html info.html jump.html +kim_query.html label.html lattice.html log.html diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index c5d42403e3..a415ac606b 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -42,12 +42,9 @@ section of the "Packages details"_Packages_details.html doc page has instructions on how to do this with a simple make command, when building LAMMPS. -See the examples/kim dir for an input script that uses a KIM model (potential) -for Lennard-Jones. Note, for this example input script, the example models -shipped with with kim-api package must be installed. See the "Build -package"_Build_package.html section and the ./lib/kim/README for details -on how to build LAMMSPS with the kim-api and how to install the example models. - +See the examples/kim dir for an input script that uses a KIM model +(potential) for Lennard-Jones. + :line The argument {model} is the name of the KIM model for a specific From fed48427be9ee74c21cdf6fa5edc2b37bf4df95c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 20 Aug 2018 22:15:02 -0400 Subject: [PATCH 101/243] update lib/kim/Install.py to support md5 checksum. update CMake support as needed --- cmake/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f6f822676e..601aa4b7c4 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -670,6 +670,12 @@ if(PKG_USER-VTK) endif() if(PKG_KIM) + find_package(CURL) + if(CURL_FOUND) + include_directories(${CURL_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${CURL_LIBRARIES}) + add_definitions(-DLMP_KIM_CURL) + endif() option(DOWNLOAD_KIM "Download KIM-API v2 from OpenKIM instead of using an already installed one" OFF) if(DOWNLOAD_KIM) message(STATUS "KIM-API v2 download requested - we will build our own") From 1c3e3ce5481144b77bc438de5bb1cdcfceb0b055 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 15:57:19 -0400 Subject: [PATCH 102/243] add kim_query command to commands list --- doc/src/Commands_all.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/Commands_all.txt b/doc/src/Commands_all.txt index 155b56ace8..ddb8e121cb 100644 --- a/doc/src/Commands_all.txt +++ b/doc/src/Commands_all.txt @@ -68,6 +68,7 @@ An alphabetic list of all general LAMMPS commands. "improper_style"_improper_style.html, "include"_include.html, "jump"_jump.html, +"kim_query"_kim_query.html, "kspace_modify"_kspace_modify.html, "kspace_style"_kspace_style.html, "label"_label.html, From 2dbc2c59169533d3fe2e8ad0897abf7288d8afd4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 16:04:53 -0400 Subject: [PATCH 103/243] fix spelling issues in documentation and some minor clarification --- doc/src/Build_extras.txt | 10 +++++----- doc/src/kim_query.txt | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index c096b5901b..66f1c8fcbd 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -169,8 +169,8 @@ used to build the GPU library. KIM package :h4,link(kim) -To build with this package, the KIM library must be downloaded and -built on your system. It must include the KIM models that you want to +To build with this package, the KIM library with API v2 must be downloaded +and built on your system. It must include the KIM models that you want to use with LAMMPS. If you want to use the "kim_query"_kim_query.html command, you also need to have libcurl installed with the matching development headers and the curl-config tool. @@ -178,9 +178,9 @@ development headers and the curl-config tool. Note that in LAMMPS lingo, a KIM model driver is a pair style (e.g. EAM or Tersoff). A KIM model is a pair style for a particular element or alloy and set of parameters, e.g. EAM for Cu with a -specific EAM potential file. Also note that installing the KIM API -library with all its models, may take around 30 min to build. Of -course you only need to do that once. +specific EAM potential file. Also note that downloading and installing +the KIM API library with all its models, may take a long time (10s of +minutes to hours) to build. Of course you only need to do that once. See the list of KIM model drivers here: https://openkim.org/browse/model-drivers/alphabetical diff --git a/doc/src/kim_query.txt b/doc/src/kim_query.txt index 61f8bf12ae..ffebe698be 100644 --- a/doc/src/kim_query.txt +++ b/doc/src/kim_query.txt @@ -37,7 +37,7 @@ For more details on this, please refer to the OpenKIM homepage. This command is part of the KIM package. It is only enabled if LAMMPS was built with that package. Furthermore, its correct -functioning is dependend on compiling LAMMPS with libcurl support. +functioning depends on compiling LAMMPS with libcurl support. See the "Build package"_Build_package.html doc page for more info. [Related commands:] diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 5366a31d5d..6eb158396f 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1382,6 +1382,7 @@ libAtoms libawpmd libch libcolvars +libcurl libdir libdl libfftw From a508f1de6c8001b7c70cf75330663faf06996818 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 19 Mar 2019 22:30:44 -0600 Subject: [PATCH 104/243] Commit JT 031919 - correct. error in fix_prec_spin - added min_post_force in fix_prec_spin --- src/SPIN/fix_precession_spin.cpp | 17 +++++++++++++---- src/SPIN/fix_precession_spin.h | 5 +++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index d3edb3ae8a..433a260e83 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -115,6 +115,7 @@ int FixPrecessionSpin::setmask() { int mask = 0; mask |= POST_FORCE; + mask |= MIN_POST_FORCE; mask |= THERMO_ENERGY; mask |= POST_FORCE_RESPA; return mask; @@ -171,6 +172,7 @@ void FixPrecessionSpin::setup(int vflag) void FixPrecessionSpin::post_force(int /*vflag*/) { + // update mag field with time (potential improvement) if (varflag != CONSTANT) { @@ -200,7 +202,7 @@ void FixPrecessionSpin::post_force(int /*vflag*/) if (aniso_flag) { // compute magnetic anisotropy compute_anisotropy(spi,fmi); - emag -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); + emag -= 0.5*(spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); } fm[i][0] += fmi[0]; @@ -228,9 +230,9 @@ void FixPrecessionSpin::compute_single_precession(int i, double spi[3], double f void FixPrecessionSpin::compute_zeeman(int i, double fmi[3]) { double **sp = atom->sp; - fmi[0] -= sp[i][3]*hx; - fmi[1] -= sp[i][3]*hy; - fmi[2] -= sp[i][3]*hz; + fmi[0] += sp[i][0]*hx; + fmi[1] += sp[i][1]*hy; + fmi[2] += sp[i][3]*hz; } /* ---------------------------------------------------------------------- */ @@ -280,3 +282,10 @@ double FixPrecessionSpin::compute_scalar() } return emag_all; } + +/* ---------------------------------------------------------------------- */ + +void FixPrecessionSpin::min_post_force(int vflag) +{ + post_force(vflag); +} diff --git a/src/SPIN/fix_precession_spin.h b/src/SPIN/fix_precession_spin.h index 53ae4ba124..2fe6b5a673 100644 --- a/src/SPIN/fix_precession_spin.h +++ b/src/SPIN/fix_precession_spin.h @@ -33,8 +33,9 @@ class FixPrecessionSpin : public Fix { int setmask(); void init(); void setup(int); - virtual void post_force(int); - virtual void post_force_respa(int, int, int); + void post_force(int); + void post_force_respa(int, int, int); + void min_post_force(int); double compute_scalar(); int zeeman_flag, aniso_flag; From 86810c2d7ccab32a9f0019e94d9197ae5d85bafc Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 19 Mar 2019 22:44:26 -0600 Subject: [PATCH 105/243] Commit2 JT 031919 - correct error in fix_precession_spin - only the sign of the force needed a correction --- src/SPIN/fix_precession_spin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 433a260e83..6ccb692033 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -230,8 +230,8 @@ void FixPrecessionSpin::compute_single_precession(int i, double spi[3], double f void FixPrecessionSpin::compute_zeeman(int i, double fmi[3]) { double **sp = atom->sp; - fmi[0] += sp[i][0]*hx; - fmi[1] += sp[i][1]*hy; + fmi[0] += sp[i][3]*hx; + fmi[1] += sp[i][3]*hy; fmi[2] += sp[i][3]*hz; } From 1e8ccb17742f8cf72f06ca4780598a2e81999ff2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 04:54:06 -0400 Subject: [PATCH 106/243] initialize setflag and cutsq pointers to NULL, so they are not accessed uninitialized by accident --- src/pair.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pair.cpp b/src/pair.cpp index 44cf3a43ea..9fd3515a3d 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -72,6 +72,9 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) single_extra = 0; svector = NULL; + setflag = NULL; + cutsq = NULL; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; reinitflag = 1; From 8f90d6c6d00a8dd07edbd510b072f7f953a114ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 04:55:13 -0400 Subject: [PATCH 107/243] must bracket 'memory->destroy()' calls in destructor with 'if (allocated)' --- src/pair_buck_coul_cut.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pair_buck_coul_cut.cpp b/src/pair_buck_coul_cut.cpp index 7eecb62121..f9e7c94920 100644 --- a/src/pair_buck_coul_cut.cpp +++ b/src/pair_buck_coul_cut.cpp @@ -42,7 +42,9 @@ PairBuckCoulCut::PairBuckCoulCut(LAMMPS *lmp) : Pair(lmp) PairBuckCoulCut::~PairBuckCoulCut() { - if (!copymode) { + if (copymode) return; + + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); From b975d59d9f7956835ba93d8ba731d0fe1f9941f7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 04:55:58 -0400 Subject: [PATCH 108/243] make use of copymode flag in pair style destructors consistent --- src/CLASS2/pair_lj_class2.cpp | 26 +++++------ src/CLASS2/pair_lj_class2_coul_cut.cpp | 32 +++++++------- src/CLASS2/pair_lj_class2_coul_long.cpp | 28 ++++++------ src/KSPACE/pair_buck_coul_long.cpp | 30 ++++++------- src/KSPACE/pair_coul_long.cpp | 14 +++--- src/KSPACE/pair_lj_charmm_coul_long.cpp | 38 ++++++++-------- src/KSPACE/pair_lj_charmmfsw_coul_long.cpp | 42 +++++++++--------- src/MOLECULE/pair_lj_charmm_coul_charmm.cpp | 6 +-- .../pair_lj_charmmfsw_coul_charmmfsh.cpp | 40 ++++++++--------- src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp | 34 +++++++------- .../pair_lj_class2_coul_long_soft.cpp | 30 ++++++------- src/USER-FEP/pair_lj_class2_soft.cpp | 28 ++++++------ src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp | 44 +++++++++---------- .../pair_buck6d_coul_gauss_long.cpp | 40 ++++++++--------- src/pair_lj_cut_coul_dsf.cpp | 28 ++++++------ src/pair_lj_expand.cpp | 6 +-- src/pair_lj_gromacs.cpp | 6 +-- src/pair_lj_gromacs_coul_gromacs.cpp | 6 +-- 18 files changed, 238 insertions(+), 240 deletions(-) diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index e6546b1acc..015dc59d2f 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -38,20 +38,20 @@ PairLJClass2::PairLJClass2(LAMMPS *lmp) : Pair(lmp) PairLJClass2::~PairLJClass2() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } } diff --git a/src/CLASS2/pair_lj_class2_coul_cut.cpp b/src/CLASS2/pair_lj_class2_coul_cut.cpp index 49242ecb43..7888591b51 100644 --- a/src/CLASS2/pair_lj_class2_coul_cut.cpp +++ b/src/CLASS2/pair_lj_class2_coul_cut.cpp @@ -39,23 +39,23 @@ PairLJClass2CoulCut::PairLJClass2CoulCut(LAMMPS *lmp) : Pair(lmp) PairLJClass2CoulCut::~PairLJClass2CoulCut() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(cut_coul); - memory->destroy(cut_coulsq); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(cut_coul); + memory->destroy(cut_coulsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } } diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index bbea2ade6e..4ae448af30 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -50,21 +50,21 @@ PairLJClass2CoulLong::PairLJClass2CoulLong(LAMMPS *lmp) : Pair(lmp) PairLJClass2CoulLong::~PairLJClass2CoulLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } if (ftable) free_tables(); } diff --git a/src/KSPACE/pair_buck_coul_long.cpp b/src/KSPACE/pair_buck_coul_long.cpp index a37e4ab4e9..c18b1f3481 100644 --- a/src/KSPACE/pair_buck_coul_long.cpp +++ b/src/KSPACE/pair_buck_coul_long.cpp @@ -50,23 +50,23 @@ PairBuckCoulLong::PairBuckCoulLong(LAMMPS *lmp) : Pair(lmp) PairBuckCoulLong::~PairBuckCoulLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(a); - memory->destroy(rho); - memory->destroy(c); - memory->destroy(rhoinv); - memory->destroy(buck1); - memory->destroy(buck2); - memory->destroy(offset); - } - if (ftable) free_tables(); + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(a); + memory->destroy(rho); + memory->destroy(c); + memory->destroy(rhoinv); + memory->destroy(buck1); + memory->destroy(buck2); + memory->destroy(offset); } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_coul_long.cpp b/src/KSPACE/pair_coul_long.cpp index 8db5979b39..98dac97db3 100644 --- a/src/KSPACE/pair_coul_long.cpp +++ b/src/KSPACE/pair_coul_long.cpp @@ -55,15 +55,15 @@ PairCoulLong::PairCoulLong(LAMMPS *lmp) : Pair(lmp) PairCoulLong::~PairCoulLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(scale); - } - if (ftable) free_tables(); + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(scale); } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_lj_charmm_coul_long.cpp b/src/KSPACE/pair_lj_charmm_coul_long.cpp index 749d9657aa..78dfdc8dd9 100644 --- a/src/KSPACE/pair_lj_charmm_coul_long.cpp +++ b/src/KSPACE/pair_lj_charmm_coul_long.cpp @@ -59,27 +59,27 @@ PairLJCharmmCoulLong::PairLJCharmmCoulLong(LAMMPS *lmp) : Pair(lmp) PairLJCharmmCoulLong::~PairLJCharmmCoulLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(eps14); - memory->destroy(sigma14); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(lj14_1); - memory->destroy(lj14_2); - memory->destroy(lj14_3); - memory->destroy(lj14_4); - memory->destroy(offset); - } - if (ftable) free_tables(); + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(eps14); + memory->destroy(sigma14); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(lj14_1); + memory->destroy(lj14_2); + memory->destroy(lj14_3); + memory->destroy(lj14_4); + memory->destroy(offset); } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp index 614980117e..00c6d793e7 100644 --- a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp +++ b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp @@ -77,27 +77,6 @@ PairLJCharmmfswCoulLong::PairLJCharmmfswCoulLong(LAMMPS *lmp) : Pair(lmp) PairLJCharmmfswCoulLong::~PairLJCharmmfswCoulLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(eps14); - memory->destroy(sigma14); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(lj14_1); - memory->destroy(lj14_2); - memory->destroy(lj14_3); - memory->destroy(lj14_4); - } - if (ftable) free_tables(); - } - // switch qqr2e back from CHARMM value to LAMMPS value if (update && strcmp(update->unit_style,"real") == 0) { @@ -106,6 +85,27 @@ PairLJCharmmfswCoulLong::~PairLJCharmmfswCoulLong() " conversion constant"); force->qqr2e = force->qqr2e_lammps_real; } + + if (copymode) return; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(eps14); + memory->destroy(sigma14); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(lj14_1); + memory->destroy(lj14_2); + memory->destroy(lj14_3); + memory->destroy(lj14_4); + } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ diff --git a/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp b/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp index 688c675815..ddca7f8b49 100644 --- a/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp +++ b/src/MOLECULE/pair_lj_charmm_coul_charmm.cpp @@ -43,8 +43,9 @@ PairLJCharmmCoulCharmm::PairLJCharmmCoulCharmm(LAMMPS *lmp) : Pair(lmp) PairLJCharmmCoulCharmm::~PairLJCharmmCoulCharmm() { - if (!copymode) { - if (allocated) { + if (copymode) return; + + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -60,7 +61,6 @@ PairLJCharmmCoulCharmm::~PairLJCharmmCoulCharmm() memory->destroy(lj14_2); memory->destroy(lj14_3); memory->destroy(lj14_4); - } } } diff --git a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp index 4b9147c169..5ea1ce4fcf 100644 --- a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp +++ b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp @@ -62,26 +62,6 @@ PairLJCharmmfswCoulCharmmfsh::PairLJCharmmfswCoulCharmmfsh(LAMMPS *lmp) : PairLJCharmmfswCoulCharmmfsh::~PairLJCharmmfswCoulCharmmfsh() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(eps14); - memory->destroy(sigma14); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(lj14_1); - memory->destroy(lj14_2); - memory->destroy(lj14_3); - memory->destroy(lj14_4); - } - } - // switch qqr2e back from CHARMM value to LAMMPS value if (update && strcmp(update->unit_style,"real") == 0) { @@ -90,6 +70,26 @@ PairLJCharmmfswCoulCharmmfsh::~PairLJCharmmfswCoulCharmmfsh() " conversion constant"); force->qqr2e = force->qqr2e_lammps_real; } + + if (copymode) return; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(eps14); + memory->destroy(sigma14); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(lj14_1); + memory->destroy(lj14_2); + memory->destroy(lj14_3); + memory->destroy(lj14_4); + } } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp b/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp index 7970097cfe..8250f1da06 100644 --- a/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_coul_cut_soft.cpp @@ -39,24 +39,24 @@ PairLJClass2CoulCutSoft::PairLJClass2CoulCutSoft(LAMMPS *lmp) : Pair(lmp) PairLJClass2CoulCutSoft::~PairLJClass2CoulCutSoft() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(cut_coul); - memory->destroy(cut_coulsq); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lambda); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(cut_coul); + memory->destroy(cut_coulsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lambda); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } } diff --git a/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp b/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp index 13096a64c6..fe8f6a4f1b 100644 --- a/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_coul_long_soft.cpp @@ -49,22 +49,22 @@ PairLJClass2CoulLongSoft::PairLJClass2CoulLongSoft(LAMMPS *lmp) : Pair(lmp) PairLJClass2CoulLongSoft::~PairLJClass2CoulLongSoft() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lambda); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lambda); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } } diff --git a/src/USER-FEP/pair_lj_class2_soft.cpp b/src/USER-FEP/pair_lj_class2_soft.cpp index b7f21fc59c..88638d9ca0 100644 --- a/src/USER-FEP/pair_lj_class2_soft.cpp +++ b/src/USER-FEP/pair_lj_class2_soft.cpp @@ -32,28 +32,26 @@ using namespace MathConst; PairLJClass2Soft::PairLJClass2Soft(LAMMPS *lmp) : Pair(lmp) { writedata = 1; - allocated = 0; } /* ---------------------------------------------------------------------- */ PairLJClass2Soft::~PairLJClass2Soft() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lambda); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(offset); - allocated=0; - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lambda); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(offset); } } diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp index 1fc4644420..94903f43fa 100644 --- a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp @@ -48,29 +48,29 @@ PairBuck6dCoulGaussDSF::PairBuck6dCoulGaussDSF(LAMMPS *lmp) : Pair(lmp) PairBuck6dCoulGaussDSF::~PairBuck6dCoulGaussDSF() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(alpha_ij); - memory->destroy(f_shift_ij); - memory->destroy(e_shift_ij); - memory->destroy(buck6d1); - memory->destroy(buck6d2); - memory->destroy(buck6d3); - memory->destroy(buck6d4); - memory->destroy(c0); - memory->destroy(c1); - memory->destroy(c2); - memory->destroy(c3); - memory->destroy(c4); - memory->destroy(c5); - memory->destroy(rsmooth_sq); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(alpha_ij); + memory->destroy(f_shift_ij); + memory->destroy(e_shift_ij); + memory->destroy(buck6d1); + memory->destroy(buck6d2); + memory->destroy(buck6d3); + memory->destroy(buck6d4); + memory->destroy(c0); + memory->destroy(c1); + memory->destroy(c2); + memory->destroy(c3); + memory->destroy(c4); + memory->destroy(c5); + memory->destroy(rsmooth_sq); + memory->destroy(offset); } } diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp index 1ca42d864e..7df1ee4a1f 100644 --- a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp @@ -51,27 +51,27 @@ PairBuck6dCoulGaussLong::PairBuck6dCoulGaussLong(LAMMPS *lmp) : Pair(lmp) PairBuck6dCoulGaussLong::~PairBuck6dCoulGaussLong() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(alpha_ij); - memory->destroy(buck6d1); - memory->destroy(buck6d2); - memory->destroy(buck6d3); - memory->destroy(buck6d4); - memory->destroy(c0); - memory->destroy(c1); - memory->destroy(c2); - memory->destroy(c3); - memory->destroy(c4); - memory->destroy(c5); - memory->destroy(rsmooth_sq); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(alpha_ij); + memory->destroy(buck6d1); + memory->destroy(buck6d2); + memory->destroy(buck6d3); + memory->destroy(buck6d4); + memory->destroy(c0); + memory->destroy(c1); + memory->destroy(c2); + memory->destroy(c3); + memory->destroy(c4); + memory->destroy(c5); + memory->destroy(rsmooth_sq); + memory->destroy(offset); } } diff --git a/src/pair_lj_cut_coul_dsf.cpp b/src/pair_lj_cut_coul_dsf.cpp index a49af13fb2..ba4a9ef201 100644 --- a/src/pair_lj_cut_coul_dsf.cpp +++ b/src/pair_lj_cut_coul_dsf.cpp @@ -52,21 +52,21 @@ PairLJCutCoulDSF::PairLJCutCoulDSF(LAMMPS *lmp) : Pair(lmp) PairLJCutCoulDSF::~PairLJCutCoulDSF() { - if (!copymode) { - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); + if (copymode) return; - memory->destroy(cut_lj); - memory->destroy(cut_ljsq); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); } } diff --git a/src/pair_lj_expand.cpp b/src/pair_lj_expand.cpp index 9aa58b3b88..abb57534cd 100644 --- a/src/pair_lj_expand.cpp +++ b/src/pair_lj_expand.cpp @@ -38,8 +38,9 @@ PairLJExpand::PairLJExpand(LAMMPS *lmp) : Pair(lmp) PairLJExpand::~PairLJExpand() { - if (!copymode) { - if (allocated) { + if (copymode) return; + + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -52,7 +53,6 @@ PairLJExpand::~PairLJExpand() memory->destroy(lj3); memory->destroy(lj4); memory->destroy(offset); - } } } diff --git a/src/pair_lj_gromacs.cpp b/src/pair_lj_gromacs.cpp index 495e96c368..da0c8148e2 100644 --- a/src/pair_lj_gromacs.cpp +++ b/src/pair_lj_gromacs.cpp @@ -41,8 +41,9 @@ PairLJGromacs::PairLJGromacs(LAMMPS *lmp) : Pair(lmp) PairLJGromacs::~PairLJGromacs() { - if (!copymode) { - if (allocated) { + if (copymode) return; + + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -60,7 +61,6 @@ PairLJGromacs::~PairLJGromacs() memory->destroy(ljsw3); memory->destroy(ljsw4); memory->destroy(ljsw5); - } } } diff --git a/src/pair_lj_gromacs_coul_gromacs.cpp b/src/pair_lj_gromacs_coul_gromacs.cpp index 414bfea92a..b003d3c068 100644 --- a/src/pair_lj_gromacs_coul_gromacs.cpp +++ b/src/pair_lj_gromacs_coul_gromacs.cpp @@ -41,8 +41,9 @@ PairLJGromacsCoulGromacs::PairLJGromacsCoulGromacs(LAMMPS *lmp) : Pair(lmp) PairLJGromacsCoulGromacs::~PairLJGromacsCoulGromacs() { - if (!copymode) { - if (allocated) { + if (copymode) return; + + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -57,7 +58,6 @@ PairLJGromacsCoulGromacs::~PairLJGromacsCoulGromacs() memory->destroy(ljsw3); memory->destroy(ljsw4); memory->destroy(ljsw5); - } } } From 8916aeb36daad1b02ae565baf8f72a4c2dafe640 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 05:25:14 -0400 Subject: [PATCH 109/243] update for README to USER-SMTBQ with up-to-date maintainer e-mails --- src/USER-SMTBQ/README | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/USER-SMTBQ/README b/src/USER-SMTBQ/README index 74b621eef1..e778c65be2 100644 --- a/src/USER-SMTBQ/README +++ b/src/USER-SMTBQ/README @@ -2,9 +2,11 @@ This package implements the Second Moment Tight Binding - QEq (SMTB-Q) potential for the description of ionocovalent bonds in oxides. Authors: Nicolas Salles, Emile Maras, Olivier Politano, Robert Tetot -at LAAS-CNRS in France. +at ICB, Universite de Bourgogne and ICMMO, Universite Paris-Sud. -Contact emails: lammps@u-bourgogne.fr, nsalles@laas.fr +Contact emails: lammps@u-bourgogne.fr, nsalles33@gmail.com + +This package is occasionally maintained. See the doc page for the pair_style smtbq command to get started. From 75d63df4e029a15a1780e3337b6ab0b806aeea68 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 05:41:32 -0400 Subject: [PATCH 110/243] fix small memory leak in pair style hybrid when reading restarts --- src/pair_hybrid.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 2b2304718c..2b6546aef3 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -45,7 +45,7 @@ PairHybrid::PairHybrid(LAMMPS *lmp) : Pair(lmp), PairHybrid::~PairHybrid() { - if (nstyles) { + if (nstyles > 0) { for (int m = 0; m < nstyles; m++) { delete styles[m]; delete [] keywords[m]; @@ -243,11 +243,18 @@ void PairHybrid::settings(int narg, char **arg) // delete old lists, since cannot just change settings - if (nstyles) { - for (int m = 0; m < nstyles; m++) delete styles[m]; - delete [] styles; - for (int m = 0; m < nstyles; m++) delete [] keywords[m]; - delete [] keywords; + if (nstyles > 0) { + for (int m = 0; m < nstyles; m++) { + delete styles[m]; + delete [] keywords[m]; + if (special_lj[m]) delete [] special_lj[m]; + if (special_coul[m]) delete [] special_coul[m]; + } + delete[] styles; + delete[] keywords; + delete[] multiple; + delete[] special_lj; + delete[] special_coul; } if (allocated) { @@ -670,6 +677,12 @@ void PairHybrid::read_restart(FILE *fp) // allocate list of sub-styles + delete[] styles; + delete[] keywords; + delete[] multiple; + delete[] special_lj; + delete[] special_coul; + styles = new Pair*[nstyles]; keywords = new char*[nstyles]; multiple = new int[nstyles]; From cd6b23d1041501543889050f8d6b8396cc3645c4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 09:50:31 -0400 Subject: [PATCH 111/243] explicitly request OpenCL version 1.2 compatibility when compiling GPU package kernels for OpenCL --- lib/gpu/lal_device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 6b4d0ab2a5..9397f3c6c5 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -237,7 +237,7 @@ int DeviceT::set_ocl_params(char *ocl_vendor) { " -DBLOCK_CELL_ID="+params[11]+ " -DMAX_BIO_SHARED_TYPES="+params[12]; } - _ocl_compile_string="-cl-fast-relaxed-math -cl-mad-enable "+std::string(OCL_INT_TYPE)+" "+ + _ocl_compile_string="-cl-std=CL1.2 -cl-fast-relaxed-math -cl-mad-enable "+std::string(OCL_INT_TYPE)+" "+ std::string(OCL_PRECISION_COMPILE)+" "+_ocl_vendor_string; #endif return 0; From 0f030acc597c55152a79a3f50d91b5c6527546e1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 11:59:15 -0400 Subject: [PATCH 112/243] refactoring python module installer script to be (more) platform neutral and compatible with conventional make and CMake builds --- python/install.py | 116 ++++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/python/install.py b/python/install.py index 9308506fd2..ab54adee56 100644 --- a/python/install.py +++ b/python/install.py @@ -1,56 +1,95 @@ #!/usr/bin/env python -# copy LAMMPS src/liblammps.so and lammps.py to system dirs - -from __future__ import print_function - -instructions = """ -Syntax: python install.py [-h] [pydir] - pydir = target dir for lammps.py and liblammps.so - default = Python site-packages dir +""" +Installer script to install the LAMMPS python module and the corresponding +shared library into either the system-wide site-packages tree, or - failing +that - into the corresponding user tree. Called from the 'install-python' +build target in the conventional and CMake based build systems """ +# copy LAMMPS shared library and lammps.py to system dirs + +from __future__ import print_function import sys,os,shutil +from argparse import ArgumentParser -if (len(sys.argv) > 1 and sys.argv[1] == "-h") or len(sys.argv) > 2: - print(instructions) - sys.exit() +parser = ArgumentParser(prog='install.py', + description='LAMMPS python module installer script') -if len(sys.argv) == 2: pydir = sys.argv[1] -else: pydir = "" +parser.add_argument("-m", "--module", required=True, + help="path to the source of the LAMMPS Python module") +parser.add_argument("-l", "--lib", required=True, + help="path to the compiled LAMMPS shared library") +parser.add_argument("-v", "--version", required=True, + help="path to the LAMMPS version.h header file") +parser.add_argument("-d","--dir", + help="custom installation folder for module and library") -# copy lammps.py to pydir if it exists -# if pydir not specified, install in site-packages via distutils setup() +args = parser.parse_args() -if pydir: - if not os.path.isdir(pydir): - print( "ERROR: pydir %s does not exist" % pydir) - sys.exit() - str = "cp ../python/lammps.py %s" % pydir - print(str) +# validate arguments and make paths absolute + +if args.module: + if not os.path.exists(args.module): + print( "ERROR: LAMMPS module file %s does not exist" % args.module) + parser.print_help() + sys.exit(1) + else: + args.module = os.path.abspath(args.module) + +if args.lib: + if not os.path.exists(args.lib): + print( "ERROR: LAMMPS shared library %s does not exist" % args.lib) + parser.print_help() + sys.exit(1) + else: + args.lib = os.path.abspath(args.lib) + +if args.version: + if not os.path.exists(args.version): + print( "ERROR: LAMMPS version header file %s does not exist" % args.version) + parser.print_help() + sys.exit(1) + else: + args.version = os.path.abspath(args.version) + +if args.dir: + if not os.path.isdir(args.dir): + print( "ERROR: Installation folder %s does not exist" % args.dir) + parser.print_help() + sys.exit(1) + else: + args.dir = os.path.abspath(args.dir) + +# if a custom directory is given, we copy the files directly +# without any special processing or additional steps to that folder + +if args.dir: + print("Copying LAMMPS Python module to custom folder %s" % args.dir) try: - shutil.copyfile("../python/lammps.py", os.path.join(pydir,'lammps.py') ) + shutil.copyfile(args.module, os.path.join(args.dir,'lammps.py')) except shutil.Error: - pass # source and destination are identical + pass # fail silently - str = "cp ../src/liblammps.so %s" % pydir - print(str) + print("Copying LAMMPS shared library to custom folder %s" % args.dir) try: - shutil.copyfile("../src/liblammps.so", os.path.join(pydir,"liblammps.so") ) + shutil.copyfile(args.lib, os.path.join(args.dir,os.path.basename(args.lib))) except shutil.Error: - pass # source and destination are identical + pass # fail silently + sys.exit() -print("installing lammps.py in Python site-packages dir") - -os.chdir('../python') # in case invoked via make in src dir - # extract version string from header -fp = open('../src/version.h','r') +fp = open(args.version,'r') txt=fp.read().split('"')[1].split() verstr=txt[0]+txt[1]+txt[2] fp.close() +print("Installing LAMMPS Python module version %s into site-packages folder" % verstr) + +# we need to switch to the folder of the python module +os.chdir(os.path.dirname(args.module)) + from distutils.core import setup from distutils.sysconfig import get_python_lib import site @@ -63,13 +102,12 @@ try: author = "Steve Plimpton", author_email = "sjplimp@sandia.gov", url = "http://lammps.sandia.gov", - description = "LAMMPS molecular dynamics library", + description = "LAMMPS Molecular Dynamics Python module", py_modules = ["lammps"], - data_files = [(get_python_lib(), ["../src/liblammps.so"])]) + data_files = [(get_python_lib(), [args.lib])]) except: tryuser=True - print ("Installation into global site-packages dir failed.\nTrying user site dir %s now." % site.USER_SITE) - + print ("Installation into global site-packages folder failed.\nTrying user folder %s now." % site.USER_SITE) if tryuser: try: @@ -79,11 +117,11 @@ if tryuser: author = "Steve Plimpton", author_email = "sjplimp@sandia.gov", url = "http://lammps.sandia.gov", - description = "LAMMPS molecular dynamics library", + description = "LAMMPS Molecular Dynamics Python module", py_modules = ["lammps"], - data_files = [(site.USER_SITE, ["../src/liblammps.so"])]) + data_files = [(site.USER_SITE, [args.lib])]) except: - print("Installation into user site package dir failed.\nGo to ../python and install manually.") + print("Installation into user site package folder failed.") From 817a851a3070755c18fcaef8a59c9eaafd97eaf9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 12:01:59 -0400 Subject: [PATCH 113/243] adapt master makefile to refactored python module installer script --- src/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index f1030ae08f..3be4e3e78f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -275,7 +275,8 @@ mpi-stubs: sinclude ../lib/python/Makefile.lammps install-python: - @$(PYTHON) ../python/install.py + @$(PYTHON) ../python/install.py -v ../src/version.h \ + -m ../python/lammps.py -l ../src/liblammps.so # Create a tarball of src dir and packages From 04f999fdd6619867aedc2a6c9414857481c37463 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 12:35:21 -0400 Subject: [PATCH 114/243] add install-python target to CMake build system. decouple python module install from python package --- cmake/CMakeLists.txt | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f6f822676e..4543dbc502 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -381,19 +381,10 @@ if(PKG_MSCG OR PKG_USER-ATC OR PKG_USER-AWPMD OR PKG_USER-QUIP OR PKG_LATTE) endif() if(PKG_PYTHON) - find_package(PythonInterp REQUIRED) find_package(PythonLibs REQUIRED) add_definitions(-DLMP_PYTHON) include_directories(${PYTHON_INCLUDE_DIR}) list(APPEND LAMMPS_LINK_LIBS ${PYTHON_LIBRARY}) - if(BUILD_LIB AND BUILD_SHARED_LIBS) - if(NOT PYTHON_INSTDIR) - execute_process(COMMAND ${PYTHON_EXECUTABLE} - -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" - OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) - endif() endif() find_package(JPEG QUIET) @@ -1483,6 +1474,22 @@ install( DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/profile.d ) +############################################################################### +# Install LAMMPS module into site-packages folder +# Only available, if a shared library is built +############################################################################### +if(BUILD_LIB AND BUILD_SHARED_LIBS) + find_package(PythonInterp) + add_custom_target( + install-python + ${PYTHON_EXECUTABLE} install.py -v ${LAMMPS_SOURCE_DIR}/version.h + -m ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py + -l ${CMAKE_BINARY_DIR}/liblammps${CMAKE_SHARED_LIBRARY_SUFFIX} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../python + COMMENT "Installing LAMMPS Python module" + ) +endif() + ############################################################################### # Testing # From e50c269a6bf1f664e36fe1f9f7b644d97c250522 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 12:51:57 -0400 Subject: [PATCH 115/243] add install-python target with suitable error message also when not building a shared library --- cmake/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 4543dbc502..e138a7dffc 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1488,6 +1488,10 @@ if(BUILD_LIB AND BUILD_SHARED_LIBS) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../python COMMENT "Installing LAMMPS Python module" ) +else() + add_custom_target( + install-python + echo "Installation of the LAMMPS Python module requires building the LAMMPS shared library") endif() ############################################################################### From 52f9e4a960ef477a54750f7b36740693c5018e75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 14:11:02 -0400 Subject: [PATCH 116/243] allow overriding the location of the molfile plugin headers with CMake --- cmake/CMakeLists.txt | 4 ++-- doc/src/Build_extras.txt | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f6f822676e..327a94237b 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -613,8 +613,9 @@ if(PKG_USER-PLUMED) endif() if(PKG_USER-MOLFILE) + set(MOLFILE_INCLUDE_DIRS "${LAMMPS_LIB_SOURCE_DIR}/molfile" CACHE STRING "Path to VMD molfile plugin headers") add_library(molfile INTERFACE) - target_include_directories(molfile INTERFACE ${LAMMPS_LIB_SOURCE_DIR}/molfile) + target_include_directories(molfile INTERFACE ${MOLFILE_INCLUDE_DIRS}) target_link_libraries(molfile INTERFACE ${CMAKE_DL_LIBS}) list(APPEND LAMMPS_LINK_LIBS molfile) endif() @@ -626,7 +627,6 @@ if(PKG_USER-NETCDF) add_definitions(-DLMP_HAS_NETCDF -DNC_64BIT_DATA=0x0020) endif() - if(PKG_USER-SMD) option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" OFF) if(DOWNLOAD_EIGEN3) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index cbbd9db2f3..3ee8d06b8e 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -893,7 +893,17 @@ USER-MOLFILE package :h4,link(user-molfile) [CMake build]: -No additional settings are needed besides "-D PKG_USER-MOLFILE=yes". +-D MOLFILE_INCLUDE_DIRS=path # (optional) path where VMD molfile plugin headers are installed +-D PKG_USER-MOLFILE=yes :pre + + +Using "-D PKG_USER-MOLFILE=yes" enables the package, and setting +"-D MOLFILE_INCLUDE DIRS" allows to provide a custom location for +the molfile plugin header files. These should match the ABI of the +plugin files used, and thus one typically sets them to include +folder of the local VMD installation in use. LAMMPS ships with a +couple of default header files that correspond to a popular VMD +version, usually the latest release. [Traditional make]: @@ -902,7 +912,11 @@ loading library libdl.a that is typically present on all systems. It is required for LAMMPS to link with this package. If the setting is not valid for your system, you will need to edit the Makefile.lammps file. See lib/molfile/README and lib/molfile/Makefile.lammps for -details. +details. It is also possible to configure a different folder with +the VMD molfile plugin header files. LAMMPS ships with a couple of +default headers, but these are not compatible with all VMD versions, +so it is often best to change this setting to the location of the +same include files of the local VMD installation in use. :line From f69173f410190f162f00127dec4da41c80b973d8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 17:25:03 -0400 Subject: [PATCH 117/243] partial documentation update --- doc/src/Python_install.txt | 68 ++++++++++++++++--------------------- doc/src/Python_overview.txt | 19 ++++++----- python/README | 4 +-- 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/doc/src/Python_install.txt b/doc/src/Python_install.txt index 97f6bf3c3a..403cf052da 100644 --- a/doc/src/Python_install.txt +++ b/doc/src/Python_install.txt @@ -12,16 +12,22 @@ Installing LAMMPS in Python :h3 For Python to invoke LAMMPS, there are 2 files it needs to know about: python/lammps.py -src/liblammps.so :ul +liblammps.so or liblammps.dylib :ul -Lammps.py is the Python wrapper on the LAMMPS library interface. -Liblammps.so is the shared LAMMPS library that Python loads, as -described above. +The python source code in lammps.py is the Python wrapper on the +LAMMPS library interface. The liblammps.so or liblammps.dylib file +is the shared LAMMPS library that Python loads dynamically. You can insure Python can find these files in one of two ways: -set two environment variables -run the python/install.py script :ul +set two environment variables pointing to the location in the source tree +run "make install-python" or run the python/install.py script explicitly :ul + +When calling "make install-python" LAMMPS will try to install the +python module and the shared library into the python site-packages folders; +either the system-wide ones, or the local users ones (in case of unsufficient +permissions for the global install). Python will then find the module +and shared library file automatically. If you set the paths to these files as environment variables, you only have to do it once. For the csh or tcsh shells, add something like @@ -30,42 +36,28 @@ this to your ~/.cshrc file, one line for each of the two files: setenv PYTHONPATH $\{PYTHONPATH\}:/home/sjplimp/lammps/python setenv LD_LIBRARY_PATH $\{LD_LIBRARY_PATH\}:/home/sjplimp/lammps/src :pre -If you use the python/install.py script, you need to invoke it every -time you rebuild LAMMPS (as a shared library) or make changes to the -python/lammps.py file. +On MacOSX you may also need to set DYLD_LIBRARY_PATH accordingly. +For Bourne/Korn shells accordingly into the corresponding files using +the "export" shell builtin. -You can invoke install.py from the python directory as +If you use "make install-python" or the python/install.py script, you need +to invoke it every time you rebuild LAMMPS (as a shared library) or +make changes to the python/lammps.py file, so that the site-packages +files are updated with the new version. -% python install.py \[libdir\] \[pydir\] :pre +If the default settings of "make install-python" are not what you want, +you can invoke install.py from the python directory manually as -The optional libdir is where to copy the LAMMPS shared library to; the -default is /usr/local/lib. The optional pydir is where to copy the -lammps.py file to; the default is the site-packages directory of the -version of Python that is running the install script. +% python install.py -m \ -l -v \[-d \\] :pre -Note that libdir must be a location that is in your default -LD_LIBRARY_PATH, like /usr/local/lib or /usr/lib. And pydir must be a -location that Python looks in by default for imported modules, like -its site-packages dir. If you want to copy these files to -non-standard locations, such as within your own user space, you will -need to set your PYTHONPATH and LD_LIBRARY_PATH environment variables -accordingly, as above. - -If the install.py script does not allow you to copy files into system -directories, prefix the python command with "sudo". If you do this, -make sure that the Python that root runs is the same as the Python you -run. E.g. you may need to do something like - -% sudo /usr/local/bin/python install.py \[libdir\] \[pydir\] :pre - -You can also invoke install.py from the make command in the src -directory as - -% make install-python :pre - -In this mode you cannot append optional arguments. Again, you may -need to prefix this with "sudo". In this mode you cannot control -which Python is invoked by root. +The -m flag points to the lammps.py python module file to be installed, +the -l flag points to the LAMMPS shared library file to be installed, +the -v flag points to the version.h file in the LAMMPS source and the +optional -d flag to the desired installation folder, if you don't want +the Python specific site-packages folder. If you want to copy these files to +non-standard locations, you will need to set your PYTHONPATH and +LD_LIBRARY_PATH (and DYLD_LIBRARY_PATH) environment variables +accordingly, as described above. Note that if you want Python to be able to load different versions of the LAMMPS shared library (see "this section"_Python_shlib.html), you will diff --git a/doc/src/Python_overview.txt b/doc/src/Python_overview.txt index a5d6a469ff..0195ec2b20 100644 --- a/doc/src/Python_overview.txt +++ b/doc/src/Python_overview.txt @@ -13,11 +13,11 @@ Overview of Python and LAMMPS :h3 LAMMPS can work together with Python in three ways. First, Python can wrap LAMMPS through the its "library interface"_Howto_library.html, so that a Python script can create one or more instances of LAMMPS and -launch one or more simulations. In Python lingo, this is "extending" -Python with LAMMPS. +launch one or more simulations. In Python lingo, this is called +"extending" Python with a LAMMPS module. Second, a lower-level Python interface can be used indirectly through -provided PyLammps and IPyLammps wrapper classes, written in Python. +the provided PyLammps and IPyLammps wrapper classes, written in Python. These wrappers try to simplify the usage of LAMMPS in Python by providing an object-based interface to common LAMMPS functionality. They also reduces the amount of code necessary to parameterize LAMMPS @@ -25,11 +25,12 @@ scripts through Python and make variables and computes directly accessible. Third, LAMMPS can use the Python interpreter, so that a LAMMPS -input script can invoke Python code directly, and pass information -back-and-forth between the input script and Python functions you -write. This Python code can also callback to LAMMPS to query or change -its attributes. In Python lingo, this is "embedding" Python in -LAMMPS. When used in this mode, Python can perform operations that -the simple LAMMPS input script syntax cannot. +input script or styles can invoke Python code directly, and pass +information back-and-forth between the input script and Python +functions you write. This Python code can also callback to LAMMPS +to query or change its attributes through the LAMMPS Python module +mentioned above. In Python lingo, this is "embedding" Python in +LAMMPS. When used in this mode, Python can perform script operations +that the simple LAMMPS input script syntax can not. diff --git a/python/README b/python/README index 6b13959f4d..204ca2c28d 100644 --- a/python/README +++ b/python/README @@ -9,12 +9,12 @@ doc/Section_python.html and in doc/Section_start.html#start_5. Basically you need to follow these steps in the src directory: % make g++ mode=shlib # build for whatever machine target you wish -% make install-python # may need to do this via sudo +% make install-python # install into site-packages folder You can replace the last step by a one-time setting of environment variables in your shell script. Or you can run the python/install.py script directly to give you more control over where the two relevant -files are installed. See doc/Section_python.html for details. +files are installed. See doc/Python_install.html for details. You should then be able to launch Python and instantiate an instance of LAMMPS: From 22be3bd37ecdd2dfe73e7768b64e518377551d9b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 17:33:16 -0400 Subject: [PATCH 118/243] fix spelling error and add false positives for spellchecking --- doc/src/Python_install.txt | 2 +- doc/utils/sphinx-config/false_positives.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/src/Python_install.txt b/doc/src/Python_install.txt index 403cf052da..f1a280931f 100644 --- a/doc/src/Python_install.txt +++ b/doc/src/Python_install.txt @@ -25,7 +25,7 @@ run "make install-python" or run the python/install.py script explicitly :ul When calling "make install-python" LAMMPS will try to install the python module and the shared library into the python site-packages folders; -either the system-wide ones, or the local users ones (in case of unsufficient +either the system-wide ones, or the local users ones (in case of insufficient permissions for the global install). Python will then find the module and shared library file automatically. diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 5366a31d5d..2b149ac087 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -250,6 +250,7 @@ Boresch Botero Botu Bouguet +Bourne boxcolor bp bpls @@ -627,6 +628,7 @@ dVx dW dx dy +dylib dyn dyne dynes @@ -1298,6 +1300,7 @@ Kondor konglt Koning Kooser +Korn Koskinen Koster Kosztin From 3464464ea925918a5bf8e4fd71171c6790bcc8fe Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Fri, 22 Mar 2019 20:20:47 -0500 Subject: [PATCH 119/243] Update kim example query and log files --- doc/src/kim_query.txt | 3 +-- examples/kim/in.query | 2 +- ...Aug2018.query.g++.1 => log.22Mar2019.query.g++.1} | 12 ++++++------ src/KIM/kim_query.cpp | 4 ++-- src/KIM/kim_query.h | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) rename examples/kim/{log.16Aug2018.query.g++.1 => log.22Mar2019.query.g++.1} (72%) diff --git a/doc/src/kim_query.txt b/doc/src/kim_query.txt index ffebe698be..be46783d82 100644 --- a/doc/src/kim_query.txt +++ b/doc/src/kim_query.txt @@ -18,7 +18,7 @@ web_query_flags = a series of keyword=value pairs that represent the web query; [Examples:] -kim_query latconst get_test_result test=TE_156715955670_004 model=MO_800509458712_001 & +kim_query latconst get_test_result test=TE_156715955670 model=MO_800509458712 & prop=structure-cubic-crystal-npt species=\["Al"\] keys=\["a"\] units=\["angstrom"\] :pre [Description:] @@ -43,4 +43,3 @@ See the "Build package"_Build_package.html doc page for more info. [Related commands:] "pair_style kim"_pair_kim.html, "variable"_variable.html - diff --git a/examples/kim/in.query b/examples/kim/in.query index 8538cac749..33272dc298 100644 --- a/examples/kim/in.query +++ b/examples/kim/in.query @@ -6,6 +6,6 @@ units metal info variables out log -kim_query latconst get_test_result test=TE_156715955670_004 species=["Al"] model=MO_800509458712_001 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] +kim_query latconst get_test_result test=TE_156715955670 species=["Al"] model=MO_800509458712 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] info variables out log lattice fcc ${latconst} diff --git a/examples/kim/log.16Aug2018.query.g++.1 b/examples/kim/log.22Mar2019.query.g++.1 similarity index 72% rename from examples/kim/log.16Aug2018.query.g++.1 rename to examples/kim/log.22Mar2019.query.g++.1 index eb83dd84b1..034bb13bba 100644 --- a/examples/kim/log.16Aug2018.query.g++.1 +++ b/examples/kim/log.22Mar2019.query.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (16 Aug 2018) +LAMMPS (28 Feb 2019) # example for performing a query to the OpenKIM test database to retrieve # a parameter to be used in the input. here it requests the aluminium @@ -9,26 +9,26 @@ units metal info variables out log Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info -Printed on Mon Aug 20 18:44:24 2018 +Printed on Fri Mar 22 20:00:56 2019 Variable information: Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info -kim_query latconst get_test_result test=TE_156715955670_004 species=["Al"] model=MO_800509458712_001 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] +kim_query latconst get_test_result test=TE_156715955670 species=["Al"] model=MO_800509458712 prop=structure-cubic-crystal-npt keys=["a"] units=["angstrom"] info variables out log Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info -Printed on Mon Aug 20 18:44:24 2018 +Printed on Fri Mar 22 20:00:57 2019 Variable information: -Variable[ 0]: latconst , style = string , def = 4.0320827961 +Variable[ 0]: latconst , style = string , def = 4.03208274841 Info-Info-Info-Info-Info-Info-Info-Info-Info-Info-Info lattice fcc ${latconst} -lattice fcc 4.0320827961 +lattice fcc 4.03208274841 Lattice spacing in x,y,z = 4.03208 4.03208 4.03208 Total wall time: 0:00:00 diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index 8d400ac333..2e1f752dc1 100644 --- a/src/KIM/kim_query.cpp +++ b/src/KIM/kim_query.cpp @@ -52,7 +52,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package + Designed for use with the kim-api-v2-2.0.0 (and newer) package ------------------------------------------------------------------------- */ #include @@ -114,7 +114,7 @@ void KimQuery::command(int narg, char **arg) varcmd[2] = value; input->variable->set(3,varcmd); - + delete[] varcmd; delete[] value; #else diff --git a/src/KIM/kim_query.h b/src/KIM/kim_query.h index 92972d804d..ed5a7c88f3 100644 --- a/src/KIM/kim_query.h +++ b/src/KIM/kim_query.h @@ -51,7 +51,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package + Designed for use with the kim-api-v2-2.0.0 (and newer) package ------------------------------------------------------------------------- */ #ifdef COMMAND_CLASS From 414f9b25d15c583763f7cd0e7d0c3fcf02a8b80b Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Sat, 23 Mar 2019 08:01:41 -0600 Subject: [PATCH 120/243] cmake: move lmpgitversion generation to build phase --- cmake/CMakeLists.txt | 38 +++++----------------- cmake/Modules/generate_lmpgitversion.cmake | 30 +++++++++++++++++ 2 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 cmake/Modules/generate_lmpgitversion.cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f6f822676e..088b712856 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1331,36 +1331,14 @@ execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HE ###################################### # Generate lmpgitversion.h ###################################### -set(temp "#ifndef LMP_GIT_VERSION_H\n#define LMP_GIT_VERSION_H\n") -set(temp_git_commit "(unknown)") -set(temp_git_branch "(unknown)") -set(temp_git_describe "(unknown)") -set(temp_git_info "false") -if(GIT_FOUND AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../.git) - set(temp_git_info "true") - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse HEAD - OUTPUT_VARIABLE temp_git_commit - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE temp_git_branch - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git describe --dirty=-modified - OUTPUT_VARIABLE temp_git_describe - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -set(temp "${temp}const bool LAMMPS_NS::LAMMPS::has_git_info = ${temp_git_info};\n") -set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_commit[] = \"${temp_git_commit}\";\n") -set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_branch[] = \"${temp_git_branch}\";\n") -set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_descriptor[] = \"${temp_git_describe}\";\n") -set(temp "${temp}#endif\n\n") - -message(STATUS "Generating lmpgitversion.h...") -file(WRITE "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${temp}" ) -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h") +add_custom_target(gitversion COMMAND ${CMAKE_COMMAND} + -DCMAKE_CURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}" + -DGIT_EXECUTABLE="${GIT_EXECUTABLE}" + -DGIT_FOUND="${GIT_FOUND}" + -DLAMMPS_STYLE_HEADERS_DIR="${LAMMPS_STYLE_HEADERS_DIR}" + -P ${CMAKE_CURRENT_SOURCE_DIR}/Modules/generate_lmpgitversion.cmake) +set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${LAMMPS_STYLE_HEADERS_DIR}/gitversion.h) +list(APPEND LAMMPS_DEPS gitversion) ########################################### # Actually add executable and lib to build diff --git a/cmake/Modules/generate_lmpgitversion.cmake b/cmake/Modules/generate_lmpgitversion.cmake new file mode 100644 index 0000000000..8aead88f5f --- /dev/null +++ b/cmake/Modules/generate_lmpgitversion.cmake @@ -0,0 +1,30 @@ +set(temp "#ifndef LMP_GIT_VERSION_H\n#define LMP_GIT_VERSION_H\n") +set(temp_git_commit "(unknown)") +set(temp_git_branch "(unknown)") +set(temp_git_describe "(unknown)") +set(temp_git_info "false") +if(GIT_FOUND AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../.git) + set(temp_git_info "true") + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse HEAD + OUTPUT_VARIABLE temp_git_commit + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE temp_git_branch + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git describe --dirty=-modified + OUTPUT_VARIABLE temp_git_describe + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +set(temp "${temp}const bool LAMMPS_NS::LAMMPS::has_git_info = ${temp_git_info};\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_commit[] = \"${temp_git_commit}\";\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_branch[] = \"${temp_git_branch}\";\n") +set(temp "${temp}const char LAMMPS_NS::LAMMPS::git_descriptor[] = \"${temp_git_describe}\";\n") +set(temp "${temp}#endif\n\n") + +message(STATUS "Generating lmpgitversion.h...") +file(WRITE "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${temp}" ) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h.tmp" "${LAMMPS_STYLE_HEADERS_DIR}/lmpgitversion.h") From b2a7205abe96f328b7e08e756bac3df6b48176c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 11:31:23 -0400 Subject: [PATCH 121/243] re-order ev_init() and ev_setup() so that 'init' comes before 'setup' as requested by @sjplimp --- src/angle.h | 2 +- src/bond.h | 2 +- src/dihedral.h | 2 +- src/fix.h | 2 +- src/improper.h | 2 +- src/kspace.h | 2 +- src/pair.h | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/angle.h b/src/angle.h index 196c2a44d1..3d8371242e 100644 --- a/src/angle.h +++ b/src/angle.h @@ -58,11 +58,11 @@ class Angle : protected Pointers { int vflag_either,vflag_global,vflag_atom; int maxeatom,maxvatom; - void ev_setup(int, int, int alloc = 1); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int, int alloc = 1); void ev_tally(int, int, int, int, int, double, double *, double *, double, double, double, double, double, double); }; diff --git a/src/bond.h b/src/bond.h index 1082748403..8fb7040832 100644 --- a/src/bond.h +++ b/src/bond.h @@ -64,11 +64,11 @@ class Bond : protected Pointers { int vflag_either,vflag_global,vflag_atom; int maxeatom,maxvatom; - void ev_setup(int, int, int alloc = 1); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int, int alloc = 1); void ev_tally(int, int, int, int, double, double, double, double, double); }; diff --git a/src/dihedral.h b/src/dihedral.h index 0769d79163..f1b42008bf 100644 --- a/src/dihedral.h +++ b/src/dihedral.h @@ -56,11 +56,11 @@ class Dihedral : protected Pointers { int vflag_either,vflag_global,vflag_atom; int maxeatom,maxvatom; - void ev_setup(int, int, int alloc = 1); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int, int alloc = 1); void ev_tally(int, int, int, int, int, int, double, double *, double *, double *, double, double, double, double, double, double, double, double, double); diff --git a/src/fix.h b/src/fix.h index f5b3338aee..7eaff38bd3 100644 --- a/src/fix.h +++ b/src/fix.h @@ -223,11 +223,11 @@ class Fix : protected Pointers { int dynamic; // recount atoms for temperature computes - void ev_setup(int, int); void ev_init(int eflag, int vflag) { if (eflag||vflag) ev_setup(eflag, vflag); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int); void ev_tally(int, int *, double, double, double *); void v_setup(int); void v_tally(int, int *, double, double *); diff --git a/src/improper.h b/src/improper.h index 8ee2c2996d..d940b43a13 100644 --- a/src/improper.h +++ b/src/improper.h @@ -56,11 +56,11 @@ class Improper : protected Pointers { int vflag_either,vflag_global,vflag_atom; int maxeatom,maxvatom; - void ev_setup(int, int, int alloc = 1); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int, int alloc = 1); void ev_tally(int, int, int, int, int, int, double, double *, double *, double *, double, double, double, double, double, double, double, double, double); diff --git a/src/kspace.h b/src/kspace.h index 12cb16c929..2345cebf24 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -194,11 +194,11 @@ class KSpace : protected Pointers { int kx_ewald,ky_ewald,kz_ewald; // kspace settings for Ewald sum void pair_check(); - void ev_setup(int, int, int alloc = 1); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else evflag = eflag_either = eflag_global = eflag_atom = vflag_either = vflag_global = vflag_atom = 0; } + void ev_setup(int, int, int alloc = 1); double estimate_table_accuracy(double, double); }; diff --git a/src/pair.h b/src/pair.h index 37606ed595..5ce62f1b35 100644 --- a/src/pair.h +++ b/src/pair.h @@ -218,12 +218,12 @@ class Pair : protected Pointers { int copymode; // if set, do not deallocate during destruction // required when classes are used as functors by Kokkos - virtual void ev_setup(int, int, int alloc = 1); - void ev_unset(); void ev_init(int eflag, int vflag, int alloc = 1) { if (eflag||vflag) ev_setup(eflag, vflag, alloc); else ev_unset(); } + virtual void ev_setup(int, int, int alloc = 1); + void ev_unset(); void ev_tally_full(int, double, double, double, double, double, double); void ev_tally_xyz_full(int, double, double, double, double, double, double, double, double); From e9384b6b173ebe00f76b5073ab51559f78177b08 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 09:52:16 -0600 Subject: [PATCH 122/243] updating output files --- examples/hyper/global.10Oct18.000000.jpg | Bin 72470 -> 0 bytes examples/hyper/global.10Oct18.003000.jpg | Bin 71795 -> 0 bytes examples/hyper/global.10Oct18.038000.jpg | Bin 70395 -> 0 bytes examples/hyper/global.10Oct18.059000.jpg | Bin 71492 -> 0 bytes examples/hyper/local.10Oct18.000000.jpg | Bin 493761 -> 0 bytes examples/hyper/local.10Oct18.000700.jpg | Bin 490185 -> 0 bytes examples/hyper/local.10Oct18.000800.jpg | Bin 488885 -> 0 bytes examples/hyper/local.10Oct18.001100.jpg | Bin 490525 -> 0 bytes examples/hyper/log.10Oct18.hyper.global.g++.4 | 1243 ----------------- examples/hyper/log.10Oct18.hyper.local.g++.16 | 993 ------------- 10 files changed, 2236 deletions(-) delete mode 100644 examples/hyper/global.10Oct18.000000.jpg delete mode 100644 examples/hyper/global.10Oct18.003000.jpg delete mode 100644 examples/hyper/global.10Oct18.038000.jpg delete mode 100644 examples/hyper/global.10Oct18.059000.jpg delete mode 100644 examples/hyper/local.10Oct18.000000.jpg delete mode 100644 examples/hyper/local.10Oct18.000700.jpg delete mode 100644 examples/hyper/local.10Oct18.000800.jpg delete mode 100644 examples/hyper/local.10Oct18.001100.jpg delete mode 100644 examples/hyper/log.10Oct18.hyper.global.g++.4 delete mode 100644 examples/hyper/log.10Oct18.hyper.local.g++.16 diff --git a/examples/hyper/global.10Oct18.000000.jpg b/examples/hyper/global.10Oct18.000000.jpg deleted file mode 100644 index b462983f6a950954a8606f3cf4dfdbcc0ca6ff96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72470 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

75>Wp#HNxV{P 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 diff --git a/examples/hyper/global.10Oct18.003000.jpg b/examples/hyper/global.10Oct18.003000.jpg deleted file mode 100644 index ef28d78d78a6bfa8e46804ed1a0d4634a7866ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71795 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 diff --git a/examples/hyper/global.10Oct18.059000.jpg b/examples/hyper/global.10Oct18.059000.jpg deleted file mode 100644 index b77a9e3454a3de55e2d4f69843fbd1518082d9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71492 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�EQLSG3m1l8T4Bst}&((=xmWw)5 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 NRK7Vuxas8cPgHlu1? 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 z zsr5G5MZZi`tBAHbZpHkOPai$5lzP9i2^g8#73NfM2oTP(1{s`~g0l)ckX!_K#owux=m3eOln(*YNqw9B`sd98p z+b8ONn0`5);hB-IaKVa^OD&E5sp=&aC~9LpQ&gsNDW1 zfmd#X6?gSv37aI(fotx+?96A&liEd(>7*w)!n2R#+In{A3a9q zq|wBKeO@Y*SNsLgsy_MRbe}5FuRFDYU;JlYJwCy@kW^|3{26#Pc;Kp2*bFH_A5Hfg zy^Ac^vw}!3A*W1TZ?KK!MN>=d0mUf(sLBqW`GIoPb>~qb*dN1a@pL67&k|XnSZWJ= zx2gr9`;Vwk#u>NO|DqnGFzk`MG;~}RAQrK=e+72>HBxaN=P1P2#riPux$Ky_)rpdj zA!g;1cPP2*e?<0;t(JsU2R=+H$J;x!%^Ov3rb~I#?D!#sP>D57!%~BG3w>i5P;0rU zWjpuG9PF%Co+=g?z4760@=0P~ir)>0M458--PfC=a0e0Y%FJ6WW!qV4EIag1=`;`bNY7B3jAwH`#rJpB+GTPRj|pT2-1?-$ab1|(D-$U?F>+qC| zwU8SuV`R`a2B{uS66V7?s`jt4Jpb66>7Up1*^ZelB?k9!nRjMS(YEMIIq1U(YKSdb z24oz4Z>{I;#&q!F+kewGw1m*>hE?`gy}ma>mJGFRfqwN_)ayF*;V+rq5-lC2ZYA0i zUacyK(Lqx%2>lr>Ttg3@%L681!*X2t@Z%0#JTkrAKHG-77S+(Q00 zQsjDQd%0a(ELs`}Q|u|acp@8GDdhCq8Ys={<{e^XS53vST|ZZ#8M3fUaH{naruU@U zi-&SshT93UzcoHtBto59-CwN&O7Qt#mV}Q0zAJO@C_n^y6Nmx!DJzw`{~f z*K9oQ<`$w�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 z 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%0A{&S827`8 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 DjY8&0 diff --git a/examples/hyper/local.10Oct18.000700.jpg b/examples/hyper/local.10Oct18.000700.jpg deleted file mode 100644 index e1e61dd6aa242cff2f12d7f2517c630f62631ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490185 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 z 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%0D9(U3_^N>i&m>@;Wj@=cKvAR-711F24F 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

+OsMow4BOCnPLKH|Jq!r^woykPR%U_40@zpa& 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 k6-b8kSJEv=v-^6Mi}9DiVhU!c;@mtb9(Cpcd9- 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�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 diff --git a/examples/hyper/local.10Oct18.000800.jpg b/examples/hyper/local.10Oct18.000800.jpg deleted file mode 100644 index a1e2fbc66a0ac986543bdedbaed05b9afd748091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488885 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≈l`#h73pyf; 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̨w9e$-DK?mwx6 zaBA5qZ?un!VL{5+Nr%8rI$SX67O<1 zHWZ4>6bX+^Q-oXW-~eVhvi^iwe*fu!Ig7XJwy3p8i?e;nEuc(vP@8}#@xw+q_Lrv| z;Sm8x*O!YRL>FOA@vopmu`^SPh`|Vw{2a?k+)rrZYyw^_8x32gdwaJ((vpgw%|buv z7`o+bfiQSnJrryMzA}wS(6&#wT*A5(=kCd96kI)AZzDfE>W$k1=uP*5gHa zqnxRDa8T>i(N{o0oR>-rqzeQ0i5fcr_;^*@0~zCNQSeqL&r$T8{>NwE#kV5EQ{%f* zU+zmiPlXJaq43FP!vQjRM69B|eLukm2y+7kg(lAqzz*_luFSlC1H^4VPRsxRnLGoK z$pX|gw7`IqR&4!t9&5n)BTdv8`$sR8I?{L{a5p?*p|-S)U%#NjkmIz3+E_lPMv z?nLxUt2JDUwfja-vSlOwUv{Zz(%*KeYrrl=&WqJ>{A;46qhpYR7&ZnRbSbr#Nc!Z} zUk03CXR{(t?AZ*C$sqXpmy?@48LlO-yjAbx;Bh#Wnr$VfX*`@` zP#3;2M*kfYS#^Ong=itI;U_2)57+OU34b>sVNF=Olq;}HjY(ZzrF>p996Q8jA>@r* zCj@Yc9?5vjO6>)Gh4sR^VU6Uve6@!Yk`Ra3f|cHW&9fa7l~v5S9=o|S`ov!dP^6O* z_n;nn>ajgpE|g6B9BBpb zSxsT#gZdph9I+^t6m}%uu6FRbK%rN0suRF3^#tpe`XeMg?jWg2Dh5`KEY!5EP2lO3 zB?;E><8;}&5WdoFVlnas7%6G?(e_lX1}D#Ylu=`1-0ft!L%tgw$eU+w(VCLevlwtb(>d`=Dc6vOw3Q)$;@m~MdQB%=ts3gcfz%PSJ<=!rc1)?7!J{-JC(48MM8l2cLt zyc~a{=<~h@-7YVPfV}PFBqj2uA$oJ_e#LOhlo-J?9O>3_ur3lv!4U!M;u0S_O-(;| zy}R8=eE%nonq!_H`W|p<@-7%U^p_wOT`Xmk?|;o#19s5VU!{{dFs_K$Ca z!7=GTv&XNFh@)CM-!OBsvb0zCPI>%!)isee1h)Aod;x?ThCct|kz_UAMx{=FC>kwI89a)O_udJG9Mci~uQ++b9(4w9;AlCCyj^OcrG6gw zJ(`bkQS#@Xq2%P$Wfj2C@pm(vX^DsT&fYQ)Uo%?sueeIjGCEykgt=3+x$nH9p_~?- zREiNCQ){qqP=3R`jrdw(nb}oYg1EL;wp60KV&%6Iv7tJEE3WOhT1h7QsO5o80ECCRMGrA9q? zKeFjIimT@h)0jzpZiJG0wL`#UNc8bFMABKK3*HxN@bL&E&-m zv(dTBch0a~C3=FJgK>U`Chci%x0yjP?^?#lESp*qj=$`Nd$9)iPn!>jyV||)DPVia zP2>G7nA>wMMe=Q~6d9D>d?s04m(Aw>cnO2|E(>4Pa?(#6R{2pLY{-_^yo*_FHNmk= zO>eg{#BwR$Wu3I5(h4{d4N2F)hL{afmd(rjXG0VOuTaHl1CJtxp;mhsVzW|ETo;@{eW%;>={S1BzIs*HFuo+_s<@ ztNP7ry{Lls!d}c+gc+xImKH}o!!6_3v~io_zBiQn%yFTwMkPSeVVHbKn9%KztjBSY zb^U45LszY6B@P!w?@HHkbUJ7mMNM2nX0*zqdAJh##>Fs)``DIILI~S3I?ZG$bOB9b z8_*=C0bT|IbwXZ`43T8%_0ylo#`$>I-Pa8jPue;kSb zy0Y%2p&)FdM)qJgMEse(7dL<+afbseh(5+8S~kwtKfiMeZ^8YgNG!}Em>5Vd%$`1U z=H9h$FdCHoT`_{&_Fokv$KU(mZ$qNXGwyTGR8(GZp z8!p-l=qm!p_EAwd$uIlpgB|AKx=gIZCL8So@nrLoUXU}v>G@@if@dnqVK1vEkG1vE zR*G0ZVsxSj}EfSCK?txe?XJ!)n(9B;Hu z$TKrzy`(Mngg$G0x~R2KWK}P&sW6~tM(42x{JZm`1*Mf=rAO0M;r9BTcLjTLNTpKW z1F2QV_FTrb%H*2d2k$E)I+Kj)oVsTtvOTu8#O@K9>@51P_fJLa3{1DMz-z+f8z-tC z>Lu8!q?((;3VYcY=OW^u@|RRs!f$l9;5=9Ms>?JRiVK?Iw))Kc)P^+lgI?;_AnQ6#zreabe|n&?bh92qaj1KM!=--Rw`@5t_z9UrV7RI;)g|~ zi2Y_$DgolF0V|3q$j-Q*L5<;ZG+Vl}K_0KeQccd$skj#7M#?voPx-Qv8Rj?6A5_#+ z2+x-JC}ht_Shr9DT>=we5Q!(^CawjU*ksIZM7%xH+~nAjZ((s?FMPkdyZ)Hk%WO+r3We{Q6lu|L8sK9_~bMpfEOl#6_ znVaM8Hw9Dey&cN0q!85-!L*C3P-mwAL65%Qj$m`*KM8u;EoI)UAqL?H^#IwLEiCV~ zJc+P;=luynk5x5*aVU8q$I!G30Eo;=w`&Uxf`-u1fbiw!-7&tZ&B+vd4?71 z1=S+62=twje4oyMMVT7)t8N?GS3Xa3n=*?F{^FCIVuktvsRI0mpQBB zQJe|AvLT%7@(f)M75iLb?HS~hG5#%M1c&rVYpH0oLPrwkFNEH+|3c^;jH&lv0bk&% z_<|Lrn)iIkcM~S1h}XvmWi8hi;8RfoW8Hxg#HA8fA$#4#0Kc#F?w8G7_*(HS7Ec3L zM)Eti=oXh0@|2cN<$?MBk1os_aHCKb;4j^vaF$9!6;mfmv4;vvnjfX z4Cl3K8J8f4KmoJh{W-4!JSt3sJyC&-3hh1B);u)$!op9R^qZdI2Qk4fCwwnwW*j7I zT$q62m6iPvYHj5K`ie+^e8mTlN<5VDP*9G13q*I`nh>VIe**#tUt3r{dG|782xIs@ zceV!~bGz46P8io4HO>FBQG?gi>S!@IYhtTC-Z0vc(;wH@7&P#5A;#utzI zZ9x(k?)uCZEslymAYZk{Cth)T@CAlnoPx@D_DtF(;Lw!mrdwvpr01@ zKL^;I0W^dt^B~yRmuwc)pW9rN!KUtqD(B+x)Zot1`DGe5L&F09*sQf#?b~y>7rQ zyR$t}54-Aoq}+^))(D9TSYerybzS(jp;&SAj zr=eF;8;T37Sy1Ps&RIg{n|K5xy-3lETS(%0ycqFK`O_53-K>S-0zG6a4{{1DM>A}5 zO9YxOeZ0N>gj@FdWqVI8-?$diTHK=kMOf^ZlC)U>vvFuK=@Zd#dFDcoL{^7Ej_sN{ zVrBD?yb4A}i-QgEb}^w0yW#BiF%8)n#B=DK4`?d2q2`r4mS_ArLYODlB&#nrA`Jte zng!^zEjeTpvgWHjRiKWE$yY1;RyrELLh7w`4L4!*%0Z*{)JUwW)QElRWE)X?ietZU zi`bwPuD;vH{^nuB@1K%U~zS=a`|kaFq4kfXxfhp&*y(*?OMaO`6Ms5sHnkO|gN~m$v}=SE-vcU| zIYJ?_r@kxCaHYE6=}wVYrtp+`TDzMJn7;nVF1s-C!gKc9kWa`C?bTJv5CWA41FSusnq4inNO}bM;cx*`lw63l-T#a1k(S=R5jOBsK=cxSr ze)#H{+o@l`JN<5FRlAmkISjbri3hcnUce=IvbgMh{E~1}BxB-cY|NW0C5xe>9GUA) zU-(!`?yi?4dG&75)@#aVW7(98%img(m@fiMc}8+-W%4=|v#nDNLNWo6^UA+Df5$kO zXFQr{;o1NsCU5KYbN7GHb#tF4ClRwe7O6q?YyX>f6!?~l&0lcCEgXoay!mCS^Ho2=poD2z9z}T7v zvck07?bj@57*Jtl0UJ-BvI~fm9L}2w_VNd17$a=DC({we5;=8*Oejkf$HY*exmz65 zNP0{|q#yeQygKB|pE#=|(0nY{E4DU(W{5ajIey|qkjx(1+bUON&{2#3e$p6|(1ICpuIQd@*sIJP>F~Mb=?^2S z`S!VK8jomI^u8UX-lIDX1?;ISUxMV66=p-tiVLCgv+@{v^RwOYACm>riSUCc(!iSu z3zO69L)nnX5_K#w@7o)0=ZCo+>d}z0ul-6j^ft+TkRQtgU()8g>APd zB-O5UFn>QNU#n-Sr#sw8!91KI5GR2bUPcG(N(f40sjrnnwi&;muc?&G0Xt$gypvA- zb8p(k%;z|si=8kjVRht|kd*f{A*Np9FSyMPZc-3}d38M{3AK}JyXheBzV5o@*dJJ& zeQ}VP<8W+CxTPHJm6>VE}E*j?1*Rp7Bsh6f;R2^@yy<>McEUjQ;QE^lmf}t8vWJWD7^{YvBcQ_ z+6LddMYP1$lBINXDi1RD$N$GRNYt2HNK*KUbE8B|tfbOfD_rKH_W7o(L_RZkKXHaw zMzW6OX_u1aI+8`NF)}i2dmr{$8`!W{M-GR;3@Jt}ku9IBl-C3i<8AKL zvJ@DfhCHa;x1An>l?ArnxYv5g3JP&A0%^h`AOL8&f)xN@l^VMCI_)?`^()G_)0$iq zRt5}10?bGK;B&Cb$mgah=VTaCWm@yEs7IgV%IeLByZL7pu(|5WObH$;i$#1JLhbou ze9|8Pds?rNtiMUHT?w8JF3vPjwdm|?QQD`gLcUNhO4ti82L?FL{13mm!lx#h_&p?U9oSW{csZe>UlaFLSMl3Vx5c@sJog8x1|rI% z47pksmK*Uj#qZCv2;^ERozPwj%?DI2xp~6Rg2qpPTH{`c?u20XYcc*C1mH9BS3qtb4sw^Tnr}Yd*gk3r9NpklnCPE%O!437622|=e^Lc5@pP=D8=&h ztOVcjCP)c*y!f}ZYd-SYvll*a`x9* zDrS_9qpKH5{?`Amtw!XxttOmpFtI~*7}qaQc>H{OtM_g3?GHCu2dAUr4l)SoO^|&(6%pBrIwQ&q_?G9Y5vx{_SLo621C?8{KlnMaua$f4FNO{OsLt%=mzN=l~*aUE_B^*3l z=kT0ZHnoP%^p(((cfu{$pQ=g07=(E)5I#h;JfyiJQNH)lo1+hEXz9H>d83F_NMR)} zj<4`cl1U6Rj%&V`P!kQqw`xo3of_EJvV&Tcn}U(W+ouI$;8Ubi=-MO2Y%WLsywltp ztywBh2Q?O4;#haqYPS})yvf>m$lIS-vv_J|CPMq7U?uaeT9c!z=9yusG-y{iX@F5F ziaH{OxC#6s`tm|E9qYSimfNl$I6}DHn43$d2-jhrIW*LwdOz-cxb#eJwTJ0FYBGD4 zTBZd*%u2*9^yyXNZad;E*KWeBvg!{R+xFmO+iPS^cLBD)lcJ)c=UrN95${UJB2r6gK=B zAL>3ua-JAdXE9$9ns-`dVTIKX6V_Z4-tbBw66!d;y_%+-u_7q!K3LI0o~`AYkde}v zunsuNBkuYWxe0YwFcfg`AaDeh8+WzyeB|ltNZDl_SAekt*%~!C&X&Q8zgi6H#?a$z zrHG)2LUtHVvXxszd7P~mGUxZMYvzhnKbE8(flwWn7$}B6CB|eo!3pVA7m!|ODIKHs zycTIpJ%uvdE4K&tN;6Y&-DsOD1O1#O3|Pc#Bq{iqfKtALrIeHWn^OLJ zC3N#S_CO7G`2*gTV2WN|%Oq1I?mr>`u0Yol5rBnD-2W{Ca5ffoI&rLdA09i_ggn97 z_($VAAWHOT4Sl-Zd+C>CP0e@qSB-JRxI{S>D4-Rv3*OR!8l$C+CYz2}RW=u$D35~v zE-{+_vVLly!n5H@#%gx!5<=>VIpn8`>wAkB_D>F5rkS-`pH{lV&TFM5ji)+u0*3Mi z_N-<2K4-QLd)Q)B^tq~&!BhQ9v~eCVl&9TW>6|1-hJA3+S&cLEv4uX|;T@)usuBJ@ z8ooO{0=lhxDSQAr>t(|rW=v!FR#{=UMOv*Ir4m{w&TMVtkY%-~eEtuneAHuCfb-<6 zg{mlV=XTa;QU(iQX~rK9fGV=?mk(-i`#*e8EYmNCci`E8pj-&dHBDqWS)#A#p2zD` zm1$83ZyOA_QLeT)pv^T(`yZDpiOPpYCt>_QUEA*2^Bgohzgo-Pw?i!>0fv_Qna5qb z_j##L2<5^EZDx1jW-f_>LqZSLU8naD5UVP0bMg_XR~+D1)b3O>G}SnHvm7;1@G4_G z*NTi6DAu0vevxmH?Jvyo*#79viR=ko+iB;|e=>QkRyTryUeA`OTj&(uW-64{NEM>* z_5uMg%Ez4YvVU>PY5PZE;+C%P53r?z9dZ*Ou<_Od0-O5P2#9?7vwV?S1JiEqrpn^# zL55wu;i}&pE_s?P_hC0z`^VYyGlv>pdlU}4hs7xF5 zUeKG8o0_gBkHv*>SR$d7p4C@mRAq8)d0G@?`?F7bQDI&>pg&V84uGL^+F24ZSxOQC=_vJv(hkYDELq z!ngClV%Qls0^((!g3%KS`!td58wPCHB*4j`dpc%3(c}y~)7Pihsii{7T$aFr zE2b{M_Gupfp|XvXCwsmPv0Si>gY)M%hls7BD_r;MgHftyM*3G(<=@Km8DA8U_EQ}PoJhQXc<&YRJir9ItB-}0y}F!+OfH&C`Lc1 zf2kDdx8pbm|;1`cQVma+Z(C-3n~i*Sk9Jnq8?5;;W*VE$HpW`^qa# zLyHm$wW$_xG%^C%qHF{kPwA_S+kYp@-4))15*Qr%rKoQEt*8dI`=16w`9xfpk&zNH zRjr|n=`lmN_CltForv(!g(qGOS(>!I)X29YVSffzErW%}V!)0|Fc?^zc({LhceQ(Y zZmF`^k@e}nd-qTn*HvrEXdlbv%3yuDdXm2nTFLpFus|&*i@W*c6(a6Aj$3TM?S;Cn zlccDlFy1?GMQMK;k|-AMZ`3Ad{!v3^3i(!RXJe#34{~K}=4Ba9oFRX(BTTEerHTRO zn&cC64eRsP1!AmNBlm+_S&Puo)e=~Fzq46?%x{6=Qyau@aSaD%!;a*|_{Q*wzZOKYwA6>m*5C)wea8Eya?Uv`V)Ek~8;lWTxjGU*GxR2)@c3YcSwI z(FWNX_miZRhZ8T@JXRi`2j3Nc^VrG3;CappL-{^JEMvE_QrWQ{Lv?$yQlF~Hk7ywS zluJbJ%4zA(H3@d?6y6;H*t6EDO%E3mrQ>=Kd`bAeN153F#9fn>91~q85GN$FZ)xkt zm1f;O8zRBfvBBfzC^a(6TU&1;GFq|2fvpEs(LIf|0>#5jea^XZ@EZB*Oagmyc`&tj z9j0CrNwA)&9Y#QnjKy8Z8V)(59(@VTWy=}A(DNRYg9E4hYGIC1Ly9E7ZgiB{OtuLzuxR zg`RCP;2ua1#ugbGPu65oCI;<=+d%1F4$s$7nI%GNySM~^9)nScU!L<9`hQ?-r1`fP zG=;a?_ww&SZ!n&ssy5jACEpvEJ`&aD4O!V0t!-}IGr8r~z*;``GPPO|*z z2$Mv~{4v^jZY@1Zms?5yGhzQ)3CaGfgjt1fFXm>Hp6(q7&Ub5Lq&R;S8RRS8pvWM_ z78wlxv&hiteSfh;BRYB`6BHTAeX#u1+-(7I*BQegN`@RexFUam(En&M+NY(ieTRyF z9xPnAGV-AASP<&AznG9ed(cBM0cn&hjiN4!;QGqU=xKcO!z4PlMJR*X>JE&Q+n3yeS6OoxXDtD}x$i zJ@s|zsg!si)ySQpc5R_FNdM59He#qk7fRuu_NyRFNz#-*xi5BIGE$)Fe#52-F0|~9 zTMWiR?~b7#v6D0?lGgBbCnctNUDXPgaPBpkM=Zi^`_B72z&ocg6G09^`<5izo=>YL zlax0UmYhklBVUuHyAIaDM=EftDY6m0ds!1yO9fhw1_#n}bIu475)r&?wsh-8VDGc^ zSGbSwv#M%;pR=%YORA~jE_t97imH#-}#MrreSu$C6r%;MFf{DWL$Ba!~ zidfRy{W_f_5#599Lksc;%bsPcTT5%uc{oY3fRN(zsyB~qM9%mm4S89h17xEgzLv|> zk<>`-*&lND$^?z`VMH4ro7b~KHkSoY#MZ@IX)s}cr+9bj_fP)Pp45|p^^H$NZ)Pf% zHQCI+T-Ch?uaUHF()MK>Uuk^#++iPHk{*&mnBl;!ZEvMGXl3W$$gb(8`s{O}!ePO> zPvnLniMW2gTkZ@|pg;}eYcoedh2v%E2)m6ae7);l^6Bbm--1k(B@(<^%)==mST4{OQLD_f060#$?jZ9~@aYbIqZWejY*QC_u(Rb5&l zjOI+DVPNG(Sl-g^@UT#v?u`34VQE}B92!X^^QsD3ZI+hEf^zr0XU_6#gLq>W^4F)s zg{8VHQrQjS>gLfjZ%7o7%IP5?uCOR)_A>9CDn{=frBE-aR&7ZdRFlWrw>-zd@!H3; z0?8=8Rt|W+g4f;o*W%giGB~-}O)iQkD#gLRNv6^lhm5gIIJweQiw0gA_B-2)B-YKN zJ$?(QXZp*Oi~)(+B`YnHqaiR{JAK8+K1O=Kxs=^E1gMf~1S(fcQ+JIVm6ac@qJ3% z=^8JGx!?e77kjl=t{#S^A0sp`(3~9qy7kuCS7*P^N+1b&#>m&Pl;-F!qXVTUlxEQr zO0(=S+(ub=U-M9-C56-{AeNFbHpcGk`02%DS&sX26_BtU47Btp4_vZ+{1yXvHYdzL zYo^*&j6oKcUoBf_x|`rZqr>^TdVd(r)cS6&EoB}B$&_6V5}~nUf*UvV-$X~Ci3~l4 zkhDPYHmNM41v}=S1^2q`7Yo zQ+GP$O0L0$0S5=$-On|OY=%0zpNGZ(q`9P!rfUX4-CCe{wN?088-u|G41l5;Vy|;q z2Nvrp+y=9rRxF*hfS?l^#^B2Fx%k4I95<`AQYKZ(dx-a1dp0{Mw5F@USN&$yt6PDbHtpoB}S z>WVF5uW6D;Sk!;O=%St&UUt)Jlyf*A&?gbOb~@7l-3Xr|SbajfrX z2&kHSo>?22V`;UsP!d$^>RluW!r!L0Yi>NcCg_JR{kc!x*D-hOE}-E`9ux2R1aj+7 zPa~U^eNdyTP>wve^H71RewaS#=$1y5Auo&BZ8%>K9StV6y9m7SjcXhwd$pso?nTVRUbFZ)Pd}B8?->^or$GUxKI`q_Z0UW%ii7*bA;i54JPaAEAr1Xj!MV{ z*i4O3>$l1FEZuy+X9&SI-)rH*;I&osEZ(c_FuO+y2zgj|2dT(?EZaYfvGZDTmB)^h zO!d;o!Ay1WU38Sz3ElsY^ra*tMztIj+_1+%Y7Drux9f20RWz@*PIGYVMKc8JKDLXS!h9^DGIXUkxi#NpW}V~-o7Ndf3a#-h04wB zC(aj9+xVXIfT5!zc`1KqjN`2_B8{pk~ygeQMszV1ekRH$4Cj zU#tDbKj#XIk4P?h#)ZD*dEp5(BW0F+RHz@7SXwzYj9$LJQsutZwo}bqdDtudQ zp09~co?S$lr3=1yLIp-6t~_VEr-dSo5o%HrdZ=hhs%FKb#K2b1gLgJ=Nt^CKGnIOE zlC%~TZAEDiX>M#SP#^nfCQRF*`G?;HUYfHJ?r7Zl15hg3>~?(S;5l+-N!*ZRzDW-dw}ASC(-^zl2DU zR-4Y$SatXE+wf8`2IGWY_JZRm$CYbc z9O%7vOiP>7)ENlF($ZQwb}a!^aF;f=-li>Q2Fcg?Qb|D{O8yYRFH@yai z2?^2jT4p`8kotglZKWhLCk`hSr zAOdA+Lt2=*{+Y+gheEFrMWi&$9v?O?bna2iH6G)akuQkOn9x3Pr?%FHgG($$#Fc`I zkB}0Tg$q=4Pf};CTIEa|?g0Bf%Kjz?G~#S0B-rZc#nU zxJTvvHq+Le{6iH0{!`1|75Lblr}q;lUe_5A|0nXfysntTnVZE@$wtQ*J6oVZeip>k zI5{O#lq+4xkBtqeQNBlG{899NEznl;6_3M}Z)h02?&7MCX{u~*{?p9hk;krK=XOsg znHTVNvkoG{#d)VLJuP8VVx6S=AY(9dyVIe6`TkTTfX^1x8V(!HT(|*hAz7PN)6GItAuMQR7+TuR}ZJf8woMziU9lL|Z&sKx{#gPZUzihdinw`P9e%{b`i&T@oyy*($m96_mph z*)LmMf!uv7uzLU2-jN*d=KwKD=iZ{#lMq5);RU57|jR7OblVn6`|=DaJq?x%AnM<5rmd?ga{{h z{#-G6Y#A=00s%Bfy(?y`> zJ!o;=J7QGwR4)Yp^Q$~YzADJ!AgENP+b;eOr%sJu)Kyrt68K+YAJJ>^%9{bBmfCW8EaWArQIL!; z&eB;W%h`M@AAb+m0LTTVl9I{Zj)zg2Z$D8;Jf|c4PGSzPdj+M<@3L`CUm_(X&SQ=0 zyvE9Kf@T(;U51F(g^LSFHF|PT_A9<%YxCvRBdY$1qj7(99*mGWL$1|NMwacGe!0R0 znrUG*O#sbYTDa^J)QF{*JK5nG{zETM=mFWtEhI#bu4?wD>l82*MU9zFG_ie-a`=gZ zyNZBJoZMv6wC;WOTDP**5{NyR#aA@;^Ak z(*S;-t>pWfW#kfESQo~7tP4Z-KjGz6%Bb;UcsY~*Rr~o~lhbF0e3}r~Q%S6j$;_5m zGIQY=I<{pB8w~uDU|295-DiyU&>1U(zbkiim zLH$32v9hhG)cFgs3F--e*lhj9Wsc9q=y++=#~M&Kotpd(^}pQ?Xs2Z2#xq^Eqk~R1 zg2z)M2XmhgmXfgN&w$p+u-v00O&Q&J=WM+NBr)7rNzC+F`X4)8w?34&cl^Xz(3c+s zj+pdgN6el_jZ;jioszQ;FIS+{WxMUvbJqXO*fb23BBuQ^8lIs}UVQ+-<&iSCr640n z*-&w|Y^Y>izpYcb>3}WOu_5M@HwF4-ql+Xbkd2X^$i~=H&C6fui+@{D3zxM^#Q0*T z#~Cvde`U=vli3;|fNfvRYJEmWWV^jM->35~eok(8(cxBOwl~ZZju&R@ z%tc&K@nP(|<1Lqt87sSs*4||O-gMGFf^jy7DN&>cqPH|9zti4Ph3bJJpKtwdq<>b2 zGLQUN+3NR^4ksfZPLl5V0c3rJzz>soKqkoqRkI_5jArCqbiW+*O$KNBq9PaViYx8K zJaOKe)**`bZpgogWgvTU&U5;@aVd|MH;Z)&-auIO5iN2fHA{}Zsqfy!+_pso51mPL zbeH8y3J)?J!(Y^!=k&p-#?O1xUc}1L0UHR^CMjjIinX$)o;IrsAeE2pCC}ScA}0HD zUQHu{5ou`ApE!+03{i_@a#}!2(MPyS*vLf3-%MN9RkYpSjdmOtc zA|r${D|=@gdmnpdo-&S2_BrMuygv6sJ)b?Fuh;wg{d|7#58(E=-EPRE z$auVX1oW2^dvFZ&S83)y2Kvvxv_$zjGd|X@&dFDAM-6E&BTB$dZXnqb@k3e?Gz)4) zWQ=S$oD-YHLRIB(Y)%p~PQ{y(s)+-6cn{g36&Xdo9%A{_X})R|y;K{2aA!jc0C!gJ zzqzwYX9WPS{Giq##GW!&5AjGYMbl;8N?+0=tH;2#Z`j5VEFQ#~SlQI#ogq1~3H(-W zF?^j@18n6xesh@dTX)4)FY?Ja13x*3c}_T+*XS+ygZMyH%G6 z4fCKyx!io7;tly#6l+`iq}dW#xnL`Q3hWn#bNTw2E_hV=As$uklurz5;=fVlYmMLc z8L}<^g({c%166*tw#+(Z#vw_m5oa{zMXH4LPq)uqh~5iLa!zkM<7-{kB_GgTNK#+;H9BeL_x!51>yp3nqr7bkwn zU~FxH3}*E&8B8`aHCV`t@e8^1hksg=YIt#fTa!XYoS-ZWUIPEanq+|jI2S zthuH#O`ChzJ8O3BrN#Mk&oxVGB!|p#TIq1;M6{K%$_nGFV;f920V~C=8`sC1d??|P zdWpkp@?UwZuL9a^wAed^8NShD{hqu&w$z^!JR(f~zF^nnMsijE#ZJ=F@k+k9w+lOX zbOVr78?@qeuJ>|##MD-;U9C|99RF97{6XtK4#{dTqlOBhleHdiMa_z8XyJ2fNHjjG z`u0~;#U>cxgB>42?4OyEIWvMI*6njXQi_#TZRDDk1`4^9!Vw^{nVL(|6zEUC|raQtY;ETKtkD?`?&%RX< z>oVI{!q#K8fdRIoIrpY%&n<4H4nSlEzd)z4NBa88Q0i}PALAsM`KJser^Qy@-c-kx z>S9uA_>`;J?tSTZ+D>>pGSX0xc4Fem-$dqRDnY8q1yM# z#wC(kz4<93`)iP*L13Rwt7Bwi0-jySp=l+1!bia-zJD9vGd!V_2ks2UDbO#vAhkLk zr^2x^0esRIEh=QuAtqM~o;{74l7*vxCr=BC*-iLaac ztE^mMSYj2_GCQg3DZK8Lv6R?hMLIh?@q3RY3L6lbpN4fZyaHD9Qp&(HrVaB#;9U{u zSFuK6A8X3`dAnZnC=F+wx^)J>Z;aDaDW)yOcJAmI6za*XRS1QJ)Vxnki8p~sdZ*=f zzqHbJrb+@}=F}r6%#RXqa@*LpZ{ifABPU|_$?l`cNdzK4I3_j**}-zAjq$?B$d#4L zcAWy@d-SeNMpSV5N71CYm+lt!r`_Pu=(uwuo)^xuxb}Zs_`#*9;gJU3u~yY)vs`YBr^f|+t3YUSoU-Cbc{<|$6Rp#?S6nja zSWAA$sWu5CeAJ)YXlR&vd4uk`6!mR_pZ2?hMgfPC15W(R2_{N*W**R|(U;Hr2#U5a z9`sg1TMt(ysPw^|+lP~t{Dimw*&!!=$@!`>3R|9W@!QW8hUEx|P7_NhPMCaTWYlkzSvAB%GZt;|_z zCR7ia=T(B*iK)4|e{0ZF0|t}YioA07yzBwGw^-91*rv8vPJV~m4+;5>ow#+0%t4R> zXqJ9?Fn+sYh>l$`_}&7oxdf&6>VB18Q*FVd|KJ8^tO>eVcr18=izQ6TQHjf;t$l3` z)mrh(g8@=4rLTia$>^SY`Ppp$XXH!Gg6sjVUQz7>h-@f^ZZQfCZE99x!9ewkt3qH z(1LL?i7+Q;R$=k#FG-BMwF&f4xV#kSm$tMmc&fs8{#V*tzx6nHyW2xMDGXxe;WPCT zh2Zw#s_JF4dCaRa>2n@#tAgFU)DJD0S9{f_Z~7qPgm^PCH8Bv4E&L%G`)9?p2jeRy zp@u!G*lM)M73IZKauxRhD`!M2d!lUpw*O`NWdgDj8oIb8-K0tFgvn@M#av$3VuvX4 z>z$9t675b9xSt3@VD%eo&JCpk1;!>R>6szCMTz=Pi&7$R#3TXKzcTN2G-(ELk3=ZA zp_F^vT$aW=Y!~ZarE?tb>EU=|rP~-{$7o6b!iF_8xKxiiWPE*x@>gpC*Bcg>kTs$e zgT+6htpamWO23!dpIuIg_o;LL38Z{g%9D~lCztf_ju=ZFjj`R5zQ=Ox>(aNRAGkB? zZ%89V8`NmvCbx#1NfXqRN-K3nqqFfzWrf6n6iKR1yW+1wKFH+h6x zgb}yAT`Fn_6m$5&PDt1F5SKJvG*yj12}!2l>M$YD`UX)kCT{dPvM521ElTuPyp8Kw zkYGh$>dS$5Ji^4IdGvD`?iKV~)0_S+iTO2jX;|OO8p_2xVwlQfhq}>=MJR*KlDL?| zg^S~kS!@$q=ApKg8{VM**JbNcE^?N0+ z>u$KG7|t(aLHgWKF*m8PkSOY^V*FJ*myBkgb5Sf{OOM2f>I|?4UeR4OxpwcDAcjA9 zpFa&w{1Cs2fT`qdo)YVHJ0y>GoV!fI$m0$)R+WQc%w58~X!p9?M;K103x$a6`w@5<7^3=+x zrADNB0P^S9mATKGkFz?ejD?bU)uYPD^u;UqN}FmgEV!e8EBI_e*nonM3(845qB@?L z?T}1AICgK|Hjo2Gzr!=OzghS#Y09YSOqB_BZ4zD%BLsBE|7}lt`-eS=QL8rSkPYL4 zkV2qCK0f+(zu>wukNvgqR)cch;3HRM>Azi-ERFN%cQZM^-AT;!@1hixih^eKIBXqu zb`oY#V?M7N!0BM1lh0{GoXusD-y;{Oi=&aN>S*K&TxKr;r-Q#oE>B`Ga^0R_vQiw{ zl$4TN_2>~9)_;xMC49niO^SkdH@4ttJ;xko{+FxL;&)X%lFNmsYc)0R;Lithy-aO7 z4Dq`NcMFP{2|M6E6VBs$qJ#CVeQYN#a@u4nLDl1DOo*OYN8)qsgs>x1CG>AorAk8B zB`iM^Hr}O`F0)D_2dA?C^jHnE@JkKzsyB~JJVrZNDJgHxxIpd+EtmA(OXdzY~anEl#C5Vu+E8MXT zHeo-9=*RgqRyfZu&u8o9CKS8II#*YWboZa&RxE1dd#uJ}q+`bCJnN?zUX~B&-FpJBZ^=_J*G>;aiwm2>w?mM;VTL|w z+6-TT`$vDn4ijJ1!I|UomK2$lD)R!(c52>t>TfS;`yu? z6P1sYIyr*0F+{GE-nsJ)OeQlUHU|P)!XcuQi3ym1`vzB3hI=2*^Qkd^{)o$*Fq!o6 zr)PfaDa)KuxVRJJYmq$iMTn;T3MVJ~6G}KBAh>GdG_n>B3BO=3CSHAsw0pl!W}L*9 zIq6SaDx87!^6;!B1q#a^9>Mt5UU=re<}G!gl>#lwGTCJy~|W zAqB@fW-iYQm`UMrBFnvH>Fb9*iOoM6zpBvJ#)|l@Kfis*F%$U}iv}`c%sK_-5~{$^ zD$^z!Q@{sMolnK5Y0xR(BCzI=S2D`9O%P>VB;MLbQM*+2u=gGZSFw zl15x8dKjO&JKq0wE8DSI>o=AT0pLDHG;Ovh)t^b!RWg{lw%n111~YzI=!ba+(Zn*k zI=W@CTm$Wn$%6o-l!O%5`^7i`iO4zt9dWE1miLFPOcW1B>?WR{opx|3VB)^27VrhU zM=0%sXb}fTm{#23EWF{3HF%W0|DBeO=p4oU89&8zv5tfl9IPZ&&c0zV<;&*kOffWN z7QFg|r`zP4eqP7J=~$4JYk*Csx2_}%&-ajaw_8oi$#+B2#z4axean zRa^6sQavJ2eDSnec_!opcz7UNj-g4-Lt6#$u{q9;l+V^Y_u@{%Q26rh>rZvbE4*nm z`j$%__qavqH8UIHxhWfKge%#Ty}iHT#*RP5o?sTU)7Omjb(H|zI1Eo7$z7_vr;Vl= zkmi7Xu?$z(yZgAXXZD8ng(&0r856o5Vu*eBDV6D5Dge*o(f2yVPH+6-mf&xARvKKb zUgVOrba9_EuhZ-3I~-+oT2e)!3e)5JT;4YGbASQKI{#b0NjVfwG#^ zoH%J)KE2vX6j^;!6=z_YtClD4>?(%5TS+E`k)J~RDu zt}d#*e~`nSY5_T%5Rk)X?6W2R06&rp?mPMr2O+N}@)$ls1Mp+}-{8mVGK4tF@kVbt zRQ^ZoqyD_&%(sZ*f;CFH$&!_y)dQjF3~r1;wV0U6+1l5L?9B?4_AtQHQC&XE6aaCZ z@0Ur?spqpAL!>9=rI8<)1r$2%LYoaYDl8>*GxGFzE3dBZ)BqmeN8DAl*F%``n}DFj z1v}>Y#J-u@muBz-h78ssJ$Y7(s-CHOJfCim6VsK@6SnLmG$d0rv_8L_?R48o-sB~Z zMAYc5W_iPpXMNsOoe+tdO8q*E<@v41SVBeHy1yUpJ+3lzQEY28BAu1|5ejkwUst!3;B#TY@I=2i6VxjCzR?4L zDQBru=AOD3@_<(>D^qW@La{S16%57C3@a??-t?4;Ii#+MnJTL?wS~B5+%Enpu)*dm z`IxHA=e*6BK-;2Rf-I-F9^ljwai|eXJVf@*&FKmCIpFeAof0ZG_4uzC5yAEAhHIZA z;>L{BYYGM@s;>;fQtKk5o=^In6o{50kh!+gwdSX7NCa+hr(kKrrxcVLU1vW$pZ?~E zq6M=KX1H@-v>eOPT;hM1YsAKg+;90hiysRatO}aH_;gzDCpjXAqt5K-c%BON^|8uo z3Aeqa-9%=q_r_u#Ckx76TXnVX>dghm_TE|GMZk>m(s&1?>1%NzY5HjWVn8&`W*lM6 zW>;G;@)h5`%?r~1MTs}e;-JiZc|DDo()>*iyEjl2?42_i;`8?6S-g{0qPRDvpVCrT zL#=ArdZ4!+Z_;r}xj!+<0JG{Lc_F4Gl_Q}fbvx}1aku~d`GxqfzIUdpva-dM2ZyFJ zZbKBWxwJZ=8Y=%G;K}unk6ts+8-gw6M$fG^bx;s~hi<=x+h_>7kSQrQK%B{3P)io?_oH= zYgh(~i!E0G*4dc-mkDGsD4HOxw{~h6hY3meVG6q@ngn`>C#;D(pSsuxPbH@u&nBM9nq)XMo+hDA9MSezqd`OhdEV%6j^h@|E~UEsGfV1vK$8){Bly#X zL6bp~stAjFFIz54o?+sq^Jal0kqOn($WAq#`~h*$RU{DPPA(K^HGahbr|p*9crLWa z*?r{5AnB&ndpE?KB>Fd1s|KJU+b(&Y`sfMJ{UQjryueF<;Tqj#@}XB(B(vkmM)xfy zpn?J)J2{;9=>q3G$riyz?Sa$X3JYy}1Ky``Fe|SKrn`-z675_;cMDHPk|9e7T2h~Q z%3$R8IlOsmdSUwt6*qzg^IjIo&&ky*obtv<2AZ}=g&2$}IvkPv9oPHoziJuCxbGos zEGiAI{VW+l?6{9sPaKHW4~I352xAFf_D#n)-q^SE>A`8#h&4@KtGX))H`dlC`F>x& zoG5HgCe_?RnjlUSTTD+x-yzgFt2aR{3)!mgJ}tGF)M!LF2G`MvMm|KH+Id%Rurfv3 zEax)&dLg#^e3+1F&*%R9QE&4m$mRGsx}{F8VQxkJ4~AU2GErN7JFZ_>57~8bl>H5R zPVPkhx}Ah8k_92(en@50jNid|h&FghK7@bwyrZWudoL>dB=?uQ#f+4A#A0V3pTi34;4Ph1_3k%wK$i3yiMcJbF;fHP=S4X~RIj%}RvYxxgB z_Ha31;L`tw)is&+H$@)#Fn0fd)qTQ(RUYu_Oaxl)ud7+wHj@A{WYK?-A$>3*P?XFCp%qG%{|gPd|4*nf z_SSjlMZvB$jbFez@}>U?HFllK52#`M)@F^S0Ro!SKtRLhh8NJR1Z(G&n_~`)qF)2&QzZ3=Yf*mZ_50 zzCJDf_vk3h=W6B60Ly$Be*?kABPDIlk*vbWYwFD11Vw%Bb-U7oJRqJN0~})K>}t1X z^i?|6JVW9MgqO9%t(o0g3Df5sttJ-X#A-tb?hx;R*3Xo03FgHY#ii%>r_wMjNRLxE znEjM;h>ggHR7u!}FW>gg22A85B`N6Oei}brO1BxT6iTy-yry?IaJ}kzd26bP-W7)~ z5T0?t2F$i$LDa(7hC_|^yLY*t-xMmV=&KB`X`GqH%w=L3?)&bIboUvqSuYmuT7N0I zd&5?X=*z0h#FL4^Fh&dS)5TcJ5er4uezL_A5oQjW=iNrtQZ-_b^iD|^a*9m{qS16V z`$;mLXA_^t?`=*qS*cC4yc7a70e(~SOw!tGC$GNR+gyn6rIS{;RuZ!>^ZuE5_odg@ zv^qa2I{NVB7S7gwci)CB=9`w6VxbVy({bj+{wJ>S4yaVJcrZ>CSa0$N784a+hNFL#IE+6R%zyiM1p`i_tdfdVBtU(r|T3f^Y}{h-_!9GHo{{eo1FU( z8`qnA6?)4*{EatO$FWV$c(Y>U3Ubqf{Ns3EeGi1q-sX(2yuEvCSRTzdvngGri<6%q zWjT-Y-R3@k>mhB=DZX6+NdkY#162UaBgLtjZ3$*j~b~cb{f3xFy8fD z%J3i?Zgmf%;VD}ZwBzKi>9EQPwzRF8J+qkUvv4yhu%&7J+S0nu*?Co4#wXJE^Lc|U zjoY%v6u+hYRAPMoXi{+kqe^UT&Y3ETH_ylc^NcAL0?accN9LJOIo;|-HnU{$j*VIa zsdGViDkL9sP^CU6HG`qZFD#^ujpqZ*I5I(mTVN7kA#ddWfrVs}{3V}hKgL2XhAAZj zE~LA;zcsHqIjFMe3zscM6JCZ!1=Ui-8u`FLW5vQLoZYaOb@g?lHOj0s}_adipW2aOdTc_w&Ze1N+SIpZ1w#+*uXd zhjEQOPea9C`$5~-k7R~GiE+sIZ5+;^j#@>e$ot<>2R6e4f)>jLoX-TjN@r?JUOu2v z=GzK>L*vO{mI1_zqYce*X~ECcnbT?kCu4BmEB;2AkHtiJer|5pC9Bj+9k5Cxo$77d z?-1@Ibht+7Z*+LW4erW}I=VKgTSP%c(;>w5G&TIn1{9r#T{knx**oVgSn=ra{K=#f zA@VKJdmPPG1RHiJT9UGzZurvIe!P7~?Vt9UJhx_e*PUawan-Pt%8 z6B;<3lK82JLcxNLR|xM#!`64mt7 zf-k@=nani5-sv)DeDQfh98{M5$WW$FgJ}9+QYVIN1PDMJsNerCE%pg|h{?nmA)kvO zltxtY8HCrudi)9e@(q8LmhwjJr(WIeo7t~E;ito((8WGzY97cw?*6|)^4}Rw8@->t z`a)Bh2TrPjX^P5uu-J>P`VvSgw~JrKC_N>KCljNlvVG`eSu28bqG7f%iWj479Bv2- z1T%kVJMEt!d)&M-?mVdPjzDVs8@K91vB?q;b4Watw>A4Wl3)E7l0V)f{yR=41%3*V zE9Y}Ql3xD8d6>9lc?;*FrCI>s`sMI@p2@V@(Hn)bt24co^z4*+emoi8W4?|xOihuU zVoMg%R&fNt)rh}x566E>ofalC#@Ct-cQTC4`mGl%h`^TAezD})7tQ2 zr(ePgLA#qjxSwuJ4#lPH3-)gXB3jq@@_vh*L=NJgecoEKNsRrSeBf!u+_LRmZDZdh z<+gtp*XjpQT*RQbT9J>!ckX-ydW^;GJdeqmsEH7r7Eufi!3fxk#%?ASDHh}1+9%{R zLrGj(*Iq2B0qaF0YM&~{3Oe;EUD?>>slM9-#d*H3-Va2=cLKzvDDr8fDLti&u;(hh zm{zNJjZ6H*-vTm!{2so*GCd-yx2)8_C-K=~(QOT<6;;7XSMAW)qvV4#dmL;#7KvwU zUzcFVZNrp84Zd&Cg^JV7#M(9!VFuhgvp;_Bz!w;$WBk$br73;Xx)%1he+P`$94;0# zMAlElpZnIWrUWsXph|(q{XAzxb@j8JY4BqtiEOjmalR;kNEQbbhHqY@*uRj*FlVR` zs;N+atG{Nx$%tZKtkA;@^W{V7$G`GL=DMc{=SsDJZ5DE;Rwu6(^)rF>kh49wq6sN} zq=-weKEBG{2JkaP;>8zNac;CY`(#`e1#QZLD;Z@Ne~n0s@2ww{fmM69$%RhKi>FADL7bp!wUiRQ1Vw#0i|HM?t>$!}Ekm z_M+p`_H0XpIssz@#lyB8nU20xOexX};we%F0*|r~fp;qh9_}nje+Q!ENz*IeMgcEN@HT ziC@EBeq*lSxMq-CAMogm%I~!$9T~1mtUhQ=EMpUYxJg~^jG1du#+eu&rHqbtWfp#uF-#z4 zbl6rpiWzsnXd(5!Z*PA=DMzY9k59!A*k#JHM?5^Qw;6qA$Jr*s&&m)kmR5uy^D?^L zQ;8D;BP-561L$wx@+lhbz}%LWGT)_c#Y%Ve&!*E^t})1~ zXnGB8jr|xK8OWVfA+9%R*>)Lz*_R-AsY7Y4JdV*ustEOwa3qz5)&w)4*O~b->!_jq zt~U)(Z+X&3fquRT`B9+%&wge^>nRhdfK~tDfJ>CRCG=UQSeD>6DxU|vB~bJ*Q{3Bi zDg9Hm4O|I)uz-yBYB_9mSaoUYJ9jBcWvvt|k4!oz^evb8mGsx$KRq)U-{2>alm3Yn zCIy2oQ>HRbpxh7>2AoKd63p;oo97x}^_Sy)pjV9o0LXd4@OlY0-oYzNu<*NZjRCv5 zR(We(Yx50vb9Q>Xr_f;pGXj%8a~B^ls{fCs2Ea7vGedcZ&3Bf)1~&=;L;Mu*rx73_ zGbUgklc_)8uj4ctxQZp=x`@|aM^?r=c&DY|>@hn^H5l#8T=bGfL_=c>VJZJ6A#>EL z2^k_iTz1p2|Jy`1iOZqAd2F!?jd;n-Nxb#CnPhFj&$Bya*A@>E7ubH#FnRE+rO^zc z*k(({^0U!DWu1xrZM?56yhV=`?w& za2j8`$W>)(sgbQVrkGJKbTlp6b|fPPv?A8oajxl}GJbV?2=vG0imI>*YT~es74WVC z8Nyw+R~nlC38-d3r1;eBA>K73{P)PH4riG>sC`|_?H{VF!EuXho`zz)B0L#jA4o5>H=xIPw4y~!F_z!{hjmW(& zkbDfso4QG+;hh+G87QzPBYenz95uFHLmSZ8)Ej{lgSjf{elONvhO8;4z2a<6iG3^m zWlr(qME@#y-Esu#X91vozGF~-YUss83Ze;@W(T#4iGmoSSec;HZ#V;|2W|uBHIm@= zfWxocquVH9?}wANWANhSFW*cR?6(gTJSd-B3lJf-JiK&M5@MWY{-O1p`-C}x$2o3| z2mMuq#u%g;y>;+#-st@R{P4()BfXF53dyniJv`3fMc1Y{Pg9(6Dz1=)CgbM=KtWYF z5pKW~6?&J9i@UDbemtJ2KO^Axn8isX7_zrDn}gnJKN0-^o;c%*n2@ z3|Cmi?hTLPHP@aXSlsd$*X*~NRIUw_ct)S1p_p8aiV^o)d;N`iEI#-|Jb0X@kj*Um zwTc2ZwTbxJ=y(6mrOXe>OlWYll;M3&WmfS-k3F`g^Y5zS3MRcI@ostjMSj6M6Lb^S z5g#{#vGJOj$46#esd8J~Pw^&^Tb!GOI<%qe1puKQk~C{(|-AzUcvW zYc)X5dFtgLSsC{VdGCMuoO1t{&k6WuQsF1Z>*x~(H}iyDts5!}Wf+HukzSnj^rfNB zB#=ir6+YjNOld5C4UOB(?-I}ATnzs}3JHw^H3hhr(;ZT&w~X*m63Ra($KP^BH)oYLGl(aE@47XPWC zRD(0WRcX&1{X)@*hn}M8kN0K!ixq{<3w&3X^%EdzXXe5A@Wo6azNUcV zvdPp7yZBUbsYA5-{%=(pcX_k(mt$4h>@QW?W=+CQ4HwR1vg=h>Ii@sr=?dXZNarmR z)LB)6`RBycX!JLnAacU2oF#z4F;4%k_l=VQ8_iz{!0MnwjJ2v0k*4t{xiYA}F8@** zm%<5UOSQ)7G~5~AhNHG@af)o!DwYg_y*wO-gCEOJ3`Dq%Ha!=kZNWO{%iOHWFjRvg zXV+R_su0IlB)#c(F3s6N)2i2eplGh)!#B2Ua|iD1Z!{u}+eg2tDJb6&Fx z61H;Yr*Gyg{?y~!oZ1g-DY{nnbg?Phqet!iLs{xijXDXRre0sR(0Z{( zVz5fl4Wn_p3YA=asQ?$TV)FC8^_dV@u2OhncKo_n_RYl_(E$j#Md=MS=Gg3?sWGf) z*NZx9Nn_ALm(z>0^44G+q_*bI;%fERU=)2gQM#bc1Y4-yW0cBwn^@QNIT*Ja=d-P1 zLqd$s8-yB}rF&}8yZ(<3rq|${FCvrD*Rz<(G2_9`A-3xM`+~iX$3{l}hW9r+7CXM! zAPZN+j0brdn@?s}l1sNdjIEFVH}{SrV5f##jmp5lBDz%3VJMd|0LsF4gWVnM#6GS0 z=ek6>cqLYFESigQP7A%CIJh{smyL$D8sq`0@9;m9S zRm6yjM7t^tm8v+KjfYiHPgkF2@WCmBe5Ol27gSUf&zzvCJ=lWm^0|+Lr7wx@^yXGA zy2w)nLizQc-1dI_=3!5L``7JuLk{a|cooRAt7Lu~m4&*k#a%J*kJ ziB+x5Sk$4pdBrQ@q^Z+ezu=jz7DkGVq0$%p`%e-X2b>N>=!V*LgNq#3BcG?lr z5!=%TxjhBrZtPvucF}vO)81ln;l|tZg7Bq7&d}l>`lT9n)D}&gcJToDK+cJcsb^0W z2`J*2i$9&svUi96@HS`?TV;)Qz6K7l0$@V9d^(@2*O(72+gtRf!w7LnieGuw06g;K zA}{vYmf@(j5>CIx0e7~g@pf)%Z=ON2qUY4v!Wn7J&=>FW!99>PyYWl7m}b$E2YOZ# zF4^?=D%oz1ROB6#xEM9}yvBnmkUy=cPBpq~nhtYBvYG~(Y|bRPYj4}TDz|UT=*~T= zz-rF&Cfy8^s8IRNz4c>cqa@|<1cozcZC@bE%C1n>gzBkTNcj_qXYn4`HBAV^WDo5U z{ZMK;&N#We(sy+9FHn%!FPL}@Ggc;;*HhH_h{W~um>hXA*lVSH1cfU|90VrF9_p4U ztL$pZp%p&8!Q{6qY%^v=VMdcZyVTmyausgRT0#ow8IAP26kJ?J@@r#P6LyP_P~uOS zh>^_PLl6`5w45{lgTwX1eID<>03h+ae{#6~@?R+a+kX-4EOTK=B9ci>bwGPj?nE@4 zjyA%Jfw@>#NmbCLw0(%_h!ga5W_B+150JPTGtQ`Gk7ogJf`nh`ar_sDE7Ntthk5~h zqHrKTsjV=G)Vt82RLWk!NqySkPBhGoKLNc0XsvMR4o1XRgPAL!KY45x)z@H>q# zgk727sMDZpcDOsie5AgZOe6ylM5r@q2M!{2raY0hqcvPXZsJ61+upe{#x2@xL*fC5 zF|ofex0D23zgny#dy5RW$T2VIO@p*JYX7o*W|w8rol0sOj)zfN4!7D?A_Qrlo5i_VBagehb?IS3Z%zm-I{holr z?iE?07vXOy=z47PsYQc}S?GtC909KXv%Gu6?k%CoztG3hgZiqdEw8&x+Y-@{+i6w$ zZ?SDBSp6B}!$%k|j550B8qtm8K3WwR;<-VIme`~?dx&$BxY9#=6+YWm!T2OXKcr^* zOGizrA(V~EcY}q(bpvZCe5XE<6SEyO>Tb_GT zAGu~0^@=Io+?@oeuC}y7P9)kd^c7WInp~r`+*>^^wkmwFN!tN(f5NvOMyBL=iuccg zTm$x%rzO?M9zXgH^c=As1(d>7yjPw%kCjULFq$K7V^%ks!f~G$*X|-Jl>r2K<}%4H z-3vAp&Zp<%a=$}__O4a_T~T$xbk$d96cwddYCqe%0^5v%R!*)>9IAI;bgJ6CnWn%6@!i1dy&PSxy{{IlX zq-xS;q2M|8%@EEK$?&@giaH!aqUuQ#FMQ?DXmO5J>Wa$_!f+wMkYa9iZ~d100_ zmh_2%7Nr%isFq0k*-;`ce92w#m7sKE#>Gsg`&H>qk=tMvveX|v>1<+nEAfR>Y?>6< zW`x&*KVgQ_t^Uh4W7NRRfwg&)X>>bT*Qkp-gYqDP=Ix63a@F)KWHa0LL)j6oRf2JI zVnO4Tdr|b^%5J&IvqNq^+cv#1l9kQ;i<}|G{Z87V67ijFWcu4hUx-$S(^M(ci8Hef zZ}#rPm(GppSVZFKFH zoGRXjc}<1qwYX(AuDQ*Hp4ly>YQZyFv-wOE<-}sNl^iuAzZ>qjptL-!z#AZo{o5GZ zASWroVHF!!N|o~wH^v4w*EBgXYheK|oVq;PgXU$ciFmN1d2FV2Puf-CuwV3Ji1U=u zrNwYrn$q;ez}dV;XzrK}Vek?DSaawSvj8BvyP7}ysz&oJ4$TpB{e&5h4`XcHwcAIu zyH7UiO*+BQcE$Cd-H;&{TiLF`mHY(6RSd-oPu&chmFCb#Zt7r_z*v#l=L-?`Yc16e zFs{Iek#l6kz|-zX9qqn;cxiiuY_%D_bUX&CV&;P&CeX>sY*JEkCH<4Yh=KiW#Heiw z-p=r5M#J-DsKyL_M3)}nkN+G4vx-#Op+|UD1%PLzbyEazaqk78wXW2->Ty{sqs-H< zCVi-vm<7NT$c2a9jTI4JtHbsO&lBgbXZuhVGua~Dv+sI1AATSVIW(ap&TJ(b5Wv?J z#E817_!1?kt1q`m#aU^@m=xkHnVU~%OPub)4UlSF!p59IStU^ZDSkJ?x(zKs#>OgPug zXEZ&=$o_{Qm=)8V3QfO#ByxH`KWkQ}(JwQ$b{}ID?5Q&OruyOL55B@HypHSw(P!w$ z6xp2!xY{6ROZp>&f;L7pS~>-TMNFPQXen0`#JQE{GJpeMkJU9qg#P39USLb>QfsD> z&=hDnmv7I;E&%y(xuKw*`>lj?kDB-OmJrCzX-OvgO)p*EuEq8%1geh&#AXvnc;Cch>K*Dz^}yxuHOOGY{M@K2 z@niR1E+xL}9dYYq*_`!Hz6^31KR)pFVyLu@K@Sg=nhw&}p5MPP#ZL|`312LF|NWzO zpxE#wMgrp7nrbgS9r>SIdn#;vs|j}~3v8T8K>9P>Vl{rj-{++b}lLF zvh259smfP%)5omw#w5JWsi;4#G?59|;2*Y*n!Yb+76W%D>MwcNrmo-;D}40wsfoF- z{oJowI8r(7C;F!YM>m1hUYM^lFN{B$L5%(CJxUW-;}*vkj||B$EkVv}RAURwv}Hlc z#V_)hOdb3>H2h(8%r7%qJb!A|Q1~#SaV~%_p&XfZ&&PvRhSR&OTf#NVo3IkAlJsV^ zw%}v@xK#P8VYcRGakhbj`g^b*PHyR?yRH6SF;BCQd<{AWn}%=Db3r9lLu2T*)adO2 zm75KToC6SBtCZvs1U8N!o8~MsO^{f;=`k*8vf36Yk$l_3Mfy7_`N#;X$IMAfLO1Y_ z-h5us)|PuwP(h34>aL%I$24fbCRy+p?ONLv14;GJ*>5NLp5Xh{A&+~1(7RF7^hqn` zRJVu7=3I^**YUWxIAx)s=+eAg2Ee2X3oB-WU3&fL6

nIg?JoE0pHHyEV$Owh&P z3MN=_k}#`1+BHcX1@Bp|UEXyZm|$_REDc?&GIuqxwFkptA zTy<#3OH@a~;iG^!zO;JCPNNTt6BcDNQt-`6;U|RSQF|5Mh~e2KR=L37JmMoI3ABSf zKs!i+*A8A3)pNmX2XmWSdYImy`f+=yAC2dV*HXj%8bu2hLO(ycd{rl;HXxfU-kskP zLh3dxRwbM{yzoUe)-#fh(|SMk7g*euWC_jRhu{TZ@$O?A#+6HwkHUN1q@={MBCF!n z4LuC@Xw?IXQvcA*Xrp>Q7Xs@bL}rR>A6N$$bj}XHY7AjCZlimWGR?MtT0*7%(hlaf zr7rz1?I5BOwOVCtY|k7Aw~hFrNLeUY*jjtzsTdm(#q0{eA6EnX@v_c8as6k0A;ney zMvBAMm&{5G6&JUDgct=flVL>zmSNopheM|?f#<0bNe;OA=8@jgV4`49M(t&u3qko zbi5b&j6nAd^S4D6ZVxe$U*17AIzxeUaeh~{{hUsbyL?=}ijjwCNrEU()-4cbG5P>1}W?4YHMRdPlcB_fl-j|mv=CX0vFdTQo~UG z<;$0WwEm8$_alvctZXbEHZEH%9&{@YJtZr#PvNnPOTTA9*h|mgy6~lanfajq{{&=~ z-vs2#p}exGGHic3oJz6$w}$q`vx-GajTYXPjn9eP+7c&-eIe{a1(oIxni?hzbS5_Y zRx(i(al+)qKs;exmbbvbzG99g??HOnqM|b!fi|38C-4j*CCNwauAkQZx`!y zR9k;R`_EV<-sl%5m*b^rKLpVJp6z>lE(L5KXEryds~;x`#XpS!Sq3o8cw7f|G>7rA z+MB`FNsZB!MumtP)6xLXyN=V922={=aszw@$-xSZroNHEVd+Nq0i<JJl1Wbh&btn6IaWcF+NMKN+@PNATgu$akPiaQ#iyW43%ND;zYCG2)O z$vC4You}q;m$knvdGLO{gZ#jYkpT^9rjDsKoRSS^FE3xjY_5_*d-}_#XBZumV#0T) z@<1l2H_q!t=9OZqnsD}YmaWE!7SMd_fnQ8`*}Uq8_gQ2k;b$3pdn zwg&eYSk6P(rdLiY!y&R{*NgOXGOvu<5*^9WYVUgth4j3DXrU26-m&us!P2N?_*H@`(PSW2h$+y|1}L>fQup%@zdZ(%%;r$ zmLOeKZn7thnq_tIXSX<&-?}J*^rc~5(F1#5>M$v+nQwERx+pO=;Rm# z>aLlLrqX#rMu$Qo5u4R}<5uh?<&h~kk0y!qU>>0q|7%;&*(C~2G)p0T^x;ntf3sYPNNn1j{3V|m z8+`RDG*$S8LlJ{T>^-8te1uv20Wrt&nIA64+gC_&SonKNDW8D;J&oC;2obR<_F)B zDNF||9Xa(Q4dFXwa7PaI#^$f>i=rU|UV;zdn^QV67GfjDTJbP{dG>fGYxiDiF0r=Z zaqdUln#p&L^cXwpza+W~c{yX)9p8P|Px>P)7Z~nse8z|H5$TJcOE_>IQ{&7< z&p;TEV>BWOwjg*p#`tTnc$t?3A_ij|X!2|P|Yqvf#?u66{*d;HA(m>Q#Se z7D3178$U5Y_EtJ!iC;FRY0vew&6BUWHfuIjG10P!$2Cnq$N4n|>;zSyoNi_8wLQI2 z0ZwQd+FFZYG~cQcS9*t2!m!5zOxgtDLt$BRD1zwYv5j0oUAi-L^RndqV3&`rKS-aL z$D0fFFySPd_T&nORf~ip4OdBMxIQ#bFDeCfmnJo$4zCx43oXso>LV-$zXG~A*%|U4 zVy0R>G%k=OXj%BSV~*|5r#GG!GUe_jEy>QFd$iCsu2weKoX9(ru{+4u@j(|T5!4o->%@tj6!LWsDU#bWzI?NL%Up5+E@BwL~uGKtN z{r*O`TeD?t@Rlw8Xo~jm+=tAT5`lub*Dtw)gJs4b?kqM4hx)2#(oDm*fYuWVw4S;S z1UyY)*5?#6@%BOR7{elUtLmO62QSr}Rf3~#HTB-+*m8&T2@HSG7Rwo6#Lytw#IXok zdsm(4_Ku312qQo4SRs>{lO8G0M+H0BSOqeXjL+REt6X~!qR2xwY*c=LO%7f#<3WC8 z^vob>L60O<%cGk;G<_)es`Magj?SNk4N^PwiXBAyq~(B8`jAC!L8ranAr=IKKb|f& zI4yidw&OdNWRvdrhvltGa2b-Vw~BizSEpH9?`aNqhS2ksv8rZt;s;_zzY#y}nyYXh zeGEG5tKk?$$*pPc?IU}W7D^jmKe+UgQgDXl@@M^=1(Gu5#)_KH&(YCes$8Q_1=GOfhWmNj3hpUOb~aK!r|lmND`}rq z`da@XlkVb9|E|kT!r7NHd}^Eo8v}S&e?Hyl@LiFT2zy$AU)DkHHA-CHe1ph?#|stN z(A@KImR7Sj#0Q_=f?@&!>SLQ{mFA78ziggwY!yaw`*gsisArhkSNmR>IC-tX%}1Xq z`ipm~GNWunq~Sp43G_|rwbU|5wNvoyMrqdSFqQCoZ|~gC3mM5g_BYYs{Y_TD-vnEw zQj2)HQR02)8|erLEwns2^59720R-))KKH`R1wYa6=Ub0Q!TC_h!L|*>CJrE={?v7Z z>(@NO^$*}jL69*$t6Kd6_h{5%mPGVA#YMsHOv(L&*RQ#6G?_&AeJKK}*Hp#jS<0*+ zS2oHLZ$o76_Yb2d@83qxaPKFLc5);v9lz~O-}1JuJ@Xj<|7mafW7V<^lqSXU2jt{- zBb?Aq1!vCFwAQnvnyF1DF|!as^)^U>D|ZG4T)8A6?~MO+<P885e+zZ%=cEEABTR~^w&ui6pgr{u)R+U)%pG+c zP@_Eqp}Xi(?^5rGK@N_z4$V6NxtwWrp=}n5X^UB(nZO3eA8_BSPh`OQBXTX>ef*iZ zQ2tX;&r?J3h6(9H7GUTpR=g2AED?pXLcO9+qqJAkGIgRJn)pP!0O>5 zR+sJ;S1PBKSj;?0F{XRLx^sBm=iq5Vtc|)7ei%$p=>E&-ITeeFQx^3={6Cc4cRba9 zANYS#R7hmc3Q1P7cO`@nvR9&vVU;&x3MQs60V|@t+_X> zhXRy3Mb$}P$#i)=s{Bd7HtEsxb%(Bps$gmR1V_ctnmOgk@~_kt zWsPH7m-1{=X)_0KrykBsjfZ-fZ`cz_6d`8CLWE5mXW|09GW8W6+Ozx^%nK(WLoq!t zTDn2=k?W;2k3iD|mqyiRmz`l4QGqS-@$YxMzO>a8zdH6B`+Zns+QQl9k?}?z4Rwxa zj6-}qYV-p_e;r)G{ZKmJWoja!-P{2+{GMCEYC;XCEh|k4Sy~@_jT6H@%e9du2f_{0 zzlEEa-XPy|oM?yQTxDh_-W|c1i`TCa&VtuGnc7Tgkx;^1n|MiMAzM1~n4}2pMSU}J zpip(O(Jnpl2)$i8=+c!)8@aMW$&-`7q9XWFM%HoT#A6;6`#LI|9MQKc+*(a-)T`Xe zONB74W#5pcG21=+;&A)fQ}OM4k7{gqIJ@gm<7tr+-Z@UjXVUy`Y+ove>dcN6L^3F# zc=jFnTGHj~u2yxcPESCZ5*%Ajt{1t~IOnj(?MqwJsCx%}){zUDJm0^i=4MpKI4WiR z=@}~g-q}p%2y#A-SsWl zEo4y|(u3<~ZOtgG(6mW$)gr~i7tJOoC66ss63nt6{~8m^<%aa}-rhJUgt}8bHm(f3 z$ElV7BCYDFR==Qqo%cG=qPL;xBa&u~;Pz%&#-U9Q-HEmgZW{(a4rrRiW64(8t>fLHGePsKCiV&w7)AM z=Zg2dL%ALVq!`Y%+hpRd2N~Cu$)A6+%-rFp@p%yZGYbc`N@lh0MqI8%#_13cYO^>h zo4wSfE73QaSZrGH&K@#FmLz+sPH58scVlza1e^RYh#qY92 zJAvovm$_|%Zr-bVDalWPd{an03wiRrtgmeC+seUOT$MY@w}nr&RX1*9a)iGBVR zRr+J0Q=xJWSZ|w|tlKAQne*;mQ?rH|V5|blAf)1(GTiKOu6I`z;h_8u-aLR z!=A*cm#XYIlm${I$ii8-zf`qf&-9huR8VMB*V}d77^KnFvCxW@l+N$mjxwE3+^HLR zx>B^ogA>DS=Vf|8O#4>iS7{Soyh}cQeb<5b)Wk4{{cQP^vnu*K%C4S#aO)I%1ZT?E zYcFmSUzc`=^%7!hni8!1%2*_qRYUA=&U|2A9h8j?LJzmFG8JRovIJh1hN|h^sVufW z=yjs1W{}TQlmK~*gX`G|F>9NuXdGESw`NnWcIjapBMX@3CYplyq0fyA2y4zHI3AkOO=E zv3(g1zHQ6v`QGnkpTEPxQEEcE!&$X`s}^NpA6YLC-Z*{ZBPuTH5O4NkoOH1OPA!+* zS7jqb;0*f8@YZ(JbKx|i+fEUwU(lw$De{GY{#dI0?5fJbjA`P`Yvy>-xEq~n@1x{} zSgO|Oq?FQ*!Jyj1(v*3sj!tPF?ixtu^XH_mUa1Z9`A$WwEFmG12gi0beZWb+?=N)u zXkPd7oJc!HVkiAb{~uFB6cE$K4E~m(oPE6vjMnN8vc&>?czhpvPxuQ|F zmsIFW|2Jpz=PoHRoR1Fq06b_}n$NCkinI6n(`u-0S_G*40@EJ+0@D=BJh=4YV{1kn zk1$T!@-Yj#JD4tOQ<)&+lnL60PrjAFk8iEtJGhLU^C-|xy_?#p7&Bi!O{m9kACuj(7 z%{g3c#&7bi26dE@B_J^FZL-WmtE+m7Nb{20?@o65ub-71@`OxM$Im#t&KdtE=>-{j zHVFT8>g${4;&6A1^C#GU5)3D3YR*T;PA!=j9LmjI)Uhl5J0hMFDq~^~i{M{{@ZLWk z58nGXx4ZOwd#*z$fP~~hm=zj47{%R5Y)oi-$Dzy!+A%jdnEgD~jp|7;h``d`po+aa zqdK(}!{o8QRC7LzY;YzPFaEo90oADP0&*wy?9{kTWnBSbD?HOyyT zuDX92tu5gQNmi|qSU^k`fSQ2P^u!}o2#o1^@%v=+d!X~6$?*bj)GD{LsUY$_kWIbl z{`OnN{b_+~l=~e6PX-n)Z-_804AuLyb>h%Ch(2xv0_?SHNh zN9R3L8AlLLzCZq~l1-%>Yc`vhdIo6!x=55k5!Zha&Dmb00nt1Q@>?{A;6?M-zeRHm zK&F`j(cE6~P&99DvIsCxJQpFjneTAb)AT1n{IqkMh|}4lq*CmXf#F`~L|pkV?B9f_ z-3bzXGY>$5B?A8<%^6E`_`(SFR&lE4ju>{e!GNT5qY54{VJh#Tm#ImQmC$pMkHuxK zw1>Gyp6W&oR`+chv50Bd#D>?^UJ3Q{m_GgHa+{#N)bE>SG@JhAxXwk+?+t;9c)(fw8+GJQ0#h3W#r`LVF8CyVHn_Flbr!;H zIIV5BYRytQ_jk#Fu}N~bAIbu=))j5Cb}YIR{VS_PLkEn_Xb&;{0gedqIIlOIl;;@; zFq0L~Q?nGLHYtPyE@R333}vK&oLmlhn}q^_^%v0dk)dVWP=!oG+vf+02C0 zoyTw9&OFnZv)Fm_>Y8##2TaYq&4)I1W-u`NVYWQ^%JsKJa>2cI=c4eodBO60#n%0% z{)B>4Lr%u|9g36lK>P2Uay?*YYeLXO#7-Oak}EMYarsUH+uWN+Y{oItQCeh{X+mDZ zOk&M0g*b?*bkhJYm_c636e=%yvKik*uFGQ$-D|pJh|2=pxBl-}NC85iz1Xz9e2*;l+128eI^GeYv1ZFLQms>=)OL zX@$4O)w~6bGG1U~B`d)Sl1c+y8?W)QIic=qtulT#?hGm-LrW#Y(Z~fcB7z#QSWJl z_x^n@*qUBeHA);4Vr&WteTlxxox+QKzXzUmmi}OgBP7rCviL%*W{O3i;A9X=qi|C7 zkWS$j>{kGVO$5_+Jd0JCopF0@As6H_IBb75W9sCMS7{a>zDlr%vDPV1-^(mKiYoPI zE?tRP?3)h<%f^q%#X3%V0CO+3qQ%-&!-*Q)59rE`ELb|E#v|WQU4^7#-7&|p8tnpb zqc?ZjMrQ6}r3FdkvRo(64Ac_HvYLT6TW`@-Cq>pz%-?PL-BhZl^YCx376{#95DC9B z`jbF4RXvL0gEBpL?JK%4m(zgS>@72qdz3k<=993;mNX-NOv2~>hm(WawMFT}Epy;i znF_vnd%GQEy~t03@PyfRNw?Z}jMgG29W=d!c%S*T`zY9YfHaC&LQe2GQ=m7eTY_y> zLym`|0lF?I@?CBGoeC2PPJa80>-mbFVD(_5msZMvNVW`1%H$g~v}Ry~NW za2)tSw-cjdxRJ-|1y$zZF&ZD7GTFBQN915L>PHwT?N0*hjiBhW;i4csmNVk9uM2js zIatRoNT`(jg^0VPRHV^i`$Um;7G)+_7)pQ`LS;B%U40__#q#OQl6I7<(Xu+L6j@Qgqx)wfAJa(?sd z;R;eCl8kO{*E40oluZ`oD1I>3u;483u6e2VkYo0MXn3-$_QWB%$p=vx7XC$U4*iSV zOa&uSE0AV88s3(ZWi$~49NLoqaA+0FFP<9wzsh4Sy`VhylYphQNbPre48&sU@v)ek z0e;4-8%gC?Pgomy#2v+A{xmVd@lA|>Vln36Z6Zfn*idBp7n^D?^}?fAOgq7!1qAT_ z|6>6GZ}*u|j~QurTlQrN9ygmKnq@&jbSww_}*v<4+s3w&qQ zgFl{ohL7(ALJS;0l`kAr`6AA^yKITb9V*SuqY+uM8DKhgeT( z#z9oF9v#!|95e!93B)KWRA1CoJqw&N5!P9sGvf?cqgj>Q0GO=D%<7>u_5}yh!PLh+B zk){!^x1Q|2l!h#e=P6qm+qg4d&+M_U(_ed`5bM)4-c7#R5%uJpl=>h&SA}{kh2H_E z36{sGKJNT$V`Ig8K}1p-GzDmQTQzOajG9~fU8H$+b#2Tp72*=-sHBfXz8QI~X4+zk z@PL2_>>9aZ)2v3^_}HhK4Bk(b9IO;fL9*EuC9X_f0wxq$T~5(0^VASUZuP9h(0N;T z^_@W(K1juaeHf`DgRyVZA>3R&al@nHGJB74-nbr7F8lfYbA|^}7}(ZM2>WoEl=Hc# z>59CShN(^U7txdPvtI<}k$e%Uq*3Mh@9rMM!_DwkIMrhHTA9q`Td>)x!Ed&#vah&A zhiM@zmOSk{!+8ES&A<0|J!o&~4LRr0dR}PvM*2&|cLdCY+Barlrj7v#j)7rXy;hGH zGGbrN1%gr8A~;L(9;B5()QSx@J~nB+cOu|L7Zq4WP6s`q=2x}gija-Xf_n@%?XaCG z6b|L%r+2)d^)LxPDcOSwhy6+(QgxL~PJ`AbFsh0wP|D!(9tKHQcmmUjEP-)mz|rSn#dLKZuyly%a_HrlfC<pQA zOH>m=Bjd(RMMK|oo}6P3d!^i}k5xh;$UJ=Y2l!oOu1v0)o?`|Vyh%=xS=PJ1&gO=; zWgaD)<+wy^x^U``XN^F=$n{1$@!L(A9&&wUXh*C@wtp$KcK>6=F=_V++Fq! z$6z;5M)b1mi`DNzLgx1R?}W^mlLyR)=}L`R8KWj4Y@L9M{h4O9l575RV-30QoRc2Q z1l*yvpf69}_sRYetP3+NG(T!r;;nzUd%B^6HB=4zEFYWQGYT1FXS{J%p~Xw_gpdvv zF0$jdQY+j+b;F_R4nO^zmE21aU(|3IR19V?dMP|x-m>^Q<#S)kcEj$_7FN*XdxY=t zeG#p*sWZ9@as94xiXPkoC!JttOVw847UAOgNs#(F%b-Vu8?==Q;g4e9JzD2u-Tsx4 zxiKJ|3NkV@AS1)H9L>>lPF(7qguYV zd0Toc@09>ia17B_IXt1m(g!!kEZEgCu7yx;VPHEP(jE0q@5`i?jG0}0n*E={iob_Zm$8pji z1DE(CJgY$n&LuA^WJ?6hjwkK7ez!$$x1-{1E3H z6Lk?2Uc^L}_FReCPl=`7a0nZYnxN3f*qV*%H#^#V4cxf*m>}zT2KBhZzE94INWQd! zN=Wj(42ZJ`9b^=vCcHYV#{06?aaPUU5WN=fnAa}d)YdP4yq~E4dOq>jUXCQougQ5h z{i=GjNNQkemywt22?AqQ#T&RAFg75velFYR5#Q_>4}$`1K{*R~Wg#HBgq> zlbH;)xCDRDPwDwN?-lnGJrZW~n`b0;6`#K27|7y5Aj~f2NVK`+ea4?ob`1j(jfXY7 zq!!)X;kr6ldk~jVMweG*=(G3Q`-<*fzpg`nnS_L)WA=PXGl6p)P8OT!G~NB+;C7tw z;mxl^BY0GTrE9BaKuQzkF1j<`J7;E`RJbB*xu+}8OhNt4QzJ}-CmeF8e4uo{;M9ey zYV?-;w+WIW-rzeKdEjpAuuGQU^0+TRG;>PqB_osb(7`%hK_de|&eBY=NHno*W(65kRUx z?Rc8x8!E2GM97NnJ;+fOZyWs;>?>U2k^;vQ8xXR@-)&vOMq?Cx>E#{x$qYaz<2X?o z4PQ>gR^HM6i!-6;|Jr{Ig9H=UeAr1Ew$Eh7yb^O^^0p zdwml8x*6V{_4P)+x@3G3SKh~3fh@9SMU~fn&uYOg4^ENo#R0GCQ5N~>MXA6aYu6_d zdVa+$ht}`?mzd=+nk!hE+i{x3N_kkA2Lu67-+Rj9zFs{zs*@!j)yY0Iv$74kGKH&x zOa}he_vm`7z(LSw6@P>mW;evAEKw7ymdW@qvVjZu_y?p*>ZL2uI}z!_oWT~AXAF+} z-3Nb}*jaxROdWDm1Yq^k4UY#!fCG-j|5XGqD#U92E?I)Z3BF{hKTLqWN|5(F%z_qK zzx~4v-wd}cvp8yoAD-Z=50iaA3I1v@g_{TKJbtsQpa8?^R}R!tTFi_bhny%m=Er~P z_|f9B9xg2hm$wrR7iHpzI2&NW=J9MO4-q0Q8EH^iPaz#D<&zy(bM$hteA~2e zbopD)ic?E%Oejk0tioaXQ&2g!JAM?)=E5Du&ghZ5a4Svj<#lv~<92-6plcwrjkS zAx~Na|7wqq%=0~yYf~#%s~(o!JMDKa>AsUD&KRSf2wxU5S&YlGjySshjg3iq5SNV5 zel)KrQlOIVT+srvM1n^}^);J@7tO%={Sqcj7k_^LKn;o+B-eSe(eB~dh#yHf`K+#M zU9>?gC2hMMEyE_Kwh0KNENEV1tXfhihB7N^`dmm!Ndp43lr4g9MV+mAV#FZrv{@9| zRNWTtyf3j#yP#fXBCioRA;5pjmhqvOWdr@Qo<`*7D9>nPgT$c0O+-6IDuRvuV_W{x zy_h7OB)h17(q!8ot3Lz~1+umnmL}sRwTowcjF~;>hU{&z?=rj%GQ$X~o;WQ>8|ZA` zlM7&SljH7o+#0RzS%15H_dtZ$V#cjjy=6o8Tf0UqZSkR^yvg3*vF%;l1#rmc} zWe{jtpd;_%8I!I@#h<=005AyX$cmCaR-!&knjOh~7jU(vrMF&!V?L#ftzc zQCx@S&wx)rG&7nna1$Xu{Uo?9IQqVx&Eui~jmHPgzG)1_w!FflVa={9L7{W^8E${% zNN#2Z`u~>6Kr$Rp21(W>O9RM65hmRpr$ z9s3r&+~BhrSlOV^jxd$n$v{;E@)yx&Z54-cc`Y3v!_KtuHp z4-0KE5DJEfrO%!9rdtoP-pjMz-f9zUkjTLSOh7Eal;Ge>&^_gh?=%-fPYCs?I-Gyq zF3xttumW+0cM~3%;Pb%=*6!-`_zm9Xnj*?#p6t1%>ACB&-*Hb@6vnL+R0H9<1Q&C+ z+|^ml_!b+5xHW}dzK&+ZGTj>xVahhqldHV5AQ!yaP~=cx5pZ2x#kYsjp zS6tg!)o7|`MnA=@W~F4f3MW`J;SKdz!4XSx;A6`&O-_ zu(%5pm|b~=dc0iQ%j`@SWeJc6^!nw=+>#$Crnv44whs)lg-jA6ae@}MuWf;b_ZgUz zhis4~7P^7Eij+2@3#BGa!*o34Aoy4m(b;|>kUDnSLVUf4U|mx+d2}i$8}U_K(nB&P z?l(sc69HoKPXfOJFmT>!AmEBtuXqY)(9;3gkZ$(>bc6b8N%$*ryHO;9O4PS*l+ML5 zG<57G_=2y@f<*NWhzH7+VYb579GvIfo8{67Ec(H~VOiy9uoXuGCj|yh5DZ-8-vd`u z)iaDl`&7SuB2OB$9YOlb4bnVvgSIt_vAXLh-M5bUNwgm7_Rzn%XPWkG%y)s*0jyaI+W5$uJBdg zm`IvD>K?08icm=GFP-aYY3^i}oq{cxG(CGb^~B2HW;wh*F`2D(S%7F{#1Q;9k>~Zf zxtr*R*STJ$u;E4WWH#;4)vL?9uGKG%1r<*k3bx-!BAz9Y>6LJ7K?L?=b*9NtA6;)H z$Sl2w;gBFN@qz}Sq>|;n-r@f70>>S)h)yMWWDM?R_}^E z?=^WLMQE!y>BjW*Iu{(hv(kG4Dizh+Nsn@x$cfxI!!#QbR zr}srFg?+68%q(lDy1dWmM&;X+cUL545wdS_ORx@}$yKT?<9JoIJ5t46}dKK68+YMyf^Lek7UF zJC%p0CX1)}#G1C<`s53gJU5y+_>QPaORR_gOnoG(5_&&c$?b*OBl91q>SDbGcB1po z8W)pZS=$U~IeP(&9C)rx_p+Ep@JzCe1cYM%PLpFAs!;#3484CH`!v@BY+Q$1LjNJT zV(}zbiXig4#0Rve9Kjbzb$+U(u)nNyCcg{IrO>n;RX8VrZOkR7;R!XTh^lS~*dsWk&V+6kmkk7rgb^*={NeRFI)Po_ z$!WeUz&?NF^_OaLBEM1TdfKX-(>8p#mN zEaNUA%c!CvDWz^lr{noMi9`PG-nk`Z5sFAz)<#gCuMS8Jjn^qbltz5z(08j2x~{0q zp5pvGgGKVYksjL_I~RDMsN}%joV&XiY2XV{2JgRvHtRbn^Wxt4F$=1W*8B(m_p+g} ztPPfBSu`c^Z!k|u`mM>R&znRe}cP0}<;=kqn zgpH;>hg^0(UG!+k%qxBm*&%=jRVXs!oUHxNA*(;-Y`O|Z3~MJN3O{cA6}j z=0Bfzm@tWU_u7WdBvUjBU}z_KP<@L|T{Z4+J~<(!qt&pDY=P;3=Q^QlBtA!eHacl~ zfdr_@;G-YB&vgq~YJm5-mX3Tb{lD2{bHFA?{>3JT05(|@|JyDl7ZjBVTR#=<^K}qb%?oIqzz^ziz}9sMr{a z_4F&LbVkoigP((N8Y65c_lbdrmLDL{>f42X8Iyn`uR7$&&jOA-^Zmg3r=wm}mIq7{ z->?~O{y{VY-ZOYEQq%3#ZDPoiO$%Y}c@~qOR8DbZOj^wlM^1B#)G0ciEe<)P?|5(b z5Niw|57=-L#r0_ZEU;y~9ZB{g^9)wgm8mA|4D#-JL>~A-Nsy7y{9=gfZzvVkw zvCq&W`3~2+f|SHhn%kk9tb-GrzLAUFn7UOt?8oZBxIjq9`om*+G8tphwC5XCmQzwO zU}_oAAk;9z>D(jK=5#j;ywGejwT>g7|BJrsXchAk@kyxPb8zvcv%^tXSwKhvEw8oD z2_*iZ?>f+_sskAzNAz8H*9sGT+WBK77vx>mr(jALo|(cF8fzi2gy}CtemX@hrDByH zH-3XXEQxII^l&xS**pt+?fsC|Fndi^rLpjh_g&b3En!z4dvp%u=%!Z3rq4f`TU$xa zD38npzNGvCtBoueEy?5wT+d(fojrS_WJQGIG)CVA*&5o#)XL7z5bLKI%l@1tn6wmd&!8ZkIU+qAV1E2X)R$1s4DBbx3_$tcVDo0Zv3ff$oxl6Lw(U}jB_68Y=m-r zQA?O*A}6&Eh@6so87Re7wx>z2TCDED--Sz~qmy8;MfL~7oc z$u+}f$i)|LLANH5{PP@n`cDBz(qjJi5{% z)$9)A*I0bLrgu2+`8(B9N@L<)!$ZCLH6~9cjMg;t5Y}*eX+eP&dw$X{Vb$7Gyh1VF zVHcg>mn*rFr#9yx24%x0@H#;U2Dm1W4ZjYT2*Xv3%{JuCevOQr9SDBojJc^+$688V>{~K6Wt|o6Gtq5*p3q=(_ z`@ZVRuUOQtapRgPtf$!rAG*`Z=POD3+>f~I7SpT1SNU9tL7ZWeroa`A0&wy}bC@y2 zX~KA1p!=-dwb?H&?+{iDm+L&oa%K-Kawv*)vLs7?3?zicCPw2^QKPc2byYh6Pu~wE zB=K{Vs#!F)T^k8-xAc)HqzK&mt73D|gl}tn{QB^ZnymEPhea7hL9zrYh&++%jNV-e z+yA2gFtpyk{<~pw*^T)JKCPjH#wTpnw+0p*mxX2i8#U=+aY#*;hhR%Rjqz;_-oKWz zhyPm2Sn6z3aqOP1y)9}|3ekTY*TVMG8YIsjOIb*85%haBH&EHIax-$&Uy8g-tjU&2 zO-N#zaResg%WR*&6)rFgHhoSn8tQ0O0y=sBuw}*ayBdHc`vNR^l_Y??`77slL!%(y zRD`ayZh2M?9!ri$sfJf4*Ki-zYw+d6_QoIV4Qj9@A&(btW+N`1A03gZ!k@*W z8^BIS07{B40F1KZ?>_1o4*V?2?&JP3Tw6f^pj6l1nYsUe2LNVXH18{^Ihz?7C4lfD z93MV}do4w;)Kk}BW3zAMw+bgnO+0meBa01xW-{{eD6A1-+a6vjKs4r2$LAu557-bX z3rUQg!3S(^%=i)(WzCLxQ!SVgLi-tKk5;myu!cH%yNoloKK(lfKVb@S#}x|kUWQhc z|L?NKU;ckpl-z||M=tpl7Sfr4)YHOsisDupXGQ0#B3JqE+CA{|J4tl3k|}_dtN^Qf zn-F6sS?H|vU-piwiw3+OX>Pkq_RA1FfE0Ta$w;lxsnLyOzr2kk&u=I?z1oJtw>1_(Tf=Sg;@}pc`yrF;AZz|t z^^hm$a53wd8p_?5(8h!0YcLj(yT-7wf)dXPxHXjJ9hTvM{RV5Msmv8FzEr_CJK%Hl zLC28gncT94gO14F_aP50wZ8DCEimjHOABo(ua0by;ycD?D$kuxg^?xE2)z}G3u!b{JWF2ArPek#t1=!M;}x5n=i7x7B6HVpJNOh+?k zyTC>ff*Ju3l>-E)iC$<97g}j<@^SV*NmYuh!L>Ly3+8RXNugIOu-@jb_qn`nVxG>f zo;iE}zPbB@ci5U~DK^qtH{H>6(~o_DR7w}lQ%OF7=xJj$AsOIU09AH{!v?!M!S!b+iax9PzB@#gkN{2 z%to{9i0IYeo~DL~B__Eb%^?`JOCHS$56dX;)6!V^AQ{#rR0RgDLpGM;MePaNj9IL( zQTJ1~Qzs!|PazR0nR`2%*-(A-Wa2xBmcf`Ux$xtUgbBw^@ucAIJ-StIH(f&_wmxqj zZW5+|s^2bdX#xYOXKM8d3ML_t3HG&+`IjRU%qnEWe z8{_85yH=W_@*AHJj1xE{@1XHn>okwZ;7z8mXd9S`kH(BK~K4Amn;(7|z4c~Pi z+cNUfM& zo~>1IAf49wLc)KI1I(p^fp;Vdjud95e`QZ6zK3>}2U}X4PWK z|6~p$32o}>i_0SLCAOnRRAxkMG*@#iPN=_D&vBMMlTI@>synSKGeo5Vl-TIo@DX2m z^>pak5KeSVv+Z%yK=%8?{i1MESuD8x$lCf=YI?hDnw)566=2L;1>NrWQ(3vu@5}~C z%9Eqp5C2gxI|v6mcz9GaBGXOzv8$WrriutYQ6u{+O1*v=X+A6?|vGqk@yJeAd+ zO#wBVoXi_2ww1uZj-rgXdlU>`8m_&5r7RUFu_g1~VJ&mjn{UIX8sPB~yWAjXlL3M@ zj|QvKS6#c-4i9F7qEZ5|SMA8SQkd=O*}adRI1cz?2eAv~(cjFCT4k_g0W=+cAEb?Cg>kq3Cn0R@#&#Ohq zOjm4`->ox0(#(sywFaR~)0NVM8Ox#v=Lh*kAa8Vy3PfK^zX@g-Mewh<%?Iz~%3gws z58(LR$?JN9SIRh}I9#nQ*vXt@*`3fYf5s8wdu(cb1-v%o7FS8qiIq$!bhSHl|kRdTK%Yz%{01aqfCoZ zWM+14T*%q&DDXWtgSCIOS3Al3Lb`y`$aDe0u)G*HEHINwgpD*s>wK-sTHaF`)9?A* z>*&tje);?{QS;kS|CBGYaPjyVL^Dq+-I8H=t?30Lc1I$yH`B*CtddykDnBj`1tXvA zJe2ui^24_%sLkoo%@0Y{cN_Ze#yotgoZGGnrBhkuV>7W!T-EKAJ7Wf3r3=^yK>GBz zj#Y!Ft6o1K+Ov`#x-#neII-^|MbahH=Mq}`Y8fB`;6<0_orLvQ@j^^b`6mV`jq{qH zNWCIpSW+?#nB+rKCuoEa2jSg+!Wc#Vi+<;q2OcI)2GDcTb*FD3v@2e0B>AYu_wwhl z+SE*NE5&kkJ=z@H9vm}~TK3pc!1}UAW|@8yjUF>G9#s;VyEb04D|GGoN5b>>sg$mZ zf8+7eDaZPnqr23DlqY`Vp4*vDIbnsBop)NO$1@2| zr&NufA!LzRs!CQK-ShFOezSl1sGM!uGo;Q3lVIa3U-dQ`c1y31Y}&zJJHn^0EmA;> z)ymbviY312Q}$f9J77^VESpWHXegiLSG7N3i4SN0>Dy?W!7@tqvW!_*82%*aS}-rV z`NG&M0;Jgn;bF4$NT^(Xmz71XcjnFJb2q#IG&nB^HXAPhbn#ttif=akhM}N~5&uMsdh7 zg7ahnBso4mY!K&s7;^&V$^|`&MJ`(f7%LWse^lAzOJemMVNKb}b4M?z_xmvDL(V~7 zPnv*s-}x^OaU?2CAmaP$I{$1o#`QnK*%jr7M>Cu((ub{anonzO_X~td_S-#Hx!yA8 zDe_JDaoc(cL{MvPv&KFtzA&nI@Z|SBBa}kL_jx@_Hex#5!Z@;(T|KU8rKNl$H@e&8 zUHzYUln)hD8pNZDb4gdd?bFNs-PccQvY&Bom)^7bo^Lt__clcK4x25tQ5{~1xaBaI zsxS2+b!ZM3wm8r}1osT`IE9Lcp9E0Q0$A%kx@)|HZAf8^G>CQKFt7s``Zv{|5FVDZ zy&OqxMuS?y8iuhi?>t%e?gZ6cZi*eF!)JrW=!UkKnoy(f~S#e0=XJ4u|ZFsTjTi z@X#11U4iFIGqFX(ZO8PBJ_p+wGIxd*>IAOGSGG^ACcUx|{`#x6G42%e7@rxHs>0vw zgUgUwy&7-RF}_WO$e>ZWX7Gh45k${(4~!XT)E7ES660fS4o|1gq`vKj`xj$DXLReo zbVlQwlds~$t1&D+m4UO}zdED-(-qAoQf;yv0|DC=+oTYERnQql$+24J>FK%WfW()t z6f3Rcn;8#Z0sYR+wcRQ+9u*Ze>$H`)(elKy$!w<9nQm>A=-U%p6^U6glO0W6^Ce9q zWQ}$AsG6(Vh|gTwpLo=mN*k5uH>#eH39eF-IX%o=H&Nh%3_d}$)GF2YH#mL&_T=KE;E!RwxR zu8GpIrI#G`8C}(5#KayPWJwkr!xv`PgSJOm0+Vw`uvM-`Ov|^|9w-DsaxITrCOP*! zzDJ3KizH7Q?SJt(4b_aWxfM9*k`|Oh{=_%S*&??>K2E^Y(|dCVrRe^qDal#~u2u<4 z{P4B3Xg%GnY&E?uUcL*bOm=rE;zCawL0HnhuS$0w|D~v>ccRMm4`Nxo1H>yEFZmdR z!A^e(9(Z12U-~@ca)AW+?ayl%rL}@In|nW!B%c(RNGDp5J(hIdd-MUK(S)2Z@_63k zbveZ-AbL(=N%^?%*7B9%?I#tF+~#W$#u=YRjr+#DhsKu26un6>Jk6|ppAV?4b!9JX z(C(QSuFc=YO$*Cz*`QT z0&-;z+l4`2H)=zTeX5FNzqgtS)}oVvp7*vOS>!Ig@t8#DajQTgN1wKO_2)6OA~ZQd ztMiE0`^09F`nF}9rfMCX$~ZNVoM!thFUOH@0s%OoS@6J|u?U`_K;Dy>(>;Huz^V9q z`y)cnvz`aF_om3D=}?HXke!Zf$>8&TZ%suHSPQQ?eXGkwi%f;hqTBu(q33uKg6An& z4tYvI=ye|vdg&XUo=zs$+`)^~-$&O!f6JnJ%Q0g~8qX3?zni* zAH!jG{1=gqjJy0VUh}Z?@P@b(vp>Ij{lIiEZ`Npvx*e|YG*6y=a<^dPhw4P4Nz_B#9N|HZ1DbBPiLyb{$@szLFGJYq>8W$pw7Lt1RZhY{OA+j)2QcMwbNz3a zvJ$|QgBQ3W=A9UfiODh-0>{OBCnOqC8JOXh(q?(QHbpk0`7|aW$g%1?qKH%U?Bh;) zyk9YXSl5Tv_5h~T{tZ)3X7-ol5RV!ydijV7JI4u~%}{@0x?Vf`3H}IZUZ#mVP)&6|0CE zC2_W^9n_!)AQoni?*Zg|vDMb6;}I+m&b+QDyFI?TB)cs%`VQ;vj%vZk3{D2wxW)6? z_I-4Fy&-f=369?LRr$xIG#wJkQ4eI*cngg3wd~~Glb31z3hSmXa6{5=>LnO3uELWV2fW55-7O$#OFjDKKw|h_?ICw4nKpxoK9< z=(`>VJ8kZ|uhd|fL3S2h-%oXze)*VB2hJU_3olmft&pzHzkTvBbc6k0MSwMX);lbg zm~%1NL$L3{sIh+0<&v6}z0et7GAwW@BMJ(v`{Z47Y=BF7W!w&m8SyiH!CEJ?EWV2*)QR4B%oDRV#x86=8LXA5=3Eb;+ z(Ghj1A3RzE7JYW`oL7ouQW=YmwZjDY3)e-IW#UEFc3nRh32iv{acl0;b%P%nv~g9Ikv^Izh>(QD%YuzfZms7 z88H;WTSN~3vWR{S7hlILPcAYkzGhwgJI_cRd-rfQysnHFSVRYh7SR$$d43UZ5l#8G zU2~oa=|)@Oo$_VRxYQZEQ$9I9UV6!#>7&0?af;+B^E9-XLksKMGAUS&9_$VPpNEU4 z7#C(wUV2SPzdz<&k-Pt;*EVQoVk-1p%dnmy3vAT5tU!s~?pJJM^B`u|&_VkMBhm*L z5pc@!0RWGGhO7SZH(5H2Y4I$RjEMPvLtlAr{6SyEf1|H~GG>P|Wo0>_@@|Zj^HuWB z`RPx)auJ}f#Dm%f6@)R`*JiOg#N>9vwO%52Dvb<_p_h5eZH7kkkTZqfJ_i_bcXa&Y zjzw>P%x;_6bh*eE=_P{gnq(jOX%rA8B?ZL=RMPd%p05bwDSJti3O zB1Ng59qk(=?UXw?bz|n6?4T3b!@1jY?2ifNj(MRar=15L6nU`zBxt+p0nsW&rX>sS zKDu_tdE>)`vp}<~3JQp-K zr0tryKyrhI%qu2CASm(eafG_LxX zKhBzk4m(&u+?&Q@cpy@bxjmF#JMb<_wO7Q)7&jI?Tf|)@zEJ>z8wR>+&l}B`w3{UI zPZf;rMB7Rt+%3yXyx=ME5l~8$*%|9{dEK`e6vs+WYY+-HEWd8G8uxH)|4D%Mw@JW; z@Fdf2(iqHE87p@AHO3^N-OmW^s6Y0|XqV-{1m=)wLOgwPQw&!WQzixxrZuHq|V~B24#Q_;gr6w%l5MBA3sd95rKEb&~Z5htz7Xr&6h0y z44mUX0~d5OaR1b8gp!Yf8)m(Q^`a&z zDCI%eaQVvZ3Z_O9tW)^NI+As(K)|n7GY2YNG6-Lw9O*$+>-W&fXs{W7*YP=Tg6%<# zGHkU(U%YBTbuOx|__e{#gf6K%|F@iK%Oe3-L?TI72T>7jh*mY-Pt)}5L z9zl4$JnC}PN#)qS>WIVbVcr38blYpJo>r*FbCisza#zpOQFVe|Ht_mp6XR5vaJQ;v z?zLoEopf0G|Ywu0QjdaPoS!U4X>xS!A>_9x_a~sZ%`(8y7R4XqR zvFc)SY2N5Aej$^hj3fBHkkwyB_lB*MRSDNUnmk;{*o__jS;%Ni`ThJOFONi3M{f>RqV^LQ7q|9~+Ik=R|8-7nt#oEUTknK*ZER)caiU+i!p+bXYy z0qxn_lM#HBkE21EQ7mqE!%V~yg)iPZ@uBfRCsr&F>N$C`e+$L8(C4UGZp`^{jOp_3 zA5!lfrXDd%euF*I80o6t333~&6Zf9A$pcfbvDKs`x(!?mt*oknWlY7vI__VjUM<}5 zbG>_5i-LAcsVVSY>k|9S;A(qPhjMwXQ7#rQm%mavoT)=lZwK`O6r&LI5Xnh=#0FJW zQ&AyC{97((af^5?YaVqOT=@h;Eg-*Y8xVYLqfhwdUs|QvnKhh#%BAY+&#V0X^Dsk+ zGfn?!l^U`ChqN~hhw^{_|4F41LiVjfLMU5yZ3x*JJ8#(u*~gv~*+Y0|%}!%XmND7) zJ!IeaoiLMa68gUeEuYW#`~UrJ{BG3Ujzh=ke4fwix*m_Lc>(yh!7r`-q07Cgfp6bN zcmLQ8wgR-u@%23}y+soL-?EL{jXA~HyH7zz{6*B8Y=9H$0o?1CiE-boyR*Lk4ioeN zApp&G1cepTA9DG}Q@@pKxzJ{H%=LmC)J}3jE?ZwH!A&&ZZPq;@2}^*hG|Q}ld|c@a zJExhJcx14#y}2F(w>L0Kh0S&mdEMct;O_?NI}$!vOR@l{ z&pb&c9qYl~b6?Gk#!pWJCxEw8hZfe)b5;zdZ86aEpyc-a39gc;ixS$jS?5|ZNN1Pt z+<*6Eg#jnPZ{5be;>@)FhvaLx4Yr~v=#~LK-Ete=2LBx-`*-`qIdWFY*wQAJOSG62 zo8z95MTgD>*09hl$<2ArG}kMig`ygmSSv#wo06VB-Og&~6rSM}aZdrDG-w;AlavM@ zzi{rI`?pohVxIeXc9w7X1Pm%`fbogWUExR@o>bhQ&HT8@$8{i-mSCEpwEn$sH45U9QJeCemBsdi{jD=RQQ7?O8_N?%g5``F z{Vx)1Mlu0LF|fX!+wjnV@ok$|Dl<_s7Pqh}eBEZn5^$5H#Bx^ZR$|OrXmG0MObV?b zRBd2n_Hln_{H5QWhSlm&->RDA3dn{Orpr?+*@lj9;|KOT1oI#TYnnAF9X(#f>vpL_6X(vIm3! z;s*ae6xex5tYqE$;xf#c$bZfVz>WshtOf%; z6kMdr(5&;1Z=-yEpyO#pbpL8M-6XjeHP~1>dP&yH70XY^uW(1ckdptLQZFek2{zUO z)#ehaWt4|}j*R|BJr}S3`dEcUj7X#OthZZ}Xl%=NrI<|U&%uQ0uv=pN;2|7a2+i;%T-Et--d zfTC2;0hxKS>@i?x8MXV6(zJH<6nW7C$)SyCXZF#`Dg!Hv``1`C8>A;*{MdTg61cj; zPyu#NpWYM{DL$At!}+29Yhyu@S<1`0xp~Q#!N#KDFam^fQr~Gp@X0i1>95PHGS5OO z>7sail!uh>!`^EC;qq~K415zDe*7~BdQFgcFS0z*XffjCf6O1We0}CCh0fjgO3#hciTtofx7re*wxrAa8)f>$a2Q=ECAa*}$?6m%D^fYVPa?5%kBy(nl4tmLItu z7B=2FQba+Sp-i5BUw)YOiA!PVn2Cla4Xk=fqQ$M%raq?$+RxC-buraozH4?dt$=*>Iwe{UvU{3=1S-=65)L1t$&9&D41 zNLhfEE)vhbdzo9&spc4#!e7>n%5e66iridzFa?4kbmd1KT@^C5p0P0|sWyB?FvY}z zsMi&LYHqW)52NNKhz<<#lAWRdcWX)wI(6M3B8pJ${8}ife(yd}4z^ZYBv;q!jsEo% zfh@TQX?8qELgn&__h{G3nKfq3KA8|RZ-FXpe(xBfq`XH<70F3~1Bt-A0kk$oa~|3^ zS#Lpgx#i_=V<{Hq!=in*F1RY1IYq+4}pGkX+k@EL4APiD} z*iYAwNLHoQh)hY`>?E}A3jSeKfe8!6Xd4k>*JCYfU&FX^$7tqUuRst$oOpQ@8q9cq zM}%&-gYnQ7x3-ikNi?(XwC|Pn_1}B|ztiV)oU9FQWh6<7E$exvvkLHoIJJ_*vFc)F#NbT$**{qy0o+8_vy<#6so zx@fL=ex#I4oi(DJz^aYPmlyYkr(B5O&?USb8oJ#ic1X#Wt;!`c`dxp2H^S-Sd}nB3 zoS5*4-35rs;#y4(@=wxUu&0_iC+p_6Ycv-TnmoP zT9rljH}Dx`aEs;Tw}>N!O+FEPiJ{ru$q{GH!?w$#58pd?h^cu?&OBlFgnsrHZvITo zN*b3tlZt+v%$m}eG9qda)-`H7;~4&cL$M}z-!*ohw5Qm*$I;Ve)ab$Lw+}fXqo2LqsTxgtDpWY8;#lEQJp;JXQ-36?( zpvicvkul3|;{`YAMyS1_8AxZcv*_L|1;pNXU|lm9M*Iye=lmbg@{Huu$E!;B(3ml_ z{m1)69#32dgkTO9L)UGMQ}pCWhH4`|v$J`cT+5ljW;baiQy@z|^$OxzLZV+5!{o{^ zB_zu_uoz;5l#)q4xGZwW!RK-XJHox=NCo=-Z5L7{>-&s$(viD}bct}_rJ}n7< z6f<5Z*_Y^+-9|(})kTb9b^avr?Z9{T=lNRceMupVmDEV4vlW=PJ~Vx6&OL`P zi&7j<&#Zy+;==?vhB?I9R_2hHsa+*rR)y^cEBDnAr#@ccsm zYcLNN#+77P+P;ka1?`o%vZsMErP4yXzLpQ@Iq>ECG4VhYV)0@tg5Fwp z0(?LVx$5b3k;$_TMZ^&PuKp5@pI>CMtdZIo<@eZ>CP)=|f^uQ+wutkhIXTT$t4o)j zx!HC~G1qOqc~_da4Kt1PSt^54|$rp9c?zsaXtZR@iCu~e z3jjBTk@d<^^IrALiiz>495fKtyQ%A!fKTfmWBetQoIlZR4N}F5^)x_F-W{>J%BhM;FX((J&$#dbPCVg*(m&^^pTNQh1J_e0S3HviN|F(ChnmB_3xnyz}`l zi(yO*xT{v>!)`#*-9;q#aTb6jxQ$17k$UqX8D{5|U?u9c@vDblZsMdh>M7H61jz@t zH*`I+{k+uEpcKkgeVN~E*GBUlk)(tATDYbg@UkCgz7~h^xo#$NS@Zq;Z>< zlbJAqp<9y|$E>J?_TKd_a4*~>i&GCLab08%=hvAa>aS2YnGp+9e%QNB%aiW^^u;-y zj0+tH-J8tiL!Mh7La)!WbLs4$d;;g*@rb>iPRIli(6S`=#G=F5rsrrCmRd%-5&90$({f(M1mrXE_o)A*3>KUh~m-;R5y5^B^q@)Peh z?^ZSO*r;H`t?%oFpG~gce$)Ki$-mh7kY{}OJvO>Y=#Z|o065kbdUp%kY-g;<9{u)e zs7o>^&(zO|wZlm|F+9XYvRtoN&V4>lSdI4oiML9r55L2~W*;~8Pu~>LnnnM+{ImLJ}kqa333=`$KhHB!Tnb+{wmz1E@aLmbdg){1<}RE<-prpD5IdE zj-YX$d24cFrYS>OehJehb9DULmslEuEbAFqt}6ffbpJj&Fv3gfCe`7!V7$UnAcNA! z%~cbD1x^N)QH76@NkQ+lYxS`ocYs*^-PzS-t7@{rrWXU}kw5Wn$;}6ZnRdGFG}&C+ zZDazEiQ(|dPVkucza(n|8M?u8yvj`ru;Hl{oNbqbTW`S%?i|6ZH|jPy&;F`{YqrCt z&LcKEBgCq>L(<{m_e2;6tJ8~H&(4|n_hu{mb2Cw!AWXD0&kO6F3laPV!D>2m>&h_}~;@my)(yl3~N zDoYMhyo^3f>IViks1A!OlhGJmo3b<94-gjFYCf%XXEuTiTdx*;0|}0-h$p|AcGiC) z92%bjsa{bRny_g=ng6?}{P4MM?6>{ZLTw+H#)vTO>B_Ff?9uPD)t|dW;m={BM%qQ- zgJb7-HMwuuw(ichTa|fT=lZ_ReXQ`bI`_69VcVz29I zdue5NK!ee&oDLp0aEX8L^I;)`R8NN?-$!t{Sd>J}{ljJ;G`_)-XVAV!L_F6_HXq@UM%*POgk;z)+w6|^Wv4N4`IC4r4T?rbdPV$mm8?LN7#UVG)w4Q+m9_Wesoia&DZON(^1Z zoJ9a)OG+TJ-BYuBYv^gzjZ=K@aR}$+&XL@+T8AWh*pvOm;TlCiLQqT7z@@OL!jDI!3+S-RR0Zdo(zh{ z@@rQ|v4-*RnA~{i{{|3|%BPg+uoenvrt~cRWfetlM<2N%#}xS{&~}Fr$z#GZ9pKBc zBjHI-#z*wcSFLyyk-cY{L>YPww?;km29;~tta|EYE?FxnYg&$E4gijSf3a>=!c${C zY@IJwxp>^M2cnnY*;smyNzU=NCj(jGJ!>=mpkX(@b(!)jjAU0d> zb)E9>%cja0-kHz|-WQW=Oe(h;SPY(%{2$1)D8_>Dey5r0*ZcH&?Y3^|mQ+F%H#wu) z8RS{tyc&%fYMlkdKI=n%ba4vtQvp3j&T~9dMiWZuv1yL_aGAYBNgVr0kmJM07%j@S zq^KkI(>I&-^4-eE%ICeb;$+cgy8$zoUa!;dmJ+zyh)w&3+wDut+El75hMAWp*C{wA zINs;yU9~Sgmrc(pON%jwl`s@}fHf=LMg-X29g;&4b%+0F z_7miPVLv@tP8Lt8pAZYtk7W&iHvi_4@bw~}>(D7|wpxlxsbzhe<4_G{rrC@hk#CTw z9el^e%Jy10sQ~$+N#njkvzG;9;aO{Ys#QsfxW;8S9P!^Sxfhn;3Du;=!_=J0VkijJ zQ~EKwJv2zZss)4G#=)DD;7`}qVG=I=OR))Yhc^Hk7$aR-yt^Y!P7_0Y-mmyV2n36~ zo(m>}$8`fIOKmn!Hm?!vHjaUPwfRHBo%$W z2zyJXKHz8nx9N5{?ewF4ckyU>4#(EEjcoy#S{h6~i9|aCVIIBXx$3-I)XlXqCykz+ zIh&pdy`%HxDfi1SM*8o}pS`OcNvGWxRhIrdN`Ag-(A@ zgM4yK2!cZjKJntk$OL9!>(xIE6t~;TDwp-nJ+BooepAYFdd`EIX30tM7ZeT0e7ax@ zsI+i;C7e74P-zuQWQ0;?_5PK-vOIDS>Sy=9bo0%*`i<36*A&f`uBVGgE9_9Ta!$+-a-j>&RG4J63t`elZuxfhUZtB=WkwFo|K z&d{-XR_}S~x}M)|%BuXI$pBw<#%RkI1f8k zPVQ#lp#Pm%z1h(&Vr<*4YHwU;)I#f&r9=6ZkM$;_k;$W#s}E{CcKwafG6lx@OH_2R z>1@4%NsSF$EPA<`EsrDOSWUqz*{m3?S6hrmDy97bFi#{j^cn0%okNpkO!~Zk&+dLT zLF@(K!cc7lyv<`5hMu0`C`}2Ih&M&^$JMw?*FG0gOUFRj5gss%LbFMuN8;YA+8{dh z*wN=_bp0D*slY>?t#J*VT8Tur;NE-eroVuOPletW)_kCdtf}M_D!ZMtvkB~420;}g7HEru;HQuPYti2GeEH@kU$i6widan zxH96ehlp2sgxeZZ9L!z0xxtEZZ9nlA=d2)3Ve%SF-(XzBnc%l&yKH50kddQQAoC>` zV)oj-fmc9@5wHi87%w|X`f0kRRre*Z2~z$p-uGr6_58*CCz|CYva0&c{r5liD^*_< zSAM^2c)M?1u##_5wRgSvI}RFX#`CCFgy|Jn8~wZw)&geOdmrt0GNS7Rje_^He*F@I1nw4 zh{lcyzB_o9yZa%F%5&#a+5XL<0E~B>IqyauR^{otv%FzvqHw6~FJ>8FpVa;w=JFQiZN$g1j!NsrvA_GxAlR4cv=`}ApI*)nkiQf^yZ z#_efa5MePZwno@YW)r3N^^+D)d4P;8`xfm!m(+|=1aqTD=*X+FpeprP7CcQDcw$rC zV9TpzIW2@XV(pb#xlnv}fBDO{K|N+|00CV!KzD3}8maXPB#6;lt)DKGy(nKE?iB6U z+A5x+`|pjq+jcw$IP(9>APjOVmy)=2M5_o@me;@Czih+3ZiIa|yJiALq<2z>kM)RZ zKIN$)if9Z8**G$ds{Hb;b{wp9O{wmmJN@*M_Y9%BhI+#xZ7Ehc zeff?qcl0V1F9$W^!goJ~q))=L^XFSupIbkPNr;)8L`1^nI(~7@)B0{sRyzLx;6OzG z8!ut3KOmcv0t?wO*<3D3{STJb^zdT;_Ae~0{~J=qRkxZ6est5jDaHqnOM9l`52p*G zKh8_WgrKV%_DEu88Rcj7dbxpbX;C?f;&gYw{kiAoTekjyH4UT)=z@M_D>Lgjy?rf6 zxAmTc&@I~v<6D@WgnV83Rww(vXw6qHc?ZFLnXn_fDi~3lvY6_(6Gv){Y&7b%xL_7` zk7&7g)G51e4qlj}ftNT-5RAasH^dv3=5@Jb>ak@g4TlS3N0)z^D$@Ah`)7}J-K085xZ2l^KU0Cz&ks71>Q|%8_^*om0 zW7yM&6h~l9GmltERUyg@UV;N_PKYPeAA)cdj|*2{aN+9kI(7~V`zu`ej5Z7iO_B?Y zYl97vp@rKZWB<890t%)@Ds)jEk|D-f%WI+qDAX&}XQT{xCu$5JD*;?hkACA5uI69i zirwpOzn8j=t;BX@*p=7U4mT`ovaCTCU+fbnHk(FigB=10v=otv;QP3ZkYqmeda12- znNR|8lr)}<29B#)1Uz4q2|$kltV+6`tH7#+Bsk@sCGpk7V5sv*-6xP1lQHkM7q6Kl zjnj@56jsJVvSEWq3j`v260pQ{e+Mj=$5U&np@)o|Qi0VJ7HB(oj`)dGiQo#8*uaKg zg$3}n)X)XIbI82MeNb=4&hmB-!VYdniX~mGP(iUUd%&G_{sEVK^q4}1mM9AE1pIF^ z0l@!0%zkfsf3J|vVS-ny4FJx8b>U~#S z2%>kKwr+j}q=4`{&0mZZkFc|BwlVkLp9a`jP5TfZ)?UF5b5A(uFgJ_qIGt?MzHZ_TvIhg`3ZE+>WFe(Ai~O(Z#TReh2hI zy=+m>RKT}Ok5L30IN6v!Tw3A;JS)h-`7sFxo|QjR$CM!E5EvT6%h&>;h^h8TV(Gcp zi+=`0xB|T!X1A@#Cm6o~2Bgil_1x!-lznF(7xOq16L5V{5d6ns z?viq$V`lExVXh^#^Ci#fIg|!ZqgLj2h}ER$5z-u?n`ffNDMiY!JB<8weZ(_U?0dqn zX%i!}Dn&QmG~|4GO#EI$x4AKBo0nh+>(XF##GNH&xdP_nCtgUh0Q#`JC_x%Dy-+4nD2V?YjuHW4kBXG0bAVl{Alzh`|AvkX%*GY^A`PYFb5d zA3Q4Ul5tdX9p?H7<`rEdf0raeWz^>T%2K}1ZNF|1;2i_#*|Mzn-Oc36PP8)Q_(|ET zdOqhcD4cg}cTWR%gXn`B1V?73t~VmXdMabgv)Nw@cuMFgmg1azP8Z7DQ~S~#NtF|r zQ;ap>93|^f`xmX9RO_0O?$F9BYxESaBfQt)B?!P~22}IRj_L-+BdU4dF?;slFZL`0 zcI4ZSM%C4kzjjE<$qxCx)$ZCm?Fbpx;Kak}F*I>{41T?V>|;HKcXx)D?N+1G@g0(I z2izeBeM-Kcf7_Lw>S9wd68ryr6kokSlSYM946&~b;y zoTh#jade&AIwI*;vEOYEv~LwJe5gAyV}OhW)Jl_;+3NJQDU=Bh(LSluOHsrqc5)zB zlC|!@n$4CYNT3rNn!VFH+2A_&E_b_>*CN-vPYAch5;gdc``363#N=DXdW6mGCfnx4 z{VJ}Q^frMRL+UbA>wZ6yK1@sg1rGVoc^4n2R?3<^Rx62{Xq~8)bPO|N5P5lJ+_qpm z*kv$V$;_Cq9&=x=eWob{awVxSGcP4f4n`*1AxC*0_851ar`paa5ZQz4Jn!aIawlL? z!smX#ao(7S=~kwxXC9gJDnbJLrqf_#>m5zZzgMrl+Pe33i7v}T*GU^d+? zv(Q!T;oC$?1+~z5bT%-n(TwgsS&Z*%zkwVf)YR}HwN)%1)C%144Do$_*2Wm2^phU-Tm$^bdp5;46PvCYT=ju1bS zr))3w=GysBcak*HbWL&c1{#qspv{rK0uBv4JeN|*@o@pmv&M%9odp7xtWsIeOoGa% zCniZ{*?_1?4-Kr3W#aD3#E?W-d{~YX;$|LRzow-uAo|ws-twmJ8_t+ap-JU>^zEEX z1tJ>tB1aDx*U^ zM&pRop$bOm&gfYzl2!nwZbBbR)#9geNDvMlQ|e%N67p@-$CqQlkzTdbBPrzZBnE() zacZURwqyAi*dfT{Gh``5ioEKE@+=MfuzTM822jV4Jl7aV78%Hwqyh=c@>m^nlCW?- zjDHA^gc#y1@OFF845&|2o!KjsD9copZ%0^Wb^_pz>GyJ(F0G>1u`DUmCo^b_W~*W5 zU+n7^D%Hg)F{<(!%R=OGUIu!ni26xEfmqll$^e*dJsO1tzjsoL|+9rL0pYU~2| zic6rPUjQ3x6ZDm}gahSp;cG^s>yJwBRplB(Hgts~;h;d6+r5u{?8!@tR^ltHmP%un zE{F0uz3~kyb3>k}`3#QLd<`e^m{4!d$(u}ZM-fZ&$jleEVZ(ZC=8LMtMXaSmiG=zp z@d&+GO1XL}aHn4{l4Qg7L9;cI52w>)-W4{dg$@9Axd2v@&8jT7q$IYJ>*MA<9#?Ur zh6=YPhtVq*!6}U+)i38U9tKw6S4C2G@yf!)1f_J1__H&QMQ~D#UDRqp)ztw6|s-7_MG8Ds`1+8fQ9tq8&O%h0Ej~Ls;p}6}>X+kzvT_wm zr*RUm{a?rkt+?A_P-WyP>NvSQrN4^UZAEd@qbfVzP} z-j2G-fr#}=$y!*uH@h7;kmDgqN9}G2&WgdMe6&AsR*Xo<3Q>v(UZ~_@d7Ra@e&|l8 zCnP((!q&}qCTIId&-V?#pHi+P_vv`>z#p`G-A|bu*Xaug7UqfuzbGXoMQa;FUi8}(;;jQ_ z<(||RJ7*5&rX2f}TXJZ5?tCuC3b@T?3GZ%2fkjHl_|K*V#w$+P#SlFV^V zS0L!q%d!yxzng?sG##l~LL-woeP0@~qLW|cPwKCXXjXn!q{_w z&Uxyhm9lxc+)%o)kX0^jIJ{)2u>kWqo;~8~AkP(zccwfc*U-wkaExqo3Od#rJo`Ay zX60`C2~V>R1HR0`uqgGbb)L_gt$@Uzmt1|Q{8^X<>nQt)fhmSPbld)%^2}C6cd>-j zFK^7LMd2yW3o7%WPe$B8wfKb58un!fe@KE%V1Dhz zAyqeiy>9Vd@2Fw%1UyHu?0e?v(Bl&%qANG^cu3|9bo!1;tfsadE1+!rcBCE~3z;5l zAXZR7+ZDYZ()<3!aGciM?Dq|Vx364^wmnSy_{^Eh%7vkUoxih_e7zZv8 zp44Zj$S*^y5KAw2e4ob`XN~qulz|dUBxm|} z$-A9+f0p0W><7QWWH`B z@W}BKEnEs88dtY>C*sV(K(sB}%X<~&|M;nxF49mwXq;f_M(kTr?&&^^^|d0WkyR{R zRvU4Z=V{Mg9cpF{%6(q@#39^TlZBeK2V(0THdbb2qn$9L74EV@F zM8V#15iWXNugcs4R9Q=lLA)|3mExyBNroh)f5GoTN#23}sQ0-Z(BZ6jo&I#drI(z3 zpAIS2 zbB3$I#ZM5`6?;Z$wyOmx)6Bu&mL`aSm`~xHLO??)!7~=51t`$_2LrwAU0_z-H+Lzt zTkVVNW+;c{gmFaOU05|~#l7iKTY`oXx}7kST<*R|xhHm4Wp6zq2sDmNe51bItgeN7 z1X53T7Uk=dyA0X2#L!INPe0#Gvj;)Ml8#rd?fMXo+|z83+1A&0N1W`CQ5~*Pi>xN@ zxNz1l`|c#A4yRb#=DSS^PA`1eSH(>3vw6J5b-lW{u9tI6lI^4aj7$Oyr{@dD=vuPk zV%DwWnB}sp4()=VLl1cs#_1pQZjG|skW{R=5KJx7OfYnEh@e*N!2`nn4^5PR&xnFz zJI;UM`vLo*Z9=bID9HGw%u896U!zmixsMeIQz?ydPm12Mwe*Ba@rc);SPN9g{#lgR zG;nJ~&|vL#i;ETM9|yEPdCqbgcdw(oIA$0{eTU1n3aJX%77{LVx$r%|_+i(mtW&D& zJ?UbHgNb!pGSjM7mvU7}qR!mncW(xZf^4B#N?U5)@(v!z1R}jMPAmWQcg>iX;E$X& zQ!hl$Mj^#jx~uYfWbnq`Cj#|?fp?O~X01Z$_v?Hw>Sx&H#BxdyIN3tczu+&tUw^oa zYGVgb$sE0F8`^LnTL=vIPd@mR7hIZlf0qtfO!nE>?G4`dA4q3(|7|C252MQm{VQ8W z@48S+JLXFC;a7@a-i6% z#opH@ALb#4Ndc68U#bM_ovT05GOO+Ond^uu&Kyu?WbgW78{8FRayimmVx7R;3iq-!;gIvZrVc!gnV76pG`JS`?+G@}^s zJU&53+KFFg@WRv?e7V*ZafiKLFZC(GFJMPVHwUS!sfzNBTnlMe5RERn&s;vrdQ<9g9@0Z zhBv?SxUrUbz47NP6ysv7{fIx>OgLDDZ=uGw=;<}6h#a$4sng8(xV1i4Y%?A`prsDz zBmHY>hK~x+o3el_jx}lEgTA0I_)shCd0me7nwc41L`=ZUg{XTBb~G#2i?s(_HS9)x zY#0)gV4NqT-6GM^Co2NOJG-I!S#}UR;Lwp!zRqdPUsQus-hOuSm-dF{={K1fD z?h8%{_KCaOr|H|wGP%+%o)T>Sv>0AVEH%^hYHNekhS$VCr?{2qxyAFjm==IN_Ca2N zsN%p{)o4*R+4xL-!0t~ToOc}-&e||9EwlcyT-v>_UyPQ>e3ijO>%{7FKgi8w!z2;% zn2x$WSCV2mKJ-~<@)g@wC*~2Of6g`H<6Sy?KVW&XS~p@wxn2vMi|Pt7?l(!6y2Yxp z#*rMX=Wse)q^9dV+y)USM5k5HMQrZvC{~{Es{SGU#p>tFihnSyPqGO^Ve&3kKXP?> zAa+XYts`QVd(t|*ta9iLd8{umAt|lwY0;IJ7#j>ThuaWLSH<99k$2G00t0}s1GLCu zH39oYF1&P3+0$aCo}}{1XS_tgi+5sLgT@$rk7vE>y1Ye-mm;&iYX*!_j)q2dI<09* zl6y%YF;pm@xcG0Q(zf_dOs_upxX4m1i9;X9-4Pr$^3Bf{^VLcHIxeZ}5Sxz!{hVnV zFDt(eBpF6^BkV8eXSgfee$4iyy)E%-G6{b-7auXRhqV>V)w(Yo+bKfuko9E7G??gm z?R>6Tjj+ZS4c&8dMX(J{#BQgD0vLEc1#tC|YIwe}H}xPe4C? ztHze9IEG#LN{6y}N>|n6VC~I~~);{Pv*&pEpbCyYw$kkv@HbbV)D@++ijb z7;^TW95KEv%|8vrc9gOTpLd5g z)^o~;L~)8yS*K61YYSY2@JU+xwvUobSkC6g3EsY9#M)x_K8(6FSnYC?{F__%<`N6h z=cbsXHOCg)l2iN#^Ro;)Y4k;5H#~QXtlLz*${Z#2Y;6%RkM$NiV|2%4gDoHZs(Ff> zXE(#log3{$UU|d6Cd{H~j~Psue(VT&i$MJ`SNw?JpHsm#<*7Hxq`Nd&wz1yu%B)oC zTJmr+tHXv8wtBjQ_kMp?Q7@vS?*5QY+EXfEY>Mc~JcdM0V(B`=7WF6$qZX0h4dM&u z%PZj>y;_q>2h5G_z682My7#67c$tU$6pqQ_|9m-QXho+#?lTE+#t_*ly#0kb#%odW zaN8J2!$zY=56MjIWJ6~9)8layW_x?_4_bUEZh9dmYoDiJzGs^$ALhQ@iDTe5C}3z z>m|4vA%}dy_grXoZjMayL~&8tIo{&C9m@2s_3RPvcoaQqD|`L{p{N3>(tbM*R@b%y z9uy&@)4p+gNqzBQGQzU!l@Gqext{7eOn`dkj~}A|?f(c(vFZ^zan*#uq2VFDlAPT$ zKA)@%tS@?@?ng~oY_$tKO`MN{0dV{G08IQ9_;9%fjfFMFhewdUt}YnC(ZqFB3`+n9~t}xS8hbfQC zHYL6C52r+2jk;2`GWiWSpt3VtO!5JEDi?pRG2#YE_ zFi7Asx(7^#tV1`u%a_eJO=48EWgPju1Dw9%!z03OVU-x~&7gbTV}tP@Tsgh)Q6S>1 zv{Xc%xI_*%u;qtzbM#I@i6CSxX?V4TDZ@_<+gsygS;cw??1_!J3-@S}Z+I09M)7rw z3f!ob;Z2YpG^$A^X>(#oz*ooDW$1P5jTe&p2KU-PudKmi7ZBmjzJah*E4siy_(H(K zN+-wqY}EXiG}jGt)fSr5v(E_`&)6GT9pZn)8fAwG$%y8U$%84=0e93P(-783u8=@W zVcGn-7@u5JM)*OI_A+`q6KkA>Eo7#?@#7J64(Qc-xY7%YOmEdiRa~@S{9c0-WF)~S zv$L`X)Z^>qqf(XMwOaPdwT_R=V{{ES(z>m;c=jc~_%Kca3v>D4fOLOanemZUO&+IJ z>%s%v>?4+*-dd7*HUr+Tj_4Iq`M&p7-dk=Yy)4`Kll%#Ph1(ij3c2@!}oGNXX|mpUy(*S@YeSpdG)s;u9M7 zYWdfYlwCI8%59;41w{iSS}-##?>~Z~hA1v5Ubgxb6dhBn9Q{o$pT@gOdx0K6A+33X zjEIfu;Pxq0^&grAJnN)MdfqK%qAop}#R)Qo%CSz_K=PC)_-?ypeLbI=6!7{F2{MUK zwwM(2CZ({rnKf?2Oh#gVIuY&xtg#ff;{JwQWrUR_poN_!8yYNwxep&Kd ze}$7TVF=}*G8OMl+smQh=6|7%lP_SM53itI5&88qpTI4qUuVCE z@{a{iO+iy}*bsZlou#du`EfuMpUrZY(zS0oxBuT8OcHWntDajkBNGfG?DpyR*(?t|Et5dsmaH!){X#;q4 zFfJx$=C|4pD*dRw>?HzrSojyH%9!L6Bf-p1Zr^`wn>5;3>-s*wDM_>3p7p3%b2RAf z!57ZJ#t8i7WST-`IPq`H@yqa-NZ$GyAKGO@P88;?8c|MLyZOL(=SVpSa6GZl;2cj@ z0xKL&mH$^_|LzMxSf#reUBzF({yQh?nW@9*DXIY^ZN>e^4$WkjY(>OMo7q>al>@>5 zaPg1HQ`WlM6D2{cO0IX;HgD|^Fo7}~x5J>g9TrLbx-+y}2l-j8?Zu<;0sOb2FXYB< zcjd16yScEpdrJ|n<^~o8P>_5m1Gd7Ev2NG0`D1nbd3rW9Sn-cNMuso-dO(=pX&4PfQLR3`sdx#k@SSj>sv=M1)wv z-?N^-bvjgRZ*zHnC2oD*dD{lSJRh4*@C0Xb9`RO}bC%8DzqMcZnvC#XBYf#xO_1Gi z<4GUOXh!o@lh}!&?K6c=&6^)4sT1l`MnOSg+<^GI?vOT{7GuQK9ezw%1FHI;yODLD z@b9WQI+8N@6n9;Q5<5##W<@&8X!N~R3fXy`_N^~;vuSp4Rh3CkCL{CE+j&dWMl^Bz zS+OPDxjSFaP$*iF*HZ(;L<84DE=wcguN~!B&Fk$lbmmcREbgm*iTGcI;WkT>%tQOU zz08zcbS>bLEVe$6GB2%h_RNF*C(0JHTE- z<%OT>C0>PADs@K$h3ChG?Xbzcqc(oHayfJ}x#|$#WGmq_`3k`|e z1ngsdDWpEkODMzBeaQB42gnS&q(OPI-Vz~roXP~f-rktZ(^njgsEU}^uKcX_hEAgG zZY^PyV|xwDb9YLw&Ww|k*nb1;u5Pfq`m?R1kuELYZBaHWyAz)SM(YN_>yX7mg4!9; zvNi!a`&k$2`11G@Lrp}c7Q^|TaoRI1C7&(9SdT7ofc3TN&-!`M@(NB;Xz{Xw!q{nc zRgqn7@KKQIHNDU?4>rOd%}(y$z}CKB+7p5cX2p2eT?=YzO}|1#yT?5LNAa}yU;-Y5 zkaHT@&+pK2+?F337xdmLIbd(hsUWt`0<_i8LL!$FhnkH9;q>M{Tdxaw6e)11#hoi^ zVYv|A_LAqT>4#j&jCkdsNn-W79=(4nwBr-`@8`2J&pc$c-$ zTR4yn1W)CO#;M~0Mqd9RcvAeezvOaC1->VZ;~a&I#leM!k9_OlT+;{D&yfnS@A}rA z!+uA?8D^Yt#>Jk|sCMS#^3jCNL`Hu8P;;X#vX*2RD4x>Lcl>O@yPruOd!&?MqN@t; zi1ZYgFsyd;c9Z4fk5(K|kuA6~(T7P78lqRNQ0b1N8awb^`tZw9SasfT51E~kpGACN z9$4hOro^|K)T`RlA?-NXF?`3ZatAg|Oi=5K{>aUZq|H3+c=bJI(n&~o%+msKmk=dy z--xZaLxSX7x@TS-ez)6x{TOTvTu){$|BLI1@zMBmcSfhkfutEApjF7g=2$vn__^J${H8zj1{TBu!b+51jabE6cImqf1}w<#JqK39-n zrlY3Qo)evG=ic?yf~g+~vpNJ$P}=48%$AN1PaE1i@IhRp@;aXdebO^RBWSr{_~=30 zF+-f+3n!t8o`C@g&5iQVyb@dcIJwI)e~z+1kD$$RJ@nS$zf;Roi;Bj%n@(I=@k)B* z^2=6(U*TjXHK2X*&4rTclnu;%^4AX7Js@p;n`2r>@yX&elU6o?aIFYzl5ndFFCX?n zdFE6L?7a4=5;>MPp!SfesV3Pfj|kige9ePwq+ktfN4eI6rM5g!x)FGI-oG)Kt6v~z zU&h%yxHUg5_95x-yX=;?_bu!7j8c1Cxd?F7;%{odXc|a)?6}&Tm}n&9`ZxL|d+O`r zQyRua2O(_EuJ0PY1`-#UIJ2a7`SkOKZ5f>!hF1R5%@SE$Eh1z3ZY+jSd@e;^nE-og zQWLYK3p#_>lqOoXgJ)bhXqt0zpSkU=Vg07XhuPtf9=3!nki;Bs(|8a+?Pu zHN+*R6h-Y{3Qce%Xlo_QK*NeknCG8lOfj96Wg5x_?`^oTGYSqKp3Uxjwm~@sO`*!o z5m<(?2_?jgB1e=~jkv5_4X_T``%?Zjd&q&bbwMk7=L@9FhY0IhtWzeGMGMovFL_f- zQCz#CphAsLB<9yf8}iU#B1GSmWa$=v;6xZ?q?jTH9cvb_x%N29zAo#+n|n%5$>UB< zfpzwQu2t6t?O#ol#deR>C@tfZpu!ut#Mti{wNM4OT3khJn=EBaT#G3DHFAF_;_q=* z(4)|Zfo}cws>!XX?*9`}uWF-~{}Lv6?8mq(Qrm2=n@82a&BO&9GAzR^t1jCF;RksQ#!gQz zZ1jiOSPw8AO;~HDm{4vJMeY&+fnbZKB<|Ex#dhDrc|q?pRM_L1#b~Me+MjqAdgU;h zsL-^x22Bt>A=H1$G32t3th)iD*1~NxB0bvHUSqi8!-(?43_2HLi1(!m6d%;O<%1Aa zSfeYh_~_QT@LO_yN0M~83SUuKBc*}6mG4|V3|ya!Z?mv%Ki5y z^P(_znO!yDQXhQu>S&Xxj|$I)O8{m;M93ahMEXjvu9a5S%#D<}cs_jNl+;7b3%W97 zu}Oy@<}M{sb{w^elQF|ELkU|uTkdLau`OS!DYRfok`-ZqoGH}`+Yvcjhir+N^g32O zV?~uH$K{|CrAicV`{Vr<;U)g(;GtsaA~!Y#-S5T4RvOW0mHR+|b4DQ4?!H#))2YqF zmaSd58~DjBR}IeysuI(bxArf!tL$uiE!I8*%MQW(e~jJtKh=K&@NuQm5ZQYa zQf9Ju3rWc4SRq**dmJ2OW(%Rr${vS|WAB4wglrjybB-;XBjbd8@6SSRHT;f%y= zi&uU8DAtK9-oT&wNUjRc5H75}WvXVo@t)WH?cakdck|Ky7)eEL%xvf*4pCuNw$xV1Woz_?4T zZR3Dja5}5!Zjm~G?qV_QSs$B=_MXg|o}jyGtT*M@FSKq%FJxY37X?lgB_p~bgd?(n zQ$=Oou-_VJ((`O>*OLn}mQn3|zLS{@)KhBgTTPtGdQ6+^9UY-h0C+d%Hj4;aKl7f2 zx%A1d3}=W3)rY0cvrvXHLq@Ehk9lIADSD{nJ|V#7*?=KNUq}ICTkk*ry2??bUFA`i z`Kx|m#AV^m*M#yr^%Mz4swB686AzJYi%=d2g_KcGCRK8&FpfuwuvaY`+M27d}vr%!i82|fMVyOi` zxvG)RKl`aJ{L-J*2t}aL!k-<0GmG73do7F3S~({Re4)B^MhR0!XYV7YaP_#`_C@NN zwDl8wM)Zf@yRx#p%YO`ckv(_Z8#*GSrVr}}1{jCuFGwv#a|C*`5c+uJ+ip-_c8}-< zl;pFgfvSvrD$ZnB9S8z}Iv>^L^3~RQLf!6Pq_t-6yZJ$q>oDw!yK#m$3B`0imnAkI zn7`I)Iw>iQAOR-6#=iSW;6;+YOV28Zr;0AxIU9`18nZ{o-|dE?GE9_wM3&}~rqT5V z1W?PM!|I#^W;s;uY_^;V!hqUjGg>ZsxSBLmiVU{-&8INX_ zM{1S$w{aiBk$vgA@|w~`z?%1%1qIQU)vLu@mljw9>(}!Vp@T2B#Os6u#RO&19$UCKcg20G(W94$;c)%#sdwRwC;e6POIE&RM z1di6^V{RO(DFBSg9dUH8djc;h{}J?XhAr2BOIl}!IL!2$sg4xkz%bjKZ<$Cy$wE|x zu=eGEQizQnso@5W?WYGPwCemU<0|$%^BJ~e^RlgrA{SfIDjc``zYx40;Is%)V7evZ zna7MKU|_8G?DPwFapOLNJ{P~|>$71E{7CJV&N_eSGsZGVVYdyvJF;U@pzcIBwhdy! zScIb5?z7FcUtro>&J2ZG;f~c=I!Pa-bl}%GyScujUvjQV1IP9se;wQJj{H^%(JRI9 z3Ky;FWa5_W_uber2f-sB=>%jLR+&Ct7V%DxSx!9Jla=PTQ$Z{gpEqf!%aeP-$Zr;O z89Sd9^6XOK=nQj0wt$v_bNowyTNqQ~yau?1pNNY52Df`@aJvG-r;4BH;(qGl)=gj# zYHrZ%{=Fd+lDn){O9Eu2vb$x9Vu{HtsACAUX=S4j8I^lc@5UjE(e~Hf#Jwn0-@<9H z3Xm{2bO>YnF;4$AqFrh>PGfGkl3xwD_!2jw`D{nKowLWDlxFU5pWrg_fpBaOiz!O2 zY25h{N~;A*Kcz(btmGU$T} zTwX?zY3HR?16$7l-qw30Yx$WPcUtA8JB4H6PSj>l+AmJxD_ct6{J9$pk4IQeTNyiO z=hzf2%f<5f0!@kitV-L1!^bC<^150%}}Bd>3X!L3Zot464ExSFWO zyJhyw=3$#)5ajCNgDA1C+g4}7EMBU%O#yeltFvO7RFHw`_U}eUt5Z4k4x(hXSM6xH zf*Tw?kEMt~@zG;}zeqxY_O>2WHmU{N5A_~CdKulC1Wdsp9Dk7*mL*iG_o^B%5;&YT zxNhitxTmeHsj`*#t8y|02jX^V?ZmQFCAPr5*v|6MHNlOA=9{vHNSAlPksEr}2id`& zccF3pFA^yg_#B6X%Xo_V*pWdlq&#nAW0R-Z+A0cKneNfLrYTP*o>jJ%dEF1}@4b-X5`fN_?3q1&mUu4;@c4|C9&d|EE{saGRgy;Gc5$fL4(rUANdV}Msd*F?y1 z<%8Jl@gO4%#Ro&GkvzqNUHYi`EUKBKTQzu^*;9EEdeCZ?`vF&wrQeoO4xm2IgI8?q^w&T(+sdW`uJJm9vJe)He-8c|6}swF-2v(9laV zv^KUS3l8JJ(M+TRpK!F9@c~?1DSG6YmcXq<{;t_N?q}E`UtRW7DV>FRYuk4E6Boel zS4_&$hQM~4Liv&;$SG93jL}Xe<6x!QV5Ij6Q*(Ei@)YE-_&Y~0G1#w9tefocX+6ok z_}z6Dco|=ilTnv^>?ihV6t^F~h@Z`i$Qj@s6|%N{Eo-%O5m|8HaqMB-#m+ZF|Q1Dl^vE-=&r+>&@Z(;YHZliEt-5QwtaREU0k8#6A)Uy#7EK%QG5eCPWBhByDktIz&XMYD@glp^!uMKV$s?X9+2YJ$j^3orS=s zKi!}-go3=&89N_5u^3rEEJlK3-avc%CS+@bnHDu%v>;e>eAvhGyt=$Kpwu6JqF_Xa zah>rEj;yifjaET4$m%$`P`pV?C2scmQcwQUxNam7fZfL^4A_OQZX+-;5i zm9mMvpKL&;(9iRoGj;`k&OxmiLCMwUn>y`6qA%*n;!>*%@5;mfq~ytbqg&(Gj})?oi~l5!JI6x)uZd&&K(rIRgMvuq2t6Za6r{5)N+$B@PvUr@ z14e3$Llu27GmWdhGcO$VM-4^m4wLz1#Vxby3hqME)Y(FF+tXnO)c58Gn-pq*y;`< zp9f+&m?k0GVCLRA9hn!=)8ps+K5zwR)FH9a<2J!ShtX(#!Y4K&-(K5P<=j`L#>WE% z8$gDO-Qd$cvBD+f@Tq?~AUk>k ztBrlhYvVv}mdSAA?rYg{VuMT0bbgE8uKr+^c_umNTlbZar1aAd2c_6r27U4!yfE@A zoz-5qCe8fn`IFv}3L*9N&qz?pvAP#$N{%)@p6WGOyTFBF(xpsW`Zb{91oY~fRn|OA znSc;ttbOEInYTkOs>Q}Fm+)a8Y=iKWn43zCO9L`oG}Px>xjvLUY`lq$IOZ^dqzqPq z*_T~AmJG;^R1H`>_nso8mznY*C}EZinJKI}Jd=w1ZnjaxskzS>TsLVG+EYK^5wIcmfCFw%ZqW%=+9-v6>8b5UQHQr zz@-G5*SqEy?Ndv11oS1g>eUlGu*7L9^CAuzB|b=NW_!$B8@ic5>f9#~{Vqm>ae?&9 z8*H;*VJc;~oVE3b*~v+}gYR?9GsqzW}foZ26F4+3)h1H9kh54j*11QdtZc z=u^`R^*HD3xrwrJ(tI2o`>OhGu_E=(We0>$@m*hcg|C-lmX!ZLlE(ICJV4TzIrAMc z7kNQE*bwj!vFGD zgkSPcgdcvP!_%#7Gg&lrPzO07H)bBr;4fMW5A$>3?v7^c2w5n5@l4-uKT^)x8*Oat zn;~i-{v}dFJtad?aYAi=L+QM3bSUuAsAy|5wr&>fwQjlD89v>juDc0^f>S z1P=O59<5$S_m>82-1V`KV70c%K+Tf)BIGW)ZPv|+hfA174rq2_!5 zDWQ75tv;+OW|6q?dppO8k4^_N{71lNYtv80;ev|o1;UON!GjQev{n3wlqKnvTen5K z*VpdkuVixLGipMwf2t(bBFCRoe7QHw$vM9{ozW62U&IkMLihwp-rl+gEc+6HWgq%s zyXfh=TSuJ0!Dgo{kkGW-J|fRh0+xKQ5`iV3oo(u&fxhEDkoNoz%Y_7Vf{@WL_pQnj zVk^=J@v9Y?v4*av(Mm~|(+!A}CDn+_PgqjkgOJLjZmfOX;*~;Pt z-&Okt)6&w^#D*8)O&+$x`28@2tF}($?AOW-F$p}7d}OM^HY$I zedyWJN^j}dc9S1>jTZ-X+V%%??_*bw?A-F(6sjxmjN6Uv-X<>5W0zW}3Bv*Bjiyb2 z_fjLww{V{VQw2Eo!tN-{+MBK^e^C`qKK7D`jHM__1~UAqWAN+g#y%=3uy63@!Mi~0 zFMxf`pJogWrj~Nt*-+48?d6^PfvqITCkfuK_r>c##c&3ZjrTDu-Bn*{)y{DDuFTfQ zC&nplXhAL=Q%_dKSnL!_XIIzq3FXdi*P6_;+A#9eAB_6bj5k{3+Jl0K>%N{(zt(*k z3TsEm?c&77bjy^?3IA8(H-M`!vy$9~#TL=%7g-(2&A>kttjrS$1jGBWed;u->8b@L zy+fRy$j@|fT084UYc)|vB3M~LM|FOq>QLciY|r@#mf-I(t(~iRr`HuJbj=}nff9zB;lyu&S-d^F#=x+ETl^wt|O&+m}BxWAz+XMqo zl`cCNkM8_MLM~?@>AAPG_`xp3=^FWF7i8cUad8u>h|y%6hB&TuwIg)WG*KsPOys{I zXl|Gxj6*SuVt7LcG?pD7^e+UhR6p&_a7~~2eFl9RB7%0Zqe9)x_qVC^YFL3erGv;q zj|@s6U4xIWAn892XT`sjRwj#0w~>+$NHQj*pnn3NPyticzcFZBV~xMu81N>~C|jE4 zbkHB-f;2T3%cj;*-~4fI%IA4bibgA4ZD6*mDpDBjmEdY*rO!Rp6VtjA|`mWVpo z@lpkIyw!NL*QNBN5m*G49^G_sa>=t_RzFWJ1WxY^5=ESO3 zYEpcx%jmWX5;(39AB-MBfHIoXoSakLJ`*$i^uKbEdQe^%0r_~;gR#n(|1jdr)4{z5 zx7mO^xU{^y)D}>S#L_nIHS9>Q-v6o{YG0XryzwIyPz4hvTC5$Q<8z4St9AI<(uf?B zY_<(5e+S$9g zE#V#XMN=K< zyQ66FLpX{wj6`ZLm>ma>8D8c&Pv&XBY7uC5L3)i$Di^En(8V06JH9ikFQL~C?;tO_ zvjb>MtU!rhf5B5hG#K5Vpn0bH;8EDEVrm07>i$8EoE@O7dkzCwBX}{!6(43$jxe1ofedUQOan|}Ztj70<2NmUL^RtjL zBm9hvUgMXjMefa*2&Cn0msrt$C2SVO`Z)Vl(_5O$=0DoyOXoV%J#wnY8?`<{%AZ$- zp?5FT@I?_}iv$wZ#Fr2{6_YXO3suBEO(4QD_h#?N2(D(=Ela$p z;3;0rd1fFtEz(}YWZlLOR-Ngaq1gc_wCp^%^%qJqa%tqOym#kdm_HziHWjQ%(%=60GvTx~ zWF}TLae~!ZaS)_%Hm%dePNr(g8s6bq<9imtP8a0Zb!XverAHpbs>4iZM5yfBPL!as zr?VW|j^?2=F&zFwQ>s(9?532GuzcCJ;@zC=M{oGY-qb)-mR-~i`+TQ1z+Zp{K}xvC zAO~p0N3T`#b{+X=mzOesk!1Zvq9=)&2;OzNXg_Q>6*{HnLdCK#p&LBM`MkguG#Ck! zGder|&e}gUs#}ltstOs?pj78wth_u*4a5n#ahU3&!7-5CX{J-lb^*vUP#Uk zJfe6==A{+s8Hh1woPv0+wYMX*Q#E@T?XzfVal99M18{(&t@?!PCP|382;{a_fuP0!Zp7jX9ZMc|t2 zDRFWiWJFcm|H$xL6cX2gX~Yb_{+cpL$^VzdR7Tue$$xnk^b0t{=*Bxr22tX$rz+?2 z~H%O0%wfQ2ai%+9Dy1SM#i%%=b4r<2Bkq+c>7$3jod* zg+t_cu`q}Bsm$WsrffS;8peE^j5lGeQe89b=jDCJ21EVN;3dQ1rm7{S7U9$P9+#E{ z-C2l^AIbkgM;R>CXzhSzyT@_^;8`-~8*>);B>>>;QQ5rOAX87Vx#5aLipJulN0w(w z<)zkK4|MZy?re$YtQI(q?8N6^sX^l%S85~ z43fP8h+={fD<05Qb9_C{Fiv~yqnk4~`E=SD4xRKTX^(Ci)vPY5^G%X(QJTS}dm&!# zqb8~26aLAL>mDAyWHC@d?8bHe0K!8-{Tt6~sF63*oPpg1#rXl>9b}V&;zh{XG|XVVZ4DUCEE`wvje3;XI~~}@D_=j4AB<^KE4}0^Z;ASOUCnt2DMt}~ZGhC`)$AbC zs`l!>zpx_ZMu}Vm@Zd;jNZ=jmk|lDrkHe=>!El|n0lZ%s%!U5kaLW9c=0~F4cd764 z!nm$g2l!Umy!t#PDWp;dw^s}^<`C-TiulU7eaw;@Hd9h~s; z*-I}E#zLq#CX3OC;JAs<{4|9M@cE;3f`2QW z{q*)4Iv{8Z>DT4x!h5mo>W>Z-{a3}d`iJ)$hI_}qU&C#MLJdj?1AXe-)UtaiZ~MZY zai+W87ENbeKH@_Hx)}(!R08N`ldc>w_!Qg7`+ zjyW~jx6axG#z*iD0l$BI+AfLkX8m%#BCQV>tFA3992UBLx3h7FIk->g+Y`RGXI&AK z9-i(LDWDg+~YGiCpt!f!V4_^JtE zz`^$UgtmGg;|*?JSzjyhEI&*fQDGWJE&oGdA_bOzyWfDF)yeV?>t=fhtp5N2H-`w| zjx@(Fo&dNBko)asGUHJG!nJynWSd8y-XcWhHghCSbxF+Q?yjR?P*EIjBz$^S1JnL+ z6x9B>LU{%&Etff~*j*q;>4p`@b>)Kdrf05aaCfP`&3avZI`iG}mQOJ{jtbK9xUQvq zSOCrv<}9~Z8Ie1`Twvz1o#_%;Xr}$kVPe$M%2uXZ>oov`v*+21-0-Qruiz1{m1bHz zMGf%b0;Ou2-{*n*qO4CT01z$nFB0Gru(xQ9INpsudgAbJ!=nRJ4tVf15yZIJuj9 zUQZ{=vtmb402A$WMNQ_7^Tm&d>Jpfc0elOx>r`J+J_*@xMez)|tI0OmuU5KUNf2^F zI`Rt%Umz?wz1qv<5&c>nC;cqub1CCLrYXH63yd%$%J@DQW;a!J@1N5YHnPS_I2wuQ zQ?m(zROOV3rc(yZJBoHV!?DjA}vi*42N32_>v@&H?;O9!9=@u#QH1fmVKp~DJ61bs$<>>?8>5^p%6gi_Pq{&P2eKa)~xt}Ro zR}};Xb4x`t9ueoM+kBzRk&RZ~Xjx<97)b*e*Y_gQMBRey1Z&Sl<@j|Z{BT-!v)z8W zmLHy;D*<rIxH|oilY1Y3+%;@p?fGt(^w)$lPfyfafg^F8 zdF1X-Pl8>vTpvU=`QbFd=hGm2)Kna)8KGC0+}<$2riqY%wqZj;pPS$-l2BhSE9|XeZJ`8HG_X4ZF^qPIA&sY{-ypj3fM|i#2 zs>6FiY5*H(rCy-tdbaxpvjCB5=YB>yNkh;B+q56w_VX6YuamBV+v1RfXNsQcG%&ev1rg#j1n)L>idAz^}ku{vs z7jE>xvfXc|uh;8rE;xAcFz@PuNc8F33QtA89Mh#2>OLB(J~mKP#LggP_TE^(>GgD} znxQS3-5Kg^03DaWaeZy5n-f*0mRQX!dVN=s+Vc;Qq)dZQKYzGE+c7=fu@X}Z<3Q+i z@=UdlRP=E1ZjPd3@5o;;lU<(rfb*=uvT@xRRjk)Z9aYu2^)9*)IR^4EbQ zzy1-^VSW8=jvRy|rQrG6#3!EM|Ipf-|7h*GpQC}11^Rnr@t%w%|FdQ5Dlgaki&ZpL@w|~qH%<_QZ4GdA|l#x(Esgz={_Qp8hc>1wd!xMY7Uz&)R0uWPijzE7w z$vx1^Fw`Z=Pg|kY^^I6h#Ly>+Wj5J~jCVD1GK;E05YM?x*>u7R;&RVM?oIVtv!ijB z2*~;ZpY^Z@fSK=MT2BuV^{CvH6Me4Z3bsk8dd)*I8_=>KuqMI^`kX zT6X{DlHq|IjCYXDtWU4_T7LVWHz5lfqtZEd9x4r6b1qT^m(5J`eFXoYMvcZQ(&)kC zqO{jgWED94t)H1=&S`i0ZI8_H!mk>Ya486bdgVm=Gz*Fv7qEaxEK@RSw9@aPVykWbHkHve;DqJd|y-bdIAHofxfNCv-`n+M?~#xXm__iLUTr3*QG-slRrs7V5S zQj7EJ$|dJ#R`U#HeR$3@bsG071}c(&B-J>~Jq%lD$=JUXq+q>A7l`ZYU}yh?*Dn+f zcaM@cc>JsTM}5-$dm1|@xw^u?K$k1A=$?XJEZ-Lg;xtwoDFV5?MHN*$EfV|so}h-+ z>h9hzayIf=9bie*%DaN2qM{uyZMcgmvSREY`&|tC$Jf=J3~II`-pFn;(%G~t+`t`& zVkbR>zcmnDE~XZlgB3LsNc?aCB`WNc)5p+5){<>5F~t!iaETM_0;1k{5Tw_{wN}@GhMH& zLJf7_YJ%WXw5{KU)6B~U06txq0CHik{z9s>!#WFhJesxF3Pq5x|}bK zyafb*x)8yhj_H>(l({xXV)(_mS5OzXqSf*XrMwjhbGD`({I?Ta2p%v>5=a{26U4ZK zS-Iu?>Qs2;@tb63Ns7?`S)qx6*AG>xUB2Cx2apwCPRNRjZ*O#ofMxf7s^h6)Ah@A& zj;`mDgR!h{(V(e^4>znX0OJ(58$df{tm*fx`}G5=0I!-wI(8V|%=a%6-~(~+xLDBa z-8&3t7Hky5#XsO3x&VwxV1wr2$khtNr{~+qP@Enm3wX*b?v``oYF~XOF+b zvE8SDHvf96)}vw9hQr-$AtG6^dO}ucRf+rW#rXnZJ*gq&znd(iJJBQ%=x=N4)#^Y-^aYj6xlYj z4h2bt*k3u-%09*ieK02M&tTWgYTMtLn-I@he4dF(ij~6oR^46?kTrwPow0W_p0QvD9Su=9Je`L)dQJu#$S-_?H+HG zQySYfvjI_~pK(r|EPlMLUMO~BV;hI$9}CuJ1KBDK=PpA7e9>_Xb91Y$y%YMvq#ftx z?^<82J^<$53O@(6R?q|x=)YcO1qAwi!g2+t<$*x|-OuOsTxqzXUu)7ipeb7BH(0bs z^T)+%9rZ9bFP4nEuqTmb6VZM{OEM5DnY0|p}`FsW&EJt@QQI~`5CJ?nD&=u-lqI^0+cn36wF$o z8Xui7V0NY5#S4cDH&d@1D9ydv!4?}` zpq&-tEH|BGt$x^Bw9KZit0#Vr*v7;usDwczOcbN`J{9Cj3s*It$?6pL1@5-|em!JpxmhCP{@Hce_$oH;^e|Ic^ z4uH8iZanQb?~-vTp}P0Olhba|6ntf!EmW&MDEM#QWiy8BAG}Mp+kf&d*5$${mE}%O z$v>ffQaU+y>2Y3yQ62&OG1Zs$z<N!19V?C0`R?~ zIF9fmUMJwas?o4`KgFO{Lnf}@L9oN(C>~hnP_^|qX6EGq1jdGN`$1{0n@j%mY!&{^ z-D|-$T)-DdA2(R$TC5UM3(YR-&6qfOu+gMFngCa)D3t-V(r-{ZzxNP~yrY_5%Eivn zTix9~ith)}MlIAwp2vKn&qswaBzs*uo?dLqCuH{cbFZd$Bqvu+-}mHBWeU78w9V); zXD79hZWCF9&G14xuZiIwHC4&7o# z-N@LP4gRmwv-Yw{AM{O%GV+4@cM%=9;J4xMLG&N-V&>gQ%ZUDjH-mb zoBXK|HW*>o<4BJ$owXIh|#aJG6M!b&dickv` zdh`?!7&EqyFBltU=1*)j8){ zt|fDTc@e-%yvl{t=+=$z0L+U9z`O*$e@FMGj?0d7mr+P$B-2-~_z}1vr^)?RVZYjC zX7{N#IlKB%I`vKaBfwoO$&{+C9tbNTdX4tozxsys2buDGQ?bSUPiVG9$3P2Ek1LBA6qoepG+p~=VZwe?4jA4}wKxW&X`a3grN(<=)3GFl z?sLp*{kS4TJAR73yxNXOYNc`Lp;0^;LhYOLr!&e!BLMsqZBu28)~%>t7ui$!V6TW4*J zA(>s%#Ofa`on}f20uyh{a{0)+#HONj5?9te79NM*l#J3}R~Zrzn?9FeI6Zx@yp&9X zgzlCWF^q|tE3CezS3F*PeiRrN{SG$346}n`~{kzVeB9LBs{1Y0(H}J9WQ3ku=SF?Wp`v#>ai>#6;H1ed4=~?-Hb??}n zVdA>cyI*+4t4DF@{f_ClbM{lg9p%JTmIdeX$to)Vkij0~&V9(8v3mlnvVPSuqkxY@ zW!U2}KQ*u*qF$i@tg=Y|O|KxXvg&I}vjX32sal$zC^c@4Le0?ZtXBZ8^z4FBx&n_VA) z&)WMo-3I#nUNaFKEb=01s#0B3oRKF)7|aqgK|TASG}uz1NnzMSOeaviQ&l8v zt%Fc!fHeg8=xoU<^HQjF!K{gy_jtuj2S*RUSGY<^3wG}U`EgBpf(>E{7$5~e8Pft7 zAivnWjG{RK^9J8z^T3|7pnu?CrYL<=`lf1Ngvj}Mpvzd1rK-%GF0~cj!O`R99l}g% zn0|fZp2(`o7FiW-4Khui(JH)BQdviaq@l5tkl;0-4TvIcMP9K|b(;WN5wcucLR3d4 zQ!RdN4fw@?!=h7^y*VRJ7gKxlvZ?MC#C%|EHt?S-95Nd1&@Vo#&&T2>R%T<mf)dVoGoJn!|F&*Sv#hh>SR`C9Ax{(a zgvNzq{e?PlKOf7>u}L-CqWXEeN8pK3H4?D7kA51O=)n%zpS2}CN=_yEezunPwyi?dt0Qq|LRB0O9*zD-5Z^McT z+Vk#5Za>BY5Q8+fAe-3IO?V97g!V|O!1JJoyo%S28Nszz<6f{jBQud+HacdR_5NhT zi?#J{(?7;o)8=Xet9`p!*`GN(6$YL=Tft74AOBmmIC8@JX6STkIrwDMMZbFx%_LE{ zS8PT*0Tr~s5}X{}Cn?fssH?kwueb6$frk>H(gs0Pj00Ph@*P}P(RpnO6*^|M@cl@$?vFbG`?Id_&&HNMERpQDd$C)1D;g3mSB_*vFY=T zQoFV!eJ`0?6!<2%m5jaBvJ|Q}-gvo)#k-19F|2a;YBf@2O*BN5*I- z1r{SaPtXgOHIapWm)Vu{6#hq>0BJNutoHBZZ&>i9moI{NoLrAk-y2)_kCb^sn)$2a z=cDE>cf5W9urENg-;ZAs{fZb|#vE?k*I;*;`6_prLh>0shlKnmWnagAnDFWKO!BDK zsm|EC_l9dS(J3$XycnqX;q`QnL%OltG@Z6kUc5?(yH!z!!Q-&i-0<95c`m6|PJp!d zHLGN%J6LjN7yvu>9{!V^d-L%$>s}nTr%IC@QSz3g?zTVs0=C%@cHm9sb zl#8Uenq~BL=UV9cetIb?U}9xEt$%cEA3V{CjTjhAOV;;{$tY=I$cxfOc4US7q(oI6 z8f^-S(B3NI5`dg_X*=*85o#8cUq&37lgDuy-|gKXweie1hYJj?0^4~ zJJhGaC$%rm9GCtV$@!`#=B@jcX$J6w=aO#9YIJPA@S|AoJpapMC*HWh%&{O4JDN|(R!AFdwO{hK?+FO~De zzk2WwoTxl9p%a?1A(%j))=l*zRQGhpsld!e z7j1K>;h`5|UGp;E9nP9XqdPs~0T^WDkzmp4o{O!|3s1`%r&VhR(`*j698gpZ1cSUu z)QUch1CEK__y?yBKkwU41}VTv+FeKGa*w9BP&6BJsB7z8mC;=>GBO)ho2m5Q9c|ni zTQeZIU}p_faN|wcMrB!c1&>Nsu95XUt>yJHQ%1>x_r;)qw+Dq9-6rpM-qU3_YG=VsD=@|HljBoBmh#ZoOw{1Y3p$V$+`2RrJHs{I|CH~ zr2LbV_@wkMdIH-Nb$$(Et2|-Ieti0c)#|ZWT`-0|t!%QJ{=ZB9S+Pe>zP^~ZyFZoZ zdR=Y+C4UBSt2Q8-)f|r{>|StB(|Hn>V{(MhYQl@rhbEB3gIaj^Ue!LmRA#2v9qjq860ns(7Dcar7j}d zn?w;|Og80kecN0MqPf?zOu|a}ly49y%|R3mGFh5v?p2H|-V$)@p?xY>O9Jg5-Qjp$ z3_OzPFs0u|FNTEzx8U~$>yJkGVg@t|KRV*=B`5IP#|`J0Da0*gHu;lmlTxltpvJ1^ z5?VUz;?U-iBep2=CfsLB9@XjnhL^Lc{RAs)aSH`x9Kc|*jY@gT6DIR!JNPRST>c_C zwZ3J{ej3jZf+hr%tb#UQ*%g>+LagD*m|MpWC&_v#?`O=)tE=PUIu+=@06&0O-C@|~ z7_cAO>fIH9`B^*m8Nb+>>=}Z(x(jo3!e*ycmidz( z04QbQ`gp;SF22hD=9rN91^OFDBgvOup4F&7PFA>TXx^7UZMuqC@hcj)c)Ji->%k>= zl=E8t&iqcXzsOi4mtwS4(=fmpD|CFOj6cKoQphcqY&h?t$S<>1vW#!6Xe`9$7uhMv8Q04@yNq?nzl#4TAIihuec5tu$6*Ez=saWk%| zHf2x`>*0FI#TP(D3e(Y~B3L?wOerLKWgDrMd=-1O0i#a2X!5NM$@nCAA~4gAyY3mF zi5;IE%}~#8$1eqnq1IF63u zva=2~mCDqzQ6YQ}UfS4Us*f(=$&`kUE*IJk<{7KGxCcz!j_KPei3>gE`QpCCv?f`< znRYHae=xt#5xjKjbpu@+pAWv)pLe{_fp}q38Yb$PNiVi4)vN7O=21B7I5wg`Z7}>Z zK7uSdUqNBSqtD35@qMH58>)pAJ}B`jEn2`00ITc9i2<|_an89uw6GUG#Y|1~zBKPju znM;Q~qX2WEmQ*ljj_h+%=$$rMb^IaM;zzMfTDI#&0|%u*=f3 zB{yy4$VIsj^Ah@gN3Lec9@(x*3(>hZ3g;(EN#9g2#L@wploWCp_D9>XowtlN1D;#OGPaYeRDtPi3<=pb1yH$i z+>U+l|!4hM8GN$$is~%r|#TM z#_Zh5Q`M!uk}NGf$c346LxIRk?vLUmKwy7b}1@2RLT7u!z({Cb$t2CKRE6O<8Wte9PzL>1@c4nkR zQBUZm(=zaV>CL}Lk^>%f5S+>g_Q1L;`p>$nC-K`p75|4fGH*FqR=^M9h0U}wBM}CP{X*vtqTj)?k@(Ro=ecTm;r4{X zuKm=wh!N9KFrc>HuQs@(4KX*yHD_Q6Wx2x}EtSLf{vxq?a52Q^soz;8yjO>h2E1g@ zEeDkQ-yr46ACS_>sLZv0&h*e$ooIbG3y00jc;7)>iSZ;kM^akZ&dxVl)?y>*_Bew( zLGT*Ci(?11>GQhTmzqy#Z?L~~F*K(;QktK&{9h<#bv0fh*bm2GQZrIw8Dy$($-?W# z`c3cAn~IM)1{#mX)h0ob4}F0^?`(!d=`DZN%rZTc~9@sV(gLlz$))}wax z>*)45mdS;2us!5M{H}h&t#gY#$WnFdiK#Egw0@M`qQ*ZxVY5G%3$&Ez3YUTR{ddm( z`7;@^3}+uL76+tKa6 z!k(0ccWcu>rX$=%H!)8e1Zzn$&-S;aUjLzmLQR4dAN#{~ObDh5Y4h^3X6(1ZbX+*L z1fj17Sn9ehUP7>B>n7<2kKULIaM$_e`r4Iss+(IM)8)-leu12W0dgl=y;r@>RIF^X zXS-qNP*bm>!G{ya9*6@jEn0p0muk69E&02Q#ba%hp51u$cX0%GjbAT`z@_%1YPVR| zsf?enNOMUo{0tbR;|TI+0hvJ+Tkw~=s$L?mPLnE3IK5{q5q{Nt&YT{SrZxN&{{VC| zXmX}7lj~Z2A>vf`GLKB=PfDjZ4TVC+s{}<;P56^Ail8DOWxO_G0(2m?h#km%pP8ol zCgHZJtd4ah{F#q}x1}$MQX*;RVsH>`N-A}ZFwcG~mcpn2&iDa&lu`!0_ZbVl-Vc`=nD}V3Tb#M2zA?g0)3SKdjTk%{d=>^;6$g;BeSKvpxqooWHw1yuAw} zOI~1J+qo1Khk|0Bg@|TgA%B|k)j{yN3`b$w7#X!o*^EJY)ZTqn9B(e?_@M_h@2_{x1s{_Q zdBnIqQMWOr|1ynu-QW70WQYC7R=Oq3f73wIfN-$(bh>j$cTr;$vpGAmIAY7g@&gDT z&iOvU9mma=5e$=uW{a;Uu};T6doH!RaPT~j&;b>y{~U!TjH_`wTN)|5#ew>ozPR_5 zh08pTO%188-Z$v6AL)#HBMT;X>pI1m^h;r?q9Q7EL zY8OxmA1s@9($|RrO_~5kegRv`IAFnwC@CNfry(c@h_T?Ey}U5`OG@qIS7ADUAYJFRk~;~OvBLKrb5 zj1ZLUd=06kta_zVo(%MhxhfK0BQCnMcDc-@pB@1Ek8mKeI^j}y|ALIUL4N<|D*K*3 zBhyECvyI)ADl?_5SE(EbAV6`!VV|8da>3rk)sW+p{?}zYYCG(S05J#-cgHzo?1eeI{%#tM~3bIqr&08TH&;Rx566>P=9k5Q+Rb$znlBm z{)pR0LW|YBudJ-CocPsb;j7U8R=;m z-|<-g@Bcrp6iFenXCY;0kJG6VLI~Nbl8iHCuhYuPUZKpg*NJf2D|>`Ejcn&>@AEWI zoIJmeQ}uejUhm)Ma{2wyzy9EIbR5U+xIeDfyG05@WH-foqv{=N6H&UY`XKHDWW7FF zJ`-m9c_?$X@SuvVBzriXWIWo4wKvbg2_yDH@boNx+NBR*JTF|!ZoETTz@&2J>Ah12 z*u9b5t!&F0QFoC^rE!x9aELz70SDG6(~XEVcp`przcs=*T`3;1LLttF^jbv2cyVwS=?YJHXia-U$4s6rjyf#~wsFqa zdc-4Bp-D($KTHUav*u&8Gtlsc!!{m1B4%?Dq^qQ#ZI=CFCWT8Z`7<@53-lb0isAK_ z#bQu?0GIB`_U_%NfglS15{(2qk5A)y!yoa^3&s)6fCA)Q4c*G_&O~P`>B8N&@ssO0 zONng*#8^hfSP~HM+{?9_!!u1fGd1x+Mlcp zJh*=p_Z-ZFz1rGJqchlvht#!j{9*GaBiC7j3`|4kFaer;L)5W@Uw(wHDOX9-(bKJX zSa69b?^7+iR3R%z{~>rUZtq#UH^h5)9Cm*D+TjU@4cq(b3qg_`qru-#X`5pq$Kf+<@u>F_AAE_XTnX&M_tyJ> zWEt6>4gCClSqh_d%OIK~zUd>Nt!+lu6v+mk5r?&#@C`e;LFG;(@rYwbWxx3&I-*Oj zDb`f1&HD;VT^L;Y&ho)-gfuw^{!pA&K?#=_d<~TBXnZKOKLU9+XH_fMs$e zkpWHE*J|`ap?Y<|MCvdXs*7$24u&U|`D?hx(h>|1zK$nOu?Rr;LRN1e*I9wnwjp2-#`>Z_N#lG%`%A0CuNolX=6)Ezf|XOx;_F zYsAVn|Kh{%+?)|QFT1Q^_ax|mA(!Q5odMo6V}#yHony2M+?fL9p4cpKuyssn+xgY1 zw*r}wbyb>xll+sY@grH!V`tgamskPhq+9TJhO`>mFv{lD!|SAzs#jc+eOuqqy&&)e z6ip7Z!Lrx($!XT40^vao%rTV#k_pemD8Yxl-X(TX zl8$24bMw@|5RacB-n~50n`9_->EGC2AlH1554D(++%u&F93D*}uZGLn!qsmApNw?V zzu8Q>`683HFJrxAPLbGLGE&ty-xo$^Rkzy5$Z@1Sn|j7<3@@7+#*9Xw_bihXz9QG% zzgE|khkE9v;Sv3L|ApvZ`4CP18BUdKr*F`v9C zBW_)aLq;Z|x}bVrjER+avwZ2P2gm6a{zK^JNR{WefVi%%=I>W5GjZf|iyWokiFK*d z01`5L>zI$GJi#+;9s|WrLkTKoI zz&8urvX^jT<@M;x0O8bDG>b@*>=!+HbB~ZZ5Pj0ziyEM^mU_x^H%wm8kTG7k?X|A9 z#0yELgCN*-1M5M;&&5QL%U>Rq<*-C zv{>19>3_i4pZOdQH!-oJQ@n3~1_|YJ2H58CO}$r?{cskaj@%|tEx^uPzsPJJUbJX1 zM=cN9|K3j|vzFc_duae^tYagqIeIqr>K%)UWecw6sFZ{)UAdnkO2m911Cf7}coSe3 zeX=O~ac_c0$?&tuJ$qV z=5nXijMXYx4x1GG4J{fCBsGeb@2ua*OP(ax$LlfC7`dZ|JUSbbGs-p zmJ92dgOd$zPJ&J2!bL+^1@k~Y>DJ3l@~|5n=?7d1VxbBVxWyMY0a{(~ zTYy%l_#Vvq9mRSD;!$M67o}coj!#1{~*t(ns@7#Q#`km_;>=s&-ver?)4n0{2WWv3{t; z%mzm(hZ>LXk}^36cZ&>!lOnT5vyDk;3?&w>Q^ckCI{HV>z@NFqf2yMn_sacwVs6EI0tV zfQWKTmL;y(zHp~1Ulm2r&CsI5T%^R6M-N`g!rG%xlp4`G`LLOF%eY5v?SxeVdw5L$ zoarSwR1@9oDg`#sNrO6WDr@Ji+fL+{d=nB5aaO?&Y2av@&bNnSEzV)-rvu5t54`vH z;U6<5Y8TES{dR^kgHv+IoA%)FX;8LDQN znfod>l#;S#Kh}hK`xm+isvRzFNPCS)4NZ;Z;2g2BGa;t5BIXL<;ZCs zxzVih@+PZ{pa&rAm2(G1KezjT2FP>SjH<`EFAW~2R5xC1cW!g)5Wqg7oS6~07GzoP z%Q54iVg_8*9%BLO=hce3g^KF1wx{&A&!!rG+~Y2yWxL)?v^tx=W{43+7J;b~nA3O| zQiLBA=Y1elXuB3<8=P{$+#oqMTu+UR5C#l|d7Xu@5nO)AEl@m5){w)2eQekmtfF!f zQuBP(%LT?AkHn9Up8aY&SQz8Z%3;}L_YIsx8Qz!XrL(LteOkg}>r2@A4?*EXsW-Eg zH}MGWyv{~jHw1X?ZbmSEj`!7wXMfLJCKH^^at-SW$XBV0AV0BRow|8#abNAYLqH=F zaLgmL6nQJuwC_v4Mkf<>%*9#}vg`O6tFrjd$fX%dC`ND?d) zGdEaQoY8-)!JH-pvwS;Et8%?PVv9DuF}e7tcR1n~v!YR~)DYm{!qw`ACd$RN4X!a} zpF@qE*L%eqp1vKnko0!l+Y>KdrXOkfnNd92-L41>kJ;OA8>G&etIMsaqI|S1X->&s zFX|+@`h1FXdn0P5gXZ$(1%6Y<@$kL4wIMdj_N7v7f*0?|ggdk4Fc!$u#K14_IYu;h zlx~q3NRnKAvZ^oaMy@GKE@F3c5?j!L>fdL!sCsRlMyvkOS4xnd&WDVEZaN8gZmZfe zeTcAuORm2xRT|7euVr|2K54Wu&#K8Ns-0D(9Bm)CfOSNkeVvnWSvE>=bN;ZU&l@f* zgv+K~0?kD``YK4QcK1d3ACvoSLFMw4O8S2qw%^!!ARReJc0VoEJr}qb*^uSVHK?1` zj?SyI;Yx)!`F+L-)75H4_ z*V&5AY_P^?4kkFLp4JRNx|dlV>gqB$PH*X^8MkXmj&Ehoat$X%wR&H&QSAI_8Mof; z&wssHgJFL=*6sLJ7WNww!b-L-U`CdK;3d0|M%2xdW}haknQhsDM;@P&h5TG9)V*O4 zx-=~hhoe#|bQ;54XH~Zcp(dqh`FOxT!|<_>HM-Gu4tyZl{z^Qk{<0&wN`7Rnwy|=I zXs@nPY4@fd)kGq?MqNldK=5N5%@2t7EM~MSMOt+rSK;RXhEy()y<9#$CMN8^nh71 z#Sl>&d0Wxp_tKUsl*=z1BF$E?IC7xC5CHWuIM=iN+)A=MCjOQ&^-(&*o1ku)E zV?lZlhzH3t%RIT7=<1-D^Im(|o#fU1h$#x;@V!o%`+nNqoNjh4Gc04dVG1?X!#0%j zKjcK}-lRwF@oiSo%(CdS8a zUxuq~Ak!35>1uNjN2&6bL^lc~-gl@MIV;GL^O57|dCK0=Y;llVJsCsJ?PrlRLism0 zvkVM6hHSF7%XFKJ1w6N*I_Rp_O({c2)HM_19*)Y3mT6{-Atc=|q@tc$&}|y*TFww6 z&S=I}EF4~s(s>{0T{B}oRkgr9!@64`ZG?U>8w;2xU3Tcc;}R=<&}S}>K34LkU2WtG zYqz9X0NI&yuyqwj_VfW!iZc3sitF+P>0$NHn^+IXnT4^qI*Dd_X|5}uma2)`7T{bP zI<3);UHxi?TnYosC+MaR9Ag=^QO_$siN8x0zXF2Pd`1S~yzm1880N-SHqDpAi7(gs| zKyuN<5+0C@3n#oNM8fs16WsVo)K&72K9pLG&VXg;89*xhS6eeZv$}z>I5)4EH|8=8 zWXX&r-v4c08~!&<@tX_7rzt_N&-#S($ni#v^LA+33MM=o!fZB%fa_&PqsQoO6iYb* z=C##XYMg)>a@uO+%dmmDU$gLoan6U!^z#yVnnQx&72Ai&z)Gi$U+G}~yV5~T@dXL2 zbU;DUMmN4WFGw?=7U?lQnC9cxoD0{DV- zBg7UntKJEh%F=j|<8jXh&@9IJr9U)C{Dk>4VO6pA?JKuGTuAKN7`%;l^(X+=1+BYfwt32Uh-V3X$npP zLXrX6wFHyf_4No?UrYjHveKinu1LXZw)`o&9Ys2s{>L*USa;bEAo@Z`DK>{s#_1#> zV6u6*D~PfmA!JtB9D@>cow;BqT;rR+1ebK~~o9?+eC%dw#BkGC8-0 zGV+{u*Hz`qwahT04cP9R%~O{I!9+is{ZyVZcs$o; z7-~Dz$+C$^<97it}cuT&|IiZ-!ELQn++Uf-_;2YM{D8rD>BBPM71=nr|4zmL~Fws*1#x!^F6I zmD&lC7QFA(vTK%QYUd{^?JCjH4S1g4ZDpoxZuPh$(t2`U+eV#UF+2LZ`Mr1@a1NfvpTn?rRQ-@ z`mcvu<(u%R<1Xt9Jeu_bNzPqY2T0^IRWfZ172@eDujrM7A5cV3&H4B2%~{ZaMoI!0 z#C;b5M-=qotQbDK5x5KJr6J&^aGcQOSk%e*VEHwmIoxcf+XF5GXT<8% zZdICtbLTzq^_a&0>4ELWz+yM6mI`=K!2M~I!SHuRW98OUctzCVxxc0{pJo7`T<-OH z=}2Y`F4W#vdvSuKqn-w8?Y;W53+zdCC|NQr87p(UMUK1w6JcKie177&kd%*9ClG_p z{}PdO9$~GQK6f0ZV8$BcF^a8X-b|x2LwpYxDU=CSNNss*fKtnTln?`GdcC|i`?6II zG5yqW5BlGa|O%ySj>&7g+)~oxOno1N$M) z>#$n?ca6bJ%X`Z(2Olahg9=jr#Vjh%`EioWT8#Yrzs@!CFZrTAfl`&}bJFBDlu%Ee zirGlr(kBsu%ndSGGb&6{QdT?Jt1I)I z=rzfn4PY?!TSU(^xfd%fns(kY6g5R1J>N~6Rg)+xA+$QXGVIN!WR6Pq^v_kbyQKsR zkz*<#QQe@U2(V>7dzEhB>UYNU4}mR~U3csS<^f{yTkU-jDut4zh%dM=6du$IX`PY# z0)SH^1ZCsBLmFW#K{G?cxgbqwmTq+H3QNrdzusSMY^+V!Pk07nDo&uHDE?~eZoXxu8{ViazrKUfF+DLFsKDDzopR z0&ef)XV1sL?0FAAd&(FLrC8{aJ_@Zf~H#_|EhVag)JW3_T3z(SowN~3jX zX~{rj$N?Ll?FN(DGZ0`e#2RKoMZ%CBB|b$)f}_(Re!`nO^Ak1cfjTCXwb*!W?1v%) z`$|{-%%z#E%Y=wqk>2kUThg!Y8(Vy@YP@al|y&EIQOrh;>#XVl-oF5VS7&2~=bT+g|pm6sJfnV3NY3ajt4V)6zN+8g?-xMEI zg1lcu-gWsnAkSC*UXf|e>oUX`Ski_X>GdGu3{$SIw4}R_S+7+eFyH-i99YEyVlOTK z4()8Iiqqkw-?Cnp$O&mH>eux#T&>gW%@l5gT6K+|JBs^0X}KuK?CP0bcSw2--f35RJq3>uHzkiNd`Bygk+3@CyHS~R|9?z}FdQe=-44ZP zeaa6X0ZfP20n=gd%K;!pIdeY04~(TX)_yWw7t#K0Is^^`qR)(AN9RIp;6T8N*2nr; z+2jof9K0p}QGD|GTgUvQjK?*=k^nUgZjHv9YiJ-(vaXYzVI{vG%qL}Y1r=>UeatfM z{9W=&&zHPbdUh9LjWLc;pKuT%f6TeKM(_MU5DFX!On%D_H63u`);puRnoBBbP3Ayz^SR_^*KAPY>pU6pW^E0j z8@Um7r}ASyPXI@>1GzmS_bH3@*!g{69e9Xw>;K#bRDkcskbMz{e$IT}>jsbAUURa! zwt~F~I;~rl{B8@?>_@tjVuouUVffd`0JolY^?8BkU1r_0E7J`y0}e9MI64 z6J;Pc`2Vxpg$DAmU+Go*hrnmfN%_xt06$B{MNAJ>iKUu)i8m=?0IA%8i&&}K8#!Jd z3sZ3y{B~!BRZ&6vo+iT!!|1YAPV#IJ+TlOiABHaQK6aW+p^?~MmVv}!w-F8R-nay@bgvJPPUbdI`P1cw z9*A<0yI?dNtZKkssR^S^kAWl;Y=YsqFIONDEKPS&$Z_+ON35b=k;Gp+2Gn{x?Ri@3 zP&s7tE<{agR&IxP(2!BvVRFX9$$) zV6*~ch@zrW{2;x|sU>Oh-v_-DApKgyVVex69%3d$3+_kLg!ixZ?BR;;2Pb_w|H4*Mf zLB(}?b6~vlnKaguyz>HSUx^%S75a5v3cs->kw~B|bM71la`yPugt5pt zSle_HJ5>!GoL-kqCkysExH~QkSAn7{m8) z4g`Q+Ob|^RTK}@d)NtkS$+yW{?w?Yqum_v#v)P(MP_21tbWxIVae6^t?t7I_eADy9 z91hPZ$eGv3FJaR=446lDR}yMt%R4~Zz_Qnusux^;WTaWuw zvyZ!;dfoc%DxVel4{IUGeLS3{{;g7DI9^g2hW-uGvD6IBX}K4BKx}DHjMGLJS0N#X zLB|^n8?yH=mysNYE@#${Z9}yz>}gWn`Owvr3W3Vi&PV=^k#pW4;0wJGoJ!&BjY6yA zkFNZW;%odeUnvogevOV%!FHCD@ZqE6vhs0GJ5{G9l@07< z3yaW@(>hOs&Q=RVx{JnB|8}*IdyHUDX>%u=|9AEo_${mt3L+bHP&=~uQ-$7fu|S-D z?H##{QbD6oB?iiHIlv%GQ_k*snIeQS&X2+O=CzXx`eP>Sn5?v$@XBh0s8-IW*2gFs z%Tk{SBVVuDQIBC&MZ4IO0l3j8<(O2LsicvUAyu)hOqr$gtmgIMU|Vx?SH|3g^j`43@vwskl>#Y4b43i%HKjx%P}pw7xAuG8k- zbK@Q|?e|;F5?o*T#+a=IuCAL14mnHj4;F3bCcY5%in$i?-u_VWhtCCFE_aEn`h&5b zOWCT3?5q2ne6xIiSg<=fD*dah!8mz=C_WL@JN9?JI`TaBn`9N#^oYv+hoHCs_#g`` zTt2!m1W&fqJhBDFFsfI}N=#iDAjT7xE&1!^+)?YKABqG5cZ`c-E(RJKUwP5S@}P_L ztacOw+YZefd-ZQcZ2=V}V+oX$Ro~7ow?+`>XtLw;lCq_SS^i3h`O3b>o)+fD0FdjYlcdfRX{vHIAu)@a-8GKE2Z%Gaz-n= z>`m;is(WTUd5Dz6x^0PFp793uzOkH=20*bv`kjTZ2_2MO*mh=;el4r9vkPR#C4()R zC317^km`r$ug=h0ZrN^b_O(8GbEE!)a2@@;e}$vp?zI>d;15RS)-l;CE=EJc@NvT3 zp)A=g>G37AZJYj?ruOiIJa6V{Y?&;TvGIyam6gLN>}K#wR`$PEfZQI0LlR;UOYf=I zpDIP?uJT!iwJF1D_VdQ{)?OLB(H`sC>dij_varZ)XZW5k5-w&p)#c8t$XcS_Q-o9b z={!JY4ZFTScKn)5{3!gLjM{@cU!wqaQ49)O%=e`_5nvaE5%4bf>diTG5umvf0h|IQ zgdxnwYPB}h_(`+S03kc2dgiMSfB4GO2HD&cg%2fb-18kB&mnu>0zXGE%Ylt-mStHi z9OZguZaPnLP98W%Q;-pyv=;wAkzhOTSrfV9eBIYnA7U;ZcIfJq4#2X4-MEd3uq+1!4?$ldhL=*9bgkYFMJ5)AhcMY^&#s=+}K z$KG+OTS#Uf=?`bQT!%^VrXSv{_{F6vr4$}l>8<&P304&#x=p)k5ShsmX5j^TFZkw! zn;vfmU`k6%(e9p6yRR|;X_8C($Sm~^rsFU>eah%ae%QDb^I*OBVjy{u|t+(hc6* z9b&XMtg0fQiI1Md$HXVdANk+-PRGWIn5e*60AF#yu_dB(uRXUV0f71BUw}DGveCr6 zU$CvVynck^z-X*)akTGkecZ_UAVU)+h#6%^K4F+@jcglw%<-TTWVTn7oJxu!#fqzr zE>tL0sI;Aq47*x(Wlq5lvL98LxgkKAKj0L(JqvEATgj~yYF zz5TH9#<1vz^j^fPkK1?0FU?&`@5#fmD`DVg@O-No>Tr{(R^l`?tfiAZ=UtmE+l$v0 zF=NAink!%~zzz_QgV?AzRWp_x4+y$q@c0rF^Q2=HreK!L4y4N(QoL0mtx{17(Fyr= z4_{g=fR>T`AA%yS%Hnf~rML)QUxT*;Y+EKZH8@+qX5}H!^;HvAjLx@tMq}v>6yJkB z-|+7}r7H>~^!?HYg+7$^G9_+y&+nT~p|)rk+k*YJW8#h(LPUKiSAn;*OEWX>&O~p1 zmEN=9yQQ!HBJov2LDQ*>k}kZcEz4Lr8x+qCCWpr*H(M5snU$CQQd<%6>zjSnvVI_~m+0dG?S_x- zF9q+giQLu-!Zx;6)|3YAc=LT+C8aP)ZO}B=;`JhB+_MJG_ zn@4IH=vk&0S3M3BulI*}Tv3{@F?!tV`~71IdNP>)Bv%5Y>9*eHEeNCze2!`(?04&K z04>XiOo)VzeTqptOcL}8%%X27+R!GYyk!~t))ydHPBJTH+gZ@!XF=Rs!?^ab&|FEb zUZ7<`-t0w*nz4=;D8-+bzLYIZA%V43yqD$cmBy!DI&6JHesc%ej2)of%vc{?WV#M}(`+N_xz z_S&$3E25W7X~q9kR?0+$L+K;IKtJ{|Ebx-s2qu0H1~&DJf(PXPt*gR2@Fh=i&&JTv zqud}U7i!wH+UO`8vHy_4sbvkh1QvJ|qjtyLU$xGNl6%%Wqx zSZ`)zbJ0s1E<#-R>sJ7t#tlaYFIM41p{n|%q0yb`W5zUDv|?nv?B#D5s&Ro-iWq7x z3u*Ncc^f74t`VY<{ujjcIN%k@@J1-t981>x`q8Len?COK=%84AS+HKmNOa2PX87;@d*+X;%@U{f=q?v?Ntj(tf_UnM?OLw<(E(7Sw9ERtMLAhbeaq4=q?(IC%#(bu_*%e0t6GYV@ zdy9aN|kSxia5mka6X_7cqY$~*5v zb(W5Nbj234Kg3(d0xkdpew%4{)z0a*De&b8K$yRRjcWDe6Aep*r1OeRElV;NOpmq7 z(&|AaD=_?pP8p+fDR+uaon7089EVFJ2glD5U{+V?@gsQ=LfiziQ-d{ygiOW<|93`{BoTW z6rOhEk~v&hQMR82kC6NCr_)=3S%ziHMNZ}SPC`DU&f&?GyO+BO7uVbh&PbEnVzD*O z%slF~;?W9=rk9@@e#{3qIhAgYtw0oDcyuLv58T89`;ec2Tpg(`F&}~?tj;Fq)D`Lr zJe&{!lu!lOo`I*21D$E08`Je2GijfRnaSV!>wq~d4VHuU&8RoWj*WofFJO+eS4r2+3<3~!9ef$usS8`Fiu zU?T@&xy@7yK&Vv&W*)b$LR=|&V>*2a={P*+<=Cf#_4AyUF4VIa9g?fOzj$=6h0j79Zdz6$l?!k!No-OS(*o zNctt3_j9q7+a2~;3oST;Emh>`j*yz;PQqWw#;sy(lhTOj&B3=Nxrx0*c4Z2$rS)Qd zI(T?!E9Fd`t7}rpJf6h^v!5m~`>85*h^eE1UUAH0n6r|`is5aPgb!A@52-4nv?$Mc zuw2pPFMPQ3=UIWzP{&M?pN!hDhwi`G`6z-62nIH*?oRIqpuGaLiQD_b4lyeEmr#NE zS|u~0+eO8>@3`29$#)=z9aW9oQO2RWf1A_*o(H@CRh&%Qyl;mIc})ujwklBCs41R= zPbW1b#!pX(dULpmw*g-e){GW2sqo%@4163RtNf!Dy&ctrBpTY^=H^Ld*nfg=QVO~k z{O?K5Z82GFrOaV8uZtYRt~X>Vv0UuRU_9(jOIf+YNeI?H73DIN)PM z$PWks=qKDvJW2Vawc^xWUfz076C)&bu7whw_=0tIM|I)Uon609OygZ^n#_O1g^~sE zzuFoNW&BE|qzdn| zV3ZQHYF8{Qh_b*f1aDi**KePFGHzFSn&uA@Mb3U;2o7{+R)1V!I4#yQ-(9`4by4UX zvuwsp0*ZpF;`zS(fLWM7PE~{Hn_@x25}3xvM_o2Xk; zYnn*K*y50Lvc!CYQosY5=9gR&T|9A-IA8bGq>{@^P44rIB&gCxTFf-Zp#KdWU9D=W zm^I=f(UN(U?VC9b)JxgdqCA%XdrdOFWoe#IfJd}hNMhB2C9u+uybI6f^dr z-Za0+s@Uo{gW5P0aDo>9jx12H@qzgZ=&hbU*w(F~ILF6vuL<VwgXE!ER z&70}od$s;MvZ&tW*qDh~T1V*4OeBCV&jCP3tfJ-!GFm>T^_I|E=(%cls2oabqKGP9=c{nV7motKPV{?gylq&Au6psgHQ737rIenczPuW_r1lqAn@lyrF2ZZR^9)K7?v_vey zW4ch^U|Kxv5xO&U--m8|wfCxGUPY7re>tHHu!&#R8<|E77}viZR2$jtk~D*B=s{lB zNv7t$+Djii>}xP#5#Dy;_(%<@w?VX~}un!{Oq*zg-)5LqDdNXE*AU zuJr>QDi=n2rr3ud?OdF6`H0<{`@aAw z6a}sZltMV5Y26fMhqG`ux3e#nzk6Fy!<(X#OARXp|Dnl)STo?tGT`RV;$2! zR$e?9IP@H`BXNssuNBMoB8xK5Q{~B{JdLG^MwX8&0Ac{^$)!KJ`f@Hguu!e_;}p*?B#9T+X_I>o}bJzE*b< zQZH7$fM)e+MZ=hFy~Rs=mSm4H%v8}g9)+HsHCG;&l?SqkFl%hAm(XGwmf`h%r5|a+#o3ty~+y|BZC$`8@i|{93>msMI z1rtGWm|IXri~OlohsH1|qRJZDdyCa{%j24nH?0_?#r&K(*feYcb48v7+ZWsAz^q0P9=V& zpDCaD%EXg?``JqCv9<_u6F{?J)>!iofr=jhFBeS1cPmyojaHajvLeu~#D1#Z`9JN- zTXX~}U$pjgqWEu20ko_0nBwvCta%hwN+j}$rL z5_s2nOXUUGta9PpKLnI+<&Q@N5*5mtl3bs0oN(~n`aWPz-`V3{7<-sJ-TioTXK6plJvN=( zh?08E+6C97k3urrNlpCTHf?jx?Hp4#wG+j=YFZ=`b)bmnaU+1ZdegN4KLF0;E)a8T_$eZV zy7v!MAs0*U}5 zV7-}|gUNRN{Ew3JoFeIHQnS;y{swAVu0<-XgAbAMEZF7B0e_#=i^8lpLGfA=b!PTUz>UIH#2V++OH=9#V{90VfoB zYh4rIgxV^ukpAt2Quy1cR!_NW3~aTO@s>5?-^n_l+huKXN^<=hQ?&lC6G~v}4Vi}D zd@g-Ix#^qiNwNOgrmO-e4gV%6PO+|UF4&Vj#4$6%J@n8ra zf9As}y@}3jDU%nU_@A?uY4yw@&sy20Hn>*Ks}QQ z41mi5e+IyHC1AVC74Q8~(?OT0<9a>;9ztu!VTrLG4Ib=coTk|Q!ubnTjdAZ(*;+IL-6A8DM=RiNMkvAGf7~-sjt6{d zGwTFLYK&>|n#Gn;*9_nliC0)SqiMCKuI>q?nMY;z3_&p?8*qa%ZYb}eX($V*4wLwO zn{3@6#h%IzMVkB|@5{vy8|z=4DC>@V46F7CVEDEyeC^%-wk9G0WWiq2Ake-|;Rb1A zCBaGhWLlP5xhNG+JruDo7O$N&*m8_i;_*v=z`ay6A9dXbDp@*Mv{!wrE`W+-4mz-3 zOvbCJWp6z&F*^9RVa>yGqHY#ZDEkDBDK>z?U(Zjh?)1)%PVf~0znE8UTB!OY#rFVW zkRm`)+WU~rw$B2}k7*wZuD5Y5uo}!7qxz*}Q*Mg_P@NM05cr^)9uKl3BwPqN9-?H`8}AnR@bb30=#+Aox%IY3iFx(8mcY&6H-SbU_RW7XK^x| z^_ul7^{3K z!s!4Hvu(+%CI(o+@59Y#5RC_?E@ExUa1Xc{LyQL2ePXnKW~~A~rki14YYA1u`sHJD zW+pt>sTdwoW}sv;EpygQX~^>D3|Yx9`Msz#jn1PNbww?Q13HdLgW`ys*4Hr)Zp5G4 z0_Ka|l;@E;@i{Y=QckstWwlCB^sSi8nGVr@smtugyGa^KIg38KCxgxwnxgj*Uwev5 z-o$^cZ9tvK#2?2XihNldM64lE7u z;56>=Ja7jbM~#{#(Su4iB8r{5vWIiuW-S+Z@uXsbSk(m4A-;=ElrJBtSbdwKc>M>@ z?V^*Q&IKk4(x{H43cwXG8$4&Op&Usgm}?~|qaB~??77NQXj5qT_Sq2Ba@6z&(1a-r z70OiYq?H&hPseHptDRa8vE>~&ci)6w+R6x%Mq2V;-y+`NGM`jg+|xv@0AuI+5eE8%OZMr2e};Y*tNbTxNk z%i#^}CE_ZZcABOinkbx`sH_rTdEeP0uLM{s-|)T6U=b;*fYmiaKG`JIpA?BL{BR5~ zp2wPIii77(BY`NLl=KQzHmm(b>7yG5d6y$)3S}Q)qJqC*Wr>2tl1WB%6#1MhhK~#9h@d1C25U{?eAo1P{JE#LEN!Xx9i=tKWce2xo?#qbc=&50>C^*mSCD;kTmVb zFb5wGI_QWZGBI)sCo>O$8LCCRsZQ!q@k(~3DDF|}#1WS?SVE;R;=#bfhMTKNGjR|f z0PGq&+UTU*BF0$7qA0_@j>UaU&lDdEt?VL}2pNiBjc}_=4~e%9A~G^Yy!n*!u{6D{ zO*J$JtqT)Gs+LeAOk%KT9YlMu;@8{QyBCGNoV1a_<<2NsNvEKKLq#Pb(j=gVka}>& z&##~3ewfishoiH+LHm7ov#lhJ&zk(4Ei|5It3~l@>XxfajjTKKZR{zZ#6TsmetA|V z*GDTDNneWK0naIS-nry;_>jf3w$6r>y9w(Ivv7o1)BwzEg5MeqJ9;-$RRHjuV`TNL z7XUmfbuEJ9!_ZA_$7Fvs8vEyfXDR^jtho?Q6|-Vw_O(xRTeT{?iM+YTYN%C#0?&6g zx0<#)XK=3U{c1-5rg7pnW^vPR(R{B0sP_iVe*4Xn6++QhcPPu{n8^x`=aBtA+<*Etx{gY5TU z%yu1(wCTw9$QX<4R_cuhpKWDB05brtlL(|#;Xd3-TJTwgeJQHGA1HPb%;92V) z%xRgfGTX^Ect3z2;0Is{PQdl4qvP7sXwhfc`RaK7x%cZk651bMO3bq=5B`Owl>*Q- ztpYqW?RBaOkEy<4*;qNkj8Pf0amI`p_E`AF;d&tq0HD7q2Xnejo>8U(R;I)VgEzft zzB&<6A-pyKBBHix9F|=Xx&ivBni@rm5n#roxOCCy1Bz~}nmQflQe1|f)r5Ph5x!-7 zBKGsW{Pd<7U1jQF)%v$$0DwMHNcS6n{${Ke#^*fyxW4xvf}0@ELbnW3NW`PAj_9_$ z>ZjK;GDm^ZD8MrGw*Cq*oG9t8xRz9d@#&}~|3E{SZB?qz@vh)zxETi-+`x_!`{o3h z5NG9x>=Qq6=(`I3!gihK?kg>R2M-F5eJ(#G&Yr1~GavVCrQw5$)t`$xy5&kIGF#iU z4QV|mN7QGGz@uu-Asi#jQp&3|iF7@Vx1Z{qB^az62C&b2qb{%0?kM~*%=9BVJ*LpK zks!$|EUo6y@(^sPp+=T>1N{0}N1&CJ%2LWALX@%3?y0{IBqVE40!3UQw)+MK~lGXV5?fBJt(GswfdIT51MZ#-fA0Q%hJ zhka+q?9=C~Ty&Fav-#x?|4K6$4tb|>du6}U0n#Qt)bw)G1nA4l4+?bz0O~GbMtbxP zRyWtpYAzO{qPoeHt;DGxb|J2tfP%Ob1;goLSpDJon_GJ}7du+aLp1fxLgcz0ZFawX zjp-b!aNcHgdo_<735qe#{(gOd`)Rq~uH<31B#$WLI`#-aIJ;Q`1XMiu-10Y0FwWHZ zjGd|_oqAyiMCFOhOCaZWIbCJ59msxz6Tr030`ru6fz>zOG2vfIZ?*n+p1Oh6oJF3M zpV!7$R~cl|=zr!Z$GTlnGbC3S=sxmPOQU+YqR_KRh>D53M=-@cD%*1E#p&ei4vtJu z0p`Y~-QHe@ZyY*}Wo4^P_`dOZz8h#+dGPL6PnOB_FZsWRh@&hb$wQq1T}nbYD3>q% zf`OO`=eH_sT+Uj{#Dw9K;?}-PHNP-El$cri&bNL^$?X$kfp0L@(<{fELCG%=g~^_l zIwH-WYZm}xMh9Q6*XHpCBqSbS33iCy&cw3>QyWGsifbDv5sr$e;3#LGn}z^O@U_OR z5RG@A7$4+0+l5iBu@IG^=RXY1{Oe!xK`lpAT=$q6aY_{<?& zVq-cMP-e*Cl^Hpo=lURWh)ukmOhM@rU?&4Q$JO9wQ>tPpW8NCelgN9;(V4`A5~2-r z159p?s#tfg%-(FnZm)Oaw3na&Y11^Yk!w&Son|djYV~K!jp+mpdL4Dru&*%I5!_9yGz;&+c zdOV-c``xzEPY@In^8q`78byhv!HjMsY%nCD?%u8myS0KH$%uqF0JMQ>oI>H`zSf2N zfgkD5<)RbAAaa@5pDe1s1cpm8pJ|OR_0_RJPi>P&sEo4;YZTqV0_G9%ER6P*_hMNX|Tn$T&!k8tjML4@gCFzQxTS>40Y&H75{neIF%m*%l+ z5gY7D&gcKtJ+cgQQr|aHie3O7BSc$_S_jcOx5rqSUBEf;qHH3S!aO84HyAnWQuvfE z@~R6`tpL0vVA9fkKAYan+inN_{tHSacV{+w?$oEjKa2ywwA4!v2cB1~OXLI6GIWsu z;rt8UJFX|vGEbRD3Q#lXUu&7H8fPiI5dd&Hp}g8yRNHS&^aogLUW>FaQF>XS8)<_| ztI9?nbhZvmOe!Yyv}Q&2X87-LcTmz`EexWjY>l4lY35vG(8oqe4xbyTXOe4K7w$GE zTTzDH&vg{kJ1ea6;cb#dT-r%QKc*F#L-I~BEFqDg-h_)+QNu=dx8{fFDuOR~9H)AFje-m8Q zE&R=MnlLHX75)1;MP1=Ps-kc{w4PnYM z(c*a|;|vm;COWNx>;{AylZm9-SXFa$M;wNTUr~)`XiRaT@oOjzWfjRcU5#*APJ~A< z-ls9mZ{an~sMOK_Nb3`D2;d3KTN3KW(DRx}lwMV&Z-V2IAC(Or-&}7&12mPA_DhjO zgx@YE_jgK81NdgCR{k?_h7(S<3p~olK8+7V1V0E+P>2CA=6KZbZ@LFi8jL;qSfncQ zxWN0oX$^lwToli4_Iw7pT&onz#eNld@FL+>-v^>0wS3yYx|t=$kMTA%-4!Z5F;c&P zJ96E>3Fr#Lfwf`FwvqBwICHphcRINrYd)XSL}r8Z@;NNa%J3^@G&dh?-! zLNhA|`aA2T(QRnJeT1l>tb0O-G78B-SrN?cd6%A@eu;Byq!hvdm>s0$idX3*qvD-B zSuZo+IO!_J3$OQ_@Brs0MX2k?Zh-$-{rc4+KvJD?*nmzKhq(JOeay8NNY0FSwIP`^ zXzaCD>GoOAiib1}b!X;O&K?8i3Z%>r%My)1M$> zE*QiVlMzxm1`3YG@8~TBy7(QvNDdu?Z|uQwR^FLo%CLz|%7Tg;)|OlJ07gjqCR?m3Qc z2mewV<>$1jf&UM@x${W0VMzK>@Xe?+$BZPVwD_IRfx*Sz%iG0`x6&7 z9;4z!H#vEj-Oc*wp2!#hJyA{>X1CZ4ov(pLz8j_W489kOhc~C%G!jlmjdj|?F~)7_ z6eCtubpsWoOczFIl&zvTsUQBGw?xeuutple35@(v@n`6qqi58!6aFCs03P2D8>p0r zEvR=HPcKmiBus!&o#?F_F*;N!kcDjz{c{!J4|WXD)2h} zz|M>D1o%B&@6WVli=VbM@zd5n!RGADz_b;7 zGHvOv<5Zs>*F{k3 ziD~%6#I*h|6O$Z@A|I7vY`0kw;qv)UUBKG&hj16H=BDoQuZQ3lk#E=<;Kq%E=SXq3 z-N$i`$7ifGPmpX=UnuH->v0#8=s%__8pgML>YEfJ>U(wx=VxDZ!jS__2`@8*%f%l#sR7MCzeeCMa1Z8gNE1WtjAq{0 z6wGLNFHZEh&e>iQuY_HTM~+g;XuNWxSQXI0a^@}kCJ1A@Br14ia&pStkUp0F6&`JVrPmnMv+955 z6MEz7X@+Hnt(&K$aBwyjIL>xksN&^9Uyc;8UBa5p&-uq$d1VnN>=7o?%v$NkrqmZ#hsHmaU+VknO(SEf=%| zavM2LMX&>$i-y=V%smbI2ZX8j^5_8%EWxd_vHRm@}5_1 z#x7OkYeVkX1MB+7151Un2|lYI6Fu|nZWlK{rS^elg~q@mnEA)N0K$@ zrO47skSu39%7KBu3N&@E?j|=InzeDKcvg@Kt3pY*W~5h>Ild|$H{)IP$wZOu3*ab| zU-owTI)uC+tvd%IF&Gl?0ECO{X23wDa~xp-rLi%C*TA~n6LqWm4V`cIpWvD*rFunK?=n)3Fh}P!k-DeJF5N>Q%_?S?9^c|l z*7l_z^%N%1l4FAmhUvw{0|wZhXR9avJ{_Po%obrYwTae0Dv^s1PJ0KiaFp;L_YSWA z^p2*>Txe@pfim^|@~Mu;Z%*S~^W%6Iuq02NT9WalK{prjW}Ah#Lo&Vto@cx&>Cu_Fr2Su0OC+_WIbdRPhhT5&*^gn_&U*t}$>=<#OJ! zCVBAn5AayumMAZA8-JSr|ATnL`#&rPK17O6^$JU_K1dT^*Y6qb}X*}Ps zExe%jr!=ZK=z(fnUS zl`cNrjc)xqQUyAZh;!yGh5$z&Y^#koUrnHny0RZy0D{ZOpJ6M&px^|S*9&@U)Xa zeI-&d<OX zsnv?nn%h{zZMF_lN)mZ=T&te{rRrEUnVsU7BC)Rb7iWgV=OT1`kiq`+lQ`LrH6Jfm zRdh>Zc00$EuG;>@as)%uz|+_{3B%Mz<9H5tBtkFd<}kIyaw zlPDl$8OK(UlQ%uQoSUSje)e=~|0WnIRp)I}SF4zA$n{(A#c0=g!m|*dSh;(%Wc)lu z`4z8xT6%vV`3^_35$obv4W%=o(j*}C5pr%LQ* zJE1hg{C!)t-W)448%e4+TzPh6r`0h5y!gI%$MLCJHjpLjxNgYRpJ4oRuq}{V$zQYYMp~9DkyCf|xvc4M zpm!4kFqhQ^^mQfu8ir@#;=Es&8g=_giZ9*X?1yqkK!_#;-%x~$ztPs@(v2`tIRBu- zdp4mUGC5*NaBB_ALSr(oRYgbnz-*H1oqunN8pN2>cL&k9+0I6elR!MHV5M<*bDMe} z%HP`5k9^fpS;;TnEXGFWK9>iGGe9Te3{@2D#dZd{-H5|ED9d(i3x@?$+{c)~GNsme z0OEhU{Uf;S-ZTjS@xSy3;*TfKxgiPchP0M^{h2@ob2pwWDL-97CjE=R`UXcemqD=F zNIdGe6JA%RW-SFxu%3B#u9@bO&Vn~bRGQ2_lrj)Na&QleO6=@MkY3?1p55Sxn6*4q z6MW&%Y-EPLtcf|>SIHyvN3`hpN38H z;y8YA$BJ7%d8vGchP|2?129%vW-cKh>dB7L1vBP`qAe&CW;nG}iNuyPN=7PKT4!b-LB0mu0sF9Zo|7;)2=2&$Ct+!bX47{V`PVLk zc&Orys>8PR#cI@XbPF-M4J`+6;27SCjBN*((LokIXwFe zA~`5cRSaI;MYj7Q)M+(%M6`s(lS_yq3YjnUW|&Z_L^mTT`$HjuQ2VMQ0XPDwmf|p> z@=7V*fGGDakB;A5TzYd6YXL@;h<}eFA6Ed3s09nabY`3cyrt7})xgezD)Ud5| z!C50#YG?HvPO!(b$2`^)u#H9riZvrkwq*D5v}w47EA(wi=S2;YSI$y|sp)6ABkBpc zqK{GjwmSrP0A2GX59Ww+-yy|bMc2fo0EN8re*v)&s;05~D>XF$1ucL=WDH6Yq}G=7 z1~QT`hg{kmj&!g$@_NB1OTW^S_wW=b&Kj?P>U>dwBr}-kq=2%l^_+iO;gl8_6(7+= z8IeII(nPC(8fLTCSLU<)Z=g7yhXs)5KvkIx3M2pyOS?&UAnzZ*zeL6r!h2?PJnfL z>N~5Z3XoR^ID+q4yhJVr0Mvd1IZ7NAWf;z|U>O4rT|R~KaD=WuVR-n3BdwMBAbm{S zOA7)=p#5v#``&p9$TAQnqa!1W;gzGj3suvw;+cb-U);yY{KC1hgrd71(PS&=aDcL zA4aeCXwsD#){*pX_DE z>TAsYMb7EyhA0=q$IIpvIatlyRiRc%@Jl%7*8n@$*A`dK5Zq&J`2InD}IN*}kgKbunkoK=e9ow0g-)>M&S3E@8w_c`o>ho9&JmJAL& zXSF{tgOVTe0BR0htgjj{mak4a|M-W*e3NVvZng1(o11Cn-odIHd?)#0N`8;J@bI*e zr2U5)W4OL0P*xw%QQ@-|7{)V0uk+%`g31?fv(DE5JiJXDdoff+M8uG9{;kM8byvbZ zN;p*CoZJo$+#y=0HZ}ZlwXTk~V?q61IrB|vR?;V)9j@wxg_Zpw)~y}NAJkA*4g9wv zOcm%O@9unuS3UyS_G$elkke4ef=i}7=fB9aZXc&2R$GzmfLex6Is%w`ntCZTs(G?0 z2)Bf!w@X@b6;D?`=S)&1WOUHJ^kNQcmp^Hj@XJHj99g9(G)6d4<}Zk4*Fd+eJ+&#~ zT=RbNhTT!xFUY6+LPN+C`Y0siv^8<;X!5A0%(dG1zE4#>&%SeLRUghZ zOB0YhBav7!G^0cZr=ciWl|RUZQbgHQB|&qaHs0pB3CgjkCiCWzHL>B)S8#o|@073J zKdL>@gQ2%iau*t!ZCDfA)`}MPT!1viPdNE^`BDPJx$7%$ku6q(9E}F~lUyAJsXzG6 zZ)BEZJy`5VBP-a5Cc!OICq?!T;v8T^xwy(I1OK++fr*wPcO?MOS26u8zKBLXu(>*V zw_;cCApGmw>T_TwjsodLs;isG%%D5=fpm@VZr-b#$x6haqnl>@v?mZ9rof;?;?8In)$CeE=Vi!WdekH50`~yvF#$|0bh*0-g1>GesO* z`nFF0F+Tk!cs+9-kYk!ZHgz%)TXCY$eLpKjIOZFN6b)#NM+^fHAi((4q4{@IOt8P8 zc;v%f?6aFWm&X2?9mV+x$zGaxr7n7tAxe%KpcB)Zx5`ZlM-p+wb}@^na!Yht;3viS z0?2)YyJk_Et>7>wV8=6{wQ3m@wXT0mQek-G?3snd)Kr6nPE9SK=sWjM}c&JdGeYrBUkC)t^ zH7A3-0!G`8`kMRAJ)z~He7qq`eAMh1!TS7FOxN0rWREK~Gsxgcd#%)4@i+Noq-yvX z?Iav{3uk!NU=Om8_ssyC6ngV9nib{-yWeW?Y9-;z171aji-kQPb}x>X=`VDVfs#(G z%Xz~a94uA%q*R82;Z%IyYJZ_5rfs20FHS--@?|l zCr3q7h6a=+^NQ6*8D5e$=OyU=t9&Z1jXOolb&+wg=*G+W?}7|f1V&XT6Gkc%5{DbS ztV04TeiM+`2VDNq(TI`}kWj^I)iRi$p;OJSB}v~Z<_~=SSBa6BiKSLk=%_j%^Fc6} z-HUV;%S!i|T_R@Pp=%2ungVO+Cje`98)?D$_vd0KF4ZtFbQnY>6$D=EWpG=rSleSu z!f2egk%;oyx@f1k8($NT%C_7b936#DZ%diKsnvh!zDa4IG`E6VVI*)QBp~Q4<;^fB z#WF6QF4W?bV&k z&vyY%@l*zcGS?2?s_G{-7n#uDQqn11Zb`3;ZbcI3>K?`>@{ac8BS$yo9_x%qx;H@O zJbSshVBB7o`?~w?o><-3ZB8uc1C|^@SA<;k;uHl~XW98Chsp;Ro6+Y&W*ZzjlH)Vp zSAXIh5ihH8D@QAHylJ4iR z#|w8COsEp1J-_rK0d6=7BhcVSGg8NV0d#>A`JGHj+G~4Lr=iQuY#k~-I@F=|%+^=X z2IyvcX#hFAC^G(JNG!rCv^G+*%2iYh2`quc7?f{+`IY+98Qk1QnJd^q8bCg|CY<-W z%J<=Sa#}povD3*YTRa%VjoC>EPVOB0i%z|BueH#$jm*+x_2$uS^qC2{uybz&-&hRY zK5;%3ECJ4^ce`Zm zN(Xf@&04~kYF~L<4E?fj(;UPR=HrAAeM#3qx`}(sJ`{HjhAG322oX3T3lOtUg%?cZ z`n`b~sS7N;JQ^W^cuj`B(>#5SaSktMihQE}3DU7s0U>eq+oq{Qa;-%}>x@r|&^ ze{?yy2_2w{rrXWS7Yt>|z8_dZ2)u!NEb*H_<|YIn7I*(@u8nH)fGS3l1?B+2;se5{ z;n%nJqpO_v zVAco~O~7Ti2P$9jGdoPP%g5^LU{mrY>~l)rZrw@yHuvheW1!bwA;cvUOWWDrb1pPi zHgW03*Ep%z4@;?WE2^^qW48pnBjNz{qj_9r_hl@{f)!9?0B1=fn9e{DKTao^vntEk zhRS<&oW9@8ZGXrum%d$jvI%+koW84-T!SjQZNOx}q)(uKT5t6Js8|B>yE||?50j?e z)hh$r6NO$SGVPQ~VIGlzg*38d1RgkMVN@E~UDupn+0hX3(%hr-6xO-PUBfZb+2IuI zqw$)LFB?8WePB38Eu<)+5M78W0tYl3J#RX{j?)x?Gb1E~Qe4~aTzxy``T2}L&8@V; zu2waVl|6gNCZ&rWNtlrRMRG~|F15S`&vnmtrKPyo!OdsLR$s~xG?-hjb|@(r%5Du9 z6^~%{pRpdfU^acs@U|?UlBwJejT1$N?hE-piVXQ#C&EsY3{#u_V{lro3UgJLXWaQ)6jX?cvYEt*(^nB?BO54k7wEr$<782aARZ;yRODdSV z-|{d#_Gj}9+P^*y{OhCXRdfSZvwsYc&r@~0^y2VQNRz1)@H<8?wfc#I=vta=ou8SD z=GJ&g)$LdqO|<9Z`&#mIBYBI$z_!`+vo-)^S1fKW^y({wp6Vi4Au+OR0?=cqp*Psk zlMgW_vck%-D;Ik$pB$oU%k=j@-4Z^}%$n47E>1lwF0~3LBYIwiUgceOaIU{qwi-9T zk-dJHCt#w1570KU*=A5|)>A=E9WdRZ;Enf&=NH}2sucDROl`d-(fGR9`FUEd*#Sj< z&-_yGLt5%G&@*M3yIp&7OEflf$d?cqxfeS!)~3v)OKYmhu~tmx)<>aB@G{ZPdnBac8<4_gy@<8GPQ|rO_1G}eLM_&rmm7@ zij|=b8=fcc?TAAo%EEO1m zR8FSGCbU>QH&46^&2p))dHnctjpIg~$+Tzye_se{8vYXMzV=XBxa0mW$v0jWn--~h zj~MA%3uUj^B}X{-rC$Ygxv@={KRMq{NO0-gz1R4$k*+N|7_gp~#{pxb!BX^Bs&)zl zE6~&0sPA+&_kVzf!$QOu^;>z#t^Hi3>WYI}?=z7#y;xE3?-SPa*@0_x;@Z_I836b` zVo%FnK+jQqqiaIEDry36RFj*ViJv_$eYSAgyn9~X^DAi`JEr#uM0^l}&pnPPX?gQ9 zcIoiCC&k;m1lc@FXQV8BDOEJiLL>t&0e1J%rx+6-=Z`hEjlClG6jK)Tn4I+;g_R@# zR3cUty*t`wG<{&Y)&rucIQ!;p5JhWh6z;%gs|d^K?@$H2NHSITJStZhuZ2|1^P3K5 z=M|C0*Lj@So`T)w&NQ_dgPl|#eIbxb#)AXsYYEP~|@7 zW8c#wu#Sd}=BE6w{kPFpw-vR+ljX(Jza^GZG&9Usp zb)$jB#Sh$DdM%Q^39oA>d|pb8aL4sMhg==NojI7v77sOOXLg}Fhln*!CCex*lx2fR zlr^Hoa$%+p4^Mm7b~6xsm{Z~?DZ}cG3zpH?@Lw!hl;KLVjbh46t!mnhHPFAu~?+$S932Z;0en!Vhs|p~1 z_dEQod!DN8Rj$8+&pjSsJo`^j#Q&Xpe8=Y=n(ZgKhxNiPdBo#Oe^iA9N1PDRxE82W z25oCmr-=WPhnW-FGFPfl7nm()ZNBMMF13b}^UlQwm&?|$O!v0n2F|q#$b|e;RY-G3 z+R8|~SYujcz_r}f%Ts+|QfZK<%lo=UNUg?;tLSt2UVgVDO($=a{)q5h1nz^Zn4KMl z*cD7-t0eULe}MRe6>cj++V7D5oPFyRH;VP$b$SK(6;YJuRwsVQ@~6waca! zLGpa$eO2cYE79jygly3WNtn4l0vp*hGq#0(n0gd=!;=|<%y{%)1n^_2g;jBFh5N9) zD}3=sN*%H?fYjFiLO^I0#yl}vHR{--=HAaS6hP089x@s#&g3~p>{GkFJx1&o2?lSk zWrQYszTqm_y=6KLB#Qah45O~3Q=XYU&OUN50WUZPAzFaaLXGtUS(cpa4I<+HQ~0+; z4^UVQHh20;X@h7ytJHahN7_1E+;Xp7@=hE?0#F@q~TcAwbv%X{)0tGSHps zroxIKZEG&=y}R4M3!!jXVxY3@KxB+SWpP};hp7Q9g}hu&A+G_6bsVbLiQ&PGx`>i0 zJn>tPXX^VCOAC6L+p*+afTZwvK0J-^3xNn9p?s|2HS)k)c$)}pj!eQtuwvRXbhS-XxJ>0 zcbGG7dShhCSfc&M0!sDLbXt+1PkEJqLpPdf*^HzL^U7%1{|VyJDzWlyi3tktDUDo( zIYFY%0_*|uLG7r%&3gqCs)bTXn?l)!!<+uRSR3_kqKRcyLyWd_Z;7QzP6TQ)_NNNo z#ldXvkv6@Ynmr)wxRbYO4W##YyndbCtgkAsfwb`ALtN0-N!QXj?pl{ueE!q5Og@aA zbgkeOWRp=i;NG=HSG=Xfs%8#bB+JZQ53!5>M{%_;wL+zou~zwOmmOlJr%eP{uZ~&a z{^J3a5&cad1n~9sj`{jfI$m*L9b0EQDX(k42`IK<1oE@|>KjM+VDZUuut+@D7&jYf z+^PQ!TxJSPv}Mv|6wsUfZD6Ea zcZt|+>6B%Zm(2te$8jQ1!)Ljm%&ONMUp$LHF0J+F1xUhP=`YqfYy#qBr!^6o|07r| z20PtHYeODXg`q2afTJ;PK%lmgu90Wwf2(uuePxoiylz6D1o3^2r8@vyf2T-e4k|W} z59}L(z}^%e*ymqU#Yc-5n%75x2Q%|>1hSDRm#i)nc;}KO)tk8&S63w%toKgN$NCQ4 zB^@L>Je(_T6jy$7(VP*BQ{(qk^{;hw#61SeD^iS9XinSZ+AUb>;7NI*DxJ0gXu}vp z5YdswE>;Yu&iwU3mo03Dco26x--rWWU3^4}wo~}TJ}iSWqKQnT|2VO?qhwAHzDpLi z{G()?>{bqpn4#0(`CQrqZgIf4I}vC_#=HW=9b2byhZ(PW18w-12J|m^tardH)N#{{ zx)cC6kOBhvyFHca#w6+BPGBqy2xL@xkzqQ-g}ETq&U|0~b*#o6203jlK$Yh4G+@?G z)eH#iSxEqj{(i>llkblkprZOfc;Zw*STfxusE*< z28H(0Ih@+98+H}!@IEFn>;&J}RPTrUA5<+ycHrOJKNs`|fe>)&xb>Egz*VfTH7V2Bpv z#^4TpW}5Wf&#?<9hTW?~1SjH(M*Iv!{^J@Qe$xtOjcb2{{KLp|lgc2ExQ?S&D4x-hls8Cy}Ex9SSU6g%LRz z9Uaa;{!hLkeSX|@-0)^YF;-3)Es1;ZMwEs(m;L)fPpZu;@yo9_bsGgTC?f66f7}^S z6?uox5>M2G{BkXxK22@K%emjKOg?fKcds>)nm9y7O8?<>Y@wT z20yJSwLNC?)4IQ9BtNYDLxxwfaU=vi4^ue3OyS|=y?jOUfxYwDE1Gxzei;wU*3=BG zudko8iD}8l4y$}aPbF$PB*YrtLzrB+722S#C>MWcIE`-oW}S*;epRt9tZ*POSH1Ll znq=Yvh#O>@qW@_V6#W6>3;ZM8!`_}-V=-EkcM~Y|D!9Lt@vharxHC^4RpT-z$gDcc zD@R?i3(7Isc$nHf7k-mx-f`wDy^Zv|=pc5_0K>o3LQbt_-+jbey^}I&rHrzYef(-D zm|-=kkKSd|WIb&uJo*Lbxe;mT_LuMqUV*#&@5|=l9KS|;^}Y(-foqj=K?dF8MkX7L zo6-_z{mWx#ozaDoU>#IkqPU=>I?q(0dC{;#>0)$HJqap%))?w%^K%<;oj`b zFIPcL}Y5~=QU=$T*7$Xrqkfj z?DlRbu`EI5_tKBUee+V`D-QO-859nh;N4N>ikfpfdA5lXd~75yqdQA^eiO8_0XMYh z8fYcSUMEw|19(nl(E1wle(&8-lwEHhp0ht$@qAa=aNl%g>l-FI z2;!7yFy3F%kYY4F(dhyb5jV3}iMqh_kQwuOS%K_wpJ?<8oOV7=x_lUxCp7l;Lg=-9 zfCI_u6K6PcBc=WIT}0;4)1)Vrl~KGN?|!oD5-R1(Ph{0&^dp?4xg8u_@>ZABbePo&KLA+ZM!PrO`(PEUVp8S0o=vN?Dza!TAWfRG0{4ao^)c6jjg6eZ>cnV!0a8hV!TnJB zrB`w)y&0`XvH)S9?$KzV=F~F$LtvVKKGnzOC*A5`sS{kWj;sWRGJJ<4QnXh}=U#Cc zqpz3lRhPGIcuy~V}tl6NEt#n>qKiW%Q!5W;#y{SAK7R-iN_UpHnHxc%x+SGoAfah!1a1d zXzvfbe)p%s-q!ccn9iUnR45*jcxi^kwWf1pBJ)E8eu(@cS8*U(uofE-2|eFAGnv+) zG}Ga$BS$GHZIFJWruN&q2f!c_u1zcOc2q}}Or29Cpc;26Qy1Awxs7<_OH z0;)d+0SUlRfJhAB)qQrs;~;4X47&)*npf2cXLaQm?EN`ML}`zP5FVVho(zVwwqvn= zOvkihJE!;(00EwPu|hi~ZX>t1H#cpt61rBrEs6`6V`H;bbD|8*4AOG&Na8S#oPCYE z)BJpICE8~wuG#SQM#8?Cj*;zPGkg% znp!A^kwV2aQo57$<}H?@z7nOMmkBWA>2H-g1I}-gTwg|5M<_d85dI|8H~X@ zxoS)@*jOt>E!Z9LJ+&T}mNQG1YJ=D=N~a!`ewt^`7-7U8zy0(4=Zqhrf7q%ny4=0o z^tpIoalbli_d8zQQveXx;rGgk!+7Wxf4vNfDFfi@C#!W=WxB32KT~AqyOL^2>DXk} zz>^;iAd94AT-A6D;4cLe=DW_1GQHl4Y>q(tq5XoC@|005N*!X_3i;E1wNfudR8}?P zhl2Gw&6rr4pmyMiwf0*M1176N%ADwUfUExt;OgUPbthQ;R3X-p>|<|5ol~N*$n-G) z2;k~N=uqaAW0NfQEA=bSsIPLf0|1~D@nDD#gerHf&A2~nCi{7{YE0<3($|s(w>no$ zy3P^}UF1$bgT2)CQITmaF5L;J3o*}I8TtsSW%*y?K8h8uPdSK+qe}itX1x#lmb&bkaDPuCIB&X+ExBM&mghcZUvTWoe>xjJycRfw{rG=7lZz(D)K$I*cU{1_iH2Y7)Wr(XltUL z7$B|~Ve0-0%Cfse72N=r@`-MU7&506z!{`-)z%L1I}R@Vqo~+4R&=`&ZpnK44$Dtg zJKR^kwRWp0FRx3ri)?<~b=>o#fo_Gj&d^}2E9XhoB(6ru-0u$X>|==uc0oiek-XM} z1Z1uOw^`cg#8m_>-tjVI*cWn;CHy!mJZXfH4WB<>%KxM~?s3fft1oC>@A5g5aLlrv zeT+%SM#)%cxfR;s%@wV#r{;=xI(hTl4iG4C`#Or1#{ngSA>UYsx$aH_p*IiJVn!bq5^W1l_gpYk* z$uqFNdr$-Oyjhxo4!GUXhxO&{>`wmreQE>_f-?CiDU}YCZv{}%y~gp**KM8$u!13E zUbLQW?>Djycg36=#GkNIXvoNDTmjyE$x>j<-$0avSC)(2&KQrqqA$3*!SLhmJiCmV z>MTg9g9_`WRe`u#t$HC>_>s@eJH)B(zZzEA&aE8@4D5guegU{GyZVoS#exn5jcGR1 zP;XsR*IJAV12h)6Xa$nj`LA0BD{?Z~UdjT#C9#@{MZh=m4=J z^xM2Y&MBl7XK0PFMf=B-oYWg=8~SYGN~3W!hazHwvQM1o_UFCNyEJCJ>;3@C_;%+X zma#CNWo(h*EY}4!XF!4rMaPaM7D&;5N-T;6oD!1|Hx#JXG?M+h@MuWj48~ZH1JJ~X z%5s2jw>7es!zFur-sFTnd>IAqT+!h|XGF0z8wG?eRG0a2t;@NhX5(U7$q4RVd&%PK zxuRR|fmc|_Up7JP+&?zNIOm+;_FeQqOBh$2Y+1Q4V2EiWL+6as^R-8>s;M=kisA(p zZ37x>;K1ygc5DHOY24P^kq6tzY(cDfb2^Xg*_zQ2CqXsgx1P*Iep{n2(8_JAB`%e-S-^WOzP_J+3WwuK&XE*5K5d3gn!LT#MtuoBewcRNj|z2_KrMFB3cmi z8;E&#d%l4>NX;zyz@Mc1WFCxgO?Pr&;Js70bz@>b2*|^;;9(c;(yoKZ%LvQh2_|M->y?A;~%{*=r=?nB{sk8 z{$AvVeYYJN!4RCyyo_9n+j5oOL7d%Sxp(*(t5NpXX*Hem5hDRFc3_uR(%I{Vw$eKCI6UU))s&d}AhszJ2_nOzSoc z$V_WfrZzo%Vf_%WIQmvyO}nz#_0c=z#qCvf0+z0#Mxgv&4}lY*`FGWu^WT7d-rwYhv7tSh!~?ru_0+Kk1v}ZcPxGTMVvKytJ5XF zWn2&Yv?!0#$Pvw#z(lSU?} zKO$hx)Nowna%V2r-W$vA7lz?%om}znt{*F5z9EtgiZGE9%ChF(oymQ@%QdwPjlb;G zX4!xmc#NJYESX#n>*hM#Qbd9&lB9hxn>x}=c;M>6Vs<_l;1|~iPfgK3Y7vV$=Vc-7 zF(J{sAN(*Ey%Yv{YByI`OfK80mC&AA(lNsoBTxSeaKgYa7BWS^ozNNH@OCU{MmRyCCaIp7s}lURb|o{yo?=&C{%*rweF9`Ss8 z?igRZI{y08Eot|8iO*}eqS3Yn5>xbI(Kn;Ht(JprGTJw?5AV=|^wo#7{zV7B4(KcJ1EJ*bjc-BrH@kZJQ&Lh?rE(pNNA;KO z!J93}OCpBsuiFwF$eb>AT|wGXd?F%jW&?Y4UUiop2QFC!QnpJ5wARTO?OL!zH1Eq( z_N3<%Yz-yD=7EPi3^N9kQw}aFLYIU}a+VzBc(T1wO@FO0eW?Xx>Y&v2SGQXU;Y}6* zA6zhoqtSRjxpRDurya$8QyFTkWd{JlCrf+G`c;2`Em~z|hj7=5Ru4opP3>wSGdkUH zCMIdmCv=%4ur+N!31bs3x(-~q`lk~Hzh()(gwvcP?B8U|x+~z98#@)q~rWGG%7<{7jN&b52?iOzq zN{J)$X_SWlkev@abhKkvzsgg*xS%8_@0pbq=R=Og3Te|qY?8DB`7VG2_gWG>gU1*5 z`B#{JeqiVZsqcb?WJg6>iOW6NNcG#O8r7|WIjjyJP=WhfXJio__Y`#s-l72i0tW@WO*9(z#+XrWoMd!|ODTg*ct*+7QWZ=%zP?xz5WN*1e zj9R9`t1WbYT1CbWdwz%H*lfJ@PaQh&Lx%Uat{D@b!K`S~*(N+HI8HVA{8oB@Dj4L{ z2Bb(o4-awu(O75b>t(l9T_Yoi?pX15Dvd4_Z~aXG)R^`+QB&)&eNPu=^)H=oZ$~V# z=EHq5=O`(`t@;@Jlji^0xo{u8fB62w%Y(iUavPOFZwPkWXw@hivMRIT6@mxlJXVz5 zomyYR8T8w~o;%zNo5#ou&%AN)U;zmHt}Ho_h~}6z9B@hIdVF%+yO9jR=H2~y$;a7% zd#N!RS*s?s<=y~{8I|>4+$k?&%MCF>>B%2EX+I1eb~vvyksZ@ljmj~+@*_Bjq6%@i z`O4cn6qe8K?nn?Mhsjv99cYB3s;ge1Oy$R``2K<5m%TMquUxXKc9@&D%Im>Spa*84 zk98R+Tf-xb`T2iVh8Vfq-hO@(N^dsi@NKk zrOs}zW>r+m5rQ-BqiNF$?6pIo8y3@y9sVXe9F(vnoujMf;12N93=?Hi9->$G+~8HW zbwr&m1Ed4=be8E#ZJhz%lU8AEWC2_?5h7Y)%Pd_)bIt7x&dKqzyb2R1x^B8S_cEq%qtFT1PnIz z4ccU1Az57d@Og5lzf!z)h6~f47*r~FaUJ|x=l`J$|jk;WYoG{y79$Sa?V`Hx^seuXANQ)5ru zhBi8Gn0#9>a)U$by4Fk|zHHZrc^_Kjnh=h3SyCQvpurD$eY|o9+)+dQ%Fpj8!YD#h}cQAERU5Q_BQ| zAP#h0E2i?|8;uU=CCkzz-EaLortV{aa*|1Dz^lyW(VIaK-4bkfkJ?X*sKdNPG3T#= zm!lLF-Cj`yv>bZ^VR%pA!na?R6vUg)U#_|mik|Uldb6ED*Dh0XEQ%=ueYW8s>Lf0_ zL-JCm-n;-CXE5~M-pD!!u666I&C8fBZlIo2PGQFFdWC?|;#+tekYe8jF{ zvS8x8n{6$ar|_g>E!yS#vGTF(1&2Cp6>KpGg8ta=?036;Owy(P&8?jSxvwKXf;i zT3Hw)Ls}}ZgSgq;A)P;q;_6ei%zPb|pQ@zf1IYbjhnYQ~iBUE0G89OxVGF7MAOEJF zj1mI2Rn&M3-5>FzvPJ}I{eSFLMx?MyGvL}5@c-&Jd!P;gCZ}B!I5Ayy{<7C-kE_|= zyZmzW3fEkB#p1qq6yCm>wpeIx)$4g|-~65qGYcKYM$a};WBohE*7OCq5~!{djn768 zek!dOpP!or37Y@RtQ~;KUy%0V4ekDe2+w%8L=t8b1p#X6frT1iGPB@0HkoOWFpw#p z-y@-M>@%mQ4Dr;9baJ71my*npa+TDkc-d>e(V1|s0WKI|UZ$x>Yf9>?DMl)Yu2BjY4ozt^Fz>-v1x?e~X& zu79sy=kL6QT7*V2r`Lys}*^-mlEEo;`J;lI}2Jur2=Er7# z)|Jiz7!C5nOSeVb&86MGKVIPG+V(q~{l^Gz260ak*#EUpRZHUcsXObhZ%`}>b9g5` zQ@=xZG8@!{o^8UnER3H1JsWh@t$zG_U7ZA&@arlBtSkIBg&$%(9!X}R%u^C{)U1sE z9f~PH_I?y>(d92`!qH@!OO2dW{XFK1<>(0gis7F8Xkr{D{Gi2eIH?=4ws^u2sEm=t=)Irwy)$ z|1lk$MAX{eXcm$y-IiJ&+|~UE$;a2Bt4#ngqZ!*A{@m6K|jlB9AvC9(T+IGyp}xWB*}fI@W>V7CzaSNF}m%^6z-w|zrucX2EVRWK_KRu+u~-{ z`}7b?$V9&7Xp3!7w zCs?lKw6)Ld-z54vua@+dgY}!SbI@5B*HSjiY-)r!lELn*`N;N!{=X-Lt!G%+h6`!4 zA_R_DzTJ}5xsxHd7-*ba@x-uVc_`&=!mhKYny-Y%PN8#5i$N4uM!N4}#ixv8e?Qs7 z{D>V!(F}q+>qE)%h|8$Bc_^56SW!1nVy~!IbfWVt~x%2 zXAo}f=x{l~LCNsKhpJ&s2c;_!Qwj&odUAR;Hj zs~^=^%I;M@^}aK4qFCJ)>b-JERXVqM4)*JoL_aK)fm#YNViD^oSwMlAJ5?O%Z9Z9o zu9xTijB~ZkHy!u#5Vh_+2Tp)Dh*Q#s#I`bYTbsh-TVilZ zJ(HlgsgYn#L2{1qQ^Q{bHm6VR;^Rvaq4@ZccxVuLZmgH8HdOy-g0llySCwjJax!f6 zAg)%baDHX9HjG9R;*ly8D}rcg?PYy;_WP~X{h_}I$Yg0}k(98YEjbZI>W1?o)%f(f z#azFS*0fO_W9v+f#+dpGFm`|2E@QpGL*RjT_sz~jYlQ|%mnqf39r?yjw@ zE9pPeXQO|NnSq|ITr#hIj+E2J)cb6ZT_63q4Pw#rY;0JXBk8h!x4c+~+p|iM*XQx; z>dp4*&g#IwYSCf8YthDz{~801Y&OxG0(U=3y;`!}jVr{E(a^%|oiGd43*xO^geH?I zELYBhzebgjZLixbUO|5Lsr1~)%W*0Fq$wehEQTj0hLd*DJ|JrG)4lj)5U5m+??uO> zb|sE`(Vs&o>G1CUdxao43_o`75?JbYdQ)c1-PUBEM*6R@JJ_#g5C7h;{uPU!MU1L} z^3qmE|9_U3SYlLv58ZL`J>Uz_Y*mQz)WRY-0&@D*NPb_>v99+c!a9DOK2&=csmZSq zWLy__z$P4%nqduNZ#)u2?@ZiL!z?rx_nuL(dBY8&n~z?1*K1rf zc#?Vej|Vt3YJVs7mCpT(Ug)Ez;r!)TYgSvgb=PKyWZ3-?N)r{|%VlRP;~hmb3BilY z@&v28;@w6~Q3c$Gi>dx(qxZ8ewmk7|ntu8<{q6iv$-%Y93B$VAA0|9>wASu!7MB!s zFRmRKTdI#1q%|ZRIKG%=dS` zdHaR!DF^vE^T>mMBm>&HI(k^0>BGMW${ltjg$tU!K0f;31G?UIs_O@IN8kmoAUKx0 zwCf_ufkhwjB*wzrw`W;C>CGXur%U%^pz#Q9#-T2SXNiT!K)z`t=P-M54hC1rf!iAT zHE0HSE37 zs=Jp_x#*PtJ1s@pk4@mk2!cO)wrV~pg_`Pdv7WVORW zF-99tmoETU8W2|7* z-mmIK^1Y#0>8nbEF(uJ^0+!vN7mwGQ&`td7>)a*$xQVC6j9x3)zjY_A3Fof>k{WXR#*lO?spLVZrPXdVuN znk6;(VH-EwVCH&@>8!TsV5n0I1(nTcOQBp(lzrS&;VzqCX5nRRgy6$(W55aG(T+x# z3`NNSxhXbbPuvsjOItEt2!xt2T;;&Yt;=h(^9l0cA(lSC{k=m$i3t%9mILv^^4;h^rdi&8d3ZH1_~Et}gR=6S6S~A+ zokR{vny-LF>>R+$j`FXGU(Nj-Ye3tP99>@F^Q&hII)cUl^6&hCL5woSaxZ9>^3?|O zUIn2C5dZum1@Sh2je&ZERRs|LT!76Ver)saAe>I&Vj3U7NFW35HRQcoRVhEZ%i?CQ zAKm;)+(B`t)6Xgkr!w113iH<;aujFfn_N>lA4zM;pmC#h0P&^yS9#q6j-~H^tW|_% z;2e3dwU^`;%cWkfqr0oh`qxR*YZE~xY~cv<7U97 z@ux#fMge-fj7+4kye!Zhk2YO+$BU<8H=WSt_IL9P^7MssXxW345%%jFd2;T<-{TVF zk9c5z5$IvnGfL1S>c1(>=l6&G_u*G0eIyJZna#tbz$D{rJ`B{KwiaBKJ?46=NBSn7vtxBhnG% zLIkJLv1&Gd6|Z5Ew4^W$RG-hWjR)+XnQ>D3nuyNw!zof(tq;ql!oY&75gF4OEU@SL zTf>xo^riJq0(3IbNzHp1$EdOWx&I|oOw6z$Bm*!vw8JHk+9>sKUfIWz2miZ2?mq|p zFaCIZKbCm*hu?19pW1*bX_iLa1zheK<0N&=)?uiNy!@KwtI^5t35qfXH}8Af$$}1N>HzBT9?tUE>+3D z{66I&#f0VPQ;M>u{ufePj<_&8t>NSu8Ow2H`q9SkCmCMz74k$o52Y-Ak_b27sM4vbywAxs03e2CE$fP6aORj7d`(a1t}(8L@}l z*=-5A|6DEk-Ho{m7pI=5*l6iH8uc78Yxs@E1O$r+Rc|Hk;ZH81w8XSe(=GV(cxv&_9MD zj)04%5sQErj}-t zB==R<-pd^87XmJ3^73Qz3l7I*>~9tma^lR5EKbdmCnCSLeOe(&{mo($54(ttNv%Ut zq_8y;fJsb4m-74b{%i#O3ge+8S~Pge8Foan8X+>i+*iSGA4+>251i?Pf5Gaa`e@7Q z{&n-x@HRHy;aeAOwM`G%g7;N`aW=Y@##EZ21t#4hs-xl?ki8!Roepa3G=4k^;b(+I zZU^z6=zl7!*l;0Qax0`(5|LlRjG*3V& z1w}IpLxsKSL$dnF;rE!{R!`Ts<|CfLKWs}0{7gukVGot%{|IFY?8(b$@IX>U(f|qW#zAgkI9oh^ z55egDr~TLYX=F@JLfEaBP3;423+y3U_~Mb`bZSdBT;osj$Xp+vJmNd73laO}6e4|W z|MdX-4~XLtR5zR(*iq4P_0!uq2PSzqK=NjcyaD##Kg3xpfp+jU5Iw2`yNEFW$4mbP z$MM3M=fJ3=2`&{&qJzCFftDPx;tCSKdDlm&U-^~%HHpIML^5J~lC!xp7f!_($P0m# ztoM)vO7WOAJJ*rgbaPdALsn(Rs5b~Am(d%%-H#moXee~>!P1@71K!GWqd|6uCqwl( zd2~R=r|~IABbg1Xk#3=hjl{}$>rZGGBr5e4{l4al9mMIDarLu1{c#58lUQ?wQ&Ab3 znDSYGP>vO<7K zS2d&lF71bWERaK$(RFM0J~`DhSvTwT<-r<$Rfie@oF9=WI9EkTdmL{do(8qimFpmS zWI2W#P!oD3?fJ^y;$BvH74?U&43ZCYh=-`rD!3f^)_!kz^Xt3!xel zbtVys$=s0YT;u5E5x1RDAe!;3)nB?yBBjhJ0{jgGGZ$`I-yX9GT{=y4%UXuwYhh`qOvk1`P5N; z5nZE)%a|*itv##1mC)*2uVGo8$894ScnZ5-s8Xix5r;AG7P^2 zJpMi9zBRG2i`V7VtNES@dOwv5Dm14U zIPm481o7VUnwTurK_OX%%yz^Wf7+DTISb)UbEYNM({I3?wVOA4s~t?p1nXccJ-Iom z$>hMsOppJvu~ThkT~syX1h{d@ea(O!1bNF>b+VoIXzP;|()bDIg%xokS~b{eWl@uB zvOM>i^cif^sFo1Cg-P=i(FwtGHjFzE}tKAc6Qt?syXQ%;r9&@F*CMyFnecfEzmrDZ6@q8SR1$zGr(0c zAw$JwB5pegfb@|$f!G^34 zyvxuGelvqX7%a28P?!t+pP^c3AgtjA|2?YwK)x6=+IqUdQ6&F^!vL zx05tj78baeKG52Wl{mx9hh{eV7oixhFoA>DX{!C3Pr|Ce0@+_m8VFUFVX-JO=%`%u;itg|v4(wjDdMIdB~Q30P0Bdz ziPe!GT~V8!uznDC<0M&eqVmH?nkQ)nWzXVcF2*``^knar9CNnw6@n%?FcVQ>J6GX~ z=@7e0%jPiUU7uI6eI2Z-!fkT$PFrWihO#_AnFUXq-{^>>y`7wKRZd5BSPgNB#v~>zl^AOT9H%DgTNW7<9+4*-@bC& ziLVSy!=?mN1X9f_ZL}52_*zyg_XSPBn}(bL4PiCVLMjDo1*-aK$={aS;dcw^2RrB^ zxYY^^t2r+aMREk-mrBtTrMnL@aMUdLN=RmD@$JiRZ_~ueW>335yV(l|*Wa`P7`t{w zc}1VBOqOjvjTe&i0)mshy6JhehK6R1Ev~hNjiw4Ck(jxhV4=VFKsh9n)k1!I3BQ;4 z>>Qj8%n-lP18jbM6{9_$l8J?%X0AN-z{wR_lfCFW^NU&Qnk4Dnf}A9(G4UA8U@JX% zo4k7@$MT#{j(vKWaFOK;KrFM?em__(#yQL>ocaD20qKsM;GR;Xul~ZjRv7}1rKvJ< zbytN8aJ7#%QT-befs*(wP8Jq4T$V(TM^AB!?J)NxH&*2=+#AX)GTs?SLE`24$Jkxd^ zT-wV6k5`NaOJS&k%rp)dk9OVxloNbU|?42dEfkUuSL8XZ@_qI(Wn7Km(ojE50$%E$*E1Z7Pz6#yXd>Byq{&wQ z=7~h!3$E;{$C*i^^Z3kU*U6O~=ayZ|4p;wzam>jUQ)AL}WmKX*mBciOkqoaE%ES>q z7!-8NwyOJLpFZ!Bs@jY*oAo781#i8{A6v`5BdJ_O$JR2lO53)eaNpu_Wpc98k4TRu z=W*KcZ3OhfR`zfO_+Xf~eYm)@#31Y6tt# zf<~wCs`~(mJhhvewexvG@eBnO&PfHkE&X!Tr19|lBcA8$DaCTCR^vR)KitYPy1hHS@m|-_#aI2JXPB0zS!?J1nyeTLU!(iN zN#F&#X*cTB?k}+@`LdSZ_`4}B=({L!sRjI+u6N8eBRO#Q0zdA|CUyxHQ1Px25u>%S zXxjHG3b@TxpleXbYR*6vg7=T!;4L_d#q`{t$*RKTHl5IXl22hspXQeh?uw2_Z~ z#don-6(3!}Em!Mh_huWHJYJA`a{a7{Kh@W$SEHu+WmxeN$>nQ>lov{jYTcKHB`M4_ z?9k!vspr*ahb#L_)W}3NZDS*9O8A+k*>3z}kVAn%zH?%bi$YeN+znR?_Knm#r!M+& z*wtPwElb!3&hlm8ERRZrhUwu-uVhWD36USo8;w!K*f1j4!%{>ri{%b>l@f_$(TW60 zy6mv$BgOG%nEWXcw=j}q5=~$4KIyU#k2J+vYr>&bj0E_qi>oT1Y>`XVp+BK&ac=HF zmU7%xegG?j%Q_&)WA}c(Igr9V&t5kDUlWr!$$up#dniWA0naZ)Vp~fvB-R-r$mmWI z)S;n#bsMC@j(Gaqz=KNHRd37Mw5$o+t=o?hu6G!}rb&vrJ;zFJn}@%LtY%GHiY-4* zJ136E`Aasy_OUW5V5SVBZK-ociTs@yQi`h7_^mBE&-?}c78 z1ry%PA9wNlM;;pumN=+n>ZCC_3Kvuz;|sihG3k-B9vJ#X-5=S>0cjVDl87m{ z*geXU>vZ(-CoSoao+)bl1>Laf=e7~`!F^nsWH@KwMgqr^SC`l82~O#t=8~i z=+&&EV$%MOHkUiXk4^!m^VHf|V=x79ItQh{KJmShH7@m1AZNn8Pp1~@2^Z}xw%K3j zO>$$=L7VdI%cF{s@n`6-<9Yr?*Uh`5V2)K6Icm>f=c0E>`Z%Lk=UG>ipWqj|U(>}- z27mZvpc*7oUnN{3?R|f%#Z~u+7KhU5t2Xz^v!(PJRDZPFb$aRCT9yKC!4`M1$&@Bw zX16#Uns8i~Tu%5?(BtKd^mN++2|ep5w^UL)@7U&^R3{HK)mzQ$7J|xJ`s?&IlZU@p zN`_T2+6A+7KH1-sM)j*4N-CYk9KszGTK0p3;ZAI2eeX61=}kIcpF5MAoy204aLzq>8V3lmzRly3WjaZbFri_vla`kncR|=oMF;_d_Ja(g(He+`4 zBF=BG6`BiK#u$yt)yK{%60i|0VF>(Af4X{G7+$%1s1Z7lavAY3H|LI{RqWdOMwa`? zp+H%B9gVDSJ}iO6Ct0aK?cozWvlvGj9e0ISl^ccAMsk-v#O4dc?>)Rv*s8Uv?Pvkm+mf7De)@bIx@yYA zsl{Bg_Qy|^$LOv-1#-N_H}CAfGXDVeB1??!mUln6dCxk^N^>$axu|Av)S3#(*-hV zJ>QgQ@EkXPB(Bil&jd3!<3*eQ}H1C~*3^}M&`FZ=BD*cS78m@mj zEZdSS-Yd!6q9QH`&73GLDmO7rWN}NmT33W!Oe~O!n_M9oO1@5R5@7AbddGJ_<^@z| zmN>#`N0U;pF2{%=&LHG$5{>`NrWm0Gi$I$|t2=Z*T2mRagR#VqmIl430bPju1fXpLL&tWdMc zfr+(!ya4^iWva~arvzEcwNgW4Gm61MoMltyc3W-HeC~p4OJI-p&Of+?RR}7LkkP0t z?h~7k)RE9q_UF#ObwB#-gYm6~IJv&IpWRA(C{>EdR@@!M3WB{^Sit;5l>ZImJYu>cqj%(gKd*JB^EDAgwp@0mOcK?1lQX2hVpN`a#d}k{A=$x~x zzjtd!xH13384&a4OAI$X8Ei$^{Z4uRJ8A(Qj_l%7-f}KBaZ;$bTbD8F)^K%f!*R;n zQA#6&^<=&drX)8oEuo_kDC@cxVrx{<_(&~XwWQP)jMt$gR9B$K?|Sq zHU)DnLS3vnC`%u{kGygDoPsB4TCgFocIrCdq{VvJR$j(_rB4*XPA_XY)9nb#lMWKh zT;PzEEsrHcJdnSHscA)#UFq1o`#GkGt_rmxaDnl?Y>RNj*WL@tbL~rFpVB&c`0LP4 zoT|my|FNUQ?Rs5W+3*;VPY5%@4`+O+}@W~DJ#2v#)<_P>~pao!ZGVC^%NEfxX zN5!9&z^W?AvHi0UIQcZg84{Cm2MUCINkdNyvor==yz}^vk6QU_rM?p17!%kdQd&WK za+buxP>|#Oe1vdv6ZnL4AG{*Zgd3gH!CHWbi_=2fI~gLAT;E)DfOy>n+d4|ly2^p| zo}|d*;LFli-?KWnyje0KU9@FY|9V>4KSST0oZlh6U5UjU{GBA-c<;D~)cv#4?9&gi zBfbOGfaW(w>!s!8TaT#%BX0Jbb->+eDK_)#@w+sT@!l%zPUJUp-?7MV1x2Ui>j~rt z>hl#s6Tml%X=U<^n32ScSF?IfmnU?KPobZWRG6K$XFq!+@KbrAC+6p2_R{{yjZv+< z+wFCcDK&?#@f?j+`KKTHhI6w;1d&L<>S3FSlUM874^%Me#R``^CJ#42I$5M zR9Yq!UCs|foOC{HQU>l7@H4xtNI1)Xd%gi3xbm*w?tDj2mdexKB}DfepUfq{9yhk+S|Sy72; zpc4_ysNTEod1+X;nO0rl2uF4EhtkB;_ZkUO#uyD*VM*Sl zMPB9@bx~ogZ{JVw2XE5{>(fu38FK$s<3N266r5Qxz1xJWc_iQ@`{EMTAWWQVv{39bOHPhxPg2(vpGVt2RMRU?K;sOptbmW}$qL>_I|+C+TwuM*9U+>E-UP5j29@1>3Eig0!~=jp1-@KZ@KLj?D-aGj_Wl0vL=X@5aM)?mt}i(FGx zXr^oNgmSHBj#vsEM$Gd_zP#UYXZY$OEi~K<8u@-jGiOx|>x0r~V;{~eE~@)=GZ2?> zrDZ1NTiYR@Zb>+&fXv}v1kYK~274X=^#42m<%0F7iUdQqXIww?;F8oSU)Y8>tl`BT?2O9raf!i~uDSo(iH z2hPv^ZSApFT+Tg2zGtE12hxMv$RG)(uKjsWPXm&mmlBM=80iQ9(nzjn5r^lgy4(KB zf&Av_WNh|Nbh^d&pny>?ojkl9DIN@OtSVAqK`UUUR540S)Wy!;eTri9{c@ zY}YAH@}uf~k39g?0hk{T)ZJ(QrG8dra3PD)ZX+QwAzRSsXBAK0RH@m8?~_FAR0#9~ z0~5ZhYX13FH|9OBe8SbjB@c^v`_c@r4czR%mNZY8#Nx4&i@}*`4Eb?Bv{5!V>J3_% zZghm#=VlSJ!`QM2D71O8X3yepVYO}P*|^p3pYQkUr!j@RNr8=fAKGz3mC`egeBHLC z`F`ZaK7GrZSF?r|Kr*Xj)(S*V6(sK-@qITVTZWGm~@)rkuap3 zZi-^fkM3)0*2WQqdDdP(pn&uyYqMBqfm)d|#Iz3d3a$<(ZcK1j3qA zxqIg0HKQpl^_4Bnzeo_sz^3>2>aVRR8E-lzESFV9;04Gyw&d}+2%jQvyim92T~ngg zPAAW11MYI-?4+>N$OLGqniChYx}3Mr@uGK z@KhKsoSN&9evtv=dOZ$DF>D%it!T!|32gaQCLMJ!+*c@lOD`!=RxV~_V2q3#^Qc9- z56I;ClbOI32RUlWZMWlV9%gNg=Ur3ZDt@6*$xuEs* zrRFB7c|G3tDhhmgq0D%Lahn$5gPBFC;H&|swfbgad|arT(q3fl>;Iqn!;SOLz@26% zSn-S>_&mbp+m|itp9-i|hYZ+7J#1u_)9lv_y1FMK4P2sP7OIG6b%N*5NP#aEKCbni zJ&=hp!&o7ZcV@qA&pdYPOZ*pB_a)Lb)vf}QI@2Z3IpogiT7W3g|LiDl?m&+E(khFG zAj`Q5lE+NF_g5Y*?Bud_AFs1bW@U9<1AdQ9i-|FG@d4o{7}*iWIrqm4%g)pto^PWY#&!T096-{P_^(GrT*RuRQ!%ONVPwyA^CgCB=^S+O+Rn zms4gHk^hu9M?uh;21~L@Yl3FCS?L8+M*{ zG(B5EC;Uh}49hbUnK45fyk2|x1=cF8OE*;h0ad*~%DsI*-Be5g7SpMUH9>|yaR+2w zoE2&1z4ScSH_zXMKiclOcR3-0VeqYSjpyJI#Uz~K)I4L{tx$J<{@kz$t+&35iJLyk z%DzbS=Q;{8r_(DCr;w?pd#mnF3-U=%Vh3I2r)NIbQ%YPRk|{^n9$f0LJ_A0j6ne$b zOrr%>+ryNnB7T`s!F6PaQcdEOgq@y}H({<@H@6;@4>GJrL0T{r&(px>R!YW1LFI2D zhTq(ZKERHYPCfreG)}6}8JOZ(&Dp2UA{C(5*F{T;R_QN>*)1zilz|||gqv*%1~Juy z5Fyi$O15Q?@4p56UaD_9z3aHV}Z$>KuBDbd*r|qLFKzc^}0z`=_F8Sz(msSmM z`iBhUkR9u#vxzkcb?RomlF|xcWq!oPg{1)~5k}4}`tIL73>yXVd7S1yE~LM$?@141 zp4Tz?*UsNAWL5L)mBMcJcmHLrAw4mRV69m`&hITy_H=#v#U|i!JcjjZ`9DDn-DzxW zjs`-(onNt|yM5xDjIsm!y*%#u-~*Wf_$lIN?lM(Blk7IWJ@>Tmlgg(E8dZMb?!;== zF#CBqD~vu)GE_o#9R9PraaV+OhCAJ+ABeN7M&$Wmvj$ zzj(;Xn4$yGti`1}pO^l4t3DI>9LA%m5gQ*#&A6n$O-RRr_Ntm+2AGz>=^XjXV<>nx zT|7%wxmS2At7!XbsCCP^YDw}^KATHcC6PD#y^@xQZ`@d4)wRS7C!?d*+{8u{ibpo) zA&3!@PcrcAhvr<4^()d#oCui~HiGzj*n9olSTXM)5Sqc>rgUHJl&raLKV*H?&vScQ z5^?n(xNZWXvFtO(z2GY;QOk=nn^}C%U5F{!(@v{@aZ7A%#w_VgOp1$i($nk2QeQ{h zdI^@nyLMv30~uCByHDKZ&RQQl1YhsX_{hLM4X4$3J*K8RfsI8E&=p-DRC`fo_Xqy{3Hl7GfUh$R6!97&sH8m2fO0>3ze zBv?ryzz3f4s!VJJ%M25}LL;8>TjX^7h?aKSTP*RTSoS+*qNbbLMA}A2{rRkYv@(Z9 zs*WZ`5>+EHH?#8>!7InoChGKH%c?TQ;Lq$Dr9B67n7e-0uvQsqs9E+kkI?plv^ZS~ z#;^4vZ(gg&1WE14eRlf;hokokyK;0I9_X1Uc<(xhWt=#6scNeNztpn6;taHKiCIQ= zb4+)-Rz>qDI}({+-(uN4@U>H5z_~V*$qUhqrhCXEQeMwTJ?WtLyFGbRf*%~FP*-iPd@-!!E5<+a_p2BRq!gigP z9FJK$MamiwwRe0>4-ORB(Ml#^guQ2*bqdSJt9h#RD-@Dj0p_T;8fbty2_; zJ6&_236EIJJ4TL0tu0aGos}art}DaZd%IQY26UAquwUAarY6*J|wzajHGjqw9(@+3vuLB*8n!VO@AH z61e?Y;N$&~RA=l(&3<-$A701*CW#aD&u#{9Ez9$pkegjp_G8jwAHDpNV-*eP{&(N9 zhmz`g2m8L~W@zX=eFqvDr7^~30|TB0i{JRm(dwJ{%##_pTN{GD5#f9VP~r<;Jb(Ve zJRB)NSYnP)Gbzbz(OvFx?~*Ro<4IP(vjYdhPEKdb5Uf9BFLk!euXDNOr{WA${g`d# zuZ6Wxb+Qh`#7S_9zkEA`Adx{{V=px%&9AB}7sOQD^YZD*UD6s z>-J?{t-xeOqv}rMy!}txCA54jIOWM4Lsm5>@Y6s6Nc|1^M}kjrtk*2Rv5Et}v{S zsp7E#qmw_WCt0wwiOWoL|p45zNy82xqVejRwM|EV22BEb?{*J*?h2Pn)uG90tJsCJl0axhS}Vb#hUWxw;C zV0T#=Y;WRVd;5OLviRTITkCK1ICQ`GE6USDAfh8F(CUUZO!ngQF~;^AL{SVlA`{ML z&b#qV{VN0=oIhs35*xBioXnK46Xy{EEbF#pUhjFm#+mPVV-|Cr(3SyDGrD$@+Da$i zsZe<)oNK0{jVvFU+KToE#3R@mpitGC~`=7F%WGF6+ zWQE9}_rACO8W6dabaXY*>q)2ywHWX$!^tKQ+Y9Iua0 zk9bp@+z-6Q6bwH5ut!#t0Qnd)WYgECdUG=fjxS;a;@24!4v8<(5Wn&-VmdC-=*s$Y z{w~ohp$CZyRy5GZIW?C%B*D9pBnkVY!>qY6Uup*!#pG)=166^v zD>|}f*^eLgq!U#+_^lzky7SC4#t-&!5AdqEYTO%q=c#&B7kR9Tch~Wkp+g;a?T(Hk zPc5vH4H9%CyGP84yvOEoOvxl&^jUw}hMaV4ux{uz8vIplK2oZF|H9yqAJZ6kEr4u$-D(LExdMH; zC>}#v_dr_5<@ZiT#bjoT_&pC%H&vGy@G!F3=e9t8Lu2Bf%aY~b2z7?V1x#lL^~e(4 zg0ye+c(Wiir1dBQD|wzH;g7SIk9ZArG=E)Gp$Xw9qUI;%mGhbyqS|xru~Rq)Bh*35 zlI253ok9=-J*f&YyE3I5T`uSOI+Fiz6Dsy4Zd2$H^6b5r2|V^|>*D^Wp)I z1Pc^%Cs-;u3mfTJ?@c@(a$n)oWP%Zy&^OH~CN>qWNWE6#31SUEYJnZC+b~00`(P8T zd1oNuEw|43+o3gO8nR{84m|EYYq4XinTu1+6l8FzL4mc_z?50-$2y{FPd9(;t+a*? z)g4D@u78%cc)8M5SEo^L9+i`;Knp*Wg)`SIeYo>*lg;Mt%hpTy2o0k=yX-N9+&tTS zdS2GWP=!E*Kdq?P;(B9rHK{f0&w6#~P~(jeu->#D{VVcs5+uFo%(WTG7 zN0HBGK`9iBA}J{UBCrsXaBycS%7#U@oO&DnLS;(*&J%0A zU0kOzg+Lk^^{8(F{nih&@ufb(c{2%%u2ICQq3BFmMkae$Z!J7L?u61A{|LtpWT;Kx zhmfm#j!-_c8pJDvqN`KKxJRXi!Ghi1#*tAnMT?Oc5z3?Ni0O4rjv{mFnSk+;Nn|Fd zm>p5t)_v1)8tI6VQsHsRE>NDeMybdOa4}aKkY~rVR&za=#;4Rk5@U(*JDn zM~-T8fkj^=Ycy};W!#cZVR+=@x|5yETY?rxa6Zl8hf<&4gL4W^)zRK; zGDCIeYuS`%ohVI>##f!|%P@r^Qec(sFAdh%uQUGOL8|ZU4DELzDIkm{vaIgzB(AE< z85WzJ83g=V4Wga|^LJ31fGGEZ)yP)*% z@p%kzUz=*&hu2Y-9Fmn<7l$sc88OG&KkIs$J`b4j-5$-;QH*efcqQ!3liQjF$bvS4 zEa+DErWUg}V~1Jt{&(-4q&dDX5E{MFZ#TBaCQ1@)p+#nLk`hO}FsGT8_q6XYIbUL~ zBNKiz;|K>e4GdW@idEJ&I&N5E)iP2{{=WmXluFimhCAt*Ij`8@lv&h4(-9GGy>RF{%^4 zml-5rz+MIpjQOt8;Ng$USJ@wLB2(XYr@mxTc$Nym&-oeVj_3TIr1%K0LOnaVy;C(w z4s;JPz=^tam9Uoa=$U!xW6Lon zFEI#AdvjL*Jy9M_Z@L^hUMgVo)mPeyq~9a{JT~z@IEBO9nUa3lhD^pGqG&7E5*GXv zB%tw#kSRXOVOuQ%c4`sqW9Po?t+twOgSSA1vT!~SA6{{~_m=?RPZq7q=A0rLK9pn2 zpak*!)t#ZV!~cX|%lH=Mllxd~9|%og@>GUC zzJTrQk;ZE!#`8)D->m=5jIS7C`DgNLX%o&k(cQ`AYGc*seTt7`%tfD6XH3jy5CvhF zCH3JA@$8MIFHwsTX82v~--CVO+kbawWV_|95iunm69_yrE(r5i$B>mb{&Zy1IV{_v zrt}@xWhX3&3O0})$@7~1Nh@*JuZx&nQUS^HBcGiJF5^#$W7h$(nI{ifC4Uj%ehc9aiSmn}y6Hbw5IJ?2C*o>?lF^%;oe_Hng4bl*9u zWan>TU~%+(D=SYYn=4XP9a}a+RRpmsS(!-mexqnP6Sf&LLbqpRpazX2pLfX#=>4c* z2I<4KgBXLl$s7i26n3vo_-BArE3)+Q_Y|_oxz=4a_95Au0^QxM(Sk=0`;AzvJ-oNs z(x2~9u!r?nLrc|w@qDN-XtO-a()2U#(6r;sF6Gz0|{2k=f;&PNz^jC-PWnWKgv<+ zlFhbr%wFbI+L?oEOI;E13-DwVF2LhpKfYVaRg&LxO1*4opXr@3`-ZKotQ}9jTfm~< zmYs3GzQMXfTv?&@%x173J3d8IjSkPtMY(laz3KYS=#kU;=tqz8%!Uj68YcL;c#Y#B zT+y8yk*~EV5dHZ{Jqu|->g>+;cAh*T4oaRjovhX*y2=|y0{<-bP5?YtD@2QjVD=gW zW>e{>Y({D?t8;dgLO))^{(KXweaftweAdvp*IYN_sz!%t;_7Nn^8G7Jan!>$nMhl> zK=YU)&74DxyU%!#0DHr0`0c?pwDIV48@_;;W=jhY@Zy%8xzaSriW9{CDk1>H-D+ahe(R5mWDsUKvmGXFFTz z^QV=GE)e#sInMu@_T`7n%{0fo$F#H>eHodn{DLp>Vmc#ntO~u5KT{Bgr6a4ib2}X+ z8TzS}v7Z*KyEfL6)5@aK^`f`#rjl=`f}|RWZdF}uOTqd(dJpBfg!RZlVVjOPl z`&2N}-mL6yD>i_(Cd5PHtaeVFxebTuGxu;y)+Ear^49lqdv5C6hLS7#Z z)Bf&U8$z1@>0E=mS&Y!X?q>APvC-WhI@3d&|GAre%+gXzUI&@$w3i@j&F6CG#Evc*R;n#D!bs;#Us>@-6ZHhopxLDip9 zDunY@7@Q>;ytt(R!a2mKMCPf}cHrDn@(R=D0q$kaYeX{o^r+1rE$Y9MB|F31f$I$YJXbjq%7Cw+#W?tcIW#w6XG<&%9a>y~t^vv`i6 zFUV(9s!#CaE4;zV*cY7*bRKbiFuOa~OmF`@sqhA1WYvfpG{dy6b|80^6fnGK@EY4p zF;4#>4Xy}0Ig9bmf3SWvCDh2d{kZaEV4Zd#H2{~v5H{(Q9vBR)K84hLCF^*%bk;@2 zqM}8PKao*ij8|;paNn`B!&%<-)l=~w4<9&3@!@pSci`O_ML$=fRXmI2bw44YakiG( z)xyHUJI1?=%ev6DOWZed1hW>thF(Ms$6no}w*snw)+;SV8iGH6`l*4lwW&>XPnUBM z9$OCK!u9j6y@TTKA%64~Uy8A0vCZiYT&uiPxhX2L{*azr$E3G<6Yt03zT{i-NDM4S zj83_ir<#B74Xvfe5lQb&EmZCi^?_uxuQ2v%Wk*;Yg`bP1)Yn zU!M^zzR#CHS&s-g>!3U%AK{w+ZA#fYVPQ>Gkkj%CcX{chAnyX#7dPbc;)Z4K%o#DSj+0<{hwGl@qL+5RDV#1@3tR1S$w-laqV&8t0F3z49PtUNF5zm~+ z@D;D^y>*1QPTVz#?J9f1Ak%-n}2W}qY!eSJj?uLd-YZH z!^h_QoUfgS!jqiqb86X*a1+&>x&GF7oax?K2}!kfXb`lw4iv$~fk~n^w28i3TwC$< zS@-T;!7-KA33lP-p0n=19Z6)?9Xs6#zUxSR7w=!?i+0kIo7|gT+XGYL@wZ1>Bd=}y zO7C9sbyxT{C#v$9k=&!ecZ?9bIgo}84wN-}JS&>E%5N{&v`RH5{PbJP!>7^~kxyar zExF4sxG*hj#M{2*Ju}D1X*H&{3`P@;g&V6V^Ml1wxT``a0*ubwdFOqwdeAZa_wu$eLF)M@5?Vj_g^V}GtF2?Dn)R`9rE_F=EWAe&b6fO0@{DhG zq*Ewyo^fs=z5!F!KJC#budTns;!3LvX}k(>XX4ZiE7`Z z^!%DXfRI7CL0Z|T19=QjC|;*YDA9Sf{mZi}ksV3kxjIl(%{UW92c5i9(|;i8Ofuf; zh!!krYkxO16M0kayoSuuXj&iq&K$Gc>6MN~ly*veg(2iW#XBcdXC0kTh+{#Cni23$ z^ds+lMz(dGXRAY{qz)isGncp!Tj;)q;g`#UA8%`GYbx7L^7S0_S|cXo^b5@!CrPlT zg>%_%d0roXxfDu8gtR^pagG%2R-UUPUmf*-MX&zjU=@2k3R;KPPRd5np<-rq`Ma;j zP9D5!dRI){xWmfh$WbctZLUuOC%09xce;($j0a z-|zc_G;o)^g(xU8ol8ZfesbWOBP7d@gj|;B+mcRM`nS2R64#MYi-m0Qq`+EYNu_Bi z;hycvPxE8<8E!w7RZi^hB>8Ht}wSD7&+jy@Zb8No%XazJeb;c6Z|6?6Njj%wb`KBl z_L)q>NN#r3lxxhdDGMK1YE7ymD6$8~DS{b^QRyMY2s*9u9viEPJ|#QeX!-Vn>`U3! zcqqGuq_xB5k7MYL9c%CM<|q*De8WC zHMMnycg386zij(-+_aQy)4p+Z=O9ok-=o90o>?g7yZB4q}wsnUW z!yl(!>~k33F#M1b?lP}vu&!uf8!HQ5jUw%wsZ=7DkC)HTYwx-0((>&}V)Ei(Hu&6D z`c~oKY;SSg2_d9XCL=m_zMEi@;D^R@-l}_U$YsKS9KHt|`Z@1T`|9hTf7-}+yOrsv zVgQ}G4!+_xuIm5vZXG_b=eW7Xj-Pu2#4s#6H#RTarH+AEcdFKO#IDxpTMc&fEN%aM zV;jhL3C-ufV%=5jfV40IY`-KhBsC`eCE=1psn8=m5s1*n+lUs2vXET-bE=MC$3)xq zlh95H??dB+SQ|BkNxr)7 zk%#IhX8++Kxgk_h#G|;NxWcBJ7}&=^EYV~b)zHY51sa|o7oVk-BCV;K`Sl=o?AbnD`y(IIN4$Vh+-rt}1#BlMbpe!> z1E8!Ol9xi{rQd`>aPYB&?i|$1BwO{(d5vT$5#H{&xDP_P!O?>o?zQ&}k(9w`5=H(d zq_u!HMGSxIF6kGimAZ4SXB=AzMvBPmCOC^ht~YzU@T<{HY3(j`^0xJEmOklgld!I( z5t`!02rlZ4#@7qBR%V&wu+nBN1CrvxB&C7S_Zc|uuJO)EU1nMIAgE&wGdAon4P_6A zi;Nvy(zINcb3p7sc1#VZQR|I#;B%QJ@ihPEr4`l*EfMx}V`off#IB*vH;a?GF=FDT zV|=hWNFJ|6!RfiqD|D%xSl^|(_$d?o!H7C71AY~frFV;V`mC?l7#;LW$j;p={U{ZN zmnc4^E`50jZkVzZ`|5d#R$s>#nwmD6cP07EFRE~JrN!uHDE$tnE*UjQDv0%Lmbbw@=*KqAD#<*A0vIM0L<2Q+;fu}9qc>0 zf6bPy%RN?Ecrg9np$dQd^JB?^j!!EkYu zf7bbHxT@oIEkF_j^P`kKB#*i;KBjVAbdwA4T%AK{dDX?-FoL=xo_bAhSvQOCZJA3H`{9gOBmN z?(rnRXswZ|MJLR~Q_;?5N(c0uV&D}O~1X%xNl1t}E z44P9XQal^O_iX2_sV=dqFL$X%K*r_MsXUpV)%-@qb?YZ22jHw3OCt)SovA;@&a<;Q z`Z9Vth)4t8uV*v%6@A> zjJcAy&bJ79Z0eUQTR8j9`ywW;X~eX`FDXT5iM;5ATZaX?{9DI)g4FN|6T_Fa>kVAMKv^jWFWXfnVFV;4eKx0J41?>h3+#bNA+u;_`fpb64J zI9FDiQRW!e*!_p7&Zw{J@46S&iwsF&;MEpM_k^eftk&1K=h^{pFAKnySJ!(#qjM{f ze3vbiq_Zu&Y|@@yNMyS!fA!R+$zbHQC(3+EQY0Os$qbDo;*oY2(+5U1HEnno4R*u4 zg`Sz@qPt(gpQJt)b{!dLc2&{-~-q9*hdO$9~RAmgnSh zjIAE^lyVb1iU{+PT9)}b0gTps#K~Bd@pLxaH6yJGxK&9r<5T4La`VzV#cA+qP(7|Q zLrEzfS;7iBGe`?kxqsE0;969GKHgH)En5St*4tI)S+g@?hSS}kG-DPQ*<0Fyy1DZ< z>X<%`0z_-C#bg{k}2yyvz zr_QJ93MQy;^Dn%c@%YQ{BKB#6q|6&fWdFv*&!76sKJHWnZ#W{Q%vEhyr6iu{W>TNi znKCt&-?Dl_!6DkA_y=iyASU)NOWdSof*8H#_q_pmWA%H-MR^+Xm@zs@r>=(tdc?9) z_Nm$6pAbR?S{R+6g)uSD)5Gcc?U)qTko3sJG_Oq%B5XKZIXN`mCe&#t*)|#69HwUV14ya@&i%f`!Bbdi9#5wvz#-kk3sQqahO8jP-Og=bFD;$Ybk4V=+0ze?|c&O zRds2Bp(^H#Wwc!WVoB=DQ+rm9NgbujBZblo;6FF*WJr3ildi9b8P71i1e=!)_SD9a zaTp1#qZwlByC&#CEySGu?Hh|WGjBRQ{c4vC_*AlrA_w-lp)p20F))2eK>xwH;WL*D zY*uNLNULa&)~9g`R}609!ly^$6lA#A z%sS>yQMGrw-@?P{Gc4$_TxPBpUnApDuEe)?k2i%gjnaJm;et3>{31>k$88Eh&1p?E z+r<%62bU};#I0NM<)7spPBw+Xoc7kon?mFG)c?6|VF-`ct!pRiR;%KkgB{oudZ2Y` zE}<4eoD*zS`>;2A^u|X=r?xaO0C1e!J^C0ygGdD0)>YAZ-lhR&oOOr(@l+Y%nFVkeqr#Mu{MuF zq(S8zEU%IAYPAyoi}3UEQ8TvFOAYLd!6RX(Ct&R|mzG>Atf(%e%kzi3bhqoCQhD?X z&$U_;P?i;x^^!gu1^#L%A(> zT02}Ni*oT%QPt2|m5GrfV*<=J{HHuwfj~iP?M-7*<})O7tB@MO8uTOgEv?u{0jc%) zT3#>f#wq8f3uQO5d2RNI?Lyf!EFG0pRi^cZtVi`VRu?@Ds^6#tG7_VuUz*!EXZw@O zUp|?s^zTPk+on1tbUg&)?pLae>&v=?1l{3mSARRKN^D0g?%bM!o(zB+W(ExD^%eh) zHaV*j(DQ?X7QIHLSk+T$1|6L^5N(Pa>tPwjqcm+7wl=*{&wF)*+Da` zw&Pm_$fJF*?ep5%$e&_5gQ*31$kgmRKo-AuO~4B7Q%AGFn7}3R)r%3xAh}CGSOL4i z*8j0=$@*8R%+MJUjcaRbTdHYOaq*V~rrbUrswL^2TO*$_u5QRytctVir;+j0tSL(LTl&;Aan51IHz`Bbks0qnBM}{$GTz?r1O^uu98liQ=D_UlnU9ExJ;ucqqX)4N zAxYWeA7uxmR_U-&epUya*I}_Z8@Lmz6nc|xJmfkXDGcE zOqL;-EW@Goh(|{Acm4$-Lnmn-OeZM!;UMI>_ibXh!SXN%MKloeltqryftaUkK|dQV z=GjIl_dDh}pZOaY&po`v(K4*+>s}arw7M5>l8nj8+vCzrUDJJTz#7vcTp=7LAfKt% zYVzQ(l;>l#j6c?zvcPHFR*AC0|9$@6Ej=zW`R%*o9MLhc+e0B%ye55lL>u}Su4_Kj z)S;TcBzxxROKf$vRx==FjL~OADneAjSXG%Hw>;gy$N6&>%%d+ z$R6$8ulAsoA(doChLMbXJuH>TS*L!7@9xa7ggA;oUxU+_XO3Ao)C7v-+dA;7b=cjO z?qWs%z&X%xORI;C~1DO;R47-HM(?)wH#?9tHf|U|{cLi=rI;7Kdkr<+~y~(zSTpMDu z?|C{&4-pa_8Ho}MF|&t#%24|~OE%V1iAta*^N$UnI@Tf!6Q=7^AmXtKnbHDIH*0~XDLS=K*Ay;(dyC&z< z^CUH9=)ej!GKO2BG*0<;;`V@&H|acfgm|~F?~y6a)qcqFOeD)OI9{TP+2ZxL-c+m< zuWZ${_<}O#s!F|hZeH>OqOQ2~&bdd~_W7GFW~bbb@7dEa7E`qp7@tO}%rx=9tG}-U za|G;vR%f7u7DAFygXz$;ui_RPk4)ni=6GJDr+HUSWW(+mpuHk8miT{`xc14<`G^cZ zE+1(O^#M!Nvc{iVi<_wg%8^{^Cn-;Mw64MW=K=#)D{yJSeI!=g<76>|TcetTnWH-J znMh+nh1?S@&6e3^9Q28t{K9|G$XhG={J= zDKD<^hd>nX0;0I^A5mN*Mx-?pcOeMxQ_m}yuO2Th)O9!1%DZogl|#7(R>@c#uTyP* z)+w7Jz5u?daS`3{9=0An@?EVb zip{hfy`9`w#+jgE3wtCQwbtB*6UCE>PvU~VF9d~qClyE0`8KM}#>}*i;YFTD2Bryd zy^(Rk@n$mV4KOVyv!H_%aeuT%SSwhk5a#fFbB1kcdJM;*hOv*BW3372NA zs_fz6#dUExs5$UWZn7}`!mB6wg_omNlB))R*W!x^f-CmpM$<%(khl91*!U@O=`I+` zfeVqK?Jye1;<6QU|D`eJn+`eRq^}-2h8}_znkR_?xUVp&Eo&O%6$!jBGYRG@RbUc= z<_(*jzdcMpz*;u}gNm$C_fr7F?0hlXnJ3?ID2ofF{ zU$s|WUR2oQFfth|DCr6=k^|foWeEbET1vDYH8GDRXXhE?vA&R=VstxQoK#oC*>}V^ zVj1J`K8Nj0|#C+r*IZ2>_9P>XyqcYM$PDsyPmC|6G;HA|LbBR zmHWk1vDQ&7?{GJQ9L)~*rbu5M-w4J`hxt^28$tI~ryg)4ND~#cM>z0Otc98pye11a ze_ec+EL}!$n?FU|=CAed&7T);^QYFY_Mo69@d@=U&*)p%z+?rtEiN{xCya)uZjP+? zeexAmND$S`23r5Pd^1SP6wI&fbLpn7gxx`NPk_pDG*+FX1ZYMUZv{h z4kt5H;lW6nuuEZbx(Q&m&9q&mnHERXuw0v|QV}A;N54;0&5pnCEM)z$ieU3ctgpSe zLmU5JZQPxV8b*CsK3v7w`O}F0@#atXq&N-YxGGU;bAq^MS8W3!xWS5yjOaPo4YHX0 zuriMOc`Xq8OnXy88TkwQ?(;W+i@;ek;wLYU<7b9*nn$cZX(#=*HDB$3;xqvr_M|w? zc2bqG{;#Txh79$R0V_xh9`*G(vsAd8iiXh&vm`zId%0rJ`CrLtFjj^Ev@DsnNJT+E zk$)bjNJM9e{YS+&Ks-d4iG;h@WAC+#8pp8#eM3~mBTQu?&qLC0OoGwBKZ_rCA) zfU_s<4I8KNfA9OYk!cw7sXPkUpT+9M2Yot>`6)3Wlb-_bn`!^Ao@S)0| zIWY+xwj{8inHHB3wg?AAhF+yCwaamM+EW}?mZ{-DwS@4%Z;vRKo_V4loWznB&t%sn z65_)AmYC#A)?kdm)k?IlZ=<{QbdByO7KPUKj_cU30aGEDWnuvR)wKzdO+ETcH(Pfn z9R4HO6mieW@m)I`OWPz@_c;U+Q^l^zXO*h3pNS<@+qoPpwz_tOh0SrvOp$&PuLmv%XS``{yuQ_ zJifZgfEX>8q-V4h7I~JeXUOu$!W~;aF(rxS>X~x15Lc%nx|K%_XWr~=Nb)i_8ZUEt ztIa#~D75P#($_}g@`R%IEBA_#?!JBcV;{6lLP%1zGHpJFk4#TR8hxMY*VrMIf8em< zrD34Ks;QjUn#T%br{Pkx575Xt&E0DYR0)GjO2>sSi+3lRHVU&8w7g)AR z>^8-eysJRzy{|3HLG2aQ92TB5lTl*a&QvrvYG6w{5QNSaQhVDO)_@GC$14oR{#iQS)jQkko z&2+pH6mV`&bE2P08c|4?bSJ1C-3^55448;gUr{G7oelyy%AFH0TLH+-Bw;*j{yoXiG8NU` zJmT+*wROuFZm3y<((r^lbNH$siQ|_I-B+dQF}w8;z6Kse*@_;cB(-vOt6BU~=B=;u zGyW2x5Vgk0xrLQl>X6f?%nC}0aD5v$J=fbIHGx>TxD@xBXF^yhSWoYD*CPV{~ z`a0&J+g0Dwe(af|ODYJ`xe&ENK-L^StS!znNTIl&3>6d1LnK|d$SvLYVHm`8+1Zd> zccjhxx$))3jQ3&mr<(4$p_%js;TNDO0kaV*rDtS|VY@8|T}%UVk_0-G$rh1*&)ha& zz1b(seRK%!F|}7iZZW~oSES9e{`ASb@|Dx}>pJp9C6%_G&W1y?a9KLE3zz?bf4WaP z6?otp@z`Rdt!ebbc;%K#W;<3CRt!r2+ zr~)rD+*63{eQsl&t6or0fUT5O`kFt)Y+=+NG@h~q?Hf|5+kaF_BdPr4VMUN?rWvx= z(pC8vp5?v}w9?(R$){=4yWS&hIXb*xY;=OB{rraFszlI~^O@5m`9gU!NpxdNHJrh^ z13V#akrL;WaDa`k^CY1*=7?@IL6~HvHU6FDiCV4>yfOwZ4IE&DFewT6hg#074b<`> zlY!lzoW*m0vE{n4NA5b$i&s<8YDhh4?pOUh#Z`=tt_zW7(9~t{NP1*k$HL#IZ$@sknw%nPJpV#t^GIFA1Elh~YS-7S(NxgWO|FoR& zSiFK9oqw?zRuDZmjh++@m#X3QA4$tP|s?D_q0OzDv3?mJ2G2V=u=fwP!w)uhMe z&l}nue$-KXA_%nNsbR6GC>Z`K6%T-?JM3f61NU0acoWO*;`{WbgC`@?994QT5b0o( zw8dk5_BW-ec9y!CC*5l@x4A4(Gfy*zS(Q`5Q3#PxJz$<&QBBt8unVl)0NV5*9>f~o zN{Ic}%Xbc{lb>g7dk3ppCY~)o?XEqjF2Kg!ZUgr-RB#iV@icsFJca)M8&B7lx;|$s z0KPmW&n#wb+kIToLyD|s){q#Wg|u2eLJ6mV&W!WR&DFbz2dKNJdq1Eykxmmt{l(<; z_S}H>H@ZqQ;#FKe6-EOC)T^g=nx4gD#SA@RO$RZR)TdY>G?l-Vq)uiVlHq!vMxTup zM5b`;Zf@dp=Nn^yXKq>ep#l8z%9L7?y5@8tdTxupIRKaoB0v}hSy2+K)o1-KDh1OE zH4KP#seRtEdQ*?)-IIHiqGHrnXD`c1niISt5lWt^rJXRqd=gp(h`Ftx+-MA8Z2mOg zWeijiy+yUT7`f zbX(XVih2Nun%&2YxkKmp?$4?NB{U!M^%1`u?Nn0*j`t^ip%H9Lzf6wh>Vpd!MSDox z?xfH0XSoG37{@b`ZAek2GREoJWSPr3ltpPnR!mJUJuqHLWIq@gUJ6La&XRMsT7 zezM1rEH{NEN;x|?*tIy^nHzx^kGY=*7{NFh`mvvkfYnT-2z?geuov9C)D1E*X=sB~ z=}*TJT0k9zJyzCKn%Tm=0ElSc4O{-p)htfB(2XoUb~OdQrfCZAe9wWtfK8oLVs-#v zPIkik3(rIKt=B*!W>V3j+#6{dwrzW5cvQ*LwDs+MQg7GNmrpFcDO38ZE|^b$YuNEH z+OWnK1FWWjAZn-F{CVud4@BV&cn{Cx6g2bn07)*s`c-z7^6yRyLkN7o{!16;-|yzX zaW%PmmKnW}Yw_S=FJLv{Z#cU?Sw%iU&R=Go5kt-47Ntyb-_Z?{@Lk&_F=eeslG{i z9xoz#$BW2j45uqa-O~9pOvX^%mKx!ze#ytNYpJ$#BC#yi9ln`Zo;(ax8B9jsV#$KC zZ=3G3$CKk~&mhEz$6hy{xEk^OB=Aw;XTdrNlA< z8wnE-_-hHMqRZ*Fc1?aREKHWe8Qwv!z|g8+&J&U-x~~~pI>U5P9yO`bvvmmCNmmUg zlnHq5|J_cawp7zF63^v|l3=xU*xgN-v#kKX12f-D+Xl5LqIeekOyqwnmJ=$vhLoCVyv9{0Vm4QhQ^)^P0na@={C2w zC#%%WRBzP_i(xTE=E7Ofe6OAK@2Mqe^-fo8UgNJ%!6Ofq;VhXUNL}CaA`lWCY`h~L zpDR)wu9f)=y3FMQ88!bD_7Q`WqC;L1AJ|T@zFzJesxg&Vy_D4CP4gA`Mico9uRVyA zqfG=*i(O^P6BZ^Ex*Q8I=B~h^sh9&D*44!*B z@raZY@8bf!=h^#i#-B%ACnhs{^al~DIVPeT%Z#qW#cRV7&J*Jzd~g+vZze3OcS3iR z8MKo^jHQzCo_L_mS0_mjl7g9dr9M%d=j0J2!O~o)5`>XCqkmeH+4UF9zDL3>kZ(s5 zsHn;MPJ#N}J73}qe7@<}&c1w4nBNI9>J< znJn=Azy0z36YHSCl|?dZtZj>6V;L`CK#s#b_7$Z6oLeU z-{Ykxp?4NHz29=ArAkzj;f%l_b-S!9s~qx6v6`9A9#}2;=fzO-v}T^t;CV)wKA{eI z9bW5o%DFS1h8BPE{=2S-?peW`cYW%aw+`9klPsJ9;3-!n0#~JInKn z^sA3xlO@G>oQ6UCD-E;wI}I~B3DPiNk5yX~Uh)RW)L@I{7J+?&i9fn|xlN$nPxN;g zMvom?w&G%Gg;+uG}Ses79B(Rumm%vlt%++h0U_^9S zZ5=)2Co~Uo*LlQ0OkBhyS){fmZwU3BU#a=^G zy)Ke+I9kx^{a7BD%yG%%_C*gyskSWm7k7hScrjBZOwfQ=j&nfyUsi1&fA(xt*V@C0 zAH3xMp8<@)Y^*AJ63glyzwg@;`G%vzy6!Zh1t}#yiF_EBg@`8~egH!Vl6ejWB)zwj zMa_oUiAr%A(k#_nPHI|oOa2*6YaJNL#5O^3n@UQQu|87Fgt{c*z$@*&KLla<<&9j% zYS&<<1jxe}O7WzDOLtrWqgdt&1k&kgY64*9vashPQkGI`$i5}7GX?gC;T!3 zB14G%64k`bDwiQ2@R#^b?|pmq@P>$qC?3$t zdxMk(a4Sd&XU@_?1gDdm$ukeZ>JE{0{Xcsw>8qCFT0YK*bM?4AR$KH*0iz*R79_^3 zj)(?|2?DR{teM=XzkSQ6#eEzl^A}hyn8Di5OUEHbpWd42p4yIX!;Iap5Yd|KyOvs&w|d#Nlqs zUi8A7JX`GJ*qy)DkWOtBSV4u-VEcr7TOBTa(+--$>Yxe)@<~9p2Kgl2!Ssq=M0l@= zXHN>;daH?tWrhxHu7qqrWUMeFeihAvNH&;@t4(^4Z-O*zx=>}pP+qoCc;&9pd4k)V zy0#3^TVQWhC5Vz2N=@7ey_*uA)AXWk_QiSpA5S&%f*Dy*F2#XVQo22L6OT5>j&S$>8*?ft^B=Es3}t!lW@;0wX>r@;uH^w~I-vDKD|$+yl) zM+KuA8uy7~W*8J^^!j+V8N?S+vW~>pOyN zUKp}AMzQ3mTb}SR;W8(a70Jg8FJ4%f;^6j&HK#b!{~d>EPtjL|%X2*+DmPot-Pa+< zDq@oPf~QJ18@Xm1ne|@~Y}a-CA6kGO%6p&BI;q z-*b_ceOE(IHOK{=&DYl@+9#dI=hD@v>J5)4!*jYUnka_op!fE8Y$wKOCOe53Hn^_Q zht$bs&kr9p8*k()2)F-*cWQYZGI1KL3r|tR#i`I(*2H8tsf9QwPooj`-4~KbM*nDR zrwS^fNt)ujv;M;w^R6J)6^ibg54lSz%?mf5Gw>wp4hz#o;VdXYOo|G+0eIw2$wzd~P1J3_+8hw6hI$@XuyC+K`}wrh+ICa5cxBA&M^bgKTHEtu%Gl|rAqwF>4_h3a5@+A zKrV#9#So(-xo^@MOyAumjUt%1>YRhwUI$y;Lb<**CmyNd<=aa`^B_!VgbP#FU6kEi zj(zfEE+Xm|-nWY1pnnt#IGUGdgBR3?D|wu~`I7*FXt*d1Kz}YeBSDcNHhDcZJC}@R z?~7s6la1wYI)q^dz5RtX<{S54nBup%kAc~!;z`30JjTt2SwAnaD(+}*1Q!Ch{tDbM zqXWrqvK>l#|2=(mRiCry)4Tf5uE>Xw+3xeL=BR_3t!g39g((`@5WU1jWJ=G5qFh)Xv3X8r*vCqbdr|GS)&e_T!)IVmSm9G8H7pBS%eRODEE)rX*&bg| z@253?hm(|=Nyh)5qoIIanP5VXxzB$2=V&Z6iAV1HHauihi*Ck4(D9KjqTmXB&W44$ z9p)52+&;!gF!CV{BxXcc-`)Z)xfUwEhF1~6^dP^lXeU7rtQr|*1fh7D$GyFpokJJl zM)85A0US&|y#Un}t{$*}=H}fm8mmU%LlUPV19)=5wUxysBivksLClKL&$bQmwJ{!- z&+}+qD7q9|jdpEjq#K+n(Wg@KYh!-R%;`;vj{s(#7ey83SqelCrDa8*2SK=H&H9ShZ9S?sw-QN^;u1fJ^J)7JOz|N z@ki~Ez)v+50_}eaFlkr`OdOw&v(kg)P}aW><=yz0miiIf2JpCTM$u3I?sP%KyLL}5 zf@!e35i>!KE2xlKP{!tda5U~YOhmFeZGx&8ZZ^V>zJTE<*(#mJP=lPY@88+I+9qdf z%Dl8u8d}#kygWzOEGiB|f_Ohx;2JRN_!2P|+j=28T^^cAVQ{FcH}dt6Go3BV-e-`c zgv8amFZgcZx~;-7)`yAVln3Hh)un$h-O)G#wF|IxfZ7Fa>G((O0@q5)c1)%nNPQxn z^bPU5m9&4oyRkcn3{ykrDC+y@WH!P_Tin6D;>DtMB1tkO3-jva$V`@O{-*+NS5M=u zzQD^iq?E)>2XbQlAy_+DwWCrab;qg?7u)_bg~)^p zpW1jODmLENKM?kMLIAbk&*x0Tw^a$YR1ZZpV&=j^PM>`~W_&n`EACm^XB%(~+S^yJ znkGDq%3bH;jayC|rH*wCT|n)IB8S)lnUA+rA%m`slk`axmSEZ7p?1S98^wZ#ZFIiVmT&m4NCH}2Su;Tf6sBMr1}6xqb@%UY^csY5;IPA z0vjqdT#7PPgZABH+9~ZihOM{?s_TF2#2bOWAD0LFA{fSB{qU9?h&9%{kFRCmT1-Y)yXFH zN;F-V1U$K@roDrlq}ZGG6PkxQY3F09^uW>rM5C@Oqu0&VkHHvC_~J=oyxW3>36;9e;&Wg4n9 z04|b-0jG_k4#)KRSwumGI$rz?eo!9Twz0yjJg3_^b(A&5X7~;BjBOeRD7B7)$w+np zlQDjO!8Y)(ir9}Nq*fD6l@Ud4(wy0i*U!OCuKHl2_+UClCmr_eV>nb%X_ekro>eFK zRK$C~bpW@^-X%B%F;;4A&kaw$c z-re`g6G;4DSp{5T0dhoCQe26Cm~?iTqSWH$Tl9Cw$x@1UkebV1tW_FIgbD2i=Pm5# z`81}I7In0GBa2Hy*4rbZ#e<&A?*(Z`T=R$QQ)!@3j%CTH*^g-C;fczk-*{YMMLJh%KVw;wr=B|BkM=zE7}(Y zmpeBfC^>dSt7P|$d#$bxJx5TETuUTG$-d;n5@cBJBQ|9-nWJBwc^4_{Y3FVy)0P7= ze0(qYB=s}3VV}h)8&=rlOyza7tTYl25{Bf{@ES~)H!DQ}OuJ-}+M6c6<` zi(2vMb_rhLK3p83<<%9U{5-n0WwY+}9cB&))e4ON+0$;sO`D}`2E9uG`Vihu3 zuScKxC2ziFa1SZ;=zlmEGRN0-3x{PZNsu5 zp{{PTklfmAG%1_$+qXavd1pVRq>UBtsnW1OdP>jtq6E5aubReE-lh1$@3-dzz8?7a zRjgBRft78}24pZs;7c&TlIwL27cKZ-VDv+P^@c1 zw_mPK?aT%kG8PRtx}u(JIGK_%S`_g3DlJ{7VX_oLy3k-uEII zGTb=-IMt^iE3uO;Apy}z08M3b!NL4q-zOj#GnIe}Q>p;d-jo_`^BV`$_ZN(;!q)u8 zG0qH@wlpy4R~JUU1Ku~z&i3h26I*U`V;Z*-5|^YlJmoX0q^9JBn3zVNM?e=#yBbsq zpSGx|H7S9{L5VcOpg}W(e44f%z93P!mgJ12S&UFJbu+}(P>N_yHW8usz>+J@nQ{QJ zmd-=2)x%@x!L!~2*DF9tMfs*M(!Om^yt`MKzYE02OCSLtB12fD4@(05i$9WPLM zpK^Xw{jDs`g`^lJ*lc3adY}x^GgRJi$FVUovw6n;UeO6i*9OeT!Agw1Nh)06%b@uX zb47WXVeHi(&sx4L9=Z2A>?kPk8I&v@!kcIf4KfupG7n0M^kSODT8m5#~Hy?i((lq;aA>L=Z^C?!O7fzZDTRI}4@K^fd_B{KC+mm9yC(L107H4*ayKQl5!)q(f1l+4pa zN!P>P?<>*~GS7dthBN5IE&_w@#O$#nV!VmE6e}C_Fpxbkx&Kt8>_QXXouLdshTlIS z!^NRu{}jWO1dE4x_7^7|kzsy-c+MZ;^MxQEHP%2oPKd|B{;hR9Z8(2l%%gWWvnTTK zyTrwAO#YOVNCTxy&pjMMcbC4%76+;Vw5QICX3>DN6dkEbSk~TQHn{gMgzh;|ix*r< zr%Og&vtFWKmwDVkkdz-M2wIKsm?8hK19$r@G;_OSTfHF-HX z@BNW_Ra=GxOG*$_rIl$x3JdtzNfD>l!kxhqu=fA8!4P@rPP=hX~4? z9))#DSktf^wcmRAfz4IoPB-pt+6x#`FkQMoOCd{*cdT=-qY3?V-* zd>F+~1J^&?J9ULl0slMY*d6AO_)Gg2N6@wnoqP>P1buv3+KT15Mwigp*tYFYwdPdR zwYpAQL)a$exaNU$)nX|!OUX_Vw%o&Y=fxUqwPc_d(-`br$MjK3%wT1)8{N$>k{1__ zXn$bXwb3QXpm~8#FZQXBv{F?O(sy}L_ln?~*_o^)X|%%d^Fjh#Fw_z7GdP0kQTcQ8Z~CfnpyTbRHWp4i{w+X3p<^+ znhi<1f{`jK@^IzYcNQ9yNb390kj<|=%EFenfCiqM=s!B(d`&f%j^u$pB0@nJUSchT zwu-`TiAZw*hN>yVC2!jPR%J7-OSmhu+p=#L-VVKH>QT}ZA&Kuktk2XWYqhc6>nDTn zV+>-7=T?I-<-33Jj`#zFcl-d*|DRiwY?Ic-IBIzeX$c z77)Q%{nIaQq5PW$LK5smj^dBKP79N*f-A{x^K!X2Mcno_@EBhiz4+xJJ z_?wQ0YXPUHW=b=`#lF;{q*L?sp>kpP;cq3dzdKHKj0FBo20ZX`sl-I2-N}-@wMgPT_wDHcQuvro zHD}qzBjap&v&Doz3ajREx^}hi(SKBBf={Y4FBolT7fw+z9>SIy`QF$Jal z2ByAsx9Wyj9dX*+mA^#rqKt`D+}f2mH0Lrbnzn9MUSWB#Sl$EIFGNWtyvbptdE3VH zw#H_~bHy>J-TyAemA&4RPc>AmukjKMugQVp3LW*wtEUOB-E&%>M9AWh$3zOK=LEOE zMkowN?*F}Rb$>)ayZtG}wHmmH%sd?=D&u_jJ`?%rc@QTpAcX%m!Gq!%c@Z1~$MXIk z6MT`vwCWvu!zxqVO{`3R9-p~=cH#V$u7^^adcW`*s_DLp4+T5x@?DX)hg$BCuuxI< zt~f<0Um?Efb>!B%_wY_CN~NJ3erIacP~X4liA94-`SUkLJ%O~gQQFpD^~>7m7o-7$ z#@8_FO$v2gbjFoszOS*}y&^#jJ2B_9szA>uk2I)QzkB>jZgWt31whnUhL>st^k%UN=$6r{)B`3Fuc$L|+jKvFCLV%x?vC52h9f7^*Ep zYG@0~(c7VZu`N69<72@Z6VdT<1s$xBy}sCh~51JDmL8YOe*}^72D7^KMxV?br?tk z(>qWXjW_o}M>tKlI1&Y%LD&FBz?5PTx2%KilacpH}{P)hT&xG*1zP zO0E{75JR9WGpQz@Bp1Hi9{+W>(dy#bk|@oY#5yvLBOcVG54Yq~t1XZ04_m{$yIf=P zID^h-;Gx9qOr{W%U)7nBm@q_YZ|@o*AyP04 zZZ*7R$K*ke%pYnB0b%7_%Y@jtY-6oo0Y>8^ z39`)jeyj|?>WwcrVHJ6S-tlG99mr4;F?Ug(p9^hgb2-C!Q$4napn+G)UqR_WwC%z2 z;P~k)N9CH4OAX`2pJxYV`>ffYc^ot0Jz^lmbp(PJ;t6xuH6b&r`Z!!RO$xR90A*7; zBc;&MxY-Fc9)X8l*;&)P|Nb&LLAosanagrC^lDY)05`u3lh6Xzsyf6Dgl3qn1&trZ z&1urvY1s(Kigg!5K=ERO2}~V&0@`NFP{bPO9ih-MDX+9E|6x`banxX$~-%237PhrnNzz$Z|MUtwB_9G#>lhY1{ zE@#HhcvIr{(1l@{-91|xm1ORFYOH*!tkgBJOTVTQdL@zM%#=&BgYv25W`k2PvVY`a z(3!!>#Y+O6>#8~Zmdb_;fCm5kIZ8~U-Uui05Ajrw%8wfyu)6FoR_}VeBdlqyp38P`SKS>4@#8H{Q0JF~^85wyzy1%1 zpX$j8_NY)QMomNAO!8>fNB$4?n0ohdy>fU%U#&n-T10d~MHI4Vx#xLRup!A7lYh(+ z!C>z8H0M%}{>?(|d8bR2Aa>!lz|0_XD^BLTU>IIWVMaHS%tQ`(ohY5%RTN;4Dks?E z62KlyPO!(nc8w%|?HX4p;`C+z$F9+(Cdp^Je__Y2e){l#>>7FC9Ij}tNB){Y7J{x7 z{9XT8*%q#zmK8E-hA_QER2fHCaLOM>o8!?O?;6F}dp`rCp1B|Hc`n#BH@6$-Ja*_g zfn8&5Dtl8Hk;MpcDQi^C$KDnk^LX_*;v|}(+IuskXni-X{mp_dIV5~x5(Lx!M4X7j zkcYJ|R}nlPQD6Dazq}uJd?w=oxio83wn9JI2=G=a3dWjk49%`YX%hY)&hEpX>i>WI zzf!4$>`i4Aq3m%`$qq&Ks_eZvb`r8fD6?!CCwo(7$X?lw8NxZ{iIaYhb7;L@ug~ZE zx%@7d_v`%+yk3vXBL7&Mw7N)WG+P9k}ZtlOGzM*q}{J8j`R zVE}&YFTI)9>g;Hj0ukM4YjtPgHc7{XE)uL^-~8DPbaUi0EWDT1Blr`dcT;N3zLa=u zZv3wLI%iEb^Jbix?F)i*FL;--F36;WR<=R+`5&Am(G1d*=k^lDk6YV>jl)CKdOz6PvJtB{fgEm)I+`=6_oj< zQBB0Fb`X3M#qp80LKop)h%2<-ozE6pbKFUpIEliRlq>zt+b2JVMvMpE1x^)0@a-Z^ z%)1JZkonRVF;Z*}3o(LuSJ~L2?;~~_L&!>f@V|ZPrZOLu8-Ki5aLNwv-ApNWp69WL zhmCXxpSCRyuZR1k6dfVau()M#2&xjakWPO_Zdtl`96zdUZFo1IF)eL`XR15za z!W?cQHC8CH$^==2ZRcXn)G_hO>`ri|f`y*>nYXe1o)+s4r$saDvx+Q+cc z@$&HQ>XOFkl3T`MR!gBX6UQq>x@&*YH{CH$0yMFy=uNz&rad*_Pn@$5hm`kn@gwjO z0xI51wbnTT5PUs^fwCVhmM<1lm%7Q!bu9T*8#|FuH}%g0b#Myv4*S_4v}_ji;P;NN z+p}>>p|nC1nHpN+1sL(j%n=E?i0=qD8#TTLF+aF?T#gLc(#)yxxa;3D+6hAMofD>~pcN-E6el8PacOZWWmzzc? z;aQn7Pt!mQr_b<3kP(o8KvOpE<%sTp^L{XWt=eTKlQdz4&H6X}T3x)k{%}>IQ=3#IcBEXhpPEP6{rtdpVDJi`6G!&<4jhG zO`@HDam^8gEY^R&#YDEWxi1Yje#gb^IiB!WcY1W{X>(*!VD=nw7Qgl!hVWAn(`>{1 z)HSzSE~hKBVm8KXh6mTZ{^NKxT>BjzES?QJiVoucJ34rrK&CbJFgj>AEOf-}|9QIl z4^J0IGT`=u{W+OVcYrT?e5P&L1#@(WwSyN+f9^T9FyMYVs?v1YLlj>V!h11F;-cro z=l#!%2H$^I@PRav<|whJ8_?ZxPRjW;jMtBse0{*8I49Q2>Z}}jn=(WXI8`I6Gt@@vh#tbK%XaRE_4CALxgD76xOKl2*1)iNv$Guag6D+ z`@QLuKot} zq!-W92SQvI`z4YzK5$H~!s>@rlj`$&?oWto+s76x_x7uuY@evAW(9pForXQeCn+(^h-X1a;Lmf_mqs(;tUu7mt{Os9Cb{9y+d~q6b3|)qs-P5o%nn|m|b}V$Z`|B2)xiOs>CIEkz z{(`?-#WaV?vanUA@I<~gty0B`S40!{w0_`_qfcf*A9amhb~anr*SzhY=HNmiqJAfZ zh!@cf%AWP1kDlwbs4EEgaYb>E+c;d~xgN^!s_j%jk`$Ng(GHP$>8jYjc8K5u{2M3_ zpJ^|PP5n&`_28x0PQzC{JTa=V9~KisozPuYXvSXjiM`*In4z|DUf<|#zN0D=XjvRq znGo126Lugp0Bc0bV6;~D7X&JBpFXwNGJ8G-w|V2*x%8heFPpXWZ?;*}preHu2nS^p z9SwAJ;<<+9xv>RZkFUL0{9D_I<}k{nyYP3EDT4NkI9?g@iS`%o-*;EHXwX(RgnRmW z4s-|8&wb2bPGJ8yB*MGK`HT6~&zJ>=m(+r+?ys1IN=7=ipDP$cJAh5ZtREFU|7uxq zXkuCxX#Y(?!*!tQ-_fRQ%n>JB(tdHbEBV5MHfQQehr^;L^;z01@9!28K?Vdyh`i^g zkVYcujxx0>f7f$iK8TrC+28eCw(i4v?hhO>Gux3C?1CQk1LqYV$a0e<>F&sl z4f>6^*$5a+teLyT7SG(99C@zFIyrs#3@(?6f88S<-eD&GP*X~wiSiA!ptu2KHk3j& zJSRpzTE%;1-ZE0ZQ=odx)tYkL46TkC3Xj^1SHs0wLeNMMw$NQM~v%U7P3#L&` zsVSAYb})3HhCLEpDtJJ+Z*Vn`o~ZUgBLdNe7*<4DpmNk~Xk_R5 zN3ZpTMe)RrpMHPwCa!sFPOdAadUjAU?D+N4?9(Lf-2Up=PQC>5>KuJ`WF5>nb?Vk| z<0>hp$@#Q&KjOTk1HWv6j}4VQ*bO8E>sPZDbfXYl)E%u+reGZ-F*xpCJOP?!mR2;_Ng&vY#|c2 z$>rTY&R9mB@~~>kNF!e0PC@*_!cgZGsnI1V>=jn)A>P;B5FghxAuy$J!mP!V^o4bP zv7r;wn=auj)S?uEzdl5L>ZaVOmnOQ@KW9T#Pp0W4@x|7mc=fD;$g>}Bms6e1Dg(B? z#}6ETMk+o|TA9Jjl0I94rh5`?d`8C`B_z>re{U0eMeyUxSZm2KF?fDkSMaBUjPms? z@93FN-Y3iZuTCRAUQM02J%)XAQFPxz0r~Vy$;6G;%Sc+jAiEIAlWW;uvu~}n$iIzV zmP#D-Vakk&k#l81~V>hQw?%(X@gAG0IfG&aXLTWY}Hzqhd*+Er~R|Y<0h8UUu2O zJn|#>uo83zM^PcVb>Zv!I%fH=$L~D7>_Ye5ZL53nejGE*OS`{&*kHMZ$45Ku>x8Ik zXzilYfYYFq!xVO>xRVbLBl^INq?qJb?Og&*CUL{-t#>vQ1!qrq(}ZZpIFV~v%|7S5 zrR3;`ZNmE?!pzGhi21$~gRAVx^5NgZG=GhW2s32hW9B}H3ZEQAk>NGyc&3mYH7u?l zH7q8J6HPVnZv|KDu#wXbruQr8VT$m(;+MhC0lMPLLg1427p`;1Z;XqgzwZ?mtWDiP z1SBBvH6tWnwDIcbc-1OPU2^^`pBKsot_D}Ahqp8)&3rTZM8jYEsB)g~X z2>$QJuYb&;`W#E!`$A5G>eX%nEmYGE!i!7so%s@H$Mv*P0qq`_lXd)~=cJb9PWWuE zun+Gzl$*HBC)VqweHzv69rGF*TN#t~I)7jA2o4_|gQ8ZA@)B z>v4DJ>Iqa-bMRC=$2S%%cEB%Mofbwc*6WfYjzQU)hbM^!N}=f+C0{aF6(cY>IB+2K ziF#^Gb5>|#BK*@Rho9eKGox@0n}on$+FbCg=W<(Ld29e)rKHf7u|`1w3JRJRquv`u z3DEf4Ck)rEyC&2EX8?B`~BaA+~c(ig||ocgp%+kx~|5T zBbg+JYlL&D)(d?4rtRxLvEl5^86mg$$waz?N+PJ5?X6F2EE9IVyMb}{g>a+nh;ZXG zX7x0h+*{IH)%v$j0}zPX=Azl>s2g8CZ>O@W*vG`wsh2OPX}`$6RZ4zE*bQqzrp}kv zQ&^yHBBq+?X*6FW$s^+EBJltP$-$AMi{PzrcM#ck)b;})&^wf?>D$RqhVNc5UcU0p z!A%G+IemaZ91zB04bR`LMukH*vlUXEjAW z7ft}sed*k6t`LCkS079Gnr&pACp*o}mLdR zs8vd{apzP~k-Aqe9}#gIVE1X|UmmjiCQJ)wmG5n>s6mY3^)#cF#pX1f>Gt~RlPUof z=a_|CrlplcH;yf4XawvU)F8t`k(vfTXo}MO5Sq)8Gk)gdHZD4T2m=B|>xOTt2FTQI zYRq?cS0oZvI114wauL$zVaosrivT!v#y|27D z#QM;$6NVT=TN3ALr`%d!>0>z{ey`OW)A#y#NSils0%gr$Wp3qwJN0pFc%ep%OIpbU zh^bKiBwJMgtRfGARsYN*!nmNf3-1$;6b&A5!L8xB2^bgLTEb0Bu|)CG@$0)~i?;W6 z3zG*a8>?XyFd!J0h$@s+2;|fKajw)HO2#u|>VO3)QkaAljHBEoypf8cn_>yIQ&N_m zvxs&78jUUi<{k8{!BTx9^lxNUTb zL(}=~y*Fn|E@6q)O)RnMG^}oc+H6Rc=vh>-CDCTS+>;l1hf6Z=@nbu@NxVcX4ITtJ zIg=y-pO1z42!*#BfA4E;Sj?GSNw%nO5{;nluskuk+)*Qa_Ufyy$S-*=R%qV{6Pn@+^qN+y#*s%$d5^i0|S!mK&+%^E2t^ne;|wm&&uGJsBU~{j5C0u}(RnE15Zw@MZ0G zVQ!9$hRSIxItD@l3uwb8DA8XCUcVPCQ%B0(k&qkZ&~G%OUu5ho;)!qOJ_uah4$4qQ5BxzMJ1M6`CBFG zW@#^;AA6)#Pa-F@n_+88TTtl@t1ohxgudJ`@UFcg&IpxhPQHj_SxpWU%O0>^4b6jH(QB(-5MJ@!*nvD3 z%GruwM1|Z!SXG%TyyR<}``l+Gt|K9&*BCa%LFfE_>um~=E&9#@b44uzO)2gfn?XG& zdy>j8ba%h<2hOFELDqS4n`+B1o^_-FMWN#SkFJ^To2-?_RXdGEtE;=(jE)YieJqI} zKox5uos;7qX_n%}tx*eNSjZaEM232}Mjb2ERSz+l*<+yhXoG^b<`CIZi&F!@>I}-X zyu2dru8VaDsKh+Lrz1?CW;hA*Iyp1e7!_PmP(>l@0(pfm(CfCW?qlq_K5(S=&kEF?D;bKXO?SzjZ+w}vhjJ+Zbo{uoLHViq<+Ef!(BK@dxOI6g44IyINV z&O_;LbW#xQOI~2KDFwuqS$bTD4=?mBROGGN;uX1kodv9|I<&+IwuNnQTYS|1eMD@2 z?w7(3&ROOg-&8MDeEv3DjFa_*NIw~Ue~JJ?J_9?C3f|!4ks@h4!&4<_lWsKI>!Dh6 zQZNiJ&{@=)2mfh*vMNg>?nd-uQGlx=@1w8ep&I2tdP%Cdt|IOMuUF)`u#!Zt-c82# zw@MrKa&D`zH{J3HS@NJ_fg!dmfLfW+G8u*^C3Kidc@Mf+`Y5p`V?nt6mfwd-Xg6p^*7}@Ky3BsK?63Mhe(?rdU6k~ z8a*RpUtX3xesk`eFS=@|JglHbgQAjtGV5G~I|~pY#eoPp^K_gHVBie@^4Bp#xtr=3-<4TgETKn0A%-*g^mh)>AHd>uv;eQmwsErTxup#7 zI-ZJi)NrF?!GX$EtF0LjwS~?-yKY%pEGzSj{1g z!Rr(|NfiIU>&6tkxNTcn!j-A@uV)EkwN(v37bn0J4LmHg5JbLcoouL#>flUtM?XB8 z$L*&F4z8<3%yotJz{e*(*x1mJUJIMMne@4vy6f<|VqioHhFW_HIzN2)Fh}uWOB7tuT_IVnRHC4^P`j$7`nPy{>m^#}5xpHRX_Rea{ds<(vlcX&L6}fX%)di1Dex>mh|UZV@nmZz z8PSOo9n3b4;pvVMH!GQLt|M&q(;wLCTND;s&9S(WIx?lm7JF{W_|~E&i3p*x zvJ(4vbab!+C@(E$DfVZa9c1JDKDH^;(uP*o7}n^&oww>yCWhNo3|$zO?p>7Q=LouE zRwS(Z?nLqpF<L$9*;db8{P%n@FJ{)@W ze*lbCTgoS|MCb)?svHf1otQx|Jpt<%Qvw-sxjWt>%H!~KjrFaq8WiRtnLgC9_FVmy zUoylTF0PfvWO1-~IXYZGhQu5$fuAyD^hV+|@*ZjtW9?%DO!u$>riuGMYZmi~lh+st zzvhh|je-I{N5P`3Q=>Xd9^L|+?V9b&;Ahcm`(2Rs9b4H==cU|rYm5vj6XHyCdihX> zv0)UL1&JD~>nYeUH4D+hteNy@nO|A66!69}*O`aCiO!|&&ypm%a)m8z zcb%-io_C~rV#(Oj6W&vE{b$bN63AI>@Zw!=%u?b7w^n;TTA|0eo6sVkV0(Dah)eKW zs4PR)1=72%dC&woq^AZ&kFG+ts6g{$3Wpn4?L;sQCWRIdDdP{5sxR4^km5>zKyB(9 z8N}9Gc>8|(EGOqiX&{E$&;KX2ZvZM0Gp9n>Z~jY$Jf!xQQ;tCo50}B6qr-J{YoUBS zW;t>-O^5m<%dXFVdpZZRGE&2zB8RqYHn?CKF$F&xF~rGK1X(acm30;I89C4LO)L!= z4PICY+U1}6Lu_To3fk9;ml>!Ktr4XXr!A`L!pH;MD`-9Nm#hcHU#7XGf_0_E%#8Ss-^u8DilTJLZcIZ1!4@&Sk_(Z+a{3aq-fuB zCH9jTIseh6km>c@*4Aw8{S>~$M{&u+-T`E9zUJI2)#~tZL3c{GfmyJ0pF?Ls2kOzJ zAud|h%NG)3eQSPHsIidxLHaDy(r~|+yP6LPN~akC4Jz@nx%{w(Qe3H@>pS}Uw9F&k z(CIzjyXH|)zq_Cph`{s$gYEg`m+!^&1gN*_(=sjs!%Cr>>;tUX)rT&^YXJrZLN}px zIY9=^rOqj3Ub$Q36WaORpQkY5{>F-Feq7W9roWUlT@U^?GI?Ui_DluzX|SM?AvKyk zY5fV>gVC37{rp6S319Wcm}yp%afjC_ad?bLrqD5Mq<3n2{AAKw>E-lO6}~aD458Ae zw=PWYDQInq)@G9ju9D)Fp_z$59|-hOcHAGrEuW zs+4Yp?S0?pvBg8-HuXbEHkvIlFIVn`osJ#xE3bpV_ z2_6kLYC7cVSYel?gglZml(JFfv)1Qj4H|c0ErJ@wOIN7&#~jPESHQ*sO*|7pWu~zk zma4Oi&ll-;x%^glX#}nr=HFD^m3DG|cM!8@ywY6pNtY*vE-PWQMZSw&w>K6N!-DOVJ0SAvs7~;*JhE!;%+Vx-87L%S%_#Cj2=fJy7 z-c38<4d!y*4F9D8g3+4Gs+O-P7x5NaGjxz;l{40l_7B)-ywl^jZp|#eL5vU zlcA(P>r%B<8m>>+vOvUp(-O`|ZLaMcGnwmX$eA&R zFP0anOAYz>(pd9>;q#l*Dfwn#_mkNOpGbyzNc^4!#pi}xgXWQDh=U};v~z7ION*pz zqLOc0ygs(nb6*gwv16v5uI6J_7g_AMq?pwO=83hwa?ez#6klf^m132ljIYj9FyA#) zzG$B1#blif;!8IHxf%heeG)*fQe3wAC$+ylgYm%+$<@N8@Knu2ni(_A4@y{!ZpY|6IegU!jEDJeU5RyKgYe7lEXCKIH{3JRQJh5Qty7@O25YBXsjphv=7BH!})=2uoc`w8Fd`iVZ37!rl$x{jaoz7oDz*h31>``+?kK>#m2(NsvxCq@U;vGB%pEXH74A9ZavX)m}ZK32TR@V`^W%phZN zNEt^y=74~Vg>stV(6b!57H!ZBB+UEL<8N`Lvu#&pVWAHr?{5$8(Ikr^U`+%h_sfwi z@shL+MN)#JxPNUfToH`HR^FgtvAcQts|n-pHq7jPH}&{vqj*^qePIOmCpH!j!%Nwd z(5x1XWYW^Iihh2_qs_$!YWU+(_q~DYfryGI1MZfE-nqlYg*9ezp?5S4N;Vu&A$PLi z^cotysR1iW{RPAW?{v6R*J zR~tqR5nes>o#PK4Jn~#1m<7SXf_PbgpxI0m@WFc;UWg@KR?h)E_|z*54_;P>iNjRl z1=dJOgy%cyvBP!lRz#+S3jawNUqf_JmK8`(gLP4!Qo& zx$#|u3(&FyN-8zeZO2$HsB+Ff!_oGJu65jFWON+N@lCiK{WUwR1_^IsU zGAPqlUUdoqYX9K8HMhaWo2p*e%`*^Jj%V%D*NoX9^o^n4`x6=1CFoFoEi}O`@e4_q zz%7%q&2l=S&|xnSoGffF@IOu#!T;rC5&z?4VY*9yzO%4v!C#}`A4<65ABh;-|478R z&NLzU2ZsVJUE(+`dOwcI{{KE&DUmOQrT;uyEB`)Px8m!;ww)4e+Ygm+&EHwG`!$9+ zsA$cBgnebjfv9C^poCLXMS0OOl>A&^VDc~=_mq^BtFU<(`JwUxSkC}*%HR8fSyV=S z(AB>G>cha;d?Bh25gQ%q^)F=%c@Dm?;U{NBfL!3DL=7@&Fpqb|{NfnZ2D-sPql||= zY(2Qf&A>#1*T4k9d#p&*IrvShIAJwH&)?d{nfG1;%7Bv6IqQzru;P!XX zV)pQnWf$*sbYopvN?F@|J4rlTV*qx7q3)bXTN{|2V7Bfd5{{V!|0g6oALiPt#Vwjq zABe`BtP(xed4qeE;ADvs$KoU!9U|e$+=$`ORsJ@<{73&jS=pRi+xsvoO(Cb`z>)3Vs z+BfH79d71r_bq;JW?+O*G8SP^R>m_~-*C*y8UuSU1d2_5_@z!~ngNqlg+gSRz`X!< z{mO|-Xg9lKa7e5EMX(+u=I<1}e=E08+r#zjjoAy4m~FeokPl@%fHjC4@6Z~{dO!IfU{-Jpuk39y{qO(q)Pe>v6O&-7yb^T>(m za|fVs+lkxaK3SM!E>3-IyxZ1lm>XZ$&Gr&u1)g8mDLLG$Jkl0k_)P~qWr!D5Udbsr z9a+5B98YjwI!;KqTG=|QCeAR4%48&-)Hf?Dw;wOfm0~){F2H+SV;FVw2hMh|OEIRv z>3xbz{xEQ>(YwFL3R^d~JPcY8MuWeQQ7X?stvJc0vsiBiX-4ITQ!>>-g+4AzTa<^E zC{uj4;L*11k+OD(cC%tl@%u>IM&0n;&P&R|Joy5W)qhqNW}RezzJEOt8&=om4DAm_|^Tmhw0?o6w#8rTBp*w&BbCH>W@gO9F2Txkz55qE^|5U zVcjx|iPE8N1=^JJkSnuOge3x_TlQB;ZmeJKbbgV8WE_L5c{D_xW7Ri@Lw~gN=uG)27jiX)ZxFZZI)|?+Kl!yy zrd?KdP~^)f987!U7Ww^|iM(2(c2pWIw!|skzr32up%Am`u@B2#%gb|N5JPYWIq4C0 zZE9CrjW;oeBqGOx+antEg%jZ4vx4sISf`Cs$d0$e%dfD{+Dv|;GKI|YQ-(ROQ+J;b za9>NxX`OFL<-N*TY)(yOTO}hFrd1f-VhEqlC?4ykcu_sd632ebG?c4ENIjgbva%MVc+}66|{H^re+5I3#tng{k^p)Iow*Txb|u{ z(O`zaT-47Y@UNQ+#LVE|Z5y?7B|V(PNASb;$1p>n@@BSD&WsmRGg8^|WYh3kXW;{t zKBMEUxH%ApllPF}88dnYU?qrMwLdsJextXLc@|88FYaez*A~I~B0^BL*NI1I+y2A5 zY7n`IxvPp<{-?WY0DRw3kdy9-hm4toUBsU`Q5eOlgmZrU)CJRt>YY{1WQl5IQfD6N ziaFb_u7x?uu+=rb_5C^>%fJR%Us``3pEsnQXZD28Y-&Z}X3kZKwU{_DvFgp1VaTUN zBEO8U2lZ@MCM4W<>=$-lSQ|T)SWhWz4|;yj8EG?w?)05+Rz4>hp`EYc98&1!ZleFP z#S8p2M?1s7Sh4Mcqm8#hXxQZ$)@(GT%N7VFZ!VV@6?12 zRgYcQ#WI$nquD;N#t+hc2r&?*0l>x&Ac=dD&4b%{Wjb|ul z+~oY;Xl%-~pq%l@lM5;Cp8>5`P0_(<$z1lg?A@-?H$owLkIj#sb zv)KT+=|y%+zWIG6pHGKc?7HQa6zoVf`+;M&;Tv#~<}1#*W2#!v73~zbehNJHiCjLX zV2MKv^Yc%d=aOFoxycuB{DnY=wxu1%2 zbfiLWfuB^p`*x9wmSm1#WGn9nP5^^Q6=FSXt<+kCKYqsY3g?dX_^s+IY>Wtoy6v=S zA`++r(dm^v{rXh%s>o!g*cQ2&DQ2RQ04A3kR7_Nhaof2*XCNBj#}g|WyCTUkwk|N@ za58|63$^y;Z+tjX`89~imW3+HJ+#ZQs)zOSWG(I)F&ekn?I4^AV;A}lnP~HVpWae^1*O^tO8uj=y;5=k7HpC)bsu~PNX)TU`BtkKZhY`dY(m@t zo9B%|h^o0Y|7v8|g=d#$!~n@(stibe3>Le1gvCZ#O3qAS(7(~qObq&0c!T%}QO%7N zttA*r-N3&}(Z9<-tFG3JUgz#Lws^zI7XFFQ$7B($$(0#ol}7Wfdj}^6lcdyRL?AgV z0E_L^FIV|G5mkrv#wD=cc-4^Kp*P;~(;M&mc}U{@ZWkUMk`H@B>%IVc^b&ke6Y$DD zqmk>4-N+G%S>Lor5i|2$#mn|i`GC`YzPRiiQfX?1D1qohy@}sku{@*J34QME6_rM5 zvQfbCYiYY`9KvR4Sb#BaXX^acs&{Y1=<5nz>FhTlbabKT9ZoYd@cMxdLNjLTX$|zD z8CZ_r{_^uR-E)H}c&La*cbSMc1FU_k$qf`NoKH^PIMa2FJ)&8HRMV1Xt9(?i#HHPc zMCMTASCIo6zo^T1MdK^?{I&bC!LK1+9U@MX!(W2DSv>DnAfE**WQCU4pU|s#kE1qb zOTDtocy_Cs@TEy|!vL=o2cfLV)lW;R=jXFHT%fWO8v-^1CM zKDH^q<4*KZE#G!VI@$xV)_AkLKR?yOKAIe0BjkmiC%O7(2J8W+T%?o{yFLk$6(dW95t-06@Fx}F2)$VH zaJ&8JPjn_l2h6B(RF-P|!Gdh#oe{^Lv%Td=v8RkAPMxM-1$HUkP3Cr-NSnW&Oy^9u z${b-QvXv`-WvGUY4g3~DuJvs+Lx}!0kj~Htm4Ue0iumlCN+dT%luT1P-eHcxnMvL4xAQER$ zp00J+Gm;&efuEg`qQ*f^mP7DnBM8mKPYgI!ZsoecxRg6YiC$s6*w&^|;KeFRZ|d|v z7_j2vTe3dr=2;6Z=9!M{K~^{}Tg250Ova+mvAJt%_Gb zies!;VJ(~2H99YdjgBDxkK#>3u!tIKAD_YRgKxG(pQ0@?2tsIp3ffXSl;vt z{4)q*B(s4S($|k_^E`Scoq+S@q;3hapjH9{@h9IY{;YG#EaPF@xhCJ}&$zx{Pbwod zni)ujm;+V-6zlY@#y{NrQjlcFW4uqF+rEhGoh{GxlS zFdXJ7G3$}9aYrhC0efY%jebf`v8~=4s&DKjL+N+C*T2xmA4bu)H*>J)X$yH+maW!` z7oH}e9Sv6w^%Q%J3OLxm-~XU?lj#ag#YZ|ji>a%>MKjW$q8V%HZhmQOZE}JELwBo& z2wwQ3;jE`JJZ+Vp9}deDWrt-7WZ;W=P^NHDCjK1ptjZ)W7Rg^Cxb(YB;YwtnWHA+r zEmJiAU&<6Nf0ijcW^9`XbeaWX`wg^sn2ApqOsrCoQ(*99u))fiw7V#2WEhdwOUPUg;p;{DT3t_No!=0EJ@&?DxLe;r&D zpxg34hADjh5vJHsi1}4F%AcJAbTY$FI+;XZzG2{iVi?Vz1x)d!k}=1uTYoBlj!o|R z0Hu0H*lQDN4Brxs&UN$WlT~y%?r&F_ENuO~Fjbd~P2% z)TKpKtvmRD31L&rUpg7~TJ!UrcW)K0+Fy1%{WDAvP&g}bwheKF!>*nDJ~!IT9wwg`r3;mh!imVrI~cWr89%r8=@A2{OJ@8jREA{ zshdIZHFS;BK~s&5Q0oL>lT(m_t$5Aazirsuok^B=Wk1KKOFze_uEX((jv>adg{JlC z0@7l_Y>zWMA**D$Wpa{S>OI8nl&OG|r8lvH-erHxsbpmvXy_0t|u0sDPP z_z-!sc1};|+=WK{fx}MWLOUAvY#;LzU~pLLpExY=FM~?xIa+9vS}HSjmVfz|8EsT- zOg$B?lJS<9SB5vEZ(@H&K#E$JAQ3{Z%vm` z?PIsqVyQW57pTdB!KA;{m~n0}GzOO=4V%0PhD^(&$2dxy}LaJK_G%_RzV-Rt^IXJV(l7R9%+SlS0{VcvB*KI#lKFJd(1i-YI251TD> z!xKKw8WAbYZchJzlf9`>%j=DGd^Nw|yR;X8z!PTg2$e(w;uaLdqN>&BT@sy+3vqqCtYU3LjG zJ=OjUei`SNVE{}9i3-G2c(g8bNc3?t05H2tjXfoi(Wqke*fkSL&c@B~x#UFk%#;}g zeA^&*oBSP1bE_Eu?vtAS1ow+hL32lks^JnSMR;|;lZPn5Rb96fbcEd9Q~g1LTY*2mg){UGZFMWoCOVeX7kSw(%xb+>zOxtK<;iQIPw zH@v9*JMBa-Fs(gHPvk)G+Qe==7gaT{~PeH zkb$bN<_b*5V$VT$a=hKUgDGWOp~MO82tJD>+@8W8K~3(>Hn}U7vTSmUCtrDsj+I1VbkOUi* zy_7t;C){(TWrmhTXeBZ-{9CiR=M7}-LhcM77^r+Mzrrn>f1d*p%SEZT&X5Uin8&VU zj{$o*}+k|G9G`5wgQ1=dKG_mgfhF^?*@+;)eA_X>T#K)vvqxxqP4|_x&E!Bx7G#-dX=*IpsV!_ve ze;cuHej2fPM@H=H=rz9E=-DR{fy^GhAC^>6jTj@AQ>T{kFC*3$2+DunAKHgayg%=c zA2?0xjLUUb%F2@W+R|hnovyFOp!*uALh-a|9d1IAmghRJFCT}8OFN?cG!D3+9gS7< zwQs+S0wI>{81-H3XazJIZCn3Q=@jQT=D$ZPbj$UEucpUj(Qbg=SHO%`-T+ZHy>~xD zDdMUX%p@jfdAoPrG*x3T5`-juvzPPgU%+uV1qI_%J9bEHhz+_ ze0ep|nP2;=v zrf8(+?9PHs8r4Y*)~H%qi)}|=x_Mp-11YQW`vh-Jp=df9Z3>wwme1l;urUdvZ-Orz zvCj{Op+P<`f#1)MuEXcYs8Wja>!oh+{2<7tBJI4sZb-A%a^tMbY`1P-uzGaN)Uvs{ zGx=fsYb3+W;_!fsN5ET~2xR0zo9B(D&Y3rLl{|Nj0RH=!5leY`!r*QcbC@YMwE9;R zkAMdo#S3UxlDV>#XW)Op*5d@DT6U$Gd}W)xG_39U{3UBBPaN}u#E4t}?`(^o_3W9} zh>{71K6QlzkLJpo3~~-x_PT_xAK%hYG+@99qvpnS{KO>m%qY0VXoe0PFiLtiyB)B)&>do{_vvlA2@pclys^VCBI2J%;M#!2@-ERuzvZck~tv2uS6A_v#$ z4se&s=nmZKg^j+^;zqwVc0T9g*~%vLVPzosMN|X_h<&+i@a2dEXNWktJ&LN0*I&S< zDdhKK4(QM~>icRa^FXhv!Hl~gw5a0F^jA#K=!!QTTG0p3U|Hv4NOx6e+8Ht<-0l37 zlhDS7D%Zx2Ri0V-06l4!_Abo1APVrlfS3;qaTbP1rE4!&S$BrW?07tj>F*@WpndM{ zIW>3IqVMqS5&A6~Zm5)$KDVu|o;0|Q)YBTlw7#TW0%uK%P!Ub*&FN={gqKPMm6*bwb0RM?kS@-emk87cp-*l@(*t>NAG=d0Wx z=75Q|A%(oYs0QB+o;_PWB6_g>jMjH6uRDN2ycRJWvhGYExC?VMLhxMxvB+zmcRomV+$u{EQFI zn5T#Ad(0m-N^GtjcJLfk!>n$T=CsdxjIbQWhQVOpLEte<3 z#3^9YBGK7z`?F+XuW*cHtXXVV#gy4fc^Tw#fELk0ekMvnr^%%E5r8#`(V8Xu5 zMO(DP)~Yi<YteX^l3{HyXuq2c36 z@Tv1qM@8g(?dDS151bLiM=k5fTbaCx5A5ZTuFWDQwRxSc8KW7AHY2h#v$lO%azf3V zAg4NfSQ+k`A}Ni@U(>2ysf*PnLPaB`eZbYhbq+gN;l3vChO*v{n}#*#Fj1*~kBsoy zO6zoCq=3jxe>cuw+cF^ftf_mIJxYO&{phtZ8qIC)!JRu?ZvTuBWENLAO9;LER%|M^cTn%3IV zbtX(4e`w66ANS(y>&1E-j!UJUERUSIi9dhNZ`65Z-1@Rs>M47pX&^H_Uv zX)b`2XjPBD)61&wgl#oF>kMlw0DRB_ge z^nI*2w5Z;B!lHNQiXR@F0a)i$XvHlXGhhV+u-5nGU7Y z$4H(TVx5gJC3gEVZYbuqw4J>ue?2&Qetq{_fWX~G)h0tEUmR!}gcR?p6&%nynp+>} z?fHZZPo9bD8sa|p-caiC8CSYBD+fzeaNeA&NaM_$E~@-J8|{q#8tGnp42`smlRdoKCoT;>)ngM~oMq zkGp(0;msI!hi$)7Xm_hTvrOD05DGilgo2q;@qZnRN>FTHS13szt=>>js15NUaQcCR zb91^@e?`@VCNJzI4#a1#HWwd06g}-_(CXTQD%5jA8f~OCGcmnVdweg3=?Q(2SYU<* zLh$h{k~Lz6<0VANX{018tV#7Yy@?#|LyZ&k@87g-wdx|@AQIpcuxB+l-Q%>Eb!4oM zv7}#=d^d-6;#Snw6kdszm2849aSFFcY)NHCIwoBerQ4<=9m*HJCKpZaYak{A zr!!Gu)&y{~lI;0$olho0Ux?WH`BJD15uda_<-UH4<*Y~?6X~Y+-3J8_LrL~XBIRC2 zHIK_S1%LD>NsIqHj^IXKB+@Y*bpz%;pUs4xapfSl4nE|h?LMB((y{#?aLa$ z{TR2K(^CR4j8iB^?V915!NJrj zd#`B!f1KTUJQV8R_B5s|iB{O5aMcVaUmo zksYo^i;edNF3fTN6ik1;kd~kaVVfo_^4=mLb@owUl`Oq^$#pFaGtwZBQACOaUO`O` zFv!juvYp6z2D@zfGYT`1qdF1A!Xvr7?c&U70mt{OpdZFP>(mYA9k*8xP11?mO)Q9z z-ZhhSFB%Hu=`&A-ESvbYze4w^W94#5u9=PYYb}6JDwnw8v9Hhr8s}As)~Jw$to>_e zDaAN4B1~LQ#fSr7BEbNwQ{*stYH(kkJ)HUGcrGOPNhV9dOeir-#yET+Qq9eHwBbk1 zVO?ehW`y*czXE#rX8-p6S_7f19`=A;voBIBHcMt$sXQ#zzEs(SQ_1`kOPnn=woz|6 zV-gv|#nrSWeP&4dYM;Yws?V5O#(-uSbp2)G!%m|o7mAR445~LE?iQ!~#m&5$c551l zBNQ@)pY?~oP7w|gaweW92&@FPTq=&-?FBv+_r~J9!ywL^;1Kr0^>vI>6CXUY71Q>HTyEN+ z?GmHntwpaCL##8HQd_%yjqe37(X=`em$5YzvN$O`N?r)kkQ*sk5kG3h>88xrBqgZv z`MsTTu3z5Q0}~uFU20{jrNv+W@ub?nJy@Ne# zt2_eI;b@Fs(-tG`do}4ny%^WjGerMi|O(!v8q%9ho2J)OKVO}HhB+Z!gi^VJ#x(w^J~vf zO^u!PZ0XXrmH(`DlsQEd6v+@jfShJTv_MX_eML2S0A;%6&(S*w2z~mghsKX49OP+Nhw`ERv^n!rXM|>j9 z+PySflw*BLJw3BDFDrTW=B5DFsz7dbxFLtpdga4T5ZBW7%IS~Nv~X;6u3W%_!9_A( zmNb@^HsKY;O)-I*Z3xn={QB7j;wJq=k%$pRBcgaaLV>%hDj}J(>;pwunWjri<}xAj z^&=zqJV_oZCjGJ4$GW?{k>ALPg=&2A=;GnoBu-?0Nhn0jmJFF@{FP)p3<~VX;xtG% zRrAI7@v$xmUh__=AjybO#Kbe5W|4=^{LUGmF=J(jrBKJ5#YAa`51oAge{J2l zBgvGq(IZo)nyQ}D_3jID~za<`e& zc~8Q^Ao6adf;>Af52AH3+XiJdZbpG82luH8_HVt1VeXRGB(r6Q`CqscFMst7&xG>L&Y4 z*vrg6Vg2r)m9de|RH*M8`QOHs7gM*bR%Z!ZJ`Q|T0gBBas} z@KXVE(uDCYYO4#4C3}u2ALSCMjWN=MSa1=1P>^L^rCAsm{2QPE#khY- z3U7bO9c)PsB6sf;R{9peyb7<4V)9pLD*f^G-i5E=HwER5Fzq4Jeiqa@rB7K8dj#`I zSU)bAPs^F(RZTz3HZoH>C{ws7xBUa4JhlS$5YJlgTw11E2(Fs0-;=^T5Hbf#kQ6rk+n?wPxsCN;Z;2Mv zj^P+=C8@>v6EE@p1VN|fgyi7}hWfR@ z^Hr+R#O3bjg^p8=MaA{Ht>_<;?@QHSF2e$oeb>k2orz|xne{%qZT?sBbjt-dBpP_w zFBS&RyG)oRc=`R6i5umb?O$~5uJ`)mqw63fq35U*XN2p-760nQF+q*<{vB+7lX!q5%UrMDw-C;G@3phHY1QWBXzca) zfi%q`^6tx;qY+V$ERyl$pg+Hj6Qx9zR~h%U+x?B6@&8#oRX8f1a&V4+y=QGjgX1Ph zK&g8Tigd0%qe3G-VCd+DwrQ{->G*YQm^Z zTuoSP4%CEe)K?!01mSELS&yFp>q zdB52%vJ13xVgb8-4<1djgqX1gn7yiA~-N@!IoX}Eni!9P|m?cGO=|5l>zbVk_)<8S4i>e^6?9pV zb2K14CsfJSzV8oEz&9l)T?g$*vcQjM17s}-o)S5ZZb);*s$Zs7Bm0sYr8MYY*i?FM zrF~YsH=uB#1se9yJ63<_^0FB&#K?U&x=NDlu3KMjkVIK9fL+Xe0TB}PS5X*K6)uNti1 zZ*^#!Dp2DsZ1VXOu4H<;>6H5hW4 zyC}HA8}x-RQ@yqr8g@vmL5Z!`?0=0R+me&F9pUfc42wL|bd%+3yw?S{<;CFf9Bos) zR`w^si#NBENP~-h48(hSI-&;_6({D$swXB7-Xf~dt%ytRoqQ|;4jTUNK5A{<4DW6E z!Z0KfM4DBiF(*Uf&8LBJsP18oQZ3XP zJ?R2ci6ne8IH8f!RPWHM6vq1otHeq=o>}YQ^_>Sex9a`lPM;57gIP4V&|9!QQ<73{FxS03pLbIt4xS03(qnP(!AmC*# z-pnoPB$5BT+9-ZqZOq44+kfdUCg6p(HPUK4zizhN?Mzj5I{d{m1IxaV%)5sk7N^R3 zJV&OM3qpd7-u(Etm^YG+DcA%T^B&6@$V&F~Z?}qh^)&^Q^7n-qD>=V&R($EWYX3BC zfmlpzWmy;e{H7mt0j2y=?v%>U&0d~7xSBWjKS{t-coL8ge9P;167cRZ2`E~;Ks(&> z>1`>ht4-14c>9qT&=(h!YfM4jwi+sdg_Km$1QJvrUCzxqqvs0a*Wuq z?DF+MO&NEyp)!F8sA^u1np3{!RzVDX)$!m&tP1{WgXqmRC@Mv^+9}|!HVzwERz;^@ zL*vj^bN#OcBN8_>>fsiQ&Mx-#W{(<8oJV(o!z1f7qlySOww5T?QO;`Uj|pN~d;Xbf zA}#7f8gBbh#3=F!P6D0XsP4Zkn@c<75^w8Pbp95Whio(VQ*J{f)-^Oj&oz6zvt@O|p}Gw->{Bh$RmwAY{8P7quq`n!{_GvjcN z37w2A>=1ySrIftu^F0T4QE85yP&ybU3=P}mO+Zg+3@cP5i;AB8i9~RxdA-%%a*dB1 zDXDX=L44!X%@8QzOav#(7=m)qm~=|%@3-HcH|AqyNA`$<%rN1w%i2U}Im;@@4Davh z6C}xjb31XvpL(*B15ovcojqP)i@N+V+jjmtsN~zW{m$_%pKVXL+g&QgLU?^}2#pthq+6126#%ko?O6 zrH>qVK$or!kM@MbH-5ft6~yNlo5_1vOW-kVBMdDf`i7*kcwZR7!U;mFdp zHVv|U@p2P8G%W2SCiGQydMByxv>kyTDVO%21RChmVMr1w_b)U{fT75&BX-Qfm^Aqs zgjVg{femLh_*jw)9yt_uu>Lk!%UtgYrpx(zO5R_~;|Z({6m4ufEuXP@)AUOId~Ea! z+>BPIQF)ofm?`?VoYV-!%`WOjrtdOjeESq76U!}nV7q8(TmJDot!F{^y`Q}b5`lIi z(ia^VPX@SYrM9wmP~x|X8Mx6g8ykfF*0R?$n$+M?at*?J_aPnyJbII%v1M&_G5^Dx z?Dyk^vy&_jihhZkr3T01rrQ6D3V7i+74S8>n#6U;^S!ms)S^>`LB~ z6>jHy=y)bXIG3#A&8J2NWptM6P*#LHhR{XzkHdjIqV^kS2p$ViimD&%4h4}n z(sj+~!}`GFXoY9VJYV+7^SlpMq!pvxpepe~e?ux`?JSG?N)^4_9=^8+lOvje1NLK% zjk?UleLv`i7tI&qg2@IK}$V=$xy^dXZB_~SPXO; zbH5J!d$z>)yP@KLD-_z^Tr)%9dlQ}|rO4U$8#8(1RTj2KlI_X&TrgUew1v@9e^#uI z^DK|!0q^E~O~fckYv=7S%RYu3Q18}5t8CZf&ej5SS%^whBPq?MsP6ZfQ6JqHHl2)( zgi>L=tKQE~)PueKVupsX9q#73T*+y#Qfc(t&80^iy0M)3JjL_*Zslj>@x6s#EmAxg z1FJ=%gmy-P1SO18KO08K_c6`_eEpXNDEJZ~xywM6HisV>N56>Wua;a-G5!Iz9c%R% zRWLKU4*`XuYMqdLr;G=Q=$k5{Lk)waJxH5hsG7-DF#(kAi-S*GGN9VMF?GRcOdhxF z=sNQP{!6m`_}9{&+Vy`B$wsF_#~j5}Xq5l;O$IQDMxZCLn;=H~=TR(m9JX=eO8GjD zX)ov*lo=%T%0hN!9%mX3kA|;RQ)qc5yLSa>KSCDg%VDwseqy2DFSB; zTDRMTx3bRoV(M zWc3IoqtL=^Hb%OYGF#wKvioznz6r}y0|~RRQ1Fow*|G+H-+@!fj_E($0}z$NCGroFpZxf-@)|w(>i#9(qR1~#2%gynlX3oP@rM9F|r znjhJxEpjUNE|r2fY^$9;rlS8kU?ux(Sij=~HvDe~EGV`h^4DPKTVJH8Dtw-62Zy{g z7Un$_B0K#jK}%B=Y{)iwPlUQ#r7!7$>-()f^AIKg!(sPDNvk=(|2k!>1bA`tEf%U? zi;c{)uW$sA(!{?&N+#$-Grl&bH(j&#Ye*HAy*rvmn-3j&VY&qT3g34elW5Az7|~Fp z_Golzz{}!tmm|*plfK~%?7tLe3b6aQ_Qyz%j|)T0>VYAuEW*8yU=cx9^?pNKb;`$L z@!Z6T;;Bg7T9)U+MPw1%9GtnkgIQ9UflKg^Y6cocXAwyp^(KR>JgnmKSCyzdr{K0Q z3{gk-;z)s-M1(pNiX7Bx(M2b6C?0(}W;&Le=bh)$AY!hlhlbt7+Cb4$hHw-sbma@p zAJpuF^Bu6AWz)WvB8@ZS`^tZKzu@)_`eL@7zXK~caciS@F7tH(gdbhHriZ3ldp?8V zG(N-jCxOllQZt|F6Ty;h36uH${Ae~<_`X{HqA24H3Db8*LKv0KbM<`0EC@F5@w0vA zo0_?`so&}Y8+J1jY)n~F=D&ZMDP{)?4P+hYouKE4BOApU1kp}G2HDE$oe7!<9#kn7BGFAJq-nX|{3pm@i5Ru5GfHMFO zq+(Gv${%n#yK2UWmZvY5S@DLMd8~L$xeIm9Y#?_Q8*wRq? z+`e%*sa{Y8|Hht{@F)M<*hh`@HI;R-?fRoV)kD|3+u(BZ`m|bbev;-Zk56os`ZZzT z7N@0o6j@v>4_>JHe*2M+ETl!wm4_=x&S$wv!RQ8~Q;DX2GDt@-&QfEdG$WaIlj9LGv8#}sH>j%@GLRS zhv#(ul^5cj5Pik{tL7ZI#C?&4Iw&wQ-C*8v8=7YHO)#;zwC1nngHDhGagdkhB-(5D zI|HGtvQDuh!W|RXqIOZxwW`ik8}3cZzo71%))stX=JD7Rs!=8Q<(x28p5V$nB5se! zLc-9oGSLClO4u<~s7#VZ)Yz7oarLVo9Ra9&G;w;NmrrVCm&o{{E7Do|ZHY1ts3W}RgkqOkhbbfuw&EK^) znx3NgIA!$3ocDF5Xwn56BW3NgSJx$mK_bS{{JO@)=754WmWiG2W*L#$hk|KZ zUZ)b1L6nQderFZ2ZvcF?;Pk%(Orp#$+c=sZ<57{U+cusMa>oP3*E!mZ_n>KMu z#Pdvkh=&pZoMTwYj#012LI?JWr&5Gxh^{MlHd(%})$gEX&(%#ob6H^jiqB8lKwsz(u zG_%4Iv>Rim>OlM6y5{KNr{Zt(9yH)*5EK%uKAh^nvxufa$sL=$M@njuBPNyS~>VM4% zcQgfZ3?71h9Bh#0hwZ6W%KchM8eyNdBPI$V7{&1@sO?nm{HjmD1u zwQ_X`2RjlHf7;oGAoE5u{>SlWloRKmGfPMaKFjDgcLUB}FuHi0Wqj~k?$kTBtxh^C zfHc-7UyUoD{2>1Fi|K`Ytu+6L<3}H=-P_YMU4mLYuLS_VigDx3A&3_B^ZN}$_v6<5=jU)o zOky_PQ~*FE2>4(4u#6N^1ZW%0W4?JcS|Vn8dkB5k*PXl&&7)Ze*X^1;*eKi zU1$P^8A5MYFuwSxF;ar4rk0vx{{2-(%6HHnd40@CINYeXgJRj(vxxTdN#VBQ@b#^| zmQtf}EZkqbyd2cxs`9tt$|4Hq`E3CrG4w?z^4n3CyD+=lW41sYA7U)t9)NTQNpARh zCNyPSzzOQzLYgkt`w*gl?nc4hF_U5f;jG#LS>7*i_I1Z7NccCo4YH(|DYpDc zaB*dyFK5oBP&6Pj8pWP;4rGjjB()6jj>ihc?VB6PG=hIy{9_8og-}XA8<%GBh zQFNVA6I2TMZwtsM7b{QISCC>@~Dk2;41b`as9L|FD}ay0{c}gZEs`G!gM#>zED(**=IGdZam! z8$Ev*i6 zm7TB*mAiV5e=xN%bGSE8ohDqbaQqm-3K~E`qH}-DEPARm#ZY^??<03d;xiLl0{GQY5KKb4e zEH)hyGFoirJ=UH)Nm4zqP&J&X8Z8@n!0^#DD)x^H?$U5wl|*$Dg|Qt|EGgvU&p$rI zZmFi!IX((bOx2LLqm_g%ZE)`kqrDdZ%)tH-+$;nMd_<&2 z8P$aSA$yNL_zhQw|DG-**$BiUYY|laY%>cRa>kgXO6Gi6cD#3j zzw!;uiLFK0Jz3k=h8S=A3Rf?gJ*TyBux2)?JTdgp`|8h-?@k8v%3UiX(578@-lgY7 zNi&NmxYOc*UnC*KtRL~{QNT`ZZDR3iVhOZum+nv+9JngJO8MCv zmP+4XM)C6RC(p@Qh4yk^J$`6F4<#r@i)hh(+FCLLarg79~+ z_o%s-_pe$RDff;C>Zz=?Nek4Y6HAJBZA;yUZ{2r$@QoW+>2BDgOZJU(&;}83*;)F| zsxC^^Q>-5_F!ZKnLah9X;uDvBJEqW0Ni&hNgBtNxtP3(6V&{ATF0oYh)MJXq!8qd$ zBXE!)jfOZ};<$R6$FOu%J;jMFnp^H~jI(irp>3A+A(ztvuFY61jU!t?rQ5v-RJvys zVs3todZ+Cgx3RprJW%M3L`n-*puP@lrrKNKtEVIMAwQ#=qW1Hqh(GK3fgd_%-YqS& zQX=Rno=@>?);2bAf%jS;Dx6{J9<7Er`OM~TcCK#Tu=bl04m9203vXJEpm;cM?B);u zkY*X~VdsOpy-LUCQ9Tdf3B$|%bW@l1sb|6OYL78E&L062aUdxC0T&cT%n%KLe>a@; zC6_lYCUiV{ADw(6ghPCK^@`mpXyD()bUcSx<`+AZI*bk6SL=0aPVF!(`Ejh|O4&;xq9F1O5-8Fas}J& z?Qg#lmvl~DKsr4@a3n_;;}z;}XIHA6<8=8`&ic5|HIdA}bKUs#DFUQV<#Q*6|1H<; zmBATl4pbzZFOhrDn>REs2gv^8vc{2I+3pt_H9-R#X7Z0OBI#MW@P z&p<2dEp>cV7(wd2;Z3hHvj5(t%4wdNJ!amO77t8>j*E5es6X`1hkM|9-OLoGgVly# z4DMIq4_C0lne8ij-O7-A(u{_q)eWr@+C<*k4<4WAw;E$m1~SqwV4`b|D}OL8xqj{a zPp&TwEIq(RVyNcEk~JOjAkcw1#ft2Sd2+lKR$qZHk(pzQT-~S5Kos{?yuI+(0tuie0rFdTFiAVOF)i zgmeJIn=+gg7n}%+!dJHsF9sdlPfu~tR+-{!>K;`9{nIx%T%u|A#Pbc%eD}5L~g?QSBfvcZtJ;g`gX9Axc>~I^tRmJFO(hbyFGV za8fRPicC$;6crUo^5rs~irf%}2h9XAeII0HWUVsP0(eXEf8Z^B(@-iye@Mk}S3`}g$$n+n9E-1Y3oC55nG3+t=_S?euZq%zHEB%8#3N4; zB2T~&zjO%%h4oBGaR%j$xVY6y0yrSbRA7I;7d4o5`weUIc6Bw?;|C7u2vF8le17gl_!_+ zl1)90OE(R+t@F(_Issc;Ti+Og+R64Mem;+x$c@ZVXVR=qe0%Go;z!DitVL9zcLy?1 zxN5|9KsZ%tw!sLVL-LSD$qn3Ec(_HS?DWEOK8Tg2kUn+G0WaYDp8q%BxAqUd?^tai zbq(b}WeN?mZUI?hbWP8Xk9A^HxRC`b+B$mrS*4Q!FI&>3YeeGHu>%#Qkl*+|`G%te z{(tj*QNn=l>j8XUQ8}HTm)=#^7p?bVUE546QrlT(CKBHqgGj1)5Xm<|<*x$1{Z~xl z9GzSIcEAFojh|??PaPoCYjR=5Bjv6Gi{wBM8f0ycF92lLT+1%YvhC zu|6KNZTM8T!*Qzn|D}RYj2Hac`|jc^`2Pr?;w$*(^uxyI$KGs#3ci5Itxa))lqbSa zibZL@2tRvXwjqYp`(weqN~dFpwI7n5EbvBZV|dH*-wkc_CM*Q zmmbbUk`=F&Uixi`VKqzq)Zg!Q7nJzFr2J;&{LA+b=2#z+JreI=8BEEtbDO2_qcK#woazll zeTS%YY9-0bt2-6#f*mOeCWwrIo%tkQd>UF1VMLE$k`8jr}pVzsj}EBJ5E1zC6E*-$ zb7n*S6a`L^fiFg7nR$cny8IAZeaLmbIfELbj+l*XU_nyf?DDumG=s9c0jUKYe#jtX*!9_mEbex0|Qu=gIS+=o$X(*}|@EVX@M`B)^} zoG82d`2)Wg%ivYFG&k&4Q6|N{aEZ5_u9M$#-$tjQ3-1?#14WtMBH@vUjVT&gwgz~G zqkxj$;xSL zOh*F1heRSt4kbKLGh-3B&-5DOcde$zYbN$6Lvq6}F6UQCG6>oq-IRDNPQ#vN4?e#l zoQ;;jfh_@eutoEiF;;jeg$oI%Q8+mRO6>!e% zW=@Gxqi)IizM4U0^KfJthj?|7f6wtfW%s&~`p7_9s%wm-6gBqD6ipQP-9W-E1&`>y z;4LXY_cfmtfIII?DRp(c-O6ghPk_Ix5}hU|{C+*Js27csvhdHVjNhME5ZB34jTChb z{NmmBU*A_RfP$ohT^f-eaM7ziA5QnTg0wu6qlXE?4S*$GzXm{Nx`5^#;LLhUW2IY) zMklbr%k7t`FD=4CcU+#vaj|f5NB$&Y3BGyj(0sT6C`eTDr5#=cax9ZOMe7R-|DQ%=B*s>=obYp~)t~73&%XWp|wXmC$zK{xViB9!1F%s%PR(h);tj z)yGt%v=sD|gYVDtJ{u-O&dFyViL`%^wy{}GA4`r}&lAgs1Fwa~@prG~+0kY7&{hA( zJmxXh%f=qHeQ{B__N{US0e4&M1CQ&84QUJmQ>tSazVunlCEa-*7BK&@0V zR5{H@h=pmQL-UH|*^~2-*DbmO$!I{TyAnb_gP?JeK;`6NEoW!y1A6(cCZ};V`adCj3S+^9Vx5iiSo$j|-uV1Fb@kQl%X2grPhq@{4 z^_6n>Zh5@8NJ_AWEEOkwv(*c4B*dtNA-j2u4=ov9cJIAmIz}a?F7iR_+?+4$jw*S! zUkJ1m=NhA>QrK&g=7*zmjwV2{tAC*qgCpeyUIk39tc@1YJz3zc!jFJp;hr+`PhO08 zsjmGWycls7PQ|nsi6}?+H8XNzNb7xtx-^wfvG>@2UV!R!bzI?Le^QEDTnI}#ivSff z`;RV3yRSTt^KyggCkwHPW|+|Ad`EsD%?@_5fXj;c1yChq|MhKU_Y3bk_Qh%%88K9S zF)M%=o;T5~^^CdsL&17bLce@SSVqH+XP+i*7jBTPTA62>*`LsA&Ie zR?K+mHLl0aFVoOoqym9DfNSBq0*tkxhz_u|$bL{%Z9Ge)ch#4lhUF7j4pv>$pp`{$ z^$s}sydD_zyB#muopiq^SZqmoHkzYt0`E9ej+ZCS7JR^O;Nv~m>*D2h|@5S20mPLA`;<8`@5XsxDYOr136wDOu_1zCHNQF;J(9=^}Puq~+(A zFAjCZbxwk3=_W7735ZEXEI{V~HWqkg+`ICS+@vV_TikLBwf(Dq6706& zFr;``Hx5G*$WwoIR#{n!3E`bv{mm0#NG4n+xoCUbUa)+QUP{<9hDSa}hUKOkJz>W$ zy-)d*2ZF@0hh!e;eWZkIR(Klo;;_G37Pf_B<=*?0gD*8_D65|0w}K%}h0@@01r%qV zUymz&oY>;pU%q_jID;Q%?EVl9=D=ed-Tjw1>uu1n%hO_ljqksv5N;h|QAKQYf?%2q zP9}!8F<}{}F#3tp=NVMB{*ZTg`0AO?>H>nv^yg&J{w+8ru?H?nH>#xan*W&ZW6)^> z&pZg9!)a7%kw`{)$T5)q;NIqnPKnZ9INSQZ%Y)jR9y)lvZ|YTUI`}v%&&KP^CIymC zrjPY zOssu&@iQ3A!>1z=v|q4_TA?jxX9w-l;H_V|M8G_#k~eLVNz;h%fxb2#hwlk8KPTs3 z>@er()!L3%nFyL@4Di?EhLK#bm8gt@uGU&4Nl3aq7+W7yy-@#2_$8(xH!jb-9lFXZ z-A9|E_PW!p%5LJF4C4VOA_^`%r^;Y%#%BTx9fg8JTc0=i|XLckrR`8IG zwnGEED;(4w$czbnbBf=|*t75nHEso1^rYhgeoH}iO2rP#fpOH%IeXYSy-8Dd?QIns z9i!<+eNbQLmNYclm9nTkQmvNPX^}PKPlBG|2b+@%iCXehn_=H(ZJs!~}DjZ8qkU9}Ir<$#Fa~+=Y~| z_c54v>lH~q#g@$N_?w}#x-a&mY%b1#L@YDb~pV>-xr#P9)LU%0-wfKl{?_)88&{y{?t|TuLn+LiMW1yQ3u* zjY2Av54;Xur^5ADhu3v;R(p6Wf~2ZGANbwK9(GW1<~7oghd$cc22qVgud;&38JUQ+ zEG#EzAaT?4(r;%!c~94awVX@MB=ttE=?~5sm9m$|kJ(PNa#h5;{z-6RdChq8B!>Fw zJx~bCaY|vx$nud|NOj_AwcL+;NA{92ENQ>T5UV_!dG5PJZkB7IgQgj-fs~^_5yQVx zT65GuBKj0JGEhf=Yo8K;bpm*o?^*)he4@JV6D8$+wYXW`WjsXS39 zj70*k4NhYdbC)u0VM)DQ?|#bidO|E(;a=^oV^?kSFfnB_;&4-#v2?Ump2LbnISlqp z>mk{d6FQ`Z?YzBvW1F9+E-sA}>7UEi4P^AJu5_9hFkag1=Mfc>z5yCY{7KC0mD;=3=bnx|}Jx1TdOL6#dS z>aa$+4%?%bGesH*;%pG{ln%yHKeW88UTe#kuB+YEu1YIA^z)Jj4SVf$i7SO4wj7Kv zKSE)WGd}F?P&Lwf@97Regv;!=RJS74ZtK~}UX(U@671#CMXw;~ye)(vJ!I>io^U+0 zpL=d<%6yxZ@G7GuYT+^5V#Z9c$u}n5BL^w+=Am+o=TfE$66*|tcAv2bt>ji?`P`yh zQzLVqZ?L}T zIrU|cIjHj5X}Ogr8&t$?eU}!ECo83T6C6Q^)mCh74w}p94qm4COxXAKY9HOm0%-VA z!+w9Gf*tz`WWuPCzh%O7e(VPnj_-2}!bRt++tOdX=(uq@{B#$gbkj=51FLFNd}MN& z!o=+RC`t6w?sM4{9pvGx%${Fs1ia@Kjp_QL;9TrTClWfOO7Qtk>g|Ll-8yMmokLJB z><(Dfzb!ed=c>Z-h08A)0bk<^81YIj2nXk5-Tv@gBYONcNdj!`5z!Bn7n1DCgtu2a zETuG)yvJ24Drrn)mD%iNLM)cd!WRW9tnlLsYd`lUeb?HBnt^czrmlY^CUs_~mCwddao$XGjm^<<4cUeUb)&^+=-xkP*J^94AN{b&T@qm9(rxl!<8#LV#E&lw z?!#EieIp^1JCYNvX6t_!1KVel$ll&2As6aNlA_d)2EW_07Zh&nQuHgrO1|)Sgw+vB z?RZF$+}7=pZC@kdnK4+D>gTOTO@R3y8eu)hjj*XZRpSVZ+$>SvY^tAM>M{$t+(p^v zAW{6PXx}J6rzy#tq4nhCXaCe&T}4yW{#G+RF6V9ft3E%77rQNxhq)**OgPJQe%$}& zz=P5a)w2*;C%E+6Pj6l&e6*sOh(c!vinFI3mGhRd)Y>4O2N;w#Ks+G48e!U#eRs-g znUJy1sdo*6H%o}xhtxc66td zG<5wmo_N5QyA!W)TdEH{@-5<0U)si&mb@L_@O@ytcqsH9h7HSI-r_BCJ3W#X!9oUi ztM$zMl_;KT-!_=!iZvf9d8*ipOLu?EMaRHqoCRl38T?%I?9fo;*>b;C81POyxM*J= z^z(|G1}5#d%17I+$tWFPKfC(%q3_TlJ55d=bfmm`K|$E*!&|rGQkd7zf$oo$poi;* zZIWZ{I!E*NQvNN1Cd%a?Mn?mtb5&C$XC}W5^!X^)d`&BtbQ|aOjJ4Dcc<{R#)j!*gcd6iQ)^w z9EC3u?WjH!$HQum4hJ?$1LzI`EX|^gbm8~b7od~zMAJ?(GhWeU5UDw?6+89EYTPw^ zj!4^;!XJ6kQ;(`4=V!^z%A&W820R+b2M)LV28D}Zm%`Q+nxr*--Rge|`^{)X?6bd> zDqT`KSM-{7;V~nbRo2$Bl))#A}$J*2JdIrmh5OCTkAO*{67R3ziZ~S2s)tUBbE`XU!VRiVbsy zU*1)IzJ5k}Vy8JjP!OA?IO4A?br@#Hkal6_ZM5z~MSu6=f_inXaFy`yy}{~1dYC$U9dgQ^e4Sh6q7 zGlNda8AT&bS}01fSu{oIZ!}}3A^#56FZ8+O!p&1J%M75#-LYoqfR2`QQT6&yLOa4^ zLHy=B(>lztew3zj;OfZq%}&sMgxJ|}j2+}u$+lCWtknbY?keu7hSl!gMaNApe^Ja< z!CS1K`2hE)K8O4d#ow8UyYIn)d(Q%8C|^@Xug&Uakc_OkXp22-{ciB!wKZY8Psvo+ zBo8{{)pWFa`%l#fzrA4p+SKA8l~$}P*uQ)*lw*!D%Z@)!PNboEg22~`p>V1VdI>9PqZ<{d?k1I2V{ z!-gtF5%cO@CgTkUE7l_uUTY3RNOUZScv}!#U>{vNqZ)d!dTS!34{J47gdoL^F6#|i z8I{_V$4?zkS7WQ2+a=Hw-U%)Gho?|gCAhx5OJ4m?XKT>6k6ZuMw{Il(E<@50Rpy&6 zfxi7H{JNOdOG~jiCY9Vd>eb0V36iJXZVMN+NtE*POri`5Y@C+4JdN@B)kDeS{OT_s z=-=|IA+0D8@PUBPgrQNhR5oZ6$+C~zhwp@)3L;h7CJY%U_C^}v8^tB`cis&?ptG@p zI-h$x?LK|(j~ng$&XQXPYUSi5=GBG@*}DJCudan7E(${_N5?b*tUJMU735XrOm(^7 z*nMC)=!DfUUH>GAb02JGCh+0aBljU+8berO$Nn6`#n&>yt^pc)+ao1}MUF(Le%|%_ z++JV);$$55Cn(%!b+dCJM!L0^dfyhQq>~zEm)R!Q7NHimeAxmHt&bQjgOKWyb1k3M zPH%R_+Z|mXEm>GUyrQ)m(i&F`6s>Eroy0Ml_0v#Vti@e4>6={B#fNG^{{({ONYv;4 zL(zJCwsV7*|I@dW?cA|}sjz7qp+(EAGs5ibg%#DRf5nMuL?&;hdGD!>@UU6e!f*`A z!aoXn{?2|uv+lTRHwV0*#l@6IV+MNB`+u+7qmJtKF=GEmdzBrVh`9}=X@hRXa`E3` zx%JrnWKIq64e<<$#;F8jW2pUCPGwFUo~17yt%Bkb!51 zF8*M=iyzM&e-ZUT`A>q5AY&Ao{rNsSbehCYc|=H3>h|jF&)({!*_($-pNT(^$)z8` z4`nU8LoR#iLFJ1+hx5CkJCrKm{oJf0D{^5&#*~5rK2cWm_`;-RhN=*!mnBX=dzW&4Ig7iO0^jToQ?Uac zN~O1`?hqYoIA{`Qoh9fcL&5y1<}@xiAjqIq1snNni1!alnwbOwxQJ)+p8Lz>VT*KA zTj}JJzVv3g$@XM@@LQ1X6TTqat$7sg-ux}x?Q%O3Si z^}YREj^UeqI>{d~wZfMvc(ztQLS&l)0bdxVM{HVYp2SGAiDU+so^996pw@zrkq<7&4f zmaMgrBBaR}l~D5C(>Qv3JHxpu`BFIK$?==KuS5f#(3U}iJ}d+GhVhY$l6B;wK$G|; z8vZ2UYx)N0EZp(H(^;TQTwKTF2Ofdo(q!nv%P98o;>cv#tJB~TOPx!YEl~-$J)cF! z(QQSbw+E##9P?Kk^sux$wH0U1r3S@c8y&x{jXX?fIe3;EgJ*fTW$xmNKsl@i|12l? zOO_M<-()#|Q0*4p#LIGrYxbiYDTp?owf*xpGcd#W^B$)OOex~h4zCWcMP>+~S8JUe z>qK6W#J3SB;Lk|qU@Ie4@{DIf-uQP3w`J6m;cCK@KDkmqtjs=l9*6B!20)%zjkEV{ zfl4}~o{gVS35j`~)Q=67-3pm7COj=Sih6cL%XR%l%e_7F7aez>#<4m`eY83A;?aq@ z2B(4577K9>2mn_{H4wD$*=|!H24RRptEQM_ zgG64rxMP3McAH>$UzIu?WxMJBCEIPMC0>nTEy*&UPeo)TnUL=*W8cU`X%jxY|55AA z$UO#vf|Y%@;&FfOL4T3^DSlkHdMJzYSOqT=g5=9%smDb@RB(+MhWoSh4fMAw2Ip^P zyLD0Cg1jg2|45`k5O})`8`}|hr5+oQ_kGLQ^rC4K0-i?ps;~B~^P_6Y&E=_X=n@jC z6JKx^Ia2U&WJ+d9Nkc23ERg&z@v0L^Eq0D5*A>-I9$H>mk=2%%d$2>Uc z`#6Wj>-BnnF26s1|Mg#8F1owl@3;H&alJ+mCPGRCtm^pf@>(5#5`<}$f;S%LFps-{ zRPOx}9gxa3t_)y|oX9AyXb=#FR}t;@B@=skrDKe>`toc<_B=|Ggagkvx;I^%Cl;^797q_L+P2OVY}Iry+##%Q@V zdB*OlFP?daR`w+ei9vR2xAYD%^> zuFdQD4WFJy#WmpHK56nq!9IrKI0nvUU+nG~c z6X$%;&@NK2XFIzqCX;OjOerAj1u_@U%Y-1LB66=YV^eo95FtXjbmwu>eh2{oT@EejL8vQUhu08BUq96a-b}3dNHt>&k<8>zY6SWo z4T$9E|KRtMRrV=Trr|1kMIGXFTE`@%3$7{mIBi%(4xAd+s{{zH3$*(bvudiYRXrSR zY)_jQF6EmY=<*V);ZK=1D@S)G=I1pfkzS*JZPdQRa$jg7La#;+-SIsed1DYx?|7E> zcxbsGm#26x<{_f_%XmwMeqKUktXTKEd#o~ovd|2kwu!g~imUYW1;F`m_ZXWC&ccA2YJm4PLV8ptDAFqijaTen64>#$T61@2#R9x%4otilnvUp(4Yak#w!A=o16K*FV!|g+3 z$#gcpF~>FaTM3;Fh_2}I(bfOdFDl~ni=`F0n}gc#^=ynWiPJx{8^s2CCv-*3Nv=|F zdnk0P1K{&{&OT4jM4EMah@C(a5&GQea|W;2qJ_E|l)?>}|5j`*A<0j7pek?nes|)N z*<8A^IQ;Axq?c*yKYEmmLput0VRf8VX3n4@ZqU-g3${`Z1Y3MB|7l^w*&n+82)05F zl3k!EHT$h7J@oj30E-hm6gm4%Pdh|ZI`m(TQi4On7M^ndfBRABfgh!#wt-RHxZo9E zAGNH*5gM-_uKc}=!k0%RSM-b^XxIw4F!la%Y{5Goda71O)d6fC0knw*f+Cg~9hP z14Lbp&v}UATFgfBW!Wj1Kb7+L=lReOie928_|MsfH$bs>3hBG#x=Y!}8XK zaNGxWHWIg>*BavtLO92k>c1RY^{C9oKqsFQ;}{D8HbvEZshsW#I1>%UjZd zX>tGZYqjS7aAz~dq)e|EH+&fxvp8=}hoJj_jaTT_+*}Q&*2{lk{U5vTAobEh)tH z?9X)YyquQ4HZ6yu%b64i)HWg-$WIGlbET$;zEIcM+h~muKypN+K~I85Pg2%JT@FK+ zspw-Dbbb;Ldn%`xgZp~E^OzW^LjAOA%;-q_u?sGypSa!8RoZxkyv6iR965*G6T9bzN>SPqP`qZRi`g6+~He zBD)&5g4}u!Jf)E(G26Ujn-j_x)qvlc107;Vi+u-HkQA_jNDVd*rw`Uwiz5`o%Zdxv zNgST)9|$18)#G8lr#71Ug>!tcCB8DE4=UsPZ*x$U;xzMV15ZfrMkT56CEEwa6RJ|> z+wUC=V85eX+7BNSwW(U;l-Pk=YrP7#ZH(L$60r@Y)WsY%KHbD}rf3#JUwY4n$eXA3 z8C>NWa+uzYy(%D^a*OGG8tQ!IHRD&GLCuIQ*6kJ!>0_zq5Y3!m@W(Pww3Qh1w8-nc4~=e`kbs z9l^agoBVg?%oH0d*GRd?Rm6CzdxrB^wL(G|CLP1bq*tiSnk%||oylnvm2da(E?dtf zw>$X>rmaUsO3kdRNL*@a87W;fLsUufhLhhVx|QoXU@dKF+Q#g@U*RHO@USjxHG~t}Fk`Jun;_$ZMrF1#2&y zZa2#LB-c}zpU!1z%{=2es~pcLe`(#LySFAs#Uok8)3gwk7>gi1If8JYwelWvdc;e( zyUH=*B1fW4Z~G1l*om@lv)S%u2GBbgC~n1mJt}nN%5ky-zSK7Wou#c3KviDviEj|H zcy6e-hEk@q{z^w|N^v%lh~{__00H|pgMdh2Dl`l(TguqqQI98+dXh!2y*6#33zTt7 z8WS5aUY9dyUEtNUaer0iHg5*#q|RwDKqmzVw-@`23pf;xUg8+G6QFSF{-AKAO2hIe z(K?TM_v_c1x^I4-)4YGq^yZ}hL&c99sesdwh9-Y0>gB*p)tpHxJNtf5q&tw#Hd@E} zlVMp419pDseEp0#p&Du`_FU&mlG!E2}cI9lSvl_ znJGkmP;8nN_$@B$(??65)|pb8M5z*5nXygMK};rzM10PXQW~FC%sK|xiGBnxvgZHr z>%Tc^Iffh{wjUu=D~jXHEerKGdmSB-;ePuJ3lVzc0EF|HYF$s?-zT|N3!+t$l7Tsi znDR>!8PbItmc1n(Q(w3z%L^q|K{bZv+AVgESA7g5R@fQ7xuDaA+DXGaNXG!g)TO;U zPLWMFk3<+UMu%M|;o_-lvY$velBurLv4XKKNufm$N~t4yYyS|Ymb#x*1y7I{llzzM z6Ai42u8KPA}yHSaRwhtbW!v6ef6&@qLjc4usSAHwcFg2f_iLQ!kn%l%#HA+RW7+S3`ukN>;y3k|^=M_qZ+@G^7f*6az;F9f)wSF!^|a@9 zr^|D4>A;N-`?M&UK2HzZ_Xd`A}u1fll55nYTPy*0d0V>Q%P;g;5J@aSMUHG>ip`>Vvlk=h7d2=^Bo^dqS>N5#40L5%5_yOnKNBAQeQ0rqzu z5zNRlmFQO_Th2JvQIG9Di4d5S@<}QlIfS@*%gu4yL0b5BZNj(MIL=k9e9BK-);yh#{RTkWkY~)OWgM6g4zQ1O-%5VR@p0> zSRDIi-y5)RO0qMdglZVmOj2Pj>${IRu5Vvi0aDNN5W)=1!_MJL&QDg2Zr<=s^;}_d z%6(hIbPUyX3$0lj^6-^m(|^gocs!z|H@$V%)TR6LN)NIp-ahG7YST5mh1PQhL~Z$6 zf+uq1wpdb_k!8)pMYLhzP_CmC5659~smgR(VOhGXPH+@ts~`!5*zowaGP7fxixz4} zfZAdeLX?GhKCdqieZ`(@9MB}e>JRB7`qPCgIKj4Uw@Qu__W<%g_A>^yvq6Uco+~O50gLV ztGXW(cOhy|r1KplvIxi_5*v2!F`WnHg*_}U5x=rJ`Q}<9DL_Zep9+;j?Dh`nFA4}> zXTeoh7GxS?Ms-?Gfg&bxf89-^`qo!K9~A?|Wyk^eZRv2YjnQxW0z*)y&dyM=&Zh)!HqY=c_YizgROk3{o!sOg>f-AJA=`+25m?u;2(<@Es-q*s{ z7RRQ}0aAN9QlbS%9<^4SYK#d-^{VyH1HM!ljxU8VZT`5h@7`-W)O1V0sAK{2li*GE zC*+bwqMrB4Z>n}_NraYi3nldI4HOA8S^lcccLqzcoj{_`&C>?kh(!8NQe8otmgMKE z8{s)$A+HSdl?$e$RZkLLPds2uB~Ir1M=tH3?uUP^(qu{!*~{=>?p0tj_v^o}eZu8g zS(sz8ML8;Ys$G_~Z<3pNOc8KvI(o-TbU^{fv8<)FbC5 zO|0Q0Sb)%%zYWH%Bo6JV2T8&{aiiz`=D!y(*4&p-xump~ExE8>Ye>{MX}8{Ri=w_s z^J1Kye0r`mPjTXwlGyHo$Ak~E)=!q%d|iJO`tbXAc@H~|&^cM1R|zr4vX(;3Xjb&8 z=@g&ldQ%UznMzt4{v;UWyf3s9_1#h$>5mu@AYO>MZ?WLT`-P{7?d|Z*)e+GsX2e$P zl=oZYXHUJ%*=TBCPa;x4+F9AqA9K6qmL}5#fj6tZ~2&b%V%x)jv6l)c^y5P@I5V>t>?_wIlQ{2ma2zhd;4 zK?p(Qsh8{6Ja-ED!aQ8&T*)ukJpv2qaa#4=a__4^8X9(_#H?5}e6A`hk-RNFiI zIrLm8{mzHFORW)~$c7kEGTZ{kpkyNr-gJZc@6h*qZHmiZ$D2PKXAeb~*pAJ!gk{pZ zF$7hjVy9MO1FEjOF@CQo=^nYFWG+gj65B_uy> zZGKRjf{9HdnUdd^(yd;^ zqf0^Y{R4Mz4INeyfe-QRE|gcJ?;MVbLSO z`p7C0Gsc}dI_GocV=z!~sUcG@vy~n!tUL12nM+#Y%1s$JSVp-1!rn`bjsJzckF`iB zA&1PE{97l{OmW6qQo6jZWj787=Ro8TuO73|+Z-qfKz%-hmofqg)=z?GQ)uI0XGSJw z3LleVEo(=H!gtUbts}2Po-2(Cb!D%-aCPQv^O7T6%I;d8dWisUr2aKqF2-*epEd+X zVV3@jaVm^JDbfBTZ$L1YO4-MH2#}1o99LJZ{Y`o~=)z7c>vwF)XP% zBrImkE23Qn>$YOFK0-~~BX&+7mYLu;V*uV(PhS*5NI{>KvbXz~|GWLw(AD}HjWVA{ zd{7kesFx?}Wpd}TZlFA9f0kYTV*df(qZlv!-TVGylsK%ii^l%L#!oMx$gvc&%||)_PcGOo*QF6Q0sOXQ1L*gAW0C+x07d z9B@jUiO8VWd}cs3658OHu&3GeGMStYay@qfHdj^Bt$($0`|sH@FLA`!CofalM=y1G z_Fn+g#qsJKsQz`7GFHAc=qG_EZg1;)qca_mq?F-#KOCVB=)f;?_!1mW1}Jr2k^Izb ztCw#*Wi9)Y0I86iB9{LnnY91Y%h9*jJ|r-BO}f7#U~D;0xa1$qv~ zOij$K_J>+74lt81%hE1nr%N-cJ?6aoMa!o#`N%>NO>v1IDe#T~*!{Ev&MG0_jA#V0 zzIhtv!$^~Q+g4d?+v9;9rwE-K$B1VUA@?^rZ;FU4ayhmRV8ur6grvMkWcN$=HceIG z6bSmI9>a~7#$>Bi#4y99Y?gjxB_0l(emc92z-^wDQSLI%?YByxn7tT}?g zHlIZ+JC}wMKvZ*2Pi>_jiL32zv|LzQ8T;5S^K@5R20WbnbOu`57#9=491s@LtqbqF zd-EA`N9Ux5FcGI+vuw>9aaRpbJmLP0!*xOc-z^{aEDdM;i zj%q*$9vaFqlCie2=BxFR-tajeRrk@n#149&^7+_}k%H}lPM-6<*D&B222t_Yl|~jc zy-1*44&=FD)^gUh?@hNpM0!N3a5k*^Wl!l^WAo4RXOeu$2^bJ6Co=LadeODV+B;st zhVe*Ss3o>?4upUHzRGbNB8d=~?TP=bl<=tvavB$gb7^IMPwO*?^X&ZIGAv%QRS^WB z_CAOXxv3wu&qVcewjSi(+Djn-ki5k$aCB>mo%GTMn;Qns0QkTUaeUw>6P;Q|6z+wc za{0XaY(X8vT33>E5!F=fMHnnsl($j-Dqa`g#;ixSJ+c{9#nvRLe5N?T0CmPv9Jyz# z|HS&;*dC%-n#{2ovTL^f!DuGmORu+U(0H*)7*}Is(sx6u=bieT`sE!aI)-G7Kr&){ z19jaKl-Qo9`#oHRwcCI0V%zKW7Uc9x9WXUK0qov0q-UaV(FkL;1-#aGV+ni)v+MnG zxOU5vTKwes^7W(tEV1JYvK;#ju?=lm-`|>03tgkYF}Q2HU^fo&_8U?>j!n*X#g}s6 zh4$)WdMcu5oE2%c8m$d3z+_h5?c?Xy-&8%wFiZSAen{cItKN$}@&JWUGZgxI0O1B7 zjuuR+@F2vry7h4Z$*Vx(rWxE02YAd}7_)RJs51MOt*q9zN4P3e(wb*I#!B;PA>q{% zFgYe3pn^LkZoS^mSBw9%#2Mot_rX5o8v_2WGx)z+PF>Q z%8Z$CBblJ2JWB=1(9D2e;wlpyyfe}<9;j6n;6=*J8(Vr3d2PP!*~pyFJDQDLW&+Gb zaw<%zde22P_10yaN22W_VZh3L+MBqUkw!MN1PK0;`8Kf3d6{xWng6qmy&8dPtRhu$ zq~M+>t4=2IpZBI{@QnLcN{a++4%|NUPmE5MqTThrS+ey0P2o;Kl|*)m;r;!X0}EluG)4MZMh-6IRP+v z$KNr@uEpLrCu3?DNMuZb9EqmN=-MIY{@OPm(8)B@76m^+yjkwII3-))IvEK83yCjj zZ>@K6SD-PeaeZN3X5+`jg7*0ShyLcbH#A1V4lws{xSHR9y8t3oT02=kYz;Xl7bof| zynig6bWfs1eraG#j(MHq%wa?lr9Nj~E@K5Ek}cf0cyYoXH}H&j3dBv#uYC9W4zDz@-}Z(7`2I1Y2fzk4 z_J~LJH%|*Gu=#(}Rbp_u=$Ft}o(NmY%*Y(Ln_yS;KC5@mK~JKtR7iTbPaF zdO+ZXHy;U^Z_g*(1B~k$h9P4Nv&LYab5{4eSFfKcm~I`UmjyY@*w%u`6b z!BCj~YeaK@rQl3{f?4gQxGc33+`GYL-zv zzMhm>Lg0_6IkEo*2fmlBkcpKHzA@IqGdZF2bp9PuyHJ^`O-a3i%?Bsv2Jl> z9yY#z3a6Ej{FR${1Madr(_$ZMl&>t4{U1T)F={<)tq7Q5gJPR-w48?one#KKj34JRWz{kM!v5+@^T z%lzRx8~Q#XqW$l|@iuDuR5BH( zO9HaL^qq+>-~RtNTMjJIDQFX%v&9Pb@W9z3`D8TlWmt3sC!)@qcEO0d1pQir81ysz z)c99FGsjJh)i}+c-D^R|w2ytO?ZxJ4v$=WcP?*$)p1{Qk#1F!$*`EZ@MRTg5w&OxkN2jAUMLD0!GAwM@oalq^;mP+L62F|# z_^A;{CE~)usRP0Q`X1iy(E9vl*uei<%lwOQQfS8iI9t>TF`%FQBHs_jO1}7qvt=$9 zI&uvqQySbec%70|u=AZr6wX+SU(2Y$T4p2z)-q=lb;kv~vvzReKq`@VAeEs0ODfUH zeeYm$oa;$-k1n9f%JcfQmGunQ?Akc_P+J4hAFh|-M1SuM@qvF7nJ>P$j8Yjc<8Nvp z@V|r){Ez(dAw{G5u{>-9m=Z=U$<%SmOD=EL4+H;`UMH-KfH$DWoA#^a*`(IX&`{G}o*&9~S;_XT_ACjo`^bf0*0dLx(BL3N2z zH*TOt-TQJ9c!=>yE zZYkqDUb?fH9SXzC{$$94Mi-qw{%2$?2k8fHWVC^G`M%68WLbYZ_n1E1;HVuTgg^pj zO!pO>)jrWZe8N|OYTS=3J92gFXyHB|<}{+d`}%RI4@Ngp{sQM-;-<#EWPeg-L^(SS4lR(WF-G5L4Ljv>V0p$xE!S!6Wa(=lJ#%;{b!Tp zcbQO=DXsJz=*88Bn0@x30b)`_L>% z@rq_E%0YTfJG3t0hsr&!yvI9v6ZzhmGjG+19+$hg@-`I}pGzE$tofkAo;uLMo)M$< zoo+1OkKg;kLdp8Yn#kRk_O~6bo~g8UIK}duDv+>%pl@INizg}m#`f}s%HR6GOkg1U zNnnnd8@Zlrpw<3W9Qgl^I}^(OSZr<#Kdl3`)%Bop=6L%6XK_I);BRcvsW`Ldep2(2 zM%t`a9uT>7JnGZe=iwLu@><{k^uLaFZ>!sK0ZE8?d%+IzoDF~pBxqeits-{zX`WP6 z36Fou%L1;62Y*}>V~4H@&Z!)XE^HfG!l)rR{qL%?9K#+~-DP~$@iVb}HN_I%vN7ru zR(IblRlD{;c?oWQU~*~6nCZ3V(lr{E4bibbaR@JAtA8pENTrrSOj^<#eX<9 z>Hl(UdQ*7Hz5pUJtZT)tezPsn!>+ZQh^{wh#RF3DuvJ<4@=5DzDS{)bBh|W?X3MEy!-qFFjus6oOg7GuSHDOA z$2O{XIltWRo?fQ!Ir4ub@qd^9Fm}d}Vr2FjBAfoBR9N}vOw3^2-6u61bi7II!5Z!F zg&=o!Ec+gX6uETVDpJpu^hwT4>AoA6us9{S;at*^r*EjIx`-WNcLBj;J{pHXCU+__ zm-EeAeQaEq6(ecJn`EYekd#~*Wa@9la9kk&WE`xX{h4`)25S?TH;Bx9DzZvqK9Iu% z)Gi&TUcJHhw+0N8c<^LqV_HP1;QnX!YDX6pdAHVk#+L_^4#WlMFuG_u5t$Hep1JLc z>QyglYY}*ie{?tQ@&EjVzaReN{;X$28?M;Fd$_W0%>gT7%SfU@jQ(8W>p`x&95P)~E+Jm|yNv#S}>s zw}|pornAk@2o67$DL+{jA5Mzd+dpG1V7!)6-feqTGf6tS!K#deR;i27Zd%T1o-k-Z z_JSo7d!H=Dx85Z!SM)f4soT+9v~cNb7C3@r^Y%Q6#CEPUt)~fi>9*L}H!^xXEn_aw z^fN)xd6|N~xSiWFDMTf)4J#gQ%=z~v(VB}2XCt@M+o#*}@`|;WdbPba%FXJS2+@yI zr})&gaOl(Lw_9dgK26g~t~Q!N_tB+CD_2D2pjR|2vrlsR`%m#YYVuWT75hCm^z!jw%VnB5e{OjE|N&HKOzYK?L3-w&Y=f-B^hJYs!9v)3oeLb=3j0jC!uH>)vrv2! zA=9YNOlv&0JBpSQ2gIi?0eqeuDB$yWM`v3IeFJ=+R@RfY2Yep+nT`2y*u7+t1Pvn( z!(E1rl;wqMaHTdM7c7q2O$7%(ANF~t7l{3f$$*H@A8iNAGPwDNed=B9u4zmIHEVKl zAB{6AvOaCh*Br@ezD+n!|BQBWZ*uQ+zNKsa*e|d!`~LwJ{<Qp>+e1aajFXq^-^<%BRILVolnFmWYGq6tGpsqmb}kPpjR zNn`yt86HszDwav)#5iE;Jf#bZ#r})F(l@tFU%`AWCT9#HW28{f$-;Dg;-Mh2q4h}A|niM<6M*ADHAH(!~gaM133 zO2T>nsSk>qrm!;8Qan3W7&X_e-CSt z4UN+2)8A85>5E)cAjmyH01; zDx7K2o4nsS6xdvx#{Sq`PD5EXe?W8ONU#*h{4-0jwL^vPBF8CBADJXpt8p^eaY0D! zr!Qf7vaeSG-T1)`AmD)69lIN%#}~b^cIs1t-UUZ^AR{4XW+s(} zXODdluCQn{{0q}h_x}fcmBfq(Upf6R@YOx6;Z#1Yo@J!DUUe~-XDQRo(9BWh1e@b# zFIHcys4qA`{ngQ-ufHs88`}g;s!&$EHg&oXT`=g^ywmXnGqBWn#u9C4A#`)Q-gL)t zeUD`7%FcwSW^+)};#gZ7Z4VQCvIt~xf-z1p2_f)a=}jLCIzWrYJ@v2e1| z{NUkVMW6fktD6AMFMgp$vZlJGM^kgSRQbekwyqmb@W%4 zmp{2(FCKBy)db=UfZc5*5lSi0s3x&-y7G?&ANw+Tx1(Q=+~~O&fybYQSBGq6V8xOf zGaF)K^{5h&2Ju>9+NTvL-cXYJOcDMh7~onf9?d8Qz;4qO6K+shGksBo-rE&_Dyyh| zoEmMDKW!-^%ck#jHH{_v^?B9QtZBJ$%)Q#PPJCvFxS~&PE_B}skF=Fsna{hzxsi1e zhLgB-cbJnl46a>1u5YK?LQqh*s7Cl~pa{@5kcP$@Tv-cok%pfSfZYi`=VhLRn2OU@ z0<17uwVni26Okz{AbMC@HZfzn^m1n)LTKXakvu*Wy1e#~Tj)-H&F%VjFJoTyq<3qDh2IP zhAKsOhq-LBg7V@f_y0+NifK+;B26DwV}yTFcfKS^MlEri{F;8AR38%!P<^B?O1*TK ziQZWKNL%ySPhnV9_S;VQtR|-$&XxoRE|;sl>8CeMacDVFdQLQZ-rzF8c7K8TG+f3k z_R9BgQW}qb?q+dm#-oJ?cfiMEpZ0ls;pj9=4L#x_mTTv=?1)%p{H^+BxT@r{Fg2Y> zQmNIIkDVM>z5&g|_q$=$_WO?75c@1l!jh7G7HjpwYZ9BC(z8z`8`(zP9>M^rkx^Sg z9TxCmE(>P8%0KA-Bk?Ce*Yz|^%A}zQ!sYzLa9nsi+n2yIM91z^d>LSqJ%;ltcUbq#s%nq5}4_CN+Xk9q{Ye#8%MSN1C!BW+R6b#x9PRO)p>?;C ztwJ`|V`xO93z2*Tld6dtfaP9Uph_d%8&H^ix{wg&fnHs`2cez{KW~}DRoPu73K4L6 zMenEk=ux|cT{8>Q%Y4T56&2Ke<+QQ@`S^(W7TwE%qbgDKkAyEtbhT5nkvkCDs;hef z5U2$v4!L>*UZEUQ@?>;{WrdfBsTQ%IZRRSe2Uy)p^TC;F2^D6Ui@~4UHA>f{FOQ z1rt6-+&+Fur_tI0kgFa{Z!ZSkfBDu(Y@Z3}Te>~eC-rM-o2Ou^BP!3GdS~9WNOraA z6EMBqUv)eI6AOo@tzK6n(dGpB9~%RLT*ZtA8!F z&3@+P-&5f8fz<|TBf*bl;VM<)ZBA@~y0p5FjNb?`P&_AG+k&al89_hrxky*vqGj6d z_|0hqcBC9t+t{~vUkdT(u8Jzj#EOo1Rt&-L?TS?&srVeLJheyf2s0Fn)435qYz8=u z?a2sPi0rAJ&AIdI-%3A^@Keq_6jS%pGAbV{hjwv02KhJ3vY`Fm7i5%YS`e#qh6a3ah>6%9b&LK7{uEkt z2amtM6s+cFfNNAHoH7`IXvF+MG};^@8Uy}8>el$i#EuRv^~i$aHIexs;IA#q%fwn)@nw0HasiknXt?hDX;s|idNy}&P4Ib<&e;flfR-;#xy)xn{4}>HPAn?QW)I-vyIW0Y54|Doc z6{w!bceEAF&CT`TTuE5tlp-`?y{ya^_UGgj@<($^mbh=m(tjev*gqXw?Pc1`7Jurg zp6Mx5*bgUaaB<9Di}|%*?Ozy$w(385Jg8-e6uhI9u(A>|-~~2PteNYS@=boHj{ApG zU;qmf4Qb|!uYF5+S~puTW zsLR@mt5#`Pc9^%W3$UHQ@Dg>`J2!#ti(?Oxz6xl zCh~qP*9RqFkK$o(zhOH%WWcm@Of)$a^P*u_J215`H+SU zVWeHK+Zx$881ypzy=Nz6aq)YLalTsAm(odrqquVNOV3TK=fjil6QNCRyIQW#uzbiB zp9b+=W4}D>I3$hd&Uy2YM@_=CWrQii;7qhI7DpX`1)7$&c=`iPi>X+*NI;s&s&(f$ zu9&iu$vDst(2QdP{$|kFlS8S|^${<5i3n>^FMbj%QQ>I9?6xsAeoO;rfALOh$~ED* zg{qntW*Y}JtM}&Z$6A|a+;|xDBYy7a?P4=RR+-D45)w<8HZ<#%eosjly~h%gpXD_X zZO#3vHR#ea%|R`+STyq6Z1HoX)9r&E#fU6hNvz|~^z9yD6{p-_z??3&Vs zr$&hBp-@5#Mn{oz4bo{C7Zod9QmUsnCO+sDIuXD`ik^Em(~Oh@Y1;8V^PMixRCh%!>|fp_8GHI$gG! zEa|ozWJROuW9$sgDWl{wApclOhsKSGkRwr!> zQX)#C!YgD=b~IbYaTR4*dp+(oqtu;zEse3YiMLrp(vIwT<3TNMqrt$}lH42<#}pwE zb*DVyy~;}X8y=?Ag~6SEHEMifF%zd%V0{#ySXhSsfpxztDo2w}gz$0(gI=|S>s6<5 zBEN?ctjEb`SM-uDSEBDpZD_lP2+N?}9;%SS^_0pSa`-{7(m3crX+HGge3vRkDTRpcs>DHWiTa)>?xvW_2z$T+~ zeL?WZoBQkIRAo9dPMtKN4J0HXYf`(fxD5##YA(Z33Bz77$=PigMS`zB5#N0JBBa1z z1#7Qa!!Qob6QCR$`{ojB?lb^9`%wcYLc*<(%s&ZqGOZ23X61ccG85OV;v(JUJZ|*= zSjv&H+2zrnH@*e3#-L3fni24s(_;#YlUBzclWF>26TI1JKLOXrL{0thK*Xg4?ax!& zeH>@wJT}3~xgmPay*bb+oCe`&Z40S*aoOq&ml^LbKW2?sKUOh!k$1QxIZM%zm7xA_ z(U?SQ>jaPfI(PB6ZeI(79*1>YyXul}vvgnVPM-$18SJ%gCVC$Voq*{`c4)@ltwO2j zu4B^vnLL9daX_2;@@%7+966t;M@xvi=g`{o_hZmP!+)8^XTj1aQJ@@gS$Nk&~E*mIC%t-CgjE}mnf_+7rB~dRXXC`bp=)G z2l2|rC~Ni?>!eil7VmgwN85HE_m3@2 zQe=HKCo0hi-t>Jd#cgiDHuiA6#QWOUW4KK4160uf?H8TB$b}mQ1@OZltMx-gkO^)~ zSKoET`6Y%|ztktlBwo_WmbCpo@wQ1!4XJD_8`R=dJs?1i3G!ha{x+=HT9RVVsz~E- z$n4(eGKyAflBGw(GAhL)a)%YE7FA|1Sw5}54zi0!)3q#2?)St>y;&;JzP=6a)>Ae5 zDQvesx3*oxehQcjIU^Sf2P(hyMs;wIS-kUkyT$@rzO#My+2A>jsn*=`8u@#;3fsxZ zHa6{W^|1Uf((`@QsHwEU=Oi@#%EuCG5D6Ckjs%lQF&HSl@?gWAu_vYPeE%E1n}tEH zPLs;BhU08Vt$7XRD`WSbHC?B8F4Ih9(`rl;?(gD~agban^MmA~07x@&&C423>^}d$ z)h)>c82ZMz19i)BcTdX4YW%7=9KJWt4$8N6n%SojwtiGH6oSmlCmBH48#PV93mq zF$Z;3Jh$T(ErFn1>|DPWHRNct`j=)x31uAUDTC8YWUQxy)>Wc#>IaXo4+&-i!>T+O zP?{`XqcCI_%SurgB3!uHxzg6;b~oXktmGi}K^8Ai_*LK(eg~E@mWbyvpBfDdeeiYF zVQWto86S5p9yb$i)q!@rW#@{Q(KfDEJ-*1Dke=qX&GaZSzDIm}giOpjIqh@5?A3Jeb zJIbd%7pwSXvx{_bg$j`H4akn|yqsiMa}b8^(giV^G=S$c$fSY)-mzp4X!!qDje$K& zBPt{jwgwNv8!|%-MyqzpcMc4hhPp7&w}`>_AM$1TK9qXA02vXX{I9@Wb+s;uy9ay3 zB-?^=N6azf!6{k1$ghivuz`4j*5DIqQ%NLc)@iqwGg%8E{VI1G!AT9mV`l4|vDlHB zdmn$yVqv1ES2OxuV539a&|BF^PA(OgZN~@K9)@aLFdX)&5iiJ{$;YyLc)kBBIu~Vr z`MLvol>1ZwLFlK}`3ui>99M&4r($1tY9m!#Q08S}IxJ&6JnLb(*2yuFYFgN(pdgrr(Qm0GYeD zcOnT_lheXon4ZJLScMB-HkNN$6Q`dso9|zB-F~{wkXor+p^yL3lW9sJ+WTqKtP6v^ zGVYpc020#_6Spy}P-MyAnl1jiGVd6#zr^UNmS*oOkd2H5Yb4)YAfeS?*p{5f|oD`4vOzbbM!?4Zqa#T_?R(ul^t&t#f8m4Lva(AOu z%SstH?Z~l33#Mv*(eO||&9mAqcevAP=G zKFs<^ZjD~6La;bVH-g#^;Waw*j+TXS zOo7V@*d|&>5T#mLbl#aVerrXd#VXufe_EHC-x{X8O3B$dMR%ONrR2$sUD^Yp1nuXH06`n@j!!xn|ygvR;?1QspUYhFD!`+FS4lJ24 zLrnbC4@ZQ1>Qyf%*&*W4kr5V;nWGl9TbY5y$u#n!xzuNI$E^Dr2g)%hgbc3S$G@Mck& zR!)>6f;UDn>8v%poXL}DvW!DPVB(+Df;EJrIro4JNO4z}D$$(lPB&Zmg3rR|$m9&P zG*_0>oxNx$q9u8qscG4ErgMfY;AY*)=OLz9nAEAqzBxw2uc2_BO3gd*-tvBZFTxuJ zg|a;LW7ScN$$snPL$KzSVv@N^@(@|BZt#)+?uqZw52&K6vlC=%tcGg0pEg+e)XaQIRng#>F{i&$la03b`p!zq?sqb0Ds4a^ z1CP8!;(X(_^O7HLXixMd=KdeRtAc|D(+F^Z?WIz&aZdht+C`3G+B@ifszHKDQV{}<+!_2fj;*>GkYJ3lw} zke%Q9o1H(1UJcE6CjZ0EcbKy9AqF5zJ=^eiHSxDgr9Am>jd1&3IRsf^mC~2u+PC#I z3-xZSyy=k@+kF@lX&+j=vKv>*Edixt!;1WM9c{=h|5rFk25L{t;dSA0PXrB$`0+)f0hriR&x&85jGVk9I zvJ@C*1aTI80oA>{QFfu~Fa>y+vP{4L#1r2!jV4c zi2=AL5mN26KIWM2A%(20>at#&J&g~W)v?**b`JWP+1dLPn0z3p>~}t3EKy!F@zqs0 z8$#m6JrZJ!M}>Es8puDlSXNf*q06b!Iyj(Zc)l7ymWFM^Ilyu#gT*&!c4P@}7 zqzkCx3F6{J*`=$!$%e&buq>Lh9YU)nbl;n+b-(nS^T`u;CZFbDWA|%j|z`_jbdy6g?kO2T5V{-(&j9ZQz}G_Hr)v%=3!w{RF_IHT0OTIAW|-G0|*{((Ur zukb#3S2c!C@P&qhdyWF05q<#Czdr)4x1U}SHzAI=e|ar^F8N#e}DJ=`=j&! zdDJ!6b-h2I&+|nsC#vCS-;n*ffV)VvdGlWj5@HZOj31mN%yE92@%k{n7#wtSi&R1ri#P!=rO-y@r_rBYe?o_)r+f zq`-hLlZ>4y>Z88fG_2i`5CZExft3??;Io)%~;am zb!bEPdt(9g>ihEhZZ5>wm5X*RDhOV~Mnv=>vr>_8iP?!Xwe_tczfwsqHvaAwxYfD8 zmqxdy1f*4_S4gU%I6i*>IXUk-v64H%UxCG|SD2GHi#?6NQMC6ENiz0I;y2n7h z<}EN~7NJkIGzBd0;I76(ak84jrGh$sXY9NaX=gphpU_r52|Sz8HpPwIIuemdOv*Ji zHj(d4n+-czz*}&0SqpL3g{gfKAeKL&z?3s6+$noF@ixcL+^=r03Rxix*TGfRp^XF= zhl-6En4Sw=I8mW*u8VH%*?sntAi4Uzmeh_4r-mxJqxdOGUDX6+sXlt6%Nm(sNw){(Yzxd+e4S;YUiPL4 zHpTLRF#S=EgP8!FGdU3r*1)<;U=cW^!6gZMC&nm~#W%NzHeRx=~CPQa2rk4wdzIvk02 z;d$|>zRv2|Lz_hs+TQYdbF?7qLtLtNrz4B;VW#v856bie>O7mQ)rsw&wtqZ!vbtfE zYA=&;ueD;p1i2&Cq&_uLCfs7l0h!|c_}pKUuTuG(^7TJHN6YBddPgB8@y2<09aaNB zSzYcz^mY3$UI7h9+fcX*FdgL7Tx^mV;;EnCKBICr(^c`M?pK0sW-B&?njWL|a@&oo zd@|Klpn8>ax0hcxK6kBlZy63Hb+hAAXzjXLcwa7J(oIc;ufei@*YHQlc0Y5#IXuEG z6L0zu`_n>4u=DVTm6Sebh=p7&c0EdH+gzRj686)klCR3`?9cb9fz7H4+W;F4tDw}P z#pkJyY!#VqHQqp$rqO?h3Rzu@?RDd{NKp|`ofQtN=gD$nd9z=VaOx}I!Oz}0L3H!K zRexIYn^+^zBA*w%idw!|y=gI`HdL83VlX~2VV^tNiQR26jiJK-T#2IRLD^fy!usI$ zE5-r5xY3=Ya7ME??KO7vRlB~!hhi-z`lT(P?3>&x5W!TUu1;E`Z*ysmjWpG>{VBO7 zQYunHivrYxc>A{?f?`^6p4QYA>MTJtst@#dPMz{NRMc_5F8|>3%}C*j@E3!@X~=S9 zR`I@h0|MMcz{kpru5fp#lThN62$Z3fE?NPptBlW+XhNNVUtUn=rmJiGIbZYmR-eTQ zQY-=*;TsyXehS$hvgHRczI(P@{R7l%A~JDhFuasE49@3=O}f{=Mv%{AH|e;SyY%i< zsu=S~OTL;W}{#>a%J~e0~!}j*#^{UE$f%XsCy} zBE9k0-K*yMkJOsYTTeo{6y8n+@@LHMf^CEqG2O$WQpI=%Y$L~-K6bOU@%#Yce8D%1 zrC6;%w+w!}70!XO0A_p)YTrI;eO;nQlv-6QLo1OK3f4>cU+cy3YL09Jy`}eze=0`C z$kj-Km(Qsfp#y3xrMVFXl@r!yX_>UZcepz#B_{W~-J!6mYh0cG5cR8K2rhp4__q?1 z_ousld3`!~YjbSlTii*3-2udLZ9?>tp28UCZEd(Y?rPGpiY!^+c)rp)T0!!VxR1OC zi$=$h|pfW%<_|j>V%Fle%G)Xub+o^XxaQW&P?@m zmHV~PYf;~zGo*t|MHv_CRc9vcOo?LOhvU|S(LY)f{6`3k7Nr^}c_|Z1UTdcg=a!|N zc&}~zr6Pm3|MH9O=%*U;d)=R!Utfn@ZCq*c8*0HOfz|}{^fc`0<-b}Jy}w%%BkRYl ziT_v0>*yqo_eCa_<9Er+8O?kwsKAl8Nf_!{{aW~q2g z>Zb$DlH!*c-tddmADJMU;r{?%RsXNS*RN{3ELQ^DKCv@$`#t-#q>D!ZRews*w1HFk z!=T4bn$dq${R>1@{~#c@I?SNdq?qd$s-M;{Y+q8_08sruNm|x9mmB#iE7SKoV=uqD z0?_bgqN#s=nFE;mm}0e4AD;&aQFL@DzLE$;FGkkOmYAB9MCGDvVsFtUkWXFmEZ)YE zzqG@fzc(`bVdD31G`#nBa3bOTy!U>x{&CGquIyjht1@;GeL6b_FJ}DJS+M1+r8%>m z?Sq+B?Z_i`ens#O)AYLtEDajwWYVEELhL{}NL%`<#ylRnI}`6=Rcgg>-Z@w^d)3#mnH-Gseh8Z{Z;dt8vRju6`zE=gK4|MCzLMQ-$LhwAvs}q z371>vhAn-7T~QL>kqifZxHR|#lUY9KCP(w*VuB$~_=QBoA0=BFXS=oDd@k$Z)+X7Q zIk71z>Py?9-*gVH++W(rG3H<}?ovT-TG}I;|9uYN`s)l?=}j?7+haGrx)o83zA@zQ z7Z6e|Z76bV;t7m!=lVQ-F|VJ%=r{XEi#prt+uNjG5UJVF=n{f7#&f_jw$g z#m$_Oe>GVi<{$4Zzk_$=*SQSo$iUVD?jsgCfYwKRgSe!pFtZ3p{Yg>=52Qi*Ifdvy zU5+ay+g=|jB8f#0LHtZGI_HWSDUom<_Qh^;WJ~=fld;eJ+ zL>1i^Q7=+7_N_h3vCR1TL$W7LEp8(p+ZtvCN?)2-qqT&GYml z7#et)G{$Je#$>`qAX=}+T^pPt1iy%h$L5MvCp;R&6{RcUT32_&LXJ;g;>V{iOA`F? z=}TeS^ZkU{BPOWO*d;w?>E@H=^`>Y+mOn|_Vl8vttK09yUVh;*k)9y<`}Ae~kJDEk z_ke-d0qdq~seiE=jIYT$ZrL2uk{pyYE=!B~o7<2t22FIg|A;VK$Upx5~ zlOp$`dwte-i~KNwF>ndAgY&4;z~c|mOn1%|p2pzy<+<9%uLquSsbGy#U>IglbrkAg z{pQV{nX&73=<_}`P0Dk$PZtAYjSykp5!G%T(4Mnc30G6LG+dV--WO=_5|aaX_~IQb z;!l#$D_`;N zM-1#%P2xEnPZ`uhwOiYhcRp$!FB4>36F7mj48r}~W~bSeOEg&8pD=x-Ao(Pba-3+9 z`A4EfK=}OF1YB*<)6K<2u-Nd?!gI5qV7eU!TaUz4-s(|D_dq_E!)k=Zqv%l@9~_5! z8Y%=>tT=9-%snd-X{rgrki-Io)37y5EV!H?oX2;R z8C(sS9QHj&Ugk;G*s*J7T4{;5FNj2WTi^W0rTtL7NayczQT&cyQEvKnP6YWK|>2|Kt{(x;b9p zH|VkiHCH5+&Qqsm@feSfA2yLp8(znmn<^JARd%!u5**#h0Ud5p_L?$ZsDAF`jf4F) z^SmJ&`%3rm3PK>pbW*9Mvt-%eNEbvXx@MiAl(0~gFEqxgDMjP2xz>a8sa9_K;G4;$ z2cr^i*DC64DxxMt+BsSMMReb%TD!;wiP^imMxb8=qL334 z6olBhyIdMUCxZA*wb&uLgzJL@(XVO}Ik`L0I`89{BTmE*k=$bcaI?trB0(L<;o!8z z`PXS{_CIAW{-Xj6lu8XdfV%r}05MY=1mDb`&rc!h$h#}^hh9{I(!Xr|isQ4EY-QsL zL5254qd<2yOy&R;>vI`IQ)|E$q6oGSC3-9P2&9Wg#$pxz%sOq&CE zu&ErRBNb`xN*{+@7wb1&a;hU0UrV0Ycz#o^YQYKmB3%&M7m74j!Dxe%){EDF%o=FF zz(o4Vwcr-Mx&&8Bzm8I?;Le3XdaUW zlm9i*k~*Gf3FbC_bQn1ETzG8<%P((;uHQX6RgRqi$E@1pW7cn0zljCrXNE*-a6Jg= zd>q8ZPg{R$#dryXA=R;UYJ(*e?9$s4x0XHsXPo6=Tf9gnJcr-I=eT|Md!V(x$%TjF zNOcD4IS~#f{#9wju9ux&FU>Gh-|PS}&mxNXl-x>)z3wRAb>YhGURw4Q?`8{eY;VGh zhWdl*ftlp}xq044iJAlhDHP`g2f*rk3IJBWa>(N#h2ruJ4JI3*dnBpRfBaqcIv!~? zTo-?I`u*ItK~$kR^!M6mqi%}i{c@tLaZ~)llk!cd*ll(B@o?kSE3uAXBTWE0uBhWfn5h%!`7h(c48a#CFjXvt4-w zO@D`8oIW^T$-M^6yA#h01NiY7pJiIUnmg29Ow8bWW}SX7>%@FB>4LKjmVAyMyuBSm zZAOs!HS(={sTTJ{!5$2>gbcFM8~pZM4vk<=I{KGodIb_>d7w{scaiZ23EQzRXQ2`2 z9XTi)utO?zY^w*~pVdhyfhr_)iYIh$N-5=ws@Ef7dWpI806e3Wl=A z0}>6y>O^$|ao&6Gc;4HAiJO$y02yqICG8K!{rCIPDW_JnnD4a&U#3{&pU@6iU7xO+ zao3HykJT)Xh+6L^cD>A}49ulgE8A#NFx@dU_+>#?heX++`PcVOiy2ST*FOQ#iJrix zxS|K&+`k%>grWU~M$xVr#pWjOcW!*?yH37V{d=Be$+W`36yFN*dH=&e#ysLniOcGY z(I7~rp3G${i*!xfty+e>@+=xE%+}%Oq!lyyhFtrx)7Zce64SEI0a3VytgLP#&Uy7L z<2kSG6iGwe$0)dQKy`!n|3ht}hIuu02cZZq9~%d) zA}iwwO>d^2#8wG0N+`aRyFH7LYX54fm1~;z@2D3+H5cMLbo?v?M7@qf!her?-NC3g z?cbx`6ts6M1>EX&Lwj8AwHJ^NBqS$uBidy^4w6!Qnp#|^&(W^9zpLY^5*YOoZ|GxS z(rZne^p*&&i@Tg``>Y?PV{9F!RP%S$YZUG>8xaF&JmthBDyi4cZL2wb`Wk-KCU6rP ze-C=~;|z9%1AV46{71ik!j86vZ8eci;w`w&gd2VVdxlfS=O(sg3pSkXQC=?B1J~>0 z6kH^+Ay!IsgIo|2|GoxC7$>Mr1kbLOy@&X+r-O^fQu1FH43(M94KDY3;jl-06qBqmUsu{}*ut0Tu0q)3>BqrTPY_IvYF^a8aUq*ow_nL!hFvx}og&G04>^a-_jfz;$yAJjWnP=Ypx9=PAbD%Ow>2Kp&Cv|K?p$h@HFSNtzW6|Lz;N247=aya_iap?HFsAXj9o-F zrHVK6C#akyCuigapayeNWaM7vBs-!|Q(>By_S6Uj!kD$y_#!{NYU7=)z0VlFgg zT9??7_Qn;&z2L$)p_jR^ZtaFq@d!BaDFZ0XJp`vcF7=mG(t`gfhgWrh;p>OZcs!jb7`vC{kbnj4qe@J zYA+C*b0oND=`EwWxKo}nlG`MZ?HL%I*zhNb&v`TqHQpA*)YA&LST?APDTkPwR(ben zT+p^O3V3=!Tbbmae=ZiyvYMJs(;H1#l$m-b?Y>}paso6AigZ6GYUJa?yE^S1s6JYM zvB-WNm@6PN;Ffnat+?u^w{7fVTYrqO#5}v~a>ZVT8r-ZOe*O`*{dN_$Gxn#cZe6<0 zhDd8?$e5(`j5VjQmQzk(9t;@y0qNpP%)gBMlcjJIta(+4!UcSwI!p4@Uec(cogRF4 zoYnTzF6QQL36BCteG`>Ic8r@!FCN3* zV2DKHEL=}r02wtI;QBmAWb^k=gnz~d&cMK1GCiuQMA>`wVv1S&^?dG#`QIiS+kX0( zyy0K8>EQo?HcfVc^Lc|4W3XPhqqukN#^Mcs9P7!t^4K7;INu5JQmP4+i4Q091VBfaoRT}3RN-a)zW9H*AZ4&6k|k(_SK(6 z*t;`A3GdGPIZaqQoMNzridjf^Rp_Df;~?<+eObw4eHx*P6PPW68Qfz$qW|G(w4gD2 zCG=l@aO*A#A$1RLpSQdTiJdb4&ih}8j=aR5BqIN3+mvJsc9Ju6KdR?|u2|OYT;_>r z-~CZp?6f*op#T$ghm)ZVqjf;p&8p0$a`g1WS<&}Tlqyx>wD-NAH*#EUn(?<|ptCrd_(TxB%y>*Y?ih{{|n*bCYo}cp` z$AItyTi%GQf-V3E8^+f<$r$J7u<^Vx(vcuhXuNkAIX|lDqTp`cw%Z*o~%!|)WvLv0v-Zb@IgesOv$R4?>>~sTX5`~a?-NCvS(H7zbi7Y9>8O%2w@WXQl;`L4u0m^o z9IP8cpCep!?7-Rl0;+^dm9sX4;PPJ;I4ohp=Jlh5^;L(pj*mtQHs*EbO9sSx!JNgU z92=~LrG(VJn7aJMO_k^dJ8wP%K9w-4FVxp%_u00**ShK5I7S6CnrX2^lJ*=cJUKv3 z%Uj2zV;NsHl_d*E)fsZ zxWSVDc7q@O|G2?UipSbwsVi;7qhYROdE(+CYKwpAZ=+2#*TpkJd;`k>?``t zr}m!QyWF`#kf*hS3D15{{*wd@Lwton@P(2x_r-(;Q*7?uzvN)>tN94WkyF4L<>`V( z2D@#tI(V_SNiPm6rs>!4c&v?Yj*jXw3L_rwxMm36>^6jr%Q$6$I!nQz2n{^y!hiQ8_VNxl+j---e9;5Lg6e43@WDgx(HpY96 z8XVA$&%qi8dTO{Xt5G#?vw3vvheIRfNF}4tfj=LiC5CLp_yt=;UJXTV4k7QTwQBTj zHcrPfBlz**OsP%OYJB$v9R|Wz1>+Zn1=n5MU2wJCvy)L#QB}d;)tIVILLZ>>@veQ% zomkhYm8iT`BT_9HAu<^+3`qUaOi%`g`qq2d^S9YfPSkKM?dfWv zJ}NLfS_o9)A~mbr65_smN>aO!;QI82=$SU!2XoJ_>1DG#jYull5Bzk{_k2b!ShPb# zGso6b+pkbGV!=tPVU?YIr^y0!#OZK!Vra{fzUtNGw-S{0(dy*Uv$2-2%Wn!Xxy?Sj z>m20%iZ4tUgK~!@q__7T2wdPcomu0KoUu97kRnRmMxI)ymy-$m11cY+x=A~qPu~)m z;6O%!e-OFs^iI`Hbqz?4@&?VltDinkwz zFhmsbLsC)<5Iv`d2V&}6>dYtCY8g!IUrGpvCHp6q7<+{AK9X(w8F`M6>(sq95`vQ@ zE6nfH4g9C;71S6l$031E0qKd<&FYN%5uc|>TnyVkI6Q?EW!yOKR5ZG`TWkT#hp7TP zQoZwfnfAu>hb%^>Uh{o7``G!3m@u#Fk?&qgZ@4G_C_+VUVxzK=wW#T3(bn+p*Khcu znWmHY07~uIl}=&GJ1nX`sk3DrpRT4{4aJT_U;1k1KrSqmyb<}{zVMMhf!l*RIF5pB zLj~Mj=^8m!0vPL}1*Yj7lcS1XzmHXOHud2?ss9FBEzKtKgBDI*7ZXys4@Jqcdo7wo zFF3YQ-NvG(Nr5nXEpHt%@6R~()ar?my^L$xsWT0wOzr80UQO36Qg%!Pz3Q82JcLgO zKSQb?s>~+o^X^ilF5(n#n}NTV!}Fhf`y#hx70>rbAR-($d~2OGngv2@KVN? zh|a+rvaJ6_r*n{gqtiS6MK#a^gY4L=@t;&zxn~S+jXl=WO`_rGyLe}V7-X73!6-Zcj@&j zclv8&DcA+B2#2lnUVgb#$^gDHHtGI{@F0a2ZX9kUvaBkadlSO*9VMI@`FvzBhjRSDm70 z`iwaAq#9cAj^(*~I8$({44R0Zp%F<>^C<{mhf9|Y!8r?8MorKvR*H31-t&z?)>S2t z^UVt65v>-&P5qew8Q>vr?>)0Z!#Nt&Dm&wEoYVm_oQQNIQMMijS6!|U9-{h zaVi;7dlxehjuB>TVT zV0ORapLVzI*!8|jO*#7|gJP>k`Er`vt%SuRP1 z4+JSd?F`)7D9F+?PpV4zwJ304*(_wk`!wjOFZGJ{0XCl&9nISEL?NHOZ_}rpr z9|aEMZm<77OAJWMITNH24ew=M#1+#A4c?iE5CRV4l5Wph8>lgDPggGVCapsr3-p^! zY*ewA#3$^TG#oUhu#>l$TAoJ1DyLXpHxwwdW{?H1nEFm7UPSb8XIdfOcTB$s7eygpDTIi>SG}&z#CxcwL5J7t!|qOJMwZS z45vu@^ALk4^#xTF`Ojo+4xL{IDE4FE#|uc@Eb4KeIv{LM%;dp!X=>y<6hCCkax=F zi1-*GTt(Wzs7<4xXygR{-nEn)pNNnUXmuR@S;X_h6npv^b_X2(#)lW` z7K9Mg6N1U@Vwtw%d4j=x(o9S3H9e&-WWaH92q_yCpnE2oUJ(0KjhPsJu{;64S>Ax< zc!y?9bCUSA&TbIb8RhKy^T#;DaHJpy=ea*gY{U)zT4xWtRBm&xF)fY`o|+s=E6tlZ z^b~!V_YzeY_k5udK}-tXS6HoF^|#m^77R%tW-074?28%9*%$unAjymm{3HVFk`<)% zUFwku+5kbpMPisD3!4!{gTRc5t0Ct}?s*?4U!*amzA@;~5a)X768ZNs!CfEjld4m? zUMI@kIXob))H%_VF$Iy~8!EDBVA_OsjpJS811Sx`-R)f&&hpdL$*(%!;8LD~Baf)L z>U+nW-G>G=vIycSvv#rhCb#8$mm=Grh8QTHQe(U3%=Y>oZ=6VS9+-@byqk5*3=h0$ z>=fI5@}|QTekHaw9Vs^J`A?m_TBK}0r{Oot1_D?d_gjAP-J31Pdl<-`rOsaz_OlfD zQ6KG0LrSx#F^I~)jS$MJnMc&rSXUkqe486Vx)N$c@+`+X= zypMD_K)NZkwXA6;a4a1dQ6^HG2|?NkT+i7*%Fg)e*3)5s!h%1^^ww~O8*0XV{@L>3 zewLQBSIFM2an&idxh;iyGrZzV6r=Gd6f@%4??QEMPV5PDkUV*#-y%~URy}#YseM$Z zX)2!|w3S*XmotQt^Lc(vMv%hPOB`o7=>!wEnLYAzCy&ZNSt$;DJI-W^A~k;FK*ybU zZ#K(Vx>uH^xACiZcj+q`yBLmlf{2FU4U-C-_59R?5*se)9`A&B;|(nNj&PV_nH^4a zSvujN8R|^b?-<1cXAE<%!X?nO&2{lLw2Cf zM;Fzix2VPB)>Jk}NpF&lQ5jU0)1nSILy}z@ql+aZ9%#k4>f#YIF6TkoFw1zke_HMX zxt9vBHQm4mEz}Ro*~WNuHQc1tHJE!G{yLcdqpZNWPaiIxr2{+q7HqE${ zV05DCb3pRt%Up%yw+35J*;WgAUqOcbD}Ry%ZN-FoACV2ON#HpT9<%0}3Ii-&^rCL! zxXPLusXR%MC3&&j35J4#KJ+PDN{V|Y%XsB)bt>fT>1UjQokxYvB1h`ni%TbhXI;L} z|KYnIxL=fv_nArIWWdMk4+hTiv0QjPewcMSPFRE!^5_|xdk5(PyL&ISjw`WZ1{Rn| z!cD6m{3U7gev%b$%q!;L4HX0XRi)Y^i2)aej;=aZ?pJfEI;LuBS622!eT@#yli-aO zwK=!2=S+EVV zFT6}J??*}CiY9rOYLm6S;+he&7kfs|)=8&GYf>%0Mtm=AGQI-p!d{Y9oD|26_sJtD zR$(~`JOjQ+gjsrA;!x~E9^{l@e4{-iv0WKH@;!EeIC^B?`zh-O1aI&==(xC2x^2yH zgjD@j>y^js*SnOzWS3O~UHF;)aT;lP_Q%v|PCCTsLql_ZKJ~!j>uw!uT8fL{Ieg<3 z>(RG24%)?uj+Yz~HJ_g7rIGa=VhA|@ak!D&$boLz#s1=#RaP^BpbMvXc`xDGS2S>z zL8G^EI*yDSJR0{X`UCneSeV47!@m0-I&ncjv~zEJ@avDlLjDBMe97@=Po76&*2O_q z$#lEl^EhP?x6}RWel#s<)3T41ZvnNoO(!&BfTFpoqANH-pq5!$Rca$4z9fW>_j5J z5i(z({p7RW`wv@da}|)u_~A)nw$o35XD%#&!vVN$5}Z`95X*B)UJ^#Uv^Jew+z*N~ z={7!mziswfl{G{rxdt12A4@U1O##0{MVv!g%`N`QzCf{?>O*qOg)4@&K7KkWa}3baI7keVy~8bpdL%$D4uE0J%P^ZWsRP8sBc^I(1^eggi=3-`=O z<*4KIINZ|3baHHur~HH+sRTy;1UF#i`&lMT*bKPt9ACy#(imGOEJ??WKpi(xRCVrJ zl9$4cbgNDKJA!oltY$)fD;W;|ESP72HHmM77{~qF%8v(DKL5@Pu=4+x+C5FQ@)dsX zWJyvKzjrdFzbi|GR!v%FgEz~AyE;z4Z(~xG(c?rcUuy=U7zz#`G^K08q7r%VmeVBd z^8S!Cykidjya6sf2a5iY!;oR^_$ZD!S(HaNs7Z)|+($kz^xaRG)a>}m5!r~u4}y;P zp0hBO0F*yWZg`w^p45>OMn&Ao9N~O;H|r9mqA3eV82K2cD~uKThiWEA-l&8nDq*k= zvc5gkSw)=kACDnHUJ04?2D%G|{Ds-G0*Yi~gu7KzUl|6_uT!Dd$CifXwvOyUI1%Lo zzWuRq&-`3A4*ha}%-MQnBX7z6};6%2@5fo z?AC$2c$Tz_tu%@xh8^3^N2Iz=994ebbKZ=8Vyvlc)8a3OEgy}5kmX6#AqKcJDNf=8TV1fdTR8q|lyS(7@bm-KFM|htFxWpjbq)|ZMG%-$Ed?!*o+a@xn>g0_x4{wdT zrRO5@wAIs11Dhwz`#wZwzeoeq{<_2-@f2@woqBzYzeTrl}abXmwNS#^P<+v0w z=M-zU&>HtN_G5xsq`=81Dn3km)qOW>uz_k=iV-Apz0x0;=qs1Tzsc6LgG?^;1PDsH z!a-Mb*B2d@{d&)9ZCZ@hN+F?-porCPijXrdaHInf>WjqUOKvP#EPF92A2V5ewKe(Z z;OV_IwT)?Yct%MsM^`#%QkYBh^dJyDjF1x5ZfNa(!vXKNdg9}>2ci1MkJChYtq#zV zr@ZaCNbI?{N$C08qqc-eO<@g!9z6ekoTg6@o`IEu40X2oN@3?h0wmH068*MKZCl>S zGUAAN5UyCHZf_m96HDnPt`UWjFOS{V`e!WCHMbo<^G;~{2uzJ9}oTiS>$Y3 zM5R#k&ZcJ+Ya!ab-JeuD1V2i`vh!8_#PBedntBidzv#{25{`xZt66_%DOQg&)Qx2Q z1X4y+kIMdrm${vq)ZMoj&PAjZTx_78vJlp;TZyxIipUrncd!Yuiwx8Mz&PK2ywaL% zu$HJ!&p$~{JB|Oe;E&N_@gGz=PEn(rh$-q@-&LjifCi+EMJv)fnZ#z8slyOf-{Ea% z*`hIQN6f_8hsCao&&o5G+;M-AO&KFzezW25y{8Db_>eMYfwt3h*6Q^aSR||cSq>GQRot@Co zGiI%Vz3i^k5xwx?F|Bs{gXjiFxHk3(-QL=rsfNB;s{VlM;I1~AMT3vveR?N;o%9UZ zeaef$**f*JRM*Y#A;e!M77o-IHg@}$<}S3iLTNzKIdPI8xF`)Cul0$&X50R}Na9B$ zVB&!fw8egGqn43mspf20j5JVf?IW3h8E2PA=&9G3NLb-I?vX{Oj+EqJ(@`pTjXYQ! z#zMWWD2MeO^>eW;iG=$}T4~!8l@pL7`-pU$0qM&e<*t+@nR+upAA!0}b5-?*;!@iQ zP50TIm>GF3)Dd@5i)4AuVg0Lpc!BH{wfb|*cQ9)|b%zd*f*YGY3yRHd8L~9A)w7#F z;&UdoS&WlbwA_5A*LabjP=zB8*`74Im1hFN^YA})(udBUU=2OH1A5m58JU+xeYv~;0~d8wTMq; zsUmxA#{z0tC`gR7hveWCIv~C0K|#D1wWYW?@*Y3W_~J2+tYFsD*qO^##C48d@sHvj z+F3$vOjIV8U@|D)b6KT^Ra;B`iTkq{-vS(C^RC6k;rS0kp2LkBe~|k*JjcbR+P+#! z?m8DEZrhhNSo%FC2wg(g>&~{laA6>Pz+geGRi$gaYrkQ_dr+wsA7ekG4s475AN0)j zH)t!?+N7*Afn!OInyqfK10PrN=rwvoI??5SE}5uT#>d9_cb15u15tL^%t{gbM|l3f79QG6y`dKu4$Q;{~4u4H+5=d{9hf6r44marwrP}--}m`*U9 z@^5ob^*7fpFrc4rjH+&gXeIY{Dwwk;BzA1l(koH1WJh>XvQmG#HRFZZC?1bPJMzBi z6tIn1(jNV$8xcuwKZo!7fOwU54|Fx|UCRnD{{#GoL@ykp3-lqJbvV0XXTA{ z(mcgnh-3vpP`;=1m2+Ns*nG9Ig0jW?*Q$S#SbRhT+6#EuyBc?IcggkS^srY=x->Ra z0Obp<6-uzqB3$ctmQ!*qn`$ic7L`h6HaT61M3IiJ+dffwDr248{lDxic}=l3tsEEl zy+)k;`ezNA6_aRfpTi<=q>Z8!h#|DEB+m)e8)8_SC``t+a+eo1^iK0i_CEeZ0;r$$ zvC+=2n&9)Z!M8gb(;bJwLTPdmCeigN@o(Y>3?Ld@P-Nv{`g52iibG+Dz*V@sFaB`S zaU4FS*Hy*JDd%N%0egF8A3$~DSi|so0M(6ceY>DWM%MLXvNkq8MtN2BSqZ_OGXyE? zB1r)pEo<)8jMtSXclvhyhAk-|={E+p1y$r3y7qm@ta^6tin15q`ynkae{Tfs0RJs%1=pG``33N7 z%2{0Dr%yty-`srvm#ezbFatdS%i8@UwZCk(=S9~62hg~@A_vK;u?0D{Dgt zx2}{-F0%;c3~21wMH@5XwZr4iu@ z(SpyC#T1n{(I=TLm!jL%DZQ=mX8IMw)U{CU4P>`tz(8*yE)g}Ceo&^9;vO~L)D2bY zYqzh_Jel)=Y#FIzs-kJOrcormFVr=@_rr;B8>cifx#E8kkVWI>u;=S-3_u;K3fXgg5i7tY za6Mx4G$2}T9a#()VAPu~Dwni+7btN}?GCv?0$Q%Kpjjcp#Pyv`zfKx%rNCiqBGJ$yqvPrj=Nv>S zVm-mGmIJjX_oy1!0kSx({;s~X`n`iSxlUQB_t4SYLw4kK{CSY9Xd-&WDn|xsR5k9b za~vY^=>!As=k@X!c6+0tt!b)yZz+SFh52`4XU6X`Pe$TCjY~K0h1|;lPwvC&fw3Bq zrtrI2p$q+2vw|E|*K|=8tzL(qA6OMi9?p(^p0LOK?9%ShxxmB689=CmXeG@6TAvuL z0JMJp!T!~>y$Z0lOaTGO844Fe9~!nvR-RM&u>4@od6QI>L)AKX4~%?_a64h8ut0Mo z*EKy0% z(pE2Eay6c@d91eOtOH^&HmlGC#9oqthr=BNQ%#M}rn~!9WdGCgDJ{bv5MVzBTwV&$ z3%EMS^UT=&LW~M7rCx|0!?r62i@Zka5Zs5vg=%IMYXUdTJ|ek<-l>UbR_M z?DJ$ezD1);1L7%gvu=q-zp>k*Pdyf9kNT73oG^hef7zEOvwqOIL@pvmXy&q}SR5xw zB;D8ej@_0fD)3;q@7ziiB)35AU9jkzfIHh(nr?062;QJ|xFu&O@?J%UP~2zqt< zBweBrcOTMk;q({%SVg2C3@N}IT@maBiYV9&~7cR%+6bv~4>K2%!cWQo2>d8$S^N-|msXP5>BYNOv4@O+OvalEYBan>WR3e?)b?rHML zB!}f3;*OB!e=18Fo&h24F>-u3Ql*4TIKkp4Eg%Q;KuD=L{MJpWsI>Lk0aDQ z*C|iK0reTp0Q(R)&diL-GfDD|b>idMnC@M`J^VBrSwu`NRec%M0LhB-ZxH`Kh)|wo zdorSKPp6MVUMxUbGCKz^B)8D`yU+$Y1#|ASS8tPVykiQls-&ir3lBxx< zx$oY-siN{f5&&I1AJ)7Q{;RbVdQFLbMWd$B92omvBR$Ub@xv?qEKPLvjA(OGEx@WS zwUpoCzGccq7Lbr693tmCb!JckT?vf+!cV~1clj4irwyBK;kYqm9W4*l7`7g-qsy!E z)FEf4QaQ6re(~u)SygXwwZB+ZK+}B!G~L)}8X7FEc|pc{%$N9bUxDqVCRG=8g%en* z2v1H5C*OLVGh2A>FX?8fzxFKq;Cd+xwY}+31$aOsXDH>hvoQ1dFZ?lem2C!&;?@Qy zB6@t=C@RT-fq~`C$f>R`E?JJ}=wceGWPOP}nEXZ#b9|Yc7NF_I&2zd|porfSKtcP4H~s#T5>b^1-_zt@#ysb9OY^&oFt+y|k9|21h(USU|eM zAY^CdQ1n0PimShXeKXVBZbF$qC;kcSYqiNF0bpObsbXtVP3XN9v;DK!Fy8*MmAiWH zF@k~{$k5{*>%zj^L4muwqrC?LfW?Q@TI_g3^yx5uQ+!;{<)~TXD=DidMs5*T7ESdW zP3VNo1`K$`;2e&G?7i?36JC1(7xGP|E%7Ow0_}=~;bO5B$A7ddqSnLft$k)?O(9WI zhB8kxZ`2SsE%Fdj$Ca_6x?k~%wuSz=Ps3Vt()V4Qro}YOmsmZ&neX_603kDOCvTS8 z(6B!%1Uye%*vQqd9^1o|lQf)>2lWbQNFycAqN&tU=#OSKD1~Uf3qjt97_ZR5vuw6$ z3)RQMUP7T>12eaSX3#7W1`J;d$u^f4i#g zgE7EW-Tu{DYFEV>TW%Osseea)tyhJA*gG!5}yVW{4B7R}*!R!iEOnqS3N!9P4L=YuLjI zQq#1Sb*5NSUr+YslI-_{dzPoaEqlwDm1gxmLzF0Y`M91Te|epCQ(M2@6Afip;XA+L z>s7=&c2c6XIBa9*;B$%bcUV1mr>hLKDk}1K>(wPyC`IgmPCNwe`U}U3YFpv^GEa1V zulnR}s!#FmfLwQ=?3S-rd~*O5&MR*=N?otgnj?)go=;^a{j_F4Mpr&w7}Y2;yxpU& zh3!^#_dZoq{dZRh+^U`^Jc{GjqJd?%87MH-l$8x`ON;L@g|VD5xr-?Q!7@BXzOV{4 zv3{`~?N`)5Ke8lbGMxSTCD)uCS&ZdukAAYNj)~_4R?I!JU@-fRj!skU;o*5r!nmm) z5&{l>G!e6<7nhH2ln=h(+cL85+`tL6fRv@AvLPB`UGSE&jD-_yZ|-P`|1p-uuj7`ONZg=296lp1 z%>8>6DgIhTqQq77NcE*nIJAP?_yo!S!`EL2G`+rm{5Xn&f`}rWDhSfuBMe$Xno%Os zC0zq7x)cPYRTv?R9^D-R%IMxk2ncLa0|w{!8hXxopYQMU{r<84_-k-+UDxxz@5f`2 zvQY;8R))=aV_;F61~?L-bUrI1z5gkrX1Nw@=5hud6C%6EUPi@P+Fy4Bl((1tY$C+Wi8(aSq{&Tl^ z5VIN{eAAKj`lz@I?UgP5i8R`!blRQ{~EnzQ9IlIdy_#_F2@U8-iNg;02%bfP#Vp8Pz zb?zsH4ptI?39wdq4LWJjPOK=!_oX3CIkNTnqzbFZ7j6uo17!!uWo!4S-=zul8oZpo zx45&w!m|+T26{}=LNot~IzDJsa3DL|Uy3DY@NNyO@swvsM~d!ycQTj}_ZK6a!FEwx zecop2!#&%Y&K43}O2>FI8eH!tulgp6{MnQEk&11QH2V9Z3$LYcn|F>S_hpdL-x@#( zWVd!dpes{C$NF|NzEj;Bl+}+-@+mS??9ZiCX1@?{?RlWVj5YcK&fD7MPE#i%ILwdA z`DOCc!QG|o4fXyEmXQUG8Em<$ZnsfXzO_zMt~%utEnSh@p#Wv_i>l$lXTL%K9DjFQM6weD($nMnEcPRXi7GwnM&S;#$K8 z>6*}7#d~f1HL@Yhfd-Zra5>$Kw4eN@S*kx)^wEn%d+{Bcew;qbm7;V*RlbhFcelSC z2J?5Jxovo)jU?eQNg4We@4*dC2rbhlnuM|2vfEeJ-}-G0sA{~I)b_clcZ*rA*UW3F zn&_a*0iug3X+k=UN9)va?%%2nbB;le8iCv(_xw>s3?uEk>m)xxca5A<=~hWsdZ4D* zJUGh5cK0tLr%6ZQ*=p+O0+qz1cj1K3>oqzWnCxqR$cpt zpH=M``5y0qT!6%c!9jx77YrSHGoJFcc)vpF`LmtdR!LSbT!i8zUNZllJ&iT!}n+p6-za-!z$fFi~eAFq8g2vX?`7Olg; z-y4Blzf5~RWF`H@kkdvmmJx4`=a}T>I9U#0<;MlGXmjn%`}%rJcd7uzQuWY2@XVgd z&$KN|V!V;PzzO_p-z9HyR!lVYjt$TAORY0~9dF{Sjq3btBf7Buvhr@UqdK=7b6r||qR|*UFaSpKWBvw~E&}9vHTI*%idnBJ zU(eRd(~x2HQmknE^hCI~F9Oc+cD5U7rjC1@I9j%;=TKi7iNArq?(4Dw!|{FWmVcti z5fdcZ6EKJ!f}Gn&=Oiff;2$?{VWP$co@==on(7>>i)sDq(py} zk0Z^2W7Z-%RnpEbXlpDfvte%@gi(mBa-ka9F|Bu=?c|8gz|KSsM7LW=1C-tWR|||F z!2+{+vu50D4lEw)ql}oTFCk_A9aLn>htOw-k0*yQphpma$`#Lmg^H~wjsGWVD<$b? zaDN`qs6KJqXN$(m)HhTB+S;XEejIsgGw&#b3-D@c0A5YCR0##r7t+Hcm5tYtmUK?1 zH(N&VlAg{7*E&{vE52HD3cnp}m2R7s388b{{00J8-`^Wq8@bQUMZZ0$f-a?W8kfImE;+nYibt|egrJ6GM!-&4 zT;Cz!O7Mf{M{j15lxq2wUZ@dWRci&2<&-)$b0(UaZp_J?GF2sM%|yg#*JepM>#BP! zCufJY6n(IT8(d-KjAKe2t#sE;9msUvhF2qo4ZRg^G&AAS+rch5PQDKYvu>^vpO*nH z5p$+~!tr+cT3&gAB{zEs&G>TYED?5kD_&=6xapbSYFD$+gsyPOjANX&c?9A<(*379 z;5ne4VF~Qox3~yL7(E&bdv`navlX$Jia!Uw^$Bxg5BPDuf}P!hW_;)(s6*yx*(kkE zYG$+0GDx?|5IFxcUg+d3$5mp6tua88S* z1Y@ny+qH_j$(PiU&~C`3vsB%n@uEWXQ^a1RSdst8_|KcQa_7h!7<%&16VzEZCLor% z>uIm-$Bhsg%Ru(0(>r7Q?wdz|=gXdeLfO79(_y#P6S4#yC>g?I?w4h1Zi3H>hQ+pq zgIk&ka{Ia_xO{#} z(^G3q=gd{x4mdSAp2WL%nO3EDp^?i;>87&}pf_zpIeXh|`2wvA#b7@dw~~)679#US zyHK}3aXYYuq-0tQt}&hMP-^(=iy?ILI0c>Y$M_}@X|0pkw^~HQYilO+SAbA2W^d41 zcLXA0RhKqDRboL~`)gi_#piX~Dlx~)WCnI|`B0P_gQ=gox%{y9=rSVpgX)vBZZ${f zRtDPPHCf!@oxUk){IFSHe#h^sZR)Wxtx5lQUz{Ylp>8RQ&z7KPmNIA%kWV1?(-6kP=L zI*X|`ZldC6WTuZzbe+!|{gk`0ULqoYiqp)9i?LyuB zH^rI$YJD)bA%xbE@^pUncFwv6lJXJ`Z3-C6zBq`0t23=cm7ZG|n&%V6%_dw8s$JTL zV{%%9Z)3S41e3>q(X-B-I#y*EsgD5sQ)%nW~?&vCBRcvmg)c!yWeY-_gBE=juU9$NdFUx!ZA-94DBfo4%T zW1ugYBKlTD8|xyf1jzg-aYo68v4EB0eR>+lnW=2QN7uphjF>;Uwd&W8CBzcV=%G>o zPQHN%j+;&fU0#f*TkunPJbpWI0P*x~DyXKHi^wiJ|B<2H8!-ij^|X?FE2J0Q#Pj=H zPTrZ;zVTAFOcC^ECH~tRFKoU+G|;@-s#RR<0XaDa)ZAsYUO__%4yTwq+t%01lzF-!;2Ggbi-;1 z>?Qc^pA!D*saG#;w&4MARUURfwiFj)c5Tj_XTIlmj{a7}w2XR2&a-n`FvhwL9_BmB z!C$6GE`5_qkvL`Vbv!B#zHnwahOU;!*ii$^`UVwhSw z#rj$3dTRzYhVrp4j!6#-v0xf4-tD#1l=pvB$r`0aw8|pC9T43X%!vi~`IelqHX&kL zA2s%k!4F<%^^3;8-_g=tNsI!7W%zp5F!IY+XlYZL?$BVk1_zk9T%815yo2camxLYU zx#PRvuGLFR%H$69QJYp*)?U~o&C{aPC2caoCdZ=v;9&^(oH#&&y~r)zF8Nj4BlHWb zB)@pwf)C-g=^`+{vB~XD%yWH*xXDyLl^CBkg#|DTQ6V+fjiab{rJ(O^3KA&44Gm+0 zt!x7;V?z%l>V?CT`$i3})9a-Jr5an!0c_VGOsLEokE#>RGCKyZB?!%tWo2%p{`MNc zfqT%v%h*WeZ9KU+3|&fvYtaWPs!2g#o8O0B^WPM`qVc+5HbxIM+MvFA%>H`x>5r(P zVl#Vx&ymd#luG$8W+!l_@pp%27dNcQc8x@hse){lffBXRI9qxs^<%}0|NC*osh^0o zT%WS+i!EzLXJuYGg(sQHUrwH8qjA`=xZQYJVAYVBnK*ueCMhtG+p<#b3bfDqheuU5 z$UBhVu=t1)RTB@z`nG3M8fPfy$?0zO`4ExNk{hxO)om!Su1~O$0pTG9eO93CgIjUt z(8!CC#9ReLFXV*d#wH+7CmO|zA=2OWSeVqS%WD`jM|Jt^&-p7g6$ohi@P-b5?6P&7 z7sV83Q#gy6vhZ9Iyk$ABMapl&ySs^LI0>HqNqOFSJ`kOiCJ)5}oU zXaw`q)uw~4Bz`t_7$@=ebaNx?{y_Tj#l=TwfY*bXjq;M)21N!%^rKN>vx82y6ZOS= z6GopcY=FP3GbrChcz4bjl&^(T{_*BxCk0voals2Fem?gY+nir~B!AsI6asF*26i9O zMNlmq^J>28V}GM;C>--vW|U5z4|DnnQ=^0ssA3{6nj{@ueb0bxSa#{*p!%fNwl3>M zl~74w>5CWY29IRQoFQJLb>_F$w(UL}Ev)F_e9hP0XNYh;|5^)c!B^d-xd?EG@D2eFEO$-0w6KtYIIXN z8RfEId9#yMw(~1A@2@Oaobu-*@*o#ckf# zrv>L$_uDryf3+F2B>#_ZqM6=rWvAm5@J)#I{`O69pZO+&nzuK=7UzIFEc|%((lzjY zWS*m?ede9=1izX-;>}wTb8ks5bxZe!fNKD{@;n1(zo=l=ks`^!0$ z+ymEN@ZKNj9G3vj9lYkuO#jqLiY%)j%0d<`wfR<5576mgatR=0_J?H%XGU*pHy5(* zTGBWo8llHAPp5t77YeI^G8rS3NqooG@oJy{VOP#8j5X@HxX7I(-hM!@bTYs2ULRcA zRVc1~e#+1H;P(6^BwcaP9zxJfz-I#g)=kjdJBVO$l7l=zIyBQcFb0jk&X;enXED_g z;!3lg?-rknc|jfDlT`<$VKtF9KZTBEDj6mL6{2P_DClVfL(C69EN%H3kL>BBP*KOY zR(_l`z5KDcPUP!)YTI-U!zKbMid^lSYGnH2NWtvRcOd-U>UPYFV0hi4C8MA9Bh1yD zJTnI!&5-9)YLgz>>g_lul;G7#KSGVjC}kDpnN3!O*wu!bgTAdlt|QGKj2|xhV)%Z> zS1p+BWu}&+lyQ4{43z6j1ze+O0aafeZG>=%iIwe60lwyIRdd1JiUJ?&civv=*xsn~ z$u{U6c3y=$;10TLQcmw``s&vFN*|<>SZ-g*$CO5Z#Pe`R~nsG?HQ@^Zehe(goM)qUr5Roqw@1MwWnNXgua}h5H|jnA`-^; zW5()5QOn>nKwsvvTS80M`cvEkRKt(?D=nBM4U&PdleL?!q$8EV^nUBB9a%t)RN<1( z`1(_S^YsIc$4g%{Dk1NJF2WqZE0J~u^V z6DtaY`#pO8={LV}CWh^|lI7z6g+QjSw~N2?4dhE(C&rT)E)abiqm2e!NH@+fecA

3jm=pl8|Y;DEgg4Xx#ri1kQ~>RbwhDYX3lJ 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 TQtfPp4RpVE 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∓dS+-*+}P9s8_G(%^26IztcvUa1Z0m&pynhM5< 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

~hW_{Ij+8ClOzb3%-2 z$6cSL*PflQ8{u*Tr!%<1?t9~sZq*FWy|Mg7<~X@-3hG|)VXpe=ZvG^HmYZz?`nZRE zQr!4}Dv^!(s-!wqj{0>ak5#K{2J8`C97~q4-Zb3}Os!k}7FaPrV|7oN4~GsW`V~MGjfOpJDys)P_UiIqnL9m$t~CnIyujq5ne4Ek zK}5Y-)pL{Wx#qXynyFb$IbOtM+04aI=-~FJ+t#t11_ui4Vdc%&e0o&$pHk|oB*bG8 zCawFHxdAo&soR||DP2o1dX4F-eA|oFeJXe?RU&h5RV2u2MF|h3q&2MX!DFHiI{c>m zr7F8^zoJU!B9*yy>%*)p^md?K{Z2=$vR5O~Z!3@Z2&>030*(5%|7D!IM4`p2%Us4S zk%R6XZweQvq@c#U;nEQE%bk;n5reu zMbxU+e+sCTtJ_(}PEq=-`3IU?g+|o}!bD;CCbqV0cq(G|No7m#DMDy-qSu^hy(r+R z{8ox=y0L*=>Ez44dk0ecqTgjYUshj;egpf`iBYT+XI;>BGpe&iK%4K4a-nioN)jvz zFy|!l$@{{ZIGzHKx!FBaX#X^}^^HNhl*09iuc7khB_b1BD|%XBgUA|7GezH#@`Y$5 zx1FG{xKFWtzG*#g_t5 iaxsO(6NCF8zt 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 N|NMXc9uWT=|6jmwVA}uy diff --git a/examples/hyper/log.10Oct18.hyper.global.g++.4 b/examples/hyper/log.10Oct18.hyper.global.g++.4 deleted file mode 100644 index de08541583..0000000000 --- a/examples/hyper/log.10Oct18.hyper.global.g++.4 +++ /dev/null @@ -1,1243 +0,0 @@ -LAMMPS (10 Oct 2018) -# 3d EAM surface for global HD - -# nearest neighbor distance = a * sqrt(2)/2 = 2.77 Angs for Pt with a = 3.92 -# hop event on (100) surface is same distance -# exchange event is 2 atoms moving same distance - -variable Tequil index 500.0 -variable Vmax index 0.5 -variable qfactor index 0.3 -variable cutbond index 3.2 -variable cutevent index 1.1 -variable steps index 100000 -variable nevent index 1000 -variable zoom index 1.8 - -units metal -atom_style atomic -atom_modify map array -boundary p p p - -lattice fcc 3.92 -Lattice spacing in x,y,z = 3.92 3.92 3.92 -region box block 0 6 0 6 0 4 -create_box 3 box -Created orthogonal box = (0 0 0) to (23.52 23.52 15.68) - 2 by 2 by 1 MPI processor grid -create_atoms 1 box -Created 576 atoms - Time spent = 0.000782013 secs - -mass * 1.0 - -change_box all z final -0.1 5.0 boundary p p f - orthogonal box = (0 0 -0.392) to (23.52 23.52 19.6) -create_atoms 2 single 3.5 3.5 4 -Created 1 atoms - Time spent = 4.69685e-05 secs - -# define frozen substrate and mobile atoms - -group adatom type 2 -1 atoms in group adatom -region base block INF INF INF INF 0 1.8 -set region base type 3 - 288 settings made for type -group base type 3 -288 atoms in group base -group mobile type 1 2 -289 atoms in group mobile - -# pair style - -pair_style eam/alloy -pair_coeff * * ptvoterlammps.eam Pt Pt Pt - -neighbor 0.5 bin -neigh_modify every 1 delay 5 check yes - -fix 1 mobile nve -fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 858872873 zero yes -fix 2 mobile langevin 500.0 ${Tequil} 1.0 858872873 zero yes -fix 2 mobile langevin 500.0 500.0 1.0 858872873 zero yes - -timestep 0.005 - -compute tmobile mobile temp - -thermo 100 -thermo_modify temp tmobile -WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:488) - -# thermal equilibration - -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.07583 - ghost atom cutoff = 6.07583 - binsize = 3.03792, bins = 8 8 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair eam/alloy, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.327 | 3.327 | 3.327 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -3213.9136 0 -3213.9136 -51843.125 - 100 211.06271 -3209.3285 0 -3201.4713 -27323.825 - 200 320.80707 -3205.3715 0 -3193.4289 -39370.402 - 300 393.66139 -3202.607 0 -3187.9522 -32163.403 - 400 401.11987 -3200.2795 0 -3185.347 -35961.543 - 500 472.27798 -3200.7267 0 -3183.1452 -33044.974 - 600 485.16253 -3199.818 0 -3181.7569 -34242.615 - 700 464.85129 -3199.865 0 -3182.56 -35327.179 - 800 518.91236 -3199.4098 0 -3180.0923 -32088.2 - 900 502.76061 -3199.3972 0 -3180.681 -36944.263 - 1000 522.64479 -3200.0627 0 -3180.6063 -32801.856 -Loop time of 0.333434 on 4 procs for 1000 steps with 577 atoms - -Performance: 1295.607 ns/day, 0.019 hours/ns, 2999.091 timesteps/s -99.5% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.25639 | 0.2636 | 0.2708 | 1.0 | 79.06 -Neigh | 0.017381 | 0.017991 | 0.018988 | 0.4 | 5.40 -Comm | 0.026086 | 0.034315 | 0.042505 | 3.2 | 10.29 -Output | 0.00022078 | 0.00023323 | 0.00026107 | 0.0 | 0.07 -Modify | 0.013295 | 0.013709 | 0.014107 | 0.2 | 4.11 -Other | | 0.003584 | | | 1.07 - -Nlocal: 144.25 ave 149 max 139 min -Histogram: 1 0 0 1 0 0 0 0 1 1 -Nghost: 530.5 ave 536 max 526 min -Histogram: 1 1 0 0 0 0 0 1 0 1 -Neighs: 3471.75 ave 3626 max 3292 min -Histogram: 1 0 0 0 1 0 1 0 0 1 - -Total # of neighbors = 13887 -Ave neighs/atom = 24.0676 -Neighbor list builds = 88 -Dangerous builds = 0 -reset_timestep 0 - -# pin base so will not move during quenches - -fix freeze base setforce 0.0 0.0 0.0 - -# event detection - -compute event all event/displace ${cutevent} -compute event all event/displace 1.1 - -# hyper/global - -fix HG mobile hyper/global ${cutbond} ${qfactor} ${Vmax} ${Tequil} -fix HG mobile hyper/global 3.2 ${qfactor} ${Vmax} ${Tequil} -fix HG mobile hyper/global 3.2 0.3 ${Vmax} ${Tequil} -fix HG mobile hyper/global 3.2 0.3 0.5 ${Tequil} -fix HG mobile hyper/global 3.2 0.3 0.5 500.0 - -# thermo output - -thermo_style custom step temp pe f_HG f_HG[*] -WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:705) - -thermo_modify lost ignore -thermo_modify temp tmobile -WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:488) - -thermo ${nevent} -thermo 1000 - -# dump output options - -region substrate block INF INF INF INF 1.8 3.8 -region adatoms block INF INF INF INF 3.8 INF -variable acolor atom rmask(base)+2*rmask(substrate)+3*rmask(adatoms) - -dump 1 all image 1000000 global.*.jpg v_acolor type zoom ${zoom} adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 -dump 1 all image 1000000 global.*.jpg v_acolor type zoom 1.8 adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 -dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green - -# run - -hyper ${steps} ${nevent} HG event min 1.0e-6 1.0e-6 100 100 dump 1 -hyper 100000 ${nevent} HG event min 1.0e-6 1.0e-6 100 100 dump 1 -hyper 100000 1000 HG event min 1.0e-6 1.0e-6 100 100 dump 1 -WARNING: Resetting reneighboring criteria during hyper (../hyper.cpp:133) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.07583 - ghost atom cutoff = 6.07583 - binsize = 3.03792, bins = 8 8 7 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair eam/alloy, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix hyper/global, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 6.015 | 6.015 | 6.015 Mbytes -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 0 522.64479 -3200.0627 0 0 0 0 0 0 0 0 0 0 0 0 - 13 522.64479 -3217.9151 0 0 0 0 0 0 0 0 0 0 0 0 -Loop time of 0.0106812 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 0 522.64479 -3200.0627 0.39402008 9365.7631 0.13811729 429 426 6.0069324 0 0.36151295 3.1652084 0 0 0 - 1000 512.35059 -3198.5556 0.32845525 2044.9347 0.17572153 257 259 6.0069324 0.137 0.77425934 3.8913771 5302.7599 0 0 -Loop time of 0.314234 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 1000 512.35059 -3198.5556 0.32845525 2044.9347 0.17572153 257 259 6.0069324 0.137 0.77425934 3.8913771 5302.7599 0 0 - 1014 512.35059 -3217.9161 0.32845525 2044.9347 0.17572153 257 259 6.0069324 0.13510848 0.77425934 3.8913771 5302.7599 0 0 -Loop time of 0.0071606 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 1000 512.35059 -3198.5556 0.32845525 2044.9347 0.17572153 257 259 6.0069324 0.137 0.77425934 3.8913771 5302.7599 0 0 - 2000 502.60215 -3197.7892 0.01351505 1.3684394 0.29591771 116 127 6.0069324 0.103 0.77425934 3.8913771 11603.458 0 0 -Loop time of 0.33185 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 2000 502.60215 -3197.7892 0.01351505 1.3684394 0.29591771 116 127 6.0069324 0.103 0.77425934 3.8913771 11603.458 0 0 - 2015 502.60215 -3217.9155 0.01351505 1.3684394 0.29591771 116 127 6.0069324 0.10223325 0.77425934 3.8913771 11603.458 0 0 -Loop time of 0.00889879 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 2000 502.60215 -3197.7892 0.01351505 1.3684394 0.29591771 116 127 6.0069324 0.103 0.77425934 3.8913771 11603.458 0 0 - 3000 481.01481 -3199.1324 0 1 1.0289113 542 544 6.0069324 0.212 2.8308749 5.5814852 12488.613 0 0 -Loop time of 0.334598 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 3000 481.01481 -3199.1324 0 1 1.0289113 542 544 6.0069324 0.212 2.8308749 5.5814852 12488.613 0 0 - 3014 481.01481 -3217.916 0 1 1.0289113 542 544 6.0069324 0.21101526 2.8308749 5.5814852 12488.613 0 0 -Loop time of 0.0103227 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 3000 481.01481 -3199.1324 0.25134819 341.56656 0.21155927 277 539 6.0069324 0.212 2.8308749 5.5814852 12488.613 1 2 - 4000 474.51721 -3197.9082 0.26384891 456.53799 0.20617274 361 83 6.0069324 0.18325 2.8308749 5.5814852 22776.39 1 2 -Loop time of 0.302547 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 4000 474.51721 -3197.9082 0.26384891 456.53799 0.20617274 361 83 6.0069324 0.18325 2.8308749 5.5814852 22776.39 1 2 - 4014 474.51721 -3217.9172 0.26384891 456.53799 0.20617274 361 83 6.0069324 0.18261086 2.8308749 5.5814852 22776.39 1 2 -Loop time of 0.00868511 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 4000 474.51721 -3197.9082 0.26384891 456.53799 0.20617274 361 83 6.0069324 0.18325 2.8308749 5.5814852 22776.39 1 2 - 5000 478.08772 -3199.6792 0.043886568 2.7692147 0.2865317 275 577 6.0069324 0.1586 2.8308749 5.5814852 35085.309 1 2 -Loop time of 0.300419 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 5000 478.08772 -3199.6792 0.043886568 2.7692147 0.2865317 275 577 6.0069324 0.1586 2.8308749 5.5814852 35085.309 1 2 - 5015 478.08772 -3217.9131 0.043886568 2.7692147 0.2865317 275 577 6.0069324 0.15812562 2.8308749 5.5814852 35085.309 1 2 -Loop time of 0.00705171 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 5000 478.08772 -3199.6792 0.043886568 2.7692147 0.2865317 275 577 6.0069324 0.1586 2.8308749 5.5814852 35085.309 1 2 - 6000 458.77612 -3197.8588 0.27710376 620.98321 0.20030308 511 546 6.0069324 0.171 2.8308749 5.5814852 38747.284 1 2 -Loop time of 0.287999 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 6000 458.77612 -3197.8588 0.27710376 620.98321 0.20030308 511 546 6.0069324 0.171 2.8308749 5.5814852 38747.284 1 2 - 6015 458.77612 -3217.9165 0.27710376 620.98321 0.20030308 511 546 6.0069324 0.17057357 2.8308749 5.5814852 38747.284 1 2 -Loop time of 0.00888014 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 6000 458.77612 -3197.8588 0.27710376 620.98321 0.20030308 511 546 6.0069324 0.171 2.8308749 5.5814852 38747.284 1 2 - 7000 476.88452 -3198.3269 0.0828164 6.8352063 0.27403111 264 275 6.0069324 0.17714286 2.8308749 5.5814852 45612.389 1 2 -Loop time of 0.29168 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 7000 476.88452 -3198.3269 0.0828164 6.8352063 0.27403111 264 275 6.0069324 0.17714286 2.8308749 5.5814852 45612.389 1 2 - 7015 476.88452 -3217.9146 0.0828164 6.8352063 0.27403111 264 275 6.0069324 0.17676408 2.8308749 5.5814852 45612.389 1 2 -Loop time of 0.00871038 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 7000 476.88452 -3198.3269 0.0828164 6.8352063 0.27403111 264 275 6.0069324 0.17714286 2.8308749 5.5814852 45612.389 1 2 - 8000 521.60584 -3199.0138 0.22715857 194.82964 0.22161105 419 124 6.0069324 0.191875 2.8308749 5.5814852 46748.053 1 2 -Loop time of 0.284021 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 8000 521.60584 -3199.0138 0.22715857 194.82964 0.22161105 419 124 6.0069324 0.191875 2.8308749 5.5814852 46748.053 1 2 - 8015 521.60584 -3217.9163 0.22715857 194.82964 0.22161105 419 124 6.0069324 0.19151591 2.8308749 5.5814852 46748.053 1 2 -Loop time of 0.00697637 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 8000 521.60584 -3199.0138 0.22715857 194.82964 0.22161105 419 124 6.0069324 0.191875 2.8308749 5.5814852 46748.053 1 2 - 9000 496.87475 -3198.4928 0.13677449 23.912479 0.25569629 264 275 6.0069324 0.18388889 2.8308749 5.5814852 49596.596 1 2 -Loop time of 0.238759 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 9000 496.87475 -3198.4928 0.13677449 23.912479 0.25569629 264 275 6.0069324 0.18388889 2.8308749 5.5814852 49596.596 1 2 - 9014 496.87475 -3217.9149 0.13677449 23.912479 0.25569629 264 275 6.0069324 0.18360328 2.8308749 5.5814852 49596.596 1 2 -Loop time of 0.00677681 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 9000 496.87475 -3198.4928 0.13677449 23.912479 0.25569629 264 275 6.0069324 0.18388889 2.8308749 5.5814852 49596.596 1 2 - 10000 478.6826 -3199.6673 0.37406677 5894.1727 0.1505589 127 132 6.0069324 0.1982 2.8308749 5.5814852 54170.476 1 2 -Loop time of 0.23881 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 10000 478.6826 -3199.6673 0.37406677 5894.1727 0.1505589 127 132 6.0069324 0.1982 2.8308749 5.5814852 54170.476 1 2 - 10013 478.6826 -3217.9144 0.37406677 5894.1727 0.1505589 127 132 6.0069324 0.19794267 2.8308749 5.5814852 54170.476 1 2 -Loop time of 0.00627023 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 10000 478.6826 -3199.6673 0.37406677 5894.1727 0.1505589 127 132 6.0069324 0.1982 2.8308749 5.5814852 54170.476 1 2 - 11000 518.40222 -3199.3332 0.34753231 3183.9595 0.16566286 383 418 6.0069324 0.18809091 2.8308749 5.5814852 58304.709 1 2 -Loop time of 0.238288 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 11000 518.40222 -3199.3332 0.34753231 3183.9595 0.16566286 383 418 6.0069324 0.18809091 2.8308749 5.5814852 58304.709 1 2 - 11013 518.40222 -3217.915 0.34753231 3183.9595 0.16566286 383 418 6.0069324 0.18786888 2.8308749 5.5814852 58304.709 1 2 -Loop time of 0.00599569 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 11000 518.40222 -3199.3332 0.34753231 3183.9595 0.16566286 383 418 6.0069324 0.18809091 2.8308749 5.5814852 58304.709 1 2 - 12000 552.07348 -3197.6675 0.0063435549 1.1586177 0.29809086 144 143 6.0069324 0.18016667 2.8308749 5.5814852 66990.451 1 2 -Loop time of 0.23842 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 12000 552.07348 -3197.6675 0.0063435549 1.1586177 0.29809086 144 143 6.0069324 0.18016667 2.8308749 5.5814852 66990.451 1 2 - 12013 552.07348 -3217.9165 0.0063435549 1.1586177 0.29809086 144 143 6.0069324 0.1799717 2.8308749 5.5814852 66990.451 1 2 -Loop time of 0.00602174 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 12000 552.07348 -3197.6675 0.0063435549 1.1586177 0.29809086 144 143 6.0069324 0.18016667 2.8308749 5.5814852 66990.451 1 2 - 13000 471.13412 -3198.1314 0.30918747 1307.5821 0.18532743 116 123 6.0069324 0.17338462 2.8308749 5.5814852 74345.114 1 2 -Loop time of 0.237671 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 13000 471.13412 -3198.1314 0.30918747 1307.5821 0.18532743 116 123 6.0069324 0.17338462 2.8308749 5.5814852 74345.114 1 2 - 13014 471.13412 -3217.9158 0.30918747 1307.5821 0.18532743 116 123 6.0069324 0.17319809 2.8308749 5.5814852 74345.114 1 2 -Loop time of 0.00647223 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 13000 471.13412 -3198.1314 0.30918747 1307.5821 0.18532743 116 123 6.0069324 0.17338462 2.8308749 5.5814852 74345.114 1 2 - 14000 470.81692 -3198.8871 0.10763953 12.160669 0.26575343 275 577 6.0069324 0.18235714 2.8308749 5.5814852 76252.748 1 2 -Loop time of 0.238789 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 14000 470.81692 -3198.8871 0.10763953 12.160669 0.26575343 275 577 6.0069324 0.18235714 2.8308749 5.5814852 76252.748 1 2 - 14015 470.81692 -3217.9147 0.10763953 12.160669 0.26575343 275 577 6.0069324 0.18216197 2.8308749 5.5814852 76252.748 1 2 -Loop time of 0.00651169 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 14000 470.81692 -3198.8871 0.10763953 12.160669 0.26575343 275 577 6.0069324 0.18235714 2.8308749 5.5814852 76252.748 1 2 - 15000 473.2435 -3199.0907 0.20712247 122.37713 0.22960391 569 570 6.0069324 0.18553333 2.8308749 5.5814852 81659.641 1 2 -Loop time of 0.23755 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 15000 473.2435 -3199.0907 0.20712247 122.37713 0.22960391 569 570 6.0069324 0.18553333 2.8308749 5.5814852 81659.641 1 2 - 15014 473.2435 -3217.9161 0.20712247 122.37713 0.22960391 569 570 6.0069324 0.18536033 2.8308749 5.5814852 81659.641 1 2 -Loop time of 0.00644851 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 15000 473.2435 -3199.0907 0.20712247 122.37713 0.22960391 569 570 6.0069324 0.18553333 2.8308749 5.5814852 81659.641 1 2 - 16000 504.33627 -3199.1713 0.036898146 2.3545967 0.28871843 264 275 6.0069324 0.199875 2.8308749 5.5814852 82224.366 1 2 -Loop time of 0.240195 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 16000 504.33627 -3199.1713 0.036898146 2.3545967 0.28871843 264 275 6.0069324 0.199875 2.8308749 5.5814852 82224.366 1 2 - 16015 504.33627 -3217.9137 0.036898146 2.3545967 0.28871843 264 275 6.0069324 0.19968779 2.8308749 5.5814852 82224.366 1 2 -Loop time of 0.00684911 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 16000 504.33627 -3199.1713 0.036898146 2.3545967 0.28871843 264 275 6.0069324 0.199875 2.8308749 5.5814852 82224.366 1 2 - 17000 497.60607 -3198.212 0.0067178767 1.1687272 0.29797782 264 275 6.0069324 0.217 2.8308749 5.5814852 82242.51 1 2 -Loop time of 0.240567 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 17000 497.60607 -3198.212 0.0067178767 1.1687272 0.29797782 264 275 6.0069324 0.217 2.8308749 5.5814852 82242.51 1 2 - 17016 497.60607 -3217.9161 0.0067178767 1.1687272 0.29797782 264 275 6.0069324 0.21679596 2.8308749 5.5814852 82242.51 1 2 -Loop time of 0.00708336 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 17000 497.60607 -3198.212 0.0067178767 1.1687272 0.29797782 264 275 6.0069324 0.217 2.8308749 5.5814852 82242.51 1 2 - 18000 523.92168 -3199.831 0.21046671 132.25396 0.22828927 264 275 6.0069324 0.22444444 2.8308749 5.5814852 82304.143 1 2 -Loop time of 0.240636 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 18000 523.92168 -3199.831 0.21046671 132.25396 0.22828927 264 275 6.0069324 0.22444444 2.8308749 5.5814852 82304.143 1 2 - 18014 523.92168 -3217.9153 0.21046671 132.25396 0.22828927 264 275 6.0069324 0.22427001 2.8308749 5.5814852 82304.143 1 2 -Loop time of 0.00646216 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 18000 523.92168 -3199.831 0.21046671 132.25396 0.22828927 264 275 6.0069324 0.22444444 2.8308749 5.5814852 82304.143 1 2 - 19000 538.76557 -3198.7203 0.036295998 2.3219194 0.28890608 397 400 6.0069324 0.228 2.8308749 5.5814852 83487.232 1 2 -Loop time of 0.239259 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 19000 538.76557 -3198.7203 0.036295998 2.3219194 0.28890608 397 400 6.0069324 0.228 2.8308749 5.5814852 83487.232 1 2 - 19014 538.76557 -3217.9141 0.036295998 2.3219194 0.28890608 397 400 6.0069324 0.22783212 2.8308749 5.5814852 83487.232 1 2 -Loop time of 0.0061307 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 19000 538.76557 -3198.7203 0.036295998 2.3219194 0.28890608 397 400 6.0069324 0.228 2.8308749 5.5814852 83487.232 1 2 - 20000 483.9598 -3198.1166 0.13750177 24.319538 0.25544017 400 131 6.0069324 0.2187 2.8308749 5.5814852 91177.618 1 2 -Loop time of 0.241751 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 20000 483.9598 -3198.1166 0.13750177 24.319538 0.25544017 400 131 6.0069324 0.2187 2.8308749 5.5814852 91177.618 1 2 - 20014 483.9598 -3217.9137 0.13750177 24.319538 0.25544017 400 131 6.0069324 0.21854702 2.8308749 5.5814852 91177.618 1 2 -Loop time of 0.00646776 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 20000 483.9598 -3198.1166 0.13750177 24.319538 0.25544017 400 131 6.0069324 0.2187 2.8308749 5.5814852 91177.618 1 2 - 21000 518.44073 -3199.7932 0.30241436 1117.3756 0.18858795 553 577 6.0069324 0.21271429 2.8308749 5.5814852 99740.17 1 2 -Loop time of 0.239403 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 21000 518.44073 -3199.7932 0.30241436 1117.3756 0.18858795 553 577 6.0069324 0.21271429 2.8308749 5.5814852 99740.17 1 2 - 21014 518.44073 -3217.9126 0.30241436 1117.3756 0.18858795 553 577 6.0069324 0.21257257 2.8308749 5.5814852 99740.17 1 2 -Loop time of 0.00643963 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 21000 518.44073 -3199.7932 0.30241436 1117.3756 0.18858795 553 577 6.0069324 0.21271429 2.8308749 5.5814852 99740.17 1 2 - 22000 518.95823 -3198.6693 0 1 0.4887755 262 263 6.0069324 0.22327273 2.8308749 5.5814852 103304.87 1 2 -Loop time of 0.241227 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 22000 518.95823 -3198.6693 0 1 0.4887755 262 263 6.0069324 0.22327273 2.8308749 5.5814852 103304.87 1 2 - 22033 518.95823 -3217.916 0 1 0.4887755 262 263 6.0069324 0.22293832 2.8308749 5.5814852 103304.87 1 2 -Loop time of 0.015579 on 4 procs for 33 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 22000 518.95823 -3198.6693 0 1 0.4887755 262 263 6.0069324 0.22327273 2.8308749 5.5814852 103304.87 1 2 - 23000 534.01428 -3197.6551 0.10264812 10.830446 0.26743848 136 431 6.0069324 0.22469565 2.8308749 5.5814852 108159.84 1 2 -Loop time of 0.240257 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 23000 534.01428 -3197.6551 0.10264812 10.830446 0.26743848 136 431 6.0069324 0.22469565 2.8308749 5.5814852 108159.84 1 2 - 23015 534.01428 -3217.9147 0.10264812 10.830446 0.26743848 136 431 6.0069324 0.22454921 2.8308749 5.5814852 108159.84 1 2 -Loop time of 0.0067718 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 23000 534.01428 -3197.6551 0.10264812 10.830446 0.26743848 136 431 6.0069324 0.22469565 2.8308749 5.5814852 108159.84 1 2 - 24000 502.61915 -3198.9796 0.22019457 165.75289 0.22442143 132 143 6.0069324 0.21883333 2.8308749 5.5814852 115124.63 1 2 -Loop time of 0.241014 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 24000 502.61915 -3198.9796 0.22019457 165.75289 0.22442143 132 143 6.0069324 0.21883333 2.8308749 5.5814852 115124.63 1 2 - 24014 502.61915 -3217.9149 0.22019457 165.75289 0.22442143 132 143 6.0069324 0.21870575 2.8308749 5.5814852 115124.63 1 2 -Loop time of 0.006706 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 24000 502.61915 -3198.9796 0.22019457 165.75289 0.22442143 132 143 6.0069324 0.21883333 2.8308749 5.5814852 115124.63 1 2 - 25000 510.27664 -3200.7431 0.34609419 3079.4414 0.16644232 120 119 6.0069324 0.21512 2.8308749 5.5814852 118042.99 1 2 -Loop time of 0.239452 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 25000 510.27664 -3200.7431 0.34609419 3079.4414 0.16644232 120 119 6.0069324 0.21512 2.8308749 5.5814852 118042.99 1 2 - 25013 510.27664 -3217.9127 0.34609419 3079.4414 0.16644232 120 119 6.0069324 0.2150082 2.8308749 5.5814852 118042.99 1 2 -Loop time of 0.00622821 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 25000 510.27664 -3200.7431 0.34609419 3079.4414 0.16644232 120 119 6.0069324 0.21512 2.8308749 5.5814852 118042.99 1 2 - 26000 511.79717 -3198.2999 0.19492582 92.206933 0.23433598 263 577 6.0069324 0.21273077 2.8308749 5.5814852 124902.88 1 2 -Loop time of 0.271219 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 26000 511.79717 -3198.2999 0.19492582 92.206933 0.23433598 263 577 6.0069324 0.21273077 2.8308749 5.5814852 124902.88 1 2 - 26015 511.79717 -3217.9147 0.19492582 92.206933 0.23433598 263 577 6.0069324 0.21260811 2.8308749 5.5814852 124902.88 1 2 -Loop time of 0.0105773 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 26000 511.79717 -3198.2999 0.19492582 92.206933 0.23433598 263 577 6.0069324 0.21273077 2.8308749 5.5814852 124902.88 1 2 - 27000 487.73368 -3197.4904 0.19560731 93.67693 0.2340741 401 572 6.0069324 0.20814815 2.8308749 5.5814852 130713.79 1 2 -Loop time of 0.293879 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 27000 487.73368 -3197.4904 0.19560731 93.67693 0.2340741 401 572 6.0069324 0.20814815 2.8308749 5.5814852 130713.79 1 2 - 27015 487.73368 -3217.9161 0.19560731 93.67693 0.2340741 401 572 6.0069324 0.20803257 2.8308749 5.5814852 130713.79 1 2 -Loop time of 0.00895333 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 27000 487.73368 -3197.4904 0.19560731 93.67693 0.2340741 401 572 6.0069324 0.20814815 2.8308749 5.5814852 130713.79 1 2 - 28000 468.95408 -3198.4177 0.3457758 3056.7694 0.1666144 549 515 6.0069324 0.204 2.8308749 5.5814852 135376.2 1 2 -Loop time of 0.286141 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 28000 468.95408 -3198.4177 0.3457758 3056.7694 0.1666144 549 515 6.0069324 0.204 2.8308749 5.5814852 135376.2 1 2 - 28014 468.95408 -3217.9167 0.3457758 3056.7694 0.1666144 549 515 6.0069324 0.20389805 2.8308749 5.5814852 135376.2 1 2 -Loop time of 0.00648469 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 28000 468.95408 -3198.4177 0.3457758 3056.7694 0.1666144 549 515 6.0069324 0.204 2.8308749 5.5814852 135376.2 1 2 - 29000 518.03534 -3198.1622 0.029706116 1.9926184 0.29095171 267 260 6.0069324 0.20031034 2.8308749 5.5814852 143604.35 1 2 -Loop time of 0.24066 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 29000 518.03534 -3198.1622 0.029706116 1.9926184 0.29095171 267 260 6.0069324 0.20031034 2.8308749 5.5814852 143604.35 1 2 - 29014 518.03534 -3217.9137 0.029706116 1.9926184 0.29095171 267 260 6.0069324 0.20021369 2.8308749 5.5814852 143604.35 1 2 -Loop time of 0.0063417 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 29000 518.03534 -3198.1622 0.029706116 1.9926184 0.29095171 267 260 6.0069324 0.20031034 2.8308749 5.5814852 143604.35 1 2 - 30000 535.78782 -3198.3125 0.33831746 2570.9054 0.17059559 122 124 6.0069324 0.19596667 2.8308749 5.5814852 150106.09 1 2 -Loop time of 0.259515 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 30000 535.78782 -3198.3125 0.33831746 2570.9054 0.17059559 122 124 6.0069324 0.19596667 2.8308749 5.5814852 150106.09 1 2 - 30014 535.78782 -3217.9119 0.33831746 2570.9054 0.17059559 122 124 6.0069324 0.19587526 2.8308749 5.5814852 150106.09 1 2 -Loop time of 0.0123347 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 30000 535.78782 -3198.3125 0.33831746 2570.9054 0.17059559 122 124 6.0069324 0.19596667 2.8308749 5.5814852 150106.09 1 2 - 31000 547.06872 -3198.3217 0.21707776 154.18603 0.22566791 275 577 6.0069324 0.19987097 2.8308749 5.5814852 151076.53 1 2 -Loop time of 0.321976 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 31000 547.06872 -3198.3217 0.21707776 154.18603 0.22566791 275 577 6.0069324 0.19987097 2.8308749 5.5814852 151076.53 1 2 - 31014 547.06872 -3217.9165 0.21707776 154.18603 0.22566791 275 577 6.0069324 0.19978074 2.8308749 5.5814852 151076.53 1 2 -Loop time of 0.00811768 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 31000 547.06872 -3198.3217 0.21707776 154.18603 0.22566791 275 577 6.0069324 0.19987097 2.8308749 5.5814852 151076.53 1 2 - 32000 469.53603 -3199.325 0.35776457 4037.4217 0.16000743 563 268 6.0069324 0.20171875 2.8308749 5.5814852 152526.06 1 2 -Loop time of 0.290834 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 32000 469.53603 -3199.325 0.35776457 4037.4217 0.16000743 563 268 6.0069324 0.20171875 2.8308749 5.5814852 152526.06 1 2 - 32013 469.53603 -3217.9147 0.35776457 4037.4217 0.16000743 563 268 6.0069324 0.20163684 2.8308749 5.5814852 152526.06 1 2 -Loop time of 0.00746775 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 32000 469.53603 -3199.325 0.35776457 4037.4217 0.16000743 563 268 6.0069324 0.20171875 2.8308749 5.5814852 152526.06 1 2 - 33000 491.33889 -3199.1986 0.32620326 1940.7983 0.17687118 258 228 6.0069324 0.19833333 2.8308749 5.5814852 156385.66 1 2 -Loop time of 0.243351 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 33000 491.33889 -3199.1986 0.32620326 1940.7983 0.17687118 258 228 6.0069324 0.19833333 2.8308749 5.5814852 156385.66 1 2 - 33014 491.33889 -3217.9155 0.32620326 1940.7983 0.17687118 258 228 6.0069324 0.19824923 2.8308749 5.5814852 156385.66 1 2 -Loop time of 0.00658584 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 33000 491.33889 -3199.1986 0.32620326 1940.7983 0.17687118 258 228 6.0069324 0.19833333 2.8308749 5.5814852 156385.66 1 2 - 34000 503.19322 -3198.8767 0.050333006 3.2161315 0.28449966 275 577 6.0069324 0.19794118 2.8308749 5.5814852 161964.99 1 2 -Loop time of 0.238415 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 34000 503.19322 -3198.8767 0.050333006 3.2161315 0.28449966 275 577 6.0069324 0.19794118 2.8308749 5.5814852 161964.99 1 2 - 34016 503.19322 -3217.9158 0.050333006 3.2161315 0.28449966 275 577 6.0069324 0.19784807 2.8308749 5.5814852 161964.99 1 2 -Loop time of 0.00771642 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 34000 503.19322 -3198.8767 0.050333006 3.2161315 0.28449966 275 577 6.0069324 0.19794118 2.8308749 5.5814852 161964.99 1 2 - 35000 513.68037 -3197.8169 0.26004762 417.98593 0.20782548 264 275 6.0069324 0.199 2.8308749 5.5814852 164995.25 1 2 -Loop time of 0.240164 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 35000 513.68037 -3197.8169 0.26004762 417.98593 0.20782548 264 275 6.0069324 0.199 2.8308749 5.5814852 164995.25 1 2 - 35015 513.68037 -3217.9147 0.26004762 417.98593 0.20782548 264 275 6.0069324 0.19891475 2.8308749 5.5814852 164995.25 1 2 -Loop time of 0.00711012 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 35000 513.68037 -3197.8169 0.26004762 417.98593 0.20782548 264 275 6.0069324 0.199 2.8308749 5.5814852 164995.25 1 2 - 36000 508.23462 -3199.0337 0.009260286 1.2397653 0.29720893 563 564 6.0069324 0.20069444 2.8308749 5.5814852 167465.14 1 2 -Loop time of 0.240289 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 36000 508.23462 -3199.0337 0.009260286 1.2397653 0.29720893 563 564 6.0069324 0.20069444 2.8308749 5.5814852 167465.14 1 2 - 36014 508.23462 -3217.9163 0.009260286 1.2397653 0.29720893 563 564 6.0069324 0.20061643 2.8308749 5.5814852 167465.14 1 2 -Loop time of 0.00642586 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 36000 508.23462 -3199.0337 0.009260286 1.2397653 0.29720893 563 564 6.0069324 0.20069444 2.8308749 5.5814852 167465.14 1 2 - 37000 500.95069 -3199.7129 0.024475083 1.764809 0.29256535 275 577 6.0069324 0.19783784 2.8308749 5.5814852 169290.01 1 2 -Loop time of 0.239462 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 37000 500.95069 -3199.7129 0.024475083 1.764809 0.29256535 275 577 6.0069324 0.19783784 2.8308749 5.5814852 169290.01 1 2 - 37015 500.95069 -3217.916 0.024475083 1.764809 0.29256535 275 577 6.0069324 0.19775767 2.8308749 5.5814852 169290.01 1 2 -Loop time of 0.00713468 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 37000 500.95069 -3199.7129 0.024475083 1.764809 0.29256535 275 577 6.0069324 0.19783784 2.8308749 5.5814852 169290.01 1 2 - 38000 495.41803 -3199.6385 0 1 1.0152866 262 275 6.0069324 0.21794737 2.8308749 5.5814852 169297.9 1 2 -Loop time of 0.239667 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 38000 495.41803 -3199.6385 0 1 1.0152866 262 275 6.0069324 0.21794737 2.8308749 5.5814852 169297.9 1 2 - 38013 495.41803 -3217.9157 0 1 1.0152866 262 275 6.0069324 0.21787283 2.8308749 5.5814852 169297.9 1 2 -Loop time of 0.00627661 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 38000 495.41803 -3199.6385 0.39298625 9143.7129 0.13878932 430 431 6.0069324 0.21794737 2.8308749 5.5814852 169297.9 2 4 - 39000 469.05202 -3196.0515 0.10638057 11.810485 0.26617945 408 415 6.0069324 0.21410256 2.8308749 5.5814852 175842.05 2 4 -Loop time of 0.238329 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 39000 469.05202 -3196.0515 0.10638057 11.810485 0.26617945 408 415 6.0069324 0.21410256 2.8308749 5.5814852 175842.05 2 4 - 39015 469.05202 -3217.917 0.10638057 11.810485 0.26617945 408 415 6.0069324 0.21402025 2.8308749 5.5814852 175842.05 2 4 -Loop time of 0.00683451 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 39000 469.05202 -3196.0515 0.10638057 11.810485 0.26617945 408 415 6.0069324 0.21410256 2.8308749 5.5814852 175842.05 2 4 - 40000 542.78328 -3198.4918 0.18612218 75.166934 0.2376931 567 560 6.0069324 0.214275 2.8308749 5.5814852 179412.45 2 4 -Loop time of 0.23954 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 40000 542.78328 -3198.4918 0.18612218 75.166934 0.2376931 567 560 6.0069324 0.214275 2.8308749 5.5814852 179412.45 2 4 - 40014 542.78328 -3217.9148 0.18612218 75.166934 0.2376931 567 560 6.0069324 0.21420003 2.8308749 5.5814852 179412.45 2 4 -Loop time of 0.00652599 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 40000 542.78328 -3198.4918 0.18612218 75.166934 0.2376931 567 560 6.0069324 0.214275 2.8308749 5.5814852 179412.45 2 4 - 41000 548.99015 -3197.5893 0.30318345 1137.4995 0.18822056 124 135 6.0069324 0.21114634 2.8308749 5.5814852 184564.49 2 4 -Loop time of 0.239863 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 41000 548.99015 -3197.5893 0.30318345 1137.4995 0.18822056 124 135 6.0069324 0.21114634 2.8308749 5.5814852 184564.49 2 4 - 41014 548.99015 -3217.9174 0.30318345 1137.4995 0.18822056 124 135 6.0069324 0.21107427 2.8308749 5.5814852 184564.49 2 4 -Loop time of 0.00668764 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 41000 548.99015 -3197.5893 0.30318345 1137.4995 0.18822056 124 135 6.0069324 0.21114634 2.8308749 5.5814852 184564.49 2 4 - 42000 492.4929 -3198.0535 0.31406773 1464.4003 0.18294209 262 264 6.0069324 0.20954762 2.8308749 5.5814852 187620.86 2 4 -Loop time of 0.238458 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 42000 492.4929 -3198.0535 0.31406773 1464.4003 0.18294209 262 264 6.0069324 0.20954762 2.8308749 5.5814852 187620.86 2 4 - 42014 492.4929 -3217.9154 0.31406773 1464.4003 0.18294209 262 264 6.0069324 0.20947779 2.8308749 5.5814852 187620.86 2 4 -Loop time of 0.00658375 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 42000 492.4929 -3198.0535 0.31406773 1464.4003 0.18294209 262 264 6.0069324 0.20954762 2.8308749 5.5814852 187620.86 2 4 - 43000 524.32334 -3199.9723 0.171134 53.082676 0.24330204 287 276 6.0069324 0.20893023 2.8308749 5.5814852 189618.98 2 4 -Loop time of 0.240476 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 43000 524.32334 -3199.9723 0.171134 53.082676 0.24330204 287 276 6.0069324 0.20893023 2.8308749 5.5814852 189618.98 2 4 - 43015 524.32334 -3217.9151 0.171134 53.082676 0.24330204 287 276 6.0069324 0.20885738 2.8308749 5.5814852 189618.98 2 4 -Loop time of 0.00655174 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 43000 524.32334 -3199.9723 0.171134 53.082676 0.24330204 287 276 6.0069324 0.20893023 2.8308749 5.5814852 189618.98 2 4 - 44000 490.60365 -3198.9839 0.12604882 18.642955 0.25944404 544 276 6.0069324 0.21018182 2.8308749 5.5814852 193452.76 2 4 -Loop time of 0.240179 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 44000 490.60365 -3198.9839 0.12604882 18.642955 0.25944404 544 276 6.0069324 0.21018182 2.8308749 5.5814852 193452.76 2 4 - 44015 490.60365 -3217.9148 0.12604882 18.642955 0.25944404 544 276 6.0069324 0.21011019 2.8308749 5.5814852 193452.76 2 4 -Loop time of 0.00717342 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 44000 490.60365 -3198.9839 0.12604882 18.642955 0.25944404 544 276 6.0069324 0.21018182 2.8308749 5.5814852 193452.76 2 4 - 45000 516.91704 -3198.746 0.30358614 1148.1804 0.18802791 114 120 6.0069324 0.2092 2.8308749 5.5814852 194591.87 2 4 -Loop time of 0.24121 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 45000 516.91704 -3198.746 0.30358614 1148.1804 0.18802791 114 120 6.0069324 0.2092 2.8308749 5.5814852 194591.87 2 4 - 45013 516.91704 -3217.9155 0.30358614 1148.1804 0.18802791 114 120 6.0069324 0.20913958 2.8308749 5.5814852 194591.87 2 4 -Loop time of 0.00649601 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 45000 516.91704 -3198.746 0.30358614 1148.1804 0.18802791 114 120 6.0069324 0.2092 2.8308749 5.5814852 194591.87 2 4 - 46000 511.1774 -3196.9369 0.25070338 336.49294 0.21183341 138 259 6.0069324 0.20769565 2.8308749 5.5814852 199937.52 2 4 -Loop time of 0.239441 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 46000 511.1774 -3196.9369 0.25070338 336.49294 0.21183341 138 259 6.0069324 0.20769565 2.8308749 5.5814852 199937.52 2 4 - 46015 511.1774 -3217.9159 0.25070338 336.49294 0.21183341 138 259 6.0069324 0.20762795 2.8308749 5.5814852 199937.52 2 4 -Loop time of 0.00681973 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 46000 511.1774 -3196.9369 0.25070338 336.49294 0.21183341 138 259 6.0069324 0.20769565 2.8308749 5.5814852 199937.52 2 4 - 47000 480.5069 -3198.8501 0.071646863 5.2743358 0.27767529 544 556 6.0069324 0.20602128 2.8308749 5.5814852 202107.88 2 4 -Loop time of 0.24022 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 47000 480.5069 -3198.8501 0.071646863 5.2743358 0.27767529 544 556 6.0069324 0.20602128 2.8308749 5.5814852 202107.88 2 4 - 47016 480.5069 -3217.9167 0.071646863 5.2743358 0.27767529 544 556 6.0069324 0.20595117 2.8308749 5.5814852 202107.88 2 4 -Loop time of 0.007438 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 47000 480.5069 -3198.8501 0.071646863 5.2743358 0.27767529 544 556 6.0069324 0.20602128 2.8308749 5.5814852 202107.88 2 4 - 48000 540.51895 -3198.5792 0.04754734 3.0147795 0.28537953 544 556 6.0069324 0.2085 2.8308749 5.5814852 202899.91 2 4 -Loop time of 0.241529 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 48000 540.51895 -3198.5792 0.04754734 3.0147795 0.28537953 544 556 6.0069324 0.2085 2.8308749 5.5814852 202899.91 2 4 - 48015 540.51895 -3217.9148 0.04754734 3.0147795 0.28537953 544 556 6.0069324 0.20843486 2.8308749 5.5814852 202899.91 2 4 -Loop time of 0.00695753 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 48000 540.51895 -3198.5792 0.04754734 3.0147795 0.28537953 544 556 6.0069324 0.2085 2.8308749 5.5814852 202899.91 2 4 - 49000 527.63013 -3199.0384 0.28400417 728.84104 0.19717822 544 577 6.0069324 0.20961224 2.8308749 5.5814852 210926.93 2 4 -Loop time of 0.241009 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 49000 527.63013 -3199.0384 0.28400417 728.84104 0.19717822 544 577 6.0069324 0.20961224 2.8308749 5.5814852 210926.93 2 4 - 49013 527.63013 -3217.9157 0.28400417 728.84104 0.19717822 544 577 6.0069324 0.20955665 2.8308749 5.5814852 210926.93 2 4 -Loop time of 0.00608408 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 49000 527.63013 -3199.0384 0.28400417 728.84104 0.19717822 544 577 6.0069324 0.20961224 2.8308749 5.5814852 210926.93 2 4 - 50000 516.69962 -3198.3346 0.35295929 3611.3455 0.16268782 266 243 6.0069324 0.20898 2.8308749 5.5814852 215664.98 2 4 -Loop time of 0.239941 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 50000 516.69962 -3198.3346 0.35295929 3611.3455 0.16268782 266 243 6.0069324 0.20898 2.8308749 5.5814852 215664.98 2 4 - 50013 516.69962 -3217.9156 0.35295929 3611.3455 0.16268782 266 243 6.0069324 0.20892568 2.8308749 5.5814852 215664.98 2 4 -Loop time of 0.00602353 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 50000 516.69962 -3198.3346 0.35295929 3611.3455 0.16268782 266 243 6.0069324 0.20898 2.8308749 5.5814852 215664.98 2 4 - 51000 533.05598 -3198.0432 0.17474232 57.719563 0.2419636 123 128 6.0069324 0.2065098 2.8308749 5.5814852 221609.1 2 4 -Loop time of 0.240274 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 51000 533.05598 -3198.0432 0.17474232 57.719563 0.2419636 123 128 6.0069324 0.2065098 2.8308749 5.5814852 221609.1 2 4 - 51015 533.05598 -3217.9143 0.17474232 57.719563 0.2419636 123 128 6.0069324 0.20644908 2.8308749 5.5814852 221609.1 2 4 -Loop time of 0.00743866 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 51000 533.05598 -3198.0432 0.17474232 57.719563 0.2419636 123 128 6.0069324 0.2065098 2.8308749 5.5814852 221609.1 2 4 - 52000 545.98999 -3198.2633 0 1 0.30964409 287 276 6.0069324 0.20332692 2.8308749 5.5814852 230246.21 2 4 -Loop time of 0.239709 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 52000 545.98999 -3198.2633 0 1 0.30964409 287 276 6.0069324 0.20332692 2.8308749 5.5814852 230246.21 2 4 - 52017 545.98999 -3217.9153 0 1 0.30964409 287 276 6.0069324 0.20326047 2.8308749 5.5814852 230246.21 2 4 -Loop time of 0.00786757 on 4 procs for 17 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 52000 545.98999 -3198.2633 0 1 0.30964409 287 276 6.0069324 0.20332692 2.8308749 5.5814852 230246.21 2 4 - 53000 453.58658 -3199.3577 0.23959479 260.0198 0.21650159 278 279 6.0069324 0.20366038 2.8308749 5.5814852 233492.88 2 4 -Loop time of 0.240351 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 53000 453.58658 -3199.3577 0.23959479 260.0198 0.21650159 278 279 6.0069324 0.20366038 2.8308749 5.5814852 233492.88 2 4 - 53014 453.58658 -3217.9131 0.23959479 260.0198 0.21650159 278 279 6.0069324 0.20360659 2.8308749 5.5814852 233492.88 2 4 -Loop time of 0.0067966 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 53000 453.58658 -3199.3577 0.23959479 260.0198 0.21650159 278 279 6.0069324 0.20366038 2.8308749 5.5814852 233492.88 2 4 - 54000 502.12681 -3199.1712 0.28827435 804.7747 0.19521941 550 563 6.0069324 0.20264815 2.8308749 5.5814852 239627.25 2 4 -Loop time of 0.238634 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 54000 502.12681 -3199.1712 0.28827435 804.7747 0.19521941 550 563 6.0069324 0.20264815 2.8308749 5.5814852 239627.25 2 4 - 54014 502.12681 -3217.9165 0.28827435 804.7747 0.19521941 550 563 6.0069324 0.20259562 2.8308749 5.5814852 239627.25 2 4 -Loop time of 0.00671387 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 54000 502.12681 -3199.1712 0.28827435 804.7747 0.19521941 550 563 6.0069324 0.20264815 2.8308749 5.5814852 239627.25 2 4 - 55000 470.7967 -3197.4136 0.31075641 1356.0734 0.18456394 285 283 6.0069324 0.20041818 2.8308749 5.5814852 246248.56 2 4 -Loop time of 0.240888 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 55000 470.7967 -3197.4136 0.31075641 1356.0734 0.18456394 285 283 6.0069324 0.20041818 2.8308749 5.5814852 246248.56 2 4 - 55013 470.7967 -3217.9136 0.31075641 1356.0734 0.18456394 285 283 6.0069324 0.20037082 2.8308749 5.5814852 246248.56 2 4 -Loop time of 0.00596166 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 55000 470.7967 -3197.4136 0.31075641 1356.0734 0.18456394 285 283 6.0069324 0.20041818 2.8308749 5.5814852 246248.56 2 4 - 56000 533.34641 -3198.1323 0.16761369 48.918113 0.24460077 287 276 6.0069324 0.19926786 2.8308749 5.5814852 252499.61 2 4 -Loop time of 0.239487 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 56000 533.34641 -3198.1323 0.16761369 48.918113 0.24460077 287 276 6.0069324 0.19926786 2.8308749 5.5814852 252499.61 2 4 - 56014 533.34641 -3217.9162 0.16761369 48.918113 0.24460077 287 276 6.0069324 0.19921805 2.8308749 5.5814852 252499.61 2 4 -Loop time of 0.00619745 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 56000 533.34641 -3198.1323 0.16761369 48.918113 0.24460077 287 276 6.0069324 0.19926786 2.8308749 5.5814852 252499.61 2 4 - 57000 516.06876 -3197.7671 0 1 0.33139119 287 276 6.0069324 0.19807018 2.8308749 5.5814852 255923.67 2 4 -Loop time of 0.241093 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 57000 516.06876 -3197.7671 0 1 0.33139119 287 276 6.0069324 0.19807018 2.8308749 5.5814852 255923.67 2 4 - 57016 516.06876 -3217.9146 0 1 0.33139119 287 276 6.0069324 0.19801459 2.8308749 5.5814852 255923.67 2 4 -Loop time of 0.00772929 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 57000 516.06876 -3197.7671 0 1 0.33139119 287 276 6.0069324 0.19807018 2.8308749 5.5814852 255923.67 2 4 - 58000 489.18902 -3198.6347 0.20937806 128.95422 0.22871806 544 276 6.0069324 0.20094828 2.8308749 5.5814852 256132.07 2 4 -Loop time of 0.239761 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 58000 489.18902 -3198.6347 0.20937806 128.95422 0.22871806 544 276 6.0069324 0.20094828 2.8308749 5.5814852 256132.07 2 4 - 58014 489.18902 -3217.9165 0.20937806 128.95422 0.22871806 544 276 6.0069324 0.20089978 2.8308749 5.5814852 256132.07 2 4 -Loop time of 0.00660753 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 58000 489.18902 -3198.6347 0.20937806 128.95422 0.22871806 544 276 6.0069324 0.20094828 2.8308749 5.5814852 256132.07 2 4 - 59000 522.75445 -3197.4454 0 1 0.91317104 274 556 6.0069324 0.20305085 2.8308749 5.5814852 259828.37 2 4 -Loop time of 0.241627 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 59000 522.75445 -3197.4454 0 1 0.91317104 274 556 6.0069324 0.20305085 2.8308749 5.5814852 259828.37 2 4 - 59013 522.75445 -3217.9138 0 1 0.91317104 274 556 6.0069324 0.20300612 2.8308749 5.5814852 259828.37 2 4 -Loop time of 0.00618345 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 59000 522.75445 -3197.4454 0.40114631 11050.253 0.1333929 547 548 6.0069324 0.20305085 2.8308749 5.5814852 259828.37 3 6 - 60000 552.18712 -3197.1906 0.21473769 146.03543 0.22659924 559 564 6.0069324 0.20126667 2.8308749 5.5814852 263208.58 3 6 -Loop time of 0.239681 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 60000 552.18712 -3197.1906 0.21473769 146.03543 0.22659924 559 564 6.0069324 0.20126667 2.8308749 5.5814852 263208.58 3 6 - 60015 552.18712 -3217.9157 0.21473769 146.03543 0.22659924 559 564 6.0069324 0.20121636 2.8308749 5.5814852 263208.58 3 6 -Loop time of 0.00685382 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 60000 552.18712 -3197.1906 0.21473769 146.03543 0.22659924 559 564 6.0069324 0.20126667 2.8308749 5.5814852 263208.58 3 6 - 61000 450.24979 -3197.259 0.20870055 126.94235 0.2289845 412 411 6.0069324 0.20103279 2.8308749 5.5814852 267126.63 3 6 -Loop time of 0.239598 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 61000 450.24979 -3197.259 0.20870055 126.94235 0.2289845 412 411 6.0069324 0.20103279 2.8308749 5.5814852 267126.63 3 6 - 61014 450.24979 -3217.9146 0.20870055 126.94235 0.2289845 412 411 6.0069324 0.20098666 2.8308749 5.5814852 267126.63 3 6 -Loop time of 0.00683248 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 61000 450.24979 -3197.259 0.20870055 126.94235 0.2289845 412 411 6.0069324 0.20103279 2.8308749 5.5814852 267126.63 3 6 - 62000 506.89399 -3197.4659 0.20762728 123.81933 0.22940595 256 267 6.0069324 0.20074194 2.8308749 5.5814852 270687.24 3 6 -Loop time of 0.238224 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 62000 506.89399 -3197.4659 0.20762728 123.81933 0.22940595 256 267 6.0069324 0.20074194 2.8308749 5.5814852 270687.24 3 6 - 62014 506.89399 -3217.9156 0.20762728 123.81933 0.22940595 256 267 6.0069324 0.20069662 2.8308749 5.5814852 270687.24 3 6 -Loop time of 0.00685287 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 62000 506.89399 -3197.4659 0.20762728 123.81933 0.22940595 256 267 6.0069324 0.20074194 2.8308749 5.5814852 270687.24 3 6 - 63000 510.04068 -3196.8255 0.063053561 4.320671 0.28044671 112 123 6.0069324 0.19930159 2.8308749 5.5814852 274694.1 3 6 -Loop time of 0.238676 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 63000 510.04068 -3196.8255 0.063053561 4.320671 0.28044671 112 123 6.0069324 0.19930159 2.8308749 5.5814852 274694.1 3 6 - 63014 510.04068 -3217.9141 0.063053561 4.320671 0.28044671 112 123 6.0069324 0.19925731 2.8308749 5.5814852 274694.1 3 6 -Loop time of 0.00670481 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 63000 510.04068 -3196.8255 0.063053561 4.320671 0.28044671 112 123 6.0069324 0.19930159 2.8308749 5.5814852 274694.1 3 6 - 64000 501.25574 -3197.7101 0.083024533 6.8683042 0.27396274 286 119 6.0069324 0.2 2.8308749 5.5814852 276114.67 3 6 -Loop time of 0.238342 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 64000 501.25574 -3197.7101 0.083024533 6.8683042 0.27396274 286 119 6.0069324 0.2 2.8308749 5.5814852 276114.67 3 6 - 64014 501.25574 -3217.9141 0.083024533 6.8683042 0.27396274 286 119 6.0069324 0.19995626 2.8308749 5.5814852 276114.67 3 6 -Loop time of 0.00604939 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 64000 501.25574 -3197.7101 0.083024533 6.8683042 0.27396274 286 119 6.0069324 0.2 2.8308749 5.5814852 276114.67 3 6 - 65000 476.31749 -3199.3383 0.15323867 35.04097 0.24983402 267 260 6.0069324 0.19838462 2.8308749 5.5814852 282281.34 3 6 -Loop time of 0.239458 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 65000 476.31749 -3199.3383 0.15323867 35.04097 0.24983402 267 260 6.0069324 0.19838462 2.8308749 5.5814852 282281.34 3 6 - 65014 476.31749 -3217.913 0.15323867 35.04097 0.24983402 267 260 6.0069324 0.1983419 2.8308749 5.5814852 282281.34 3 6 -Loop time of 0.00661784 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 65000 476.31749 -3199.3383 0.15323867 35.04097 0.24983402 267 260 6.0069324 0.19838462 2.8308749 5.5814852 282281.34 3 6 - 66000 515.81365 -3198.7056 0.21680106 153.19903 0.22577823 416 415 6.0069324 0.19919697 2.8308749 5.5814852 284618.61 3 6 -Loop time of 0.239712 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 66000 515.81365 -3198.7056 0.21680106 153.19903 0.22577823 416 415 6.0069324 0.19919697 2.8308749 5.5814852 284618.61 3 6 - 66014 515.81365 -3217.9165 0.21680106 153.19903 0.22577823 416 415 6.0069324 0.19915472 2.8308749 5.5814852 284618.61 3 6 -Loop time of 0.00680089 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 66000 515.81365 -3198.7056 0.21680106 153.19903 0.22577823 416 415 6.0069324 0.19919697 2.8308749 5.5814852 284618.61 3 6 - 67000 484.31519 -3197.7852 0.13298902 21.901246 0.25702524 275 567 6.0069324 0.19846269 2.8308749 5.5814852 289586.09 3 6 -Loop time of 0.239938 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 67000 484.31519 -3197.7852 0.13298902 21.901246 0.25702524 275 567 6.0069324 0.19846269 2.8308749 5.5814852 289586.09 3 6 - 67014 484.31519 -3217.9146 0.13298902 21.901246 0.25702524 275 567 6.0069324 0.19842123 2.8308749 5.5814852 289586.09 3 6 -Loop time of 0.00659657 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 67000 484.31519 -3197.7852 0.13298902 21.901246 0.25702524 275 567 6.0069324 0.19846269 2.8308749 5.5814852 289586.09 3 6 - 68000 484.02912 -3199.084 0.23443259 230.66083 0.21863699 412 423 6.0069324 0.19722059 2.8308749 5.5814852 298036.66 3 6 -Loop time of 0.240483 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 68000 484.02912 -3199.084 0.23443259 230.66083 0.21863699 412 423 6.0069324 0.19722059 2.8308749 5.5814852 298036.66 3 6 - 68014 484.02912 -3217.9156 0.23443259 230.66083 0.21863699 412 423 6.0069324 0.19717999 2.8308749 5.5814852 298036.66 3 6 -Loop time of 0.00666052 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 68000 484.02912 -3199.084 0.23443259 230.66083 0.21863699 412 423 6.0069324 0.19722059 2.8308749 5.5814852 298036.66 3 6 - 69000 516.84151 -3198.3447 0.20394137 113.66746 0.23084747 119 400 6.0069324 0.19605797 2.8308749 5.5814852 302894.58 3 6 -Loop time of 0.23984 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 69000 516.84151 -3198.3447 0.20394137 113.66746 0.23084747 119 400 6.0069324 0.19605797 2.8308749 5.5814852 302894.58 3 6 - 69015 516.84151 -3217.9163 0.20394137 113.66746 0.23084747 119 400 6.0069324 0.19601536 2.8308749 5.5814852 302894.58 3 6 -Loop time of 0.0070501 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 69000 516.84151 -3198.3447 0.20394137 113.66746 0.23084747 119 400 6.0069324 0.19605797 2.8308749 5.5814852 302894.58 3 6 - 70000 521.52008 -3198.1925 0.26533657 472.57625 0.2055223 128 139 6.0069324 0.19471429 2.8308749 5.5814852 308489.53 3 6 -Loop time of 0.240016 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 70000 521.52008 -3198.1925 0.26533657 472.57625 0.2055223 128 139 6.0069324 0.19471429 2.8308749 5.5814852 308489.53 3 6 - 70014 521.52008 -3217.9145 0.26533657 472.57625 0.2055223 128 139 6.0069324 0.19467535 2.8308749 5.5814852 308489.53 3 6 -Loop time of 0.00656152 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 70000 521.52008 -3198.1925 0.26533657 472.57625 0.2055223 128 139 6.0069324 0.19471429 2.8308749 5.5814852 308489.53 3 6 - 71000 456.91639 -3199.2364 0.030609593 2.0348424 0.29067211 555 275 6.0069324 0.19753521 2.8308749 5.5814852 308872.53 3 6 -Loop time of 0.238921 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 71000 456.91639 -3199.2364 0.030609593 2.0348424 0.29067211 555 275 6.0069324 0.19753521 2.8308749 5.5814852 308872.53 3 6 - 71016 456.91639 -3217.9154 0.030609593 2.0348424 0.29067211 555 275 6.0069324 0.19749071 2.8308749 5.5814852 308872.53 3 6 -Loop time of 0.00665921 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 71000 456.91639 -3199.2364 0.030609593 2.0348424 0.29067211 555 275 6.0069324 0.19753521 2.8308749 5.5814852 308872.53 3 6 - 72000 505.77427 -3198.8053 0.011213996 1.2972748 0.29661672 275 567 6.0069324 0.20022222 2.8308749 5.5814852 308922.44 3 6 -Loop time of 0.238494 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 72000 505.77427 -3198.8053 0.011213996 1.2972748 0.29661672 275 567 6.0069324 0.20022222 2.8308749 5.5814852 308922.44 3 6 - 72014 505.77427 -3217.9154 0.011213996 1.2972748 0.29661672 275 567 6.0069324 0.2001833 2.8308749 5.5814852 308922.44 3 6 -Loop time of 0.00666285 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 72000 505.77427 -3198.8053 0.011213996 1.2972748 0.29661672 275 567 6.0069324 0.20022222 2.8308749 5.5814852 308922.44 3 6 - 73000 505.42011 -3198.5745 0.241922 274.45031 0.21553199 262 544 6.0069324 0.19989041 2.8308749 5.5814852 312318.94 3 6 -Loop time of 0.240884 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 73000 505.42011 -3198.5745 0.241922 274.45031 0.21553199 262 544 6.0069324 0.19989041 2.8308749 5.5814852 312318.94 3 6 - 73014 505.42011 -3217.9145 0.241922 274.45031 0.21553199 262 544 6.0069324 0.19985208 2.8308749 5.5814852 312318.94 3 6 -Loop time of 0.00641418 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 73000 505.42011 -3198.5745 0.241922 274.45031 0.21553199 262 544 6.0069324 0.19989041 2.8308749 5.5814852 312318.94 3 6 - 74000 525.14325 -3197.1366 0.091100202 8.2841621 0.27129682 403 404 6.0069324 0.19893243 2.8308749 5.5814852 316054.12 3 6 -Loop time of 0.239838 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 74000 525.14325 -3197.1366 0.091100202 8.2841621 0.27129682 403 404 6.0069324 0.19893243 2.8308749 5.5814852 316054.12 3 6 - 74014 525.14325 -3217.9164 0.091100202 8.2841621 0.27129682 403 404 6.0069324 0.1988948 2.8308749 5.5814852 316054.12 3 6 -Loop time of 0.00640178 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 74000 525.14325 -3197.1366 0.091100202 8.2841621 0.27129682 403 404 6.0069324 0.19893243 2.8308749 5.5814852 316054.12 3 6 - 75000 529.75357 -3196.8628 0.27468673 587.107 0.20138617 262 553 6.0069324 0.1974 2.8308749 5.5814852 320757.39 3 6 -Loop time of 0.241485 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 75000 529.75357 -3196.8628 0.27468673 587.107 0.20138617 262 553 6.0069324 0.1974 2.8308749 5.5814852 320757.39 3 6 - 75015 529.75357 -3217.9131 0.27468673 587.107 0.20138617 262 553 6.0069324 0.19736053 2.8308749 5.5814852 320757.39 3 6 -Loop time of 0.00727272 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 75000 529.75357 -3196.8628 0.27468673 587.107 0.20138617 262 553 6.0069324 0.1974 2.8308749 5.5814852 320757.39 3 6 - 76000 494.67435 -3197.324 0.026840032 1.8643837 0.29183693 555 275 6.0069324 0.19744737 2.8308749 5.5814852 321584.51 3 6 -Loop time of 0.246189 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 76000 494.67435 -3197.324 0.026840032 1.8643837 0.29183693 555 275 6.0069324 0.19744737 2.8308749 5.5814852 321584.51 3 6 - 76015 494.67435 -3217.9124 0.026840032 1.8643837 0.29183693 555 275 6.0069324 0.19740841 2.8308749 5.5814852 321584.51 3 6 -Loop time of 0.00856209 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 76000 494.67435 -3197.324 0.026840032 1.8643837 0.29183693 555 275 6.0069324 0.19744737 2.8308749 5.5814852 321584.51 3 6 - 77000 478.4265 -3198.3778 0.099536255 10.075814 0.26848366 283 272 6.0069324 0.19802597 2.8308749 5.5814852 323214.67 3 6 -Loop time of 0.244489 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 77000 478.4265 -3198.3778 0.099536255 10.075814 0.26848366 283 272 6.0069324 0.19802597 2.8308749 5.5814852 323214.67 3 6 - 77014 478.4265 -3217.9158 0.099536255 10.075814 0.26848366 283 272 6.0069324 0.19798998 2.8308749 5.5814852 323214.67 3 6 -Loop time of 0.00662231 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 77000 478.4265 -3198.3778 0.099536255 10.075814 0.26848366 283 272 6.0069324 0.19802597 2.8308749 5.5814852 323214.67 3 6 - 78000 501.53059 -3199.1386 0.013408722 1.3650665 0.29595005 420 431 6.0069324 0.19646154 2.8308749 5.5814852 328321.34 3 6 -Loop time of 0.238902 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 78000 501.53059 -3199.1386 0.013408722 1.3650665 0.29595005 420 431 6.0069324 0.19646154 2.8308749 5.5814852 328321.34 3 6 - 78014 501.53059 -3217.9148 0.013408722 1.3650665 0.29595005 420 431 6.0069324 0.19642628 2.8308749 5.5814852 328321.34 3 6 -Loop time of 0.00632596 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 78000 501.53059 -3199.1386 0.013408722 1.3650665 0.29595005 420 431 6.0069324 0.19646154 2.8308749 5.5814852 328321.34 3 6 - 79000 500.93975 -3198.0923 0.116093 14.796691 0.26287499 428 543 6.0069324 0.19506329 2.8308749 5.5814852 333018.93 3 6 -Loop time of 0.238987 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 79000 500.93975 -3198.0923 0.116093 14.796691 0.26287499 428 543 6.0069324 0.19506329 2.8308749 5.5814852 333018.93 3 6 - 79014 500.93975 -3217.9148 0.116093 14.796691 0.26287499 428 543 6.0069324 0.19502873 2.8308749 5.5814852 333018.93 3 6 -Loop time of 0.00644779 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 79000 500.93975 -3198.0923 0.116093 14.796691 0.26287499 428 543 6.0069324 0.19506329 2.8308749 5.5814852 333018.93 3 6 - 80000 521.43512 -3199.0487 0.15540998 36.852069 0.2490506 253 136 6.0069324 0.193625 2.8308749 5.5814852 337716.24 3 6 -Loop time of 0.238806 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 80000 521.43512 -3199.0487 0.15540998 36.852069 0.2490506 253 136 6.0069324 0.193625 2.8308749 5.5814852 337716.24 3 6 - 80014 521.43512 -3217.9164 0.15540998 36.852069 0.2490506 253 136 6.0069324 0.19359112 2.8308749 5.5814852 337716.24 3 6 -Loop time of 0.00644064 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 80000 521.43512 -3199.0487 0.15540998 36.852069 0.2490506 253 136 6.0069324 0.193625 2.8308749 5.5814852 337716.24 3 6 - 81000 533.69561 -3197.1168 0.24520241 296.1616 0.21415781 575 280 6.0069324 0.19222222 2.8308749 5.5814852 343062.81 3 6 -Loop time of 0.240714 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 81000 533.69561 -3197.1168 0.24520241 296.1616 0.21415781 575 280 6.0069324 0.19222222 2.8308749 5.5814852 343062.81 3 6 - 81015 533.69561 -3217.9142 0.24520241 296.1616 0.21415781 575 280 6.0069324 0.19218663 2.8308749 5.5814852 343062.81 3 6 -Loop time of 0.00675607 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 81000 533.69561 -3197.1168 0.24520241 296.1616 0.21415781 575 280 6.0069324 0.19222222 2.8308749 5.5814852 343062.81 3 6 - 82000 522.58314 -3197.6951 0.34607713 3078.2225 0.16645154 569 570 6.0069324 0.19130488 2.8308749 5.5814852 347897.31 3 6 -Loop time of 0.239094 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 82000 522.58314 -3197.6951 0.34607713 3078.2225 0.16645154 569 570 6.0069324 0.19130488 2.8308749 5.5814852 347897.31 3 6 - 82014 522.58314 -3217.917 0.34607713 3078.2225 0.16645154 569 570 6.0069324 0.19127222 2.8308749 5.5814852 347897.31 3 6 -Loop time of 0.00662041 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 82000 522.58314 -3197.6951 0.34607713 3078.2225 0.16645154 569 570 6.0069324 0.19130488 2.8308749 5.5814852 347897.31 3 6 - 83000 518.24081 -3196.6457 0.27556929 599.25687 0.20099136 512 523 6.0069324 0.18978313 2.8308749 5.5814852 355870.51 3 6 -Loop time of 0.240335 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 83000 518.24081 -3196.6457 0.27556929 599.25687 0.20099136 512 523 6.0069324 0.18978313 2.8308749 5.5814852 355870.51 3 6 - 83015 518.24081 -3217.9151 0.27556929 599.25687 0.20099136 512 523 6.0069324 0.18974884 2.8308749 5.5814852 355870.51 3 6 -Loop time of 0.00710487 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 83000 518.24081 -3196.6457 0.27556929 599.25687 0.20099136 512 523 6.0069324 0.18978313 2.8308749 5.5814852 355870.51 3 6 - 84000 524.77376 -3198.1195 0.32714869 1983.8549 0.17638944 275 567 6.0069324 0.189 2.8308749 5.5814852 358623.76 3 6 -Loop time of 0.239069 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 84000 524.77376 -3198.1195 0.32714869 1983.8549 0.17638944 275 567 6.0069324 0.189 2.8308749 5.5814852 358623.76 3 6 - 84014 524.77376 -3217.9145 0.32714869 1983.8549 0.17638944 275 567 6.0069324 0.18896851 2.8308749 5.5814852 358623.76 3 6 -Loop time of 0.00662088 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 84000 524.77376 -3198.1195 0.32714869 1983.8549 0.17638944 275 567 6.0069324 0.189 2.8308749 5.5814852 358623.76 3 6 - 85000 485.77334 -3199.2545 0.0027767134 1.0665667 0.29916583 275 567 6.0069324 0.19102353 2.8308749 5.5814852 362933.93 3 6 -Loop time of 0.240117 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 85000 485.77334 -3199.2545 0.0027767134 1.0665667 0.29916583 275 567 6.0069324 0.19102353 2.8308749 5.5814852 362933.93 3 6 - 85014 485.77334 -3217.9148 0.0027767134 1.0665667 0.29916583 275 567 6.0069324 0.19099207 2.8308749 5.5814852 362933.93 3 6 -Loop time of 0.00642967 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 85000 485.77334 -3199.2545 0.0027767134 1.0665667 0.29916583 275 567 6.0069324 0.19102353 2.8308749 5.5814852 362933.93 3 6 - 86000 520.32504 -3197.8586 0.34074416 2719.857 0.16931052 572 403 6.0069324 0.19181395 2.8308749 5.5814852 366756.98 3 6 -Loop time of 0.23899 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 86000 520.32504 -3197.8586 0.34074416 2719.857 0.16931052 572 403 6.0069324 0.19181395 2.8308749 5.5814852 366756.98 3 6 - 86014 520.32504 -3217.9156 0.34074416 2719.857 0.16931052 572 403 6.0069324 0.19178273 2.8308749 5.5814852 366756.98 3 6 -Loop time of 0.00667548 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 86000 520.32504 -3197.8586 0.34074416 2719.857 0.16931052 572 403 6.0069324 0.19181395 2.8308749 5.5814852 366756.98 3 6 - 87000 492.06505 -3198.9245 0.35508545 3794.0215 0.16150733 282 284 6.0069324 0.19096552 2.8308749 5.5814852 370757.69 3 6 -Loop time of 0.241176 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 87000 492.06505 -3198.9245 0.35508545 3794.0215 0.16150733 282 284 6.0069324 0.19096552 2.8308749 5.5814852 370757.69 3 6 - 87014 492.06505 -3217.9141 0.35508545 3794.0215 0.16150733 282 284 6.0069324 0.19093479 2.8308749 5.5814852 370757.69 3 6 -Loop time of 0.00634283 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 87000 492.06505 -3198.9245 0.35508545 3794.0215 0.16150733 282 284 6.0069324 0.19096552 2.8308749 5.5814852 370757.69 3 6 - 88000 519.1972 -3199.3527 0.27684477 617.26171 0.20041941 411 416 6.0069324 0.19025 2.8308749 5.5814852 375119.46 3 6 -Loop time of 0.239888 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 88000 519.1972 -3199.3527 0.27684477 617.26171 0.20041941 411 416 6.0069324 0.19025 2.8308749 5.5814852 375119.46 3 6 - 88014 519.1972 -3217.9152 0.27684477 617.26171 0.20041941 411 416 6.0069324 0.19021974 2.8308749 5.5814852 375119.46 3 6 -Loop time of 0.00669366 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 88000 519.1972 -3199.3527 0.27684477 617.26171 0.20041941 411 416 6.0069324 0.19025 2.8308749 5.5814852 375119.46 3 6 - 89000 524.26014 -3198.5355 0.3001416 1059.9631 0.18966948 432 431 6.0069324 0.19220225 2.8308749 5.5814852 375708.76 3 6 -Loop time of 0.241238 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 89000 524.26014 -3198.5355 0.3001416 1059.9631 0.18966948 432 431 6.0069324 0.19220225 2.8308749 5.5814852 375708.76 3 6 - 89014 524.26014 -3217.9158 0.3001416 1059.9631 0.18966948 432 431 6.0069324 0.19217202 2.8308749 5.5814852 375708.76 3 6 -Loop time of 0.00632095 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 89000 524.26014 -3198.5355 0.3001416 1059.9631 0.18966948 432 431 6.0069324 0.19220225 2.8308749 5.5814852 375708.76 3 6 - 90000 498.11952 -3200.0434 0.2737435 574.39407 0.20180726 96 141 6.0069324 0.19212222 2.8308749 5.5814852 380021.68 3 6 -Loop time of 0.240092 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 90000 498.11952 -3200.0434 0.2737435 574.39407 0.20180726 96 141 6.0069324 0.19212222 2.8308749 5.5814852 380021.68 3 6 - 90013 498.11952 -3217.9105 0.2737435 574.39407 0.20180726 96 141 6.0069324 0.19209448 2.8308749 5.5814852 380021.68 3 6 -Loop time of 0.00614023 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 90000 498.11952 -3200.0434 0.2737435 574.39407 0.20180726 96 141 6.0069324 0.19212222 2.8308749 5.5814852 380021.68 3 6 - 91000 518.719 -3198.4974 0 1 0.38452588 128 139 6.0069324 0.19137363 2.8308749 5.5814852 386325.64 3 6 -Loop time of 0.240887 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 91000 518.719 -3198.4974 0 1 0.38452588 128 139 6.0069324 0.19137363 2.8308749 5.5814852 386325.64 3 6 - 91015 518.719 -3217.9166 0 1 0.38452588 128 139 6.0069324 0.19134209 2.8308749 5.5814852 386325.64 3 6 -Loop time of 0.00709724 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 91000 518.719 -3198.4974 0 1 0.38452588 128 139 6.0069324 0.19137363 2.8308749 5.5814852 386325.64 3 6 - 92000 489.88256 -3197.3306 0.22381505 180.28261 0.22296478 554 556 6.0069324 0.19186957 2.8308749 5.5814852 387621.28 3 6 -Loop time of 0.241415 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 92000 489.88256 -3197.3306 0.22381505 180.28261 0.22296478 554 556 6.0069324 0.19186957 2.8308749 5.5814852 387621.28 3 6 - 92014 489.88256 -3217.9165 0.22381505 180.28261 0.22296478 554 556 6.0069324 0.19184037 2.8308749 5.5814852 387621.28 3 6 -Loop time of 0.00761282 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 92000 489.88256 -3197.3306 0.22381505 180.28261 0.22296478 554 556 6.0069324 0.19186957 2.8308749 5.5814852 387621.28 3 6 - 93000 470.86218 -3199.1842 0 1 0.35506745 275 567 6.0069324 0.19339785 2.8308749 5.5814852 388253.6 3 6 -Loop time of 0.242326 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 93000 470.86218 -3199.1842 0 1 0.35506745 275 567 6.0069324 0.19339785 2.8308749 5.5814852 388253.6 3 6 - 93015 470.86218 -3217.9141 0 1 0.35506745 275 567 6.0069324 0.19336666 2.8308749 5.5814852 388253.6 3 6 -Loop time of 0.006814 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 93000 470.86218 -3199.1842 0 1 0.35506745 275 567 6.0069324 0.19339785 2.8308749 5.5814852 388253.6 3 6 - 94000 500.15102 -3200.7696 0.21997392 164.90621 0.2245099 547 552 6.0069324 0.19425532 2.8308749 5.5814852 390879.44 3 6 -Loop time of 0.239427 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 94000 500.15102 -3200.7696 0.21997392 164.90621 0.2245099 547 552 6.0069324 0.19425532 2.8308749 5.5814852 390879.44 3 6 - 94014 500.15102 -3217.9143 0.21997392 164.90621 0.2245099 547 552 6.0069324 0.19422639 2.8308749 5.5814852 390879.44 3 6 -Loop time of 0.00671053 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 94000 500.15102 -3200.7696 0.21997392 164.90621 0.2245099 547 552 6.0069324 0.19425532 2.8308749 5.5814852 390879.44 3 6 - 95000 490.13908 -3196.2455 0.24009629 263.06397 0.21629301 404 411 6.0069324 0.19329474 2.8308749 5.5814852 393723.55 3 6 -Loop time of 0.240334 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 95000 490.13908 -3196.2455 0.24009629 263.06397 0.21629301 404 411 6.0069324 0.19329474 2.8308749 5.5814852 393723.55 3 6 - 95014 490.13908 -3217.9156 0.24009629 263.06397 0.21629301 404 411 6.0069324 0.19326626 2.8308749 5.5814852 393723.55 3 6 -Loop time of 0.00659347 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 95000 490.13908 -3196.2455 0.24009629 263.06397 0.21629301 404 411 6.0069324 0.19329474 2.8308749 5.5814852 393723.55 3 6 - 96000 487.33226 -3198.9357 0 1 0.37635306 275 567 6.0069324 0.19283333 2.8308749 5.5814852 397503.57 3 6 -Loop time of 0.239501 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 96000 487.33226 -3198.9357 0 1 0.37635306 275 567 6.0069324 0.19283333 2.8308749 5.5814852 397503.57 3 6 - 96016 487.33226 -3217.9155 0 1 0.37635306 275 567 6.0069324 0.1928012 2.8308749 5.5814852 397503.57 3 6 -Loop time of 0.00752759 on 4 procs for 16 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 96000 487.33226 -3198.9357 0 1 0.37635306 275 567 6.0069324 0.19283333 2.8308749 5.5814852 397503.57 3 6 - 97000 474.12539 -3199.8196 0.35035926 3399.8667 0.16411988 543 577 6.0069324 0.19291753 2.8308749 5.5814852 402607.83 3 6 -Loop time of 0.241445 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 97000 474.12539 -3199.8196 0.35035926 3399.8667 0.16411988 543 577 6.0069324 0.19291753 2.8308749 5.5814852 402607.83 3 6 - 97014 474.12539 -3217.9109 0.35035926 3399.8667 0.16411988 543 577 6.0069324 0.19288969 2.8308749 5.5814852 402607.83 3 6 -Loop time of 0.00657606 on 4 procs for 14 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 97000 474.12539 -3199.8196 0.35035926 3399.8667 0.16411988 543 577 6.0069324 0.19291753 2.8308749 5.5814852 402607.83 3 6 - 98000 529.81368 -3198.9595 0.31966379 1667.4989 0.18016803 219 257 6.0069324 0.19226531 2.8308749 5.5814852 408103.05 3 6 -Loop time of 0.239002 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 98000 529.81368 -3198.9595 0.31966379 1667.4989 0.18016803 219 257 6.0069324 0.19226531 2.8308749 5.5814852 408103.05 3 6 - 98013 529.81368 -3217.9152 0.31966379 1667.4989 0.18016803 219 257 6.0069324 0.1922398 2.8308749 5.5814852 408103.05 3 6 -Loop time of 0.00612688 on 4 procs for 13 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 98000 529.81368 -3198.9595 0.31966379 1667.4989 0.18016803 219 257 6.0069324 0.19226531 2.8308749 5.5814852 408103.05 3 6 - 99000 521.70465 -3199.4429 0.069318452 4.9968747 0.27842895 404 399 6.0069324 0.19121212 2.8308749 5.5814852 410506.47 3 6 -Loop time of 0.239787 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 99000 521.70465 -3199.4429 0.069318452 4.9968747 0.27842895 404 399 6.0069324 0.19121212 2.8308749 5.5814852 410506.47 3 6 - 99015 521.70465 -3217.9162 0.069318452 4.9968747 0.27842895 404 399 6.0069324 0.19118315 2.8308749 5.5814852 410506.47 3 6 -Loop time of 0.00708294 on 4 procs for 15 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 99000 521.70465 -3199.4429 0.069318452 4.9968747 0.27842895 404 399 6.0069324 0.19121212 2.8308749 5.5814852 410506.47 3 6 - 100000 513.67972 -3199.6382 0.37912459 6628.3181 0.14750449 554 556 6.0069324 0.19018 2.8308749 5.5814852 415873.98 3 6 -Loop time of 0.239291 on 4 procs for 1000 steps with 577 atoms - -Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] - 100000 513.67972 -3199.6382 0.37912459 6628.3181 0.14750449 554 556 6.0069324 0.19018 2.8308749 5.5814852 415873.98 3 6 - 100015 513.67972 -3217.9139 0.37912459 6628.3181 0.14750449 554 556 6.0069324 0.19015148 2.8308749 5.5814852 415873.98 3 6 -Loop time of 0.00685054 on 4 procs for 15 steps with 577 atoms - -Final hyper stats ... - -Cummulative quantities for fix hyper: - hyper time = 415874 - event timesteps = 3 - # of atoms in events = 6 -Quantities for this hyper run: - event timesteps = 3 - # of atoms in events = 6 - max length of any bond = 5.58149 - max drift distance of any atom = 2.83087 - fraction of steps & bonds with zero bias = 0.19018 -Current quantities: - ave bonds/atom = 6.00693 - -Loop time of 25.9832 on 4 procs for 100000 steps with 577 atoms - -Performance: 1662.613 ns/day, 0.014 hours/ns, 3848.641 timesteps/s -100.4% CPU use with 4 MPI tasks x no OpenMP threads - -Hyper stats: - Dynamics time (%) = 24.8121 (95.4928) - Quench time (%) = 0.715868 (2.75512) - Other time (%) = 0.879782 (3.38596) - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 17.954 | 18.433 | 18.794 | 8.4 | 70.94 -Neigh | 1.4147 | 1.4662 | 1.5092 | 2.9 | 5.64 -Comm | 2.0975 | 2.2026 | 2.3076 | 5.6 | 8.48 -Output | 0.0030999 | 0.0031937 | 0.003444 | 0.3 | 0.01 -Modify | 2.6366 | 2.9984 | 3.4835 | 19.3 | 11.54 -Other | | 0.8798 | | | 3.39 - -Nlocal: 144.25 ave 150 max 139 min -Histogram: 1 0 1 0 0 0 1 0 0 1 -Nghost: 533.25 ave 538 max 527 min -Histogram: 1 0 0 0 1 0 0 0 1 1 -Neighs: 3359.25 ave 3495 max 3245 min -Histogram: 1 0 1 0 0 1 0 0 0 1 - -Total # of neighbors = 13437 -Ave neighs/atom = 23.2877 -Neighbor list builds = 10069 -Dangerous builds = 0 -Total wall time: 0:00:26 diff --git a/examples/hyper/log.10Oct18.hyper.local.g++.16 b/examples/hyper/log.10Oct18.hyper.local.g++.16 deleted file mode 100644 index 480fcf0248..0000000000 --- a/examples/hyper/log.10Oct18.hyper.local.g++.16 +++ /dev/null @@ -1,993 +0,0 @@ -LAMMPS (10 Oct 2018) -# 3d EAM surface for local HD - -# nearest neighbor distance = a * sqrt(2)/2 = 2.77 Angs for Pt with a = 3.92 -# hop event on (100) surface is same distance -# exchange event is 2 atoms moving same distance - -variable Tequil index 400.0 -variable Vmax index 0.4 -variable qfactor index 0.3 -variable cutbond index 3.2 -variable Dcut index 10.0 -variable cutevent index 1.1 -variable alpha index 200.0 -variable boost index 4000.0 -variable ghostcut index 12.0 -variable steps index 1500 -variable nevent index 100 -variable nx index 8 -variable ny index 8 -variable zoom index 1.8 -variable seed index 826626413 -variable tol index 1.0e-15 -variable add index 37K - -units metal -atom_style atomic -atom_modify map array -boundary p p p -comm_modify cutoff ${ghostcut} -comm_modify cutoff 12.0 - -lattice fcc 3.92 -Lattice spacing in x,y,z = 3.92 3.92 3.92 -region box block 0 6 0 6 0 4 -create_box 2 box -Created orthogonal box = (0 0 0) to (23.52 23.52 15.68) - 2 by 4 by 2 MPI processor grid -create_atoms 1 box -Created 576 atoms - Time spent = 0.00108504 secs - -mass * 1.0 - -change_box all z final -0.1 5.0 boundary p p f - orthogonal box = (0 0 -0.392) to (23.52 23.52 19.6) - -# replicate in xy - -replicate ${nx} ${ny} 1 -replicate 8 ${ny} 1 -replicate 8 8 1 - orthogonal box = (0 0 -0.392) to (188.16 188.16 19.6) - 4 by 4 by 1 MPI processor grid - 36864 atoms - Time spent = 0.0028758 secs - -# add adatoms - -include adatoms.list.${add} -include adatoms.list.37K -create_atoms 1 single 27.5 9.5 4 -Created 1 atoms - Time spent = 0.000183105 secs -create_atoms 1 single 16 9 4 -Created 1 atoms - Time spent = 0.000178099 secs -create_atoms 1 single 10 12 4 -Created 1 atoms - Time spent = 0.000179768 secs -create_atoms 1 single 31 44 4 -Created 1 atoms - Time spent = 0.000184059 secs -create_atoms 1 single 13 17 4 -Created 1 atoms - Time spent = 0.000173807 secs -create_atoms 1 single 8.5 28.5 4 -Created 1 atoms - Time spent = 0.000167847 secs -create_atoms 1 single 23 26 4 -Created 1 atoms - Time spent = 0.000179052 secs -create_atoms 1 single 38 27 4 -Created 1 atoms - Time spent = 0.000169992 secs -create_atoms 1 single 37.5 4.5 4 -Created 1 atoms - Time spent = 0.000166178 secs -create_atoms 1 single 41.5 47.5 4 -Created 1 atoms - Time spent = 0.000172138 secs -create_atoms 1 single 20.5 37.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 5 8 4 -Created 1 atoms - Time spent = 0.00018096 secs -create_atoms 1 single 2.5 16.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 38.5 45.5 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 9 0 4 -Created 1 atoms - Time spent = 0.000168085 secs -create_atoms 1 single 39 32 4 -Created 1 atoms - Time spent = 0.000170946 secs -create_atoms 1 single 45.5 11.5 4 -Created 1 atoms - Time spent = 0.00018096 secs -create_atoms 1 single 40 0 4 -Created 1 atoms - Time spent = 0.000168085 secs -create_atoms 1 single 44.5 2.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 4.5 44.5 4 -Created 1 atoms - Time spent = 0.000168085 secs -create_atoms 1 single 24.5 13.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 47.5 23.5 4 -Created 1 atoms - Time spent = 0.00018096 secs -create_atoms 1 single 1 20 4 -Created 1 atoms - Time spent = 0.000166893 secs -create_atoms 1 single 38.5 31.5 4 -Created 1 atoms - Time spent = 0.000168085 secs -create_atoms 1 single 12.5 12.5 4 -Created 1 atoms - Time spent = 0.000169992 secs -create_atoms 1 single 2 27 4 -Created 1 atoms - Time spent = 0.000188828 secs -create_atoms 1 single 21 5 4 -Created 1 atoms - Time spent = 0.000174999 secs -create_atoms 1 single 47 12 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 32.5 46.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 9.5 40.5 4 -Created 1 atoms - Time spent = 0.000166893 secs -create_atoms 1 single 8.5 2.5 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 41.5 22.5 4 -Created 1 atoms - Time spent = 0.000174046 secs -create_atoms 1 single 29 11 4 -Created 1 atoms - Time spent = 0.000166893 secs -create_atoms 1 single 3.5 3.5 4 -Created 1 atoms - Time spent = 0.000165224 secs -create_atoms 1 single 5 21 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 46.5 31.5 4 -Created 1 atoms - Time spent = 0.000166178 secs -create_atoms 1 single 35 46 4 -Created 1 atoms - Time spent = 0.000183105 secs -create_atoms 1 single 40.5 41.5 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 10 22 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 43.5 14.5 4 -Created 1 atoms - Time spent = 0.000169992 secs -create_atoms 1 single 42 42 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 4 26 4 -Created 1 atoms - Time spent = 0.000174999 secs -create_atoms 1 single 19 34 4 -Created 1 atoms - Time spent = 0.000163078 secs -create_atoms 1 single 33 9 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 0.5 45.5 4 -Created 1 atoms - Time spent = 0.000163078 secs -create_atoms 1 single 30.5 32.5 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 25.5 5.5 4 -Created 1 atoms - Time spent = 0.000178099 secs -create_atoms 1 single 47.5 39.5 4 -Created 1 atoms - Time spent = 0.000165939 secs -create_atoms 1 single 15 13 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 21 21 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 14 28 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 9 34 4 -Created 1 atoms - Time spent = 0.000174999 secs -create_atoms 1 single 7 38 4 -Created 1 atoms - Time spent = 0.000175953 secs -create_atoms 1 single 11 35 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 20.5 45.5 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 30.5 31.5 4 -Created 1 atoms - Time spent = 0.000159979 secs -create_atoms 1 single 32.5 2.5 4 -Created 1 atoms - Time spent = 0.000166178 secs -create_atoms 1 single 21.5 3.5 4 -Created 1 atoms - Time spent = 0.000157833 secs -create_atoms 1 single 23 12 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 4.5 33.5 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 46 43 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 42.5 45.5 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 4.5 10.5 4 -Created 1 atoms - Time spent = 0.000158072 secs -create_atoms 1 single 33.5 15.5 4 -Created 1 atoms - Time spent = 0.000157833 secs -create_atoms 1 single 24 5 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 13 16 4 -Created 1 atoms - Time spent = 0.000158072 secs -create_atoms 1 single 16.5 23.5 4 -Created 1 atoms - Time spent = 0.000156164 secs -create_atoms 1 single 45.5 28.5 4 -Created 1 atoms - Time spent = 0.000247002 secs -create_atoms 1 single 44.5 5.5 4 -Created 1 atoms - Time spent = 0.000156164 secs -create_atoms 1 single 27.5 46.5 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 44.5 12.5 4 -Created 1 atoms - Time spent = 0.000157833 secs -create_atoms 1 single 12 41 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 6 4 4 -Created 1 atoms - Time spent = 0.0001688 secs -create_atoms 1 single 31.5 10.5 4 -Created 1 atoms - Time spent = 0.00015521 secs -create_atoms 1 single 1 44 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 31 4 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 21 33 4 -Created 1 atoms - Time spent = 0.000156879 secs -create_atoms 1 single 3 33 4 -Created 1 atoms - Time spent = 0.000164032 secs -create_atoms 1 single 15 10 4 -Created 1 atoms - Time spent = 0.0001719 secs -create_atoms 1 single 28.5 22.5 4 -Created 1 atoms - Time spent = 0.000153065 secs -create_atoms 1 single 43 1 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 3.5 0.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 41 37 4 -Created 1 atoms - Time spent = 0.000153065 secs -create_atoms 1 single 18.5 43.5 4 -Created 1 atoms - Time spent = 0.000213146 secs -create_atoms 1 single 17 27 4 -Created 1 atoms - Time spent = 0.000159979 secs -create_atoms 1 single 3 5 4 -Created 1 atoms - Time spent = 0.000153065 secs -create_atoms 1 single 18.5 23.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 31.5 14.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 41 31 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 22 3 4 -Created 1 atoms - Time spent = 0.00015521 secs -create_atoms 1 single 14.5 40.5 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 9 38 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 36 42 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 33 22 4 -Created 1 atoms - Time spent = 0.000163078 secs -create_atoms 1 single 15.5 47.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 3 0 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 25.5 27.5 4 -Created 1 atoms - Time spent = 0.000176907 secs -create_atoms 1 single 2.5 28.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 29.5 28.5 4 -Created 1 atoms - Time spent = 0.000162125 secs -create_atoms 1 single 44.5 18.5 4 -Created 1 atoms - Time spent = 0.000152826 secs -create_atoms 1 single 26 40 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 41 27 4 -Created 1 atoms - Time spent = 0.000158072 secs -create_atoms 1 single 39.5 5.5 4 -Created 1 atoms - Time spent = 0.000155926 secs -create_atoms 1 single 3 38 4 -Created 1 atoms - Time spent = 0.000152826 secs -create_atoms 1 single 35 29 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 11 19 4 -Created 1 atoms - Time spent = 0.000164986 secs -create_atoms 1 single 18 1 4 -Created 1 atoms - Time spent = 0.000146866 secs -create_atoms 1 single 39.5 40.5 4 -Created 1 atoms - Time spent = 0.000146866 secs -create_atoms 1 single 46 17 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 1.5 23.5 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 28.5 23.5 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 10 28 4 -Created 1 atoms - Time spent = 0.000159979 secs -create_atoms 1 single 19 47 4 -Created 1 atoms - Time spent = 0.000148058 secs -create_atoms 1 single 10.5 16.5 4 -Created 1 atoms - Time spent = 0.000147104 secs -create_atoms 1 single 38 45 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 42.5 41.5 4 -Created 1 atoms - Time spent = 0.000161886 secs -create_atoms 1 single 47.5 42.5 4 -Created 1 atoms - Time spent = 0.000147104 secs -create_atoms 1 single 38 7 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 10 44 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 29.5 27.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 45 30 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 3 9 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 8.5 35.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 24 44 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 47 4 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 7.5 8.5 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 32.5 41.5 4 -Created 1 atoms - Time spent = 0.000157833 secs -create_atoms 1 single 0.5 34.5 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 11 8 4 -Created 1 atoms - Time spent = 0.000147104 secs -create_atoms 1 single 2 40 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 25 24 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 47.5 6.5 4 -Created 1 atoms - Time spent = 0.000147104 secs -create_atoms 1 single 39.5 28.5 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 17 21 4 -Created 1 atoms - Time spent = 0.000164032 secs -create_atoms 1 single 32 43 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 16.5 29.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 34 34 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 11.5 3.5 4 -Created 1 atoms - Time spent = 0.000154018 secs -create_atoms 1 single 39 22 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 24.5 36.5 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 33 31 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 35.5 35.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 14.5 34.5 4 -Created 1 atoms - Time spent = 0.000146866 secs -create_atoms 1 single 34 28 4 -Created 1 atoms - Time spent = 0.000153065 secs -create_atoms 1 single 37 41 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 33 46 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 27.5 28.5 4 -Created 1 atoms - Time spent = 0.000145197 secs -create_atoms 1 single 40.5 22.5 4 -Created 1 atoms - Time spent = 0.000150919 secs -create_atoms 1 single 27.5 1.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 12 2 4 -Created 1 atoms - Time spent = 0.000151873 secs -create_atoms 1 single 36 43 4 -Created 1 atoms - Time spent = 0.000144005 secs -create_atoms 1 single 28.5 9.5 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 20.5 25.5 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 3 3 4 -Created 1 atoms - Time spent = 0.000144005 secs -create_atoms 1 single 38 33 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 3 20 4 -Created 1 atoms - Time spent = 0.000154972 secs -create_atoms 1 single 35 11 4 -Created 1 atoms - Time spent = 0.000145912 secs -create_atoms 1 single 5 25 4 -Created 1 atoms - Time spent = 0.000144005 secs -create_atoms 1 single 36.5 6.5 4 -Created 1 atoms - Time spent = 0.000144005 secs -create_atoms 1 single 19.5 24.5 4 -Created 1 atoms - Time spent = 0.000236988 secs -create_atoms 1 single 27 41 4 -Created 1 atoms - Time spent = 0.000169992 secs -create_atoms 1 single 39.5 11.5 4 -Created 1 atoms - Time spent = 0.000138998 secs -create_atoms 1 single 21.5 2.5 4 -Created 1 atoms - Time spent = 0.000136852 secs -create_atoms 1 single 46.5 15.5 4 -Created 1 atoms - Time spent = 0.000138998 secs -create_atoms 1 single 13 24 4 -Created 1 atoms - Time spent = 0.000137091 secs -create_atoms 1 single 11 37 4 -Created 1 atoms - Time spent = 0.000144005 secs -create_atoms 1 single 11.5 31.5 4 -Created 1 atoms - Time spent = 0.000144958 secs -create_atoms 1 single 47 0 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 25.5 17.5 4 -Created 1 atoms - Time spent = 0.00014019 secs -create_atoms 1 single 32 11 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 8 17 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 27.5 12.5 4 -Created 1 atoms - Time spent = 0.000137806 secs -create_atoms 1 single 25 7 4 -Created 1 atoms - Time spent = 0.000146151 secs -create_atoms 1 single 25.5 37.5 4 -Created 1 atoms - Time spent = 0.000139952 secs -create_atoms 1 single 12 15 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 1 7 4 -Created 1 atoms - Time spent = 0.000138998 secs -create_atoms 1 single 18.5 47.5 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 5 38 4 -Created 1 atoms - Time spent = 0.000136852 secs -create_atoms 1 single 42 19 4 -Created 1 atoms - Time spent = 0.000149012 secs -create_atoms 1 single 30.5 7.5 4 -Created 1 atoms - Time spent = 0.000138044 secs -create_atoms 1 single 42.5 7.5 4 -Created 1 atoms - Time spent = 0.000138998 secs -create_atoms 1 single 26.5 18.5 4 -Created 1 atoms - Time spent = 0.000153065 secs -create_atoms 1 single 18.5 1.5 4 -Created 1 atoms - Time spent = 0.000137091 secs -create_atoms 1 single 41.5 10.5 4 -Created 1 atoms - Time spent = 0.000140905 secs - -# define frozen substrate and mobile atoms - -region base block INF INF INF INF 0 1.8 -set region base type 2 - 18432 settings made for type -group base type 2 -18432 atoms in group base -group mobile type 1 -18616 atoms in group mobile - -# pair style - -pair_style eam/alloy -pair_coeff * * ptvoterlammps.eam Pt Pt - -neighbor 0.5 bin -neigh_modify every 1 delay 5 check yes - -fix 1 mobile nve -fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 ${seed} zero yes -fix 2 mobile langevin 400.0 ${Tequil} 1.0 ${seed} zero yes -fix 2 mobile langevin 400.0 400.0 1.0 ${seed} zero yes -fix 2 mobile langevin 400.0 400.0 1.0 826626413 zero yes - -timestep 0.005 - -compute tmobile mobile temp - -thermo 100 -thermo_modify temp tmobile -WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:488) - -# thermal equilibration - -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.07583 - ghost atom cutoff = 12 - binsize = 3.03792, bins = 62 62 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair eam/alloy, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.359 | 3.359 | 3.36 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -206220.22 0 -206220.22 -52155.664 - 100 188.18127 -206044.43 0 -205591.63 -25068.83 - 200 274.34464 -205860.78 0 -205200.66 -40191.797 - 300 325.66286 -205750.01 0 -204966.4 -31510.222 - 400 352.48242 -205675.42 0 -204827.28 -35058.064 - 500 370.88571 -205619.66 0 -204727.25 -32735.022 - 600 388.62129 -205592.87 0 -204657.78 -33904.556 - 700 389.54874 -205579.73 0 -204642.4 -32769.852 - 800 395.56074 -205576.82 0 -204625.03 -33755.948 - 900 398.03458 -205564.48 0 -204606.74 -32777.103 - 1000 401.24089 -205562.85 0 -204597.4 -33785.341 -Loop time of 4.3687 on 16 procs for 1000 steps with 37048 atoms - -Performance: 98.885 ns/day, 0.243 hours/ns, 228.901 timesteps/s -98.4% CPU use with 16 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 3.2988 | 3.3828 | 3.4667 | 2.3 | 77.43 -Neigh | 0.20856 | 0.23127 | 0.24382 | 1.9 | 5.29 -Comm | 0.33313 | 0.45075 | 0.55485 | 9.2 | 10.32 -Output | 0.00042987 | 0.00044042 | 0.00049591 | 0.0 | 0.01 -Modify | 0.18811 | 0.28363 | 0.36798 | 9.7 | 6.49 -Other | | 0.01983 | | | 0.45 - -Nlocal: 2315.5 ave 2332 max 2297 min -Histogram: 2 0 0 3 4 0 2 1 2 2 -Nghost: 3186.31 ave 3205 max 3170 min -Histogram: 2 1 3 0 2 3 2 1 0 2 -Neighs: 55590.9 ave 56174 max 55103 min -Histogram: 2 2 1 1 4 1 3 0 0 2 - -Total # of neighbors = 889454 -Ave neighs/atom = 24.0082 -Neighbor list builds = 105 -Dangerous builds = 0 -reset_timestep 0 - -# pin base so will not move during quenches - -fix freeze base setforce 0.0 0.0 0.0 - -# event detection - -compute event all event/displace ${cutevent} -compute event all event/displace 1.1 - -# hyper/local - -fix HL mobile hyper/local ${cutbond} ${qfactor} ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} -fix HL mobile hyper/local 3.2 ${qfactor} ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} -fix HL mobile hyper/local 3.2 0.3 ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} -fix HL mobile hyper/local 3.2 0.3 0.4 ${Tequil} ${Dcut} ${alpha} ${boost} -fix HL mobile hyper/local 3.2 0.3 0.4 400.0 ${Dcut} ${alpha} ${boost} -fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 ${alpha} ${boost} -fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 200.0 ${boost} -fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 200.0 4000.0 - -# thermo output - -thermo_style custom step temp pe f_HL f_HL[*] -WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:705) - -thermo_modify lost ignore -thermo_modify temp tmobile -WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:488) - -thermo ${nevent} -thermo 100 - -# dump - -region substrate block INF INF INF INF 1.8 3.8 -region adatoms block INF INF INF INF 3.8 INF -variable acolor atom rmask(base)+2*rmask(substrate)+3*rmask(adatoms) - -dump 1 all image 10000000 local.*.jpg v_acolor type size 1024 1024 zoom ${zoom} adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 -dump 1 all image 10000000 local.*.jpg v_acolor type size 1024 1024 zoom 1.8 adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 -dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green - -# run - -hyper ${steps} ${nevent} HL event min ${tol} ${tol} 1000 1000 dump 1 -hyper 1500 ${nevent} HL event min ${tol} ${tol} 1000 1000 dump 1 -hyper 1500 100 HL event min ${tol} ${tol} 1000 1000 dump 1 -hyper 1500 100 HL event min 1.0e-15 ${tol} 1000 1000 dump 1 -hyper 1500 100 HL event min 1.0e-15 1.0e-15 1000 1000 dump 1 -WARNING: Resetting reneighboring criteria during hyper (../hyper.cpp:133) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.07583 - ghost atom cutoff = 12 - binsize = 3.03792, bins = 62 62 7 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair eam/alloy, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix hyper/local, occasional - attributes: full, newton on, cut 10 - pair build: full/bin/atomonly - stencil: full/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 7.566 | 7.567 | 7.567 Mbytes -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 0 401.24089 -205562.85 0 0 0 1 0 0 0 0 0 0 0 0 4e+19 0 0 0 0 0 0 0 0 0 0 0 - 77 401.24089 -206534.96 0 0 0 1 0 0 0 0 0 0 0 0 4e+19 0 0 0 0 0 0 0 1540 0 0 0 -Loop time of 0.540347 on 16 procs for 77 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 0 401.24089 -205562.85 23.271302 74 0.18753621 1 6.0138739 703.62325 0 0.55802338 3.5350432 0 0 0 4e+19 10.115141 10.115141 0 0 0 0 0 0 0 0 0 - 100 399.15639 -205546.21 22.904368 90 0.32935524 0.39929142 6.0138739 703.62325 0.026229865 0.91517139 3.9968927 91.88 0.3995539 0.4009724 0.39695676 10.262823 10.262823 0 0 0 0 0 2000 0 0 0 -Loop time of 0.579085 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 100 399.15639 -205546.21 22.904368 90 0.32935524 0.39929142 6.0138739 703.62325 0.026229865 0.91517139 3.9968927 91.88 0.3995539 0.4009724 0.39695676 10.262823 10.262823 0 0 0 0 0 2000 0 0 0 - 184 399.15639 -206534.96 22.904368 90 0.32935524 0.39929142 6.0138739 703.62325 0.026229865 0.91517139 3.9968927 49.934783 0.21714886 0.4009724 0.39695676 10.262823 10.262823 0 0 0 0 0 3680 0 0 0 -Loop time of 0.556056 on 16 procs for 84 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 100 399.15639 -205546.21 22.903938 90 0.32935524 0.39929142 6.0138739 703.62325 0.026229865 0.91517139 3.9968927 91.88 0.3995539 0.4009724 0.39695676 10.262823 10.262823 0 0 0 0 0 2000 0 0 0 - 200 403.01717 -205543.17 20.844359 90 0.3291605 0.39888693 6.0138739 703.62325 0.039527213 0.94418421 4.0368484 90.95 0.39930574 0.4019706 0.39554353 10.262823 10.262823 0 0 0 0 0 4000 0 0 0 -Loop time of 0.581214 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 200 403.01717 -205543.17 20.844359 90 0.3291605 0.39888693 6.0138739 703.62325 0.039527213 0.94418421 4.0368484 90.95 0.39930574 0.4019706 0.39554353 10.262823 10.262823 0 0 0 0 0 4000 0 0 0 - 275 403.01717 -206534.96 20.844359 90 0.3291605 0.39888693 6.0138739 703.62325 0.039527213 0.94418421 4.0368484 66.145455 0.29040418 0.4019706 0.39554353 10.262823 10.262823 0 0 0 0 0 5500 0 0 0 -Loop time of 0.481812 on 16 procs for 75 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 200 403.01717 -205543.17 21.115577 91 0.3291605 0.39888693 6.0138739 703.62325 0.039527213 0.94418421 4.0368484 90.95 0.39930574 0.4019706 0.39554353 10.262823 10.262823 0 0 0 0 0 4000 0 0 0 - 300 399.01963 -205541.46 19.137336 85 0.32442182 0.39862755 6.0138739 703.62325 0.046873868 0.94776891 4.0368484 92.02 0.39912484 0.40296919 0.39497622 10.288936 10.288936 0 0 0 0 0 6000 0 0 0 -Loop time of 0.5757 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 300 399.01963 -205541.46 19.137336 85 0.32442182 0.39862755 6.0138739 703.62325 0.046873868 0.94776891 4.0368484 92.02 0.39912484 0.40296919 0.39497622 10.288936 10.288936 0 0 0 0 0 6000 0 0 0 - 377 399.01963 -206534.96 19.137336 85 0.32442182 0.39862755 6.0138739 703.62325 0.046873868 0.94776891 4.0368484 73.225464 0.31760598 0.40296919 0.39497622 10.288936 10.288936 0 0 0 0 0 7540 0 0 0 -Loop time of 0.514907 on 16 procs for 77 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 300 399.01963 -205541.46 19.137003 85 0.32442182 0.39862755 6.0138739 703.62325 0.046873868 0.94776891 4.0368484 92.02 0.39912484 0.40296919 0.39497622 10.288936 10.288936 0 0 0 0 0 6000 0 0 0 - 400 398.15351 -205544.87 20.470844 93 0.34589451 0.39828754 6.0138739 703.62325 0.049952465 0.94776891 4.0779385 92.0375 0.39894967 0.40395328 0.3932824 10.307052 10.307052 0 0 0 0 0 8000 0 0 0 -Loop time of 0.577371 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 400 398.15351 -205544.87 20.470844 93 0.34589451 0.39828754 6.0138739 703.62325 0.049952465 0.94776891 4.0779385 92.0375 0.39894967 0.40395328 0.3932824 10.307052 10.307052 0 0 0 0 0 8000 0 0 0 - 471 398.15351 -206534.96 20.470844 93 0.34589451 0.39828754 6.0138739 703.62325 0.049952465 0.94776891 4.0779385 78.163482 0.33881076 0.40395328 0.3932824 10.307052 10.307052 0 0 0 0 0 9420 0 0 0 -Loop time of 0.465473 on 16 procs for 71 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 400 398.15351 -205544.87 20.470689 93 0.34589451 0.39828754 6.0138739 703.62325 0.049952465 0.94776891 4.0779385 92.0375 0.39894967 0.40395328 0.3932824 10.307052 10.307052 0 0 0 0 0 8000 0 0 0 - 500 400.29399 -205544.98 17.051242 83 0.42140172 0.39805251 6.0138739 703.62325 0.056986933 1.0907861 4.0779385 91.986 0.39879563 0.40493836 0.39165573 10.307052 10.307052 0 0 0 0 0 10000 0 0 0 -Loop time of 0.579188 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 500 400.29399 -205544.98 17.051242 83 0.42140172 0.39805251 6.0138739 703.62325 0.056986933 1.0907861 4.0779385 91.986 0.39879563 0.40493836 0.39165573 10.307052 10.307052 0 0 0 0 0 10000 0 0 0 - 577 400.29399 -206534.96 17.051242 83 0.42140172 0.39805251 6.0138739 703.62325 0.056986933 1.0910651 4.0779385 79.710572 0.3455768 0.40493836 0.39165573 10.307052 10.307052 0 0 0 0 0 11540 0 0 0 -Loop time of 0.502193 on 16 procs for 77 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 500 400.29399 -205544.98 17.051107 83 0.42140172 0.39805251 6.0138739 703.62325 0.056986933 1.0910651 4.0779385 91.986 0.39879563 0.40493836 0.39165573 10.307052 10.307052 0 0 0 0 0 10000 0 0 0 - 600 400.96099 -205544.56 20.904479 91 0.41219484 0.39780769 6.0138739 703.62325 0.061331691 1.1358732 4.0779385 92.013333 0.39864794 0.40593806 0.39067432 10.307052 10.307052 0 0 0 0 0 12000 0 0 0 -Loop time of 0.694955 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 600 400.96099 -205544.56 20.904479 91 0.41219484 0.39780769 6.0138739 703.62325 0.061331691 1.1358732 4.0779385 92.013333 0.39864794 0.40593806 0.39067432 10.307052 10.307052 0 0 0 0 0 12000 0 0 0 - 680 400.96099 -206534.96 20.904479 91 0.41219484 0.39780769 6.0138739 703.62325 0.061331691 1.1358732 4.0779385 81.188235 0.35174818 0.40593806 0.39067432 10.307052 10.307052 0 0 0 0 0 13600 0 0 0 -Loop time of 0.529041 on 16 procs for 80 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 600 400.96099 -205544.56 20.904088 91 0.41219484 0.39780769 6.0138739 703.62325 0.061331691 1.1358732 4.0779385 92.013333 0.39864794 0.40593806 0.39067432 10.307052 10.307052 0 0 0 0 0 12000 0 0 0 - 700 397.78618 -205534.96 20.361513 95 0.54466603 0.39757442 6.0138739 703.62325 0.061146951 1.1853748 4.1995704 92.12 0.39850836 0.40693553 0.38981834 10.307052 10.307052 0 0 0 0 0 14000 0 0 0 -Loop time of 0.590093 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 700 397.78618 -205534.96 20.361513 95 0.54466603 0.39757442 6.0138739 703.62325 0.061146951 1.2139704 4.1995704 92.12 0.39850836 0.40693553 0.38981834 10.307052 10.307052 0 0 0 0 0 14000 0 0 0 - 790 397.78618 -206534.96 20.361513 95 0.54466603 0.39757442 6.0138739 703.62325 0.061146951 2.2107138 4.1995704 81.625316 0.35310868 0.40693553 0.38981834 10.307052 10.307052 0 0 0 0 0 15800 0 0 0 -Loop time of 0.594281 on 16 procs for 90 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 700 397.78618 -205534.96 20.236364 94 0.51088027 0.39757442 6.0138739 703.62325 0.061146951 2.2107138 4.205089 92.12 0.39850836 0.40693553 0.38981834 10.307052 10.307052 0 0 0 0 0 14000 1 2 6 - 800 399.66919 -205547.44 21.285461 94 0.56079766 0.39739855 6.0138739 703.62325 0.06556778 2.2107138 4.3041291 92.36625 0.3983806 0.40793368 0.38875 10.307052 10.385797 0 0 0 0 0 16000 1 2 6 -Loop time of 0.583824 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 800 399.66919 -205547.44 21.285461 94 0.56079766 0.39739855 6.0138739 703.62325 0.06556778 2.2107138 4.3041291 92.36625 0.3983806 0.40793368 0.38875 10.307052 10.385797 0 0 0 0 0 16000 1 2 6 - 872 399.66919 -206535.54 21.285461 94 0.56079766 0.39739855 6.0138739 703.62325 0.06556778 2.3177682 4.3041291 84.739679 0.36548679 0.40793368 0.38875 10.307052 10.385797 0 0 0 0 0 17440 1 2 6 -Loop time of 0.46886 on 16 procs for 72 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 800 399.66919 -205547.44 21.2852 94 0.44964213 0.39739855 6.0138739 703.62325 0.06556778 2.3177682 4.3041291 92.36625 0.3983806 0.40793368 0.38875 10.307052 10.385797 0 0 0 0 0 16000 2 4 13 - 900 401.5853 -205544.22 19.308189 94 0.47610389 0.39719191 6.0138739 703.62325 0.066991886 2.3177682 4.3041291 92.017778 0.39825974 0.40893337 0.3878576 10.307052 10.385797 0 0 0 0 0 18000 2 4 13 -Loop time of 0.585137 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 900 401.5853 -205544.22 19.308189 94 0.47610389 0.39719191 6.0138739 703.62325 0.066991886 2.3177682 4.3041291 92.017778 0.39825974 0.40893337 0.3878576 10.307052 10.385797 0 0 0 0 0 18000 2 4 13 - 975 401.5853 -206535.54 19.308189 94 0.47610389 0.39719191 6.0138739 703.62325 0.066991886 2.3177682 4.3041291 84.939487 0.36762438 0.40893337 0.3878576 10.307052 10.385797 0 0 0 0 0 19500 2 4 13 -Loop time of 0.502012 on 16 procs for 75 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 900 401.5853 -205544.22 19.307938 94 0.47610389 0.39719191 6.0138739 703.62325 0.066991886 2.3177682 4.3041291 92.017778 0.39825974 0.40893337 0.3878576 10.307052 10.385797 0 0 0 0 0 18000 2 4 13 - 1000 395.06218 -205526.35 17.514295 91 0.42044925 0.39716259 6.0138739 703.62325 0.067937867 2.3177682 4.3041291 92.511 0.39814962 0.40993184 0.3867545 10.307052 10.385797 0 0 0 0 0 20000 2 4 13 -Loop time of 0.588597 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1000 395.06218 -205526.35 17.514295 91 0.42044925 0.39716259 6.0138739 703.62325 0.067937867 2.3177682 4.3041291 92.511 0.39814962 0.40993184 0.3867545 10.307052 10.385797 0 0 0 0 0 20000 2 4 13 - 1083 395.06218 -206535.54 17.514295 91 0.42044925 0.39716259 6.0138739 703.62325 0.067937867 2.3177682 4.3041291 85.421053 0.36763584 0.40993184 0.3867545 10.307052 10.385797 0 0 0 0 0 21660 2 4 13 -Loop time of 0.543222 on 16 procs for 83 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1000 395.06218 -205526.35 17.514191 91 0.42044925 0.39716259 6.0138739 703.62325 0.067937867 2.3177682 4.3041291 92.511 0.39814962 0.40993184 0.3867545 10.307052 10.385797 0 0 0 0 0 20000 2 4 13 - 1100 400.04484 -205545.92 19.52012 89 0.58919981 0.39704631 6.0138739 703.62325 0.069136967 2.3177682 4.4265979 92.517273 0.39805636 0.41093134 0.38574293 10.307052 10.385797 0 0 0 0 0 22000 2 4 13 -Loop time of 0.590075 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1100 400.04484 -205545.92 19.52012 89 0.58919981 0.39704631 6.0138739 703.62325 0.069136967 2.3177682 4.4265979 92.517273 0.39805636 0.41093134 0.38574293 10.307052 10.385797 0 0 0 0 0 22000 2 4 13 - 1177 400.04484 -206535.53 19.52012 89 0.58919981 0.39704631 6.0138739 703.62325 0.069136967 2.3177682 4.4265979 86.464741 0.37201529 0.41093134 0.38574293 10.307052 10.385797 0 0 0 0 0 23540 2 4 13 -Loop time of 0.500839 on 16 procs for 77 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1100 400.04484 -205545.92 19.518413 89 0.429675 0.39705701 6.0137119 703.6043 0.069136967 2.3177682 4.4265979 92.517273 0.39805636 0.41093134 0.38574293 10.307052 10.385797 0 0 0 0 0 22000 3 6 19 - 1200 400.7462 -205543.2 21.169548 91 0.32511134 0.39679665 6.0137119 703.6043 0.06750442 2.3177682 4.4265979 92.376667 0.39796198 0.41191655 0.3846039 10.307052 10.385797 0 0 0 0 0 24000 3 6 19 -Loop time of 0.583971 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1200 400.7462 -205543.2 21.169548 91 0.32511134 0.39679665 6.0137119 703.6043 0.06750442 2.3177682 4.4265979 92.376667 0.39796198 0.41191655 0.3846039 10.307052 10.385797 0 0 0 0 0 24000 3 6 19 - 1277 400.7462 -206535.53 21.169548 91 0.32511134 0.39679665 6.0137119 703.6043 0.06750442 2.3177682 4.4265979 86.806578 0.37396584 0.41191655 0.3846039 10.307052 10.385797 0 0 0 0 0 25540 3 6 19 -Loop time of 0.509118 on 16 procs for 77 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1200 400.7462 -205543.2 21.169281 91 0.32511134 0.39679665 6.0137119 703.6043 0.06750442 2.3177682 4.4265979 92.376667 0.39796198 0.41191655 0.3846039 10.307052 10.385797 0 0 0 0 0 24000 3 6 19 - 1300 398.53702 -205539.33 21.35815 94 0.38773898 0.39659935 6.0137119 703.6043 0.067808168 2.3177682 4.4265979 92.500769 0.39786514 0.41289519 0.3846039 10.307052 10.385797 0 0 0 0 0 26000 3 6 19 -Loop time of 0.587306 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1300 398.53702 -205539.33 21.35815 94 0.38773898 0.39659935 6.0137119 703.6043 0.067808168 2.3177682 4.4265979 92.500769 0.39786514 0.41289519 0.3846039 10.307052 10.385797 0 0 0 0 0 26000 3 6 19 - 1375 398.53702 -206535.53 21.35815 94 0.38773898 0.39659935 6.0137119 703.6043 0.067808168 2.3177682 4.4265979 87.455273 0.37616341 0.41289519 0.3846039 10.307052 10.385797 0 0 0 0 0 27500 3 6 19 -Loop time of 0.483781 on 16 procs for 75 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1300 398.53702 -205539.33 21.35787 94 0.38773898 0.39659935 6.0137119 703.6043 0.067808168 2.3177682 4.4265979 92.500769 0.39786514 0.41289519 0.3846039 10.307052 10.385797 0 0 0 0 0 26000 3 6 19 - 1400 402.80537 -205549.3 19.481887 95 0.32554201 0.39648737 6.0137119 703.6043 0.069550538 2.3177682 4.4265979 92.666429 0.39776836 0.41389491 0.38420043 10.307052 10.385797 0 0 0 0 0 28000 3 6 19 -Loop time of 0.586411 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1400 402.80537 -205549.3 19.481887 95 0.32554201 0.39648737 6.0137119 703.6043 0.069550538 2.3177682 4.4265979 92.666429 0.39776836 0.41389491 0.38420043 10.307052 10.385797 0 0 0 0 0 28000 3 6 19 - 1471 402.80537 -206535.53 19.481887 95 0.32554201 0.39648737 6.0137119 703.6043 0.069550538 2.3177682 4.4265979 88.193746 0.37856948 0.41389491 0.38420043 10.307052 10.385797 0 0 0 0 0 29420 3 6 19 -Loop time of 0.473799 on 16 procs for 71 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1400 402.80537 -205549.3 19.481632 95 0.32554201 0.39648737 6.0137119 703.6043 0.069550538 2.3177682 4.4265979 92.666429 0.39776836 0.41389491 0.38420043 10.307052 10.385797 0 0 0 0 0 28000 3 6 19 - 1500 402.0803 -205537.7 20.903964 99 0.3340498 0.39635609 6.0137119 703.6043 0.070409086 2.3177682 4.4265979 92.857333 0.39767858 0.41489448 0.38372784 10.333041 10.385797 0 0 0 0 0 30000 3 6 19 -Loop time of 0.587342 on 16 procs for 100 steps with 37048 atoms - -Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] f_HL[22] f_HL[23] - 1500 402.0803 -205537.7 20.903964 99 0.3340498 0.39635609 6.0137119 703.6043 0.070409086 2.3177682 4.4265979 92.857333 0.39767858 0.41489448 0.38372784 10.333041 10.385797 0 0 0 0 0 30000 3 6 19 - 1574 402.0803 -206535.53 20.903964 99 0.3340498 0.39635609 6.0137119 703.6043 0.070409086 2.3177682 4.4265979 88.491741 0.37898213 0.41489448 0.38372784 10.333041 10.385797 0 0 0 0 0 31480 3 6 19 -Loop time of 0.493982 on 16 procs for 74 steps with 37048 atoms - -Final hyper stats ... - -Cummulative quantities for fix hyper: - hyper time = 30000 - event timesteps = 3 - # of atoms in events = 6 -Quantities for this hyper run: - event timesteps = 3 - # of atoms in events = 6 - max length of any bond = 4.4266 - max drift distance of any atom = 2.31777 - fraction of steps & bonds with zero bias = 0.0704091 -Current quantities: - ave bonds/atom = 6.01371 -Cummulative quantities specific tofix hyper/local: - # of new bonds formed = 19 - max bonds/atom = 13 -Quantities for this hyper run specific to fix hyper/local: - ave boosted bonds/step = 92.8573 - ave boost coeff of all bonds = 0.397679 - max boost coeff of any bond = 0.414894 - min boost coeff of any bond = 0.383728 - max dist from my box of any non-maxstrain bond ghost atom = 10.333 - max dist from my box of any bond ghost atom = 10.3858 - count of ghost bond neighbors not found on reneighbor steps = 0 - lost bond partners = 0 - ave bias coeff for lost bond partners = 0 - bias overlaps = 0 - non-matching bias coeffs = 0 - CPU time for bond builds = 0.044807 -Current quantities specific to fix hyper/local: - neighbor bonds/bond = 703.604 - ave boost coeff for all bonds = 0.396356 - -Loop time of 17.9972 on 16 procs for 1500 steps with 37048 atoms - -Performance: 36.006 ns/day, 0.667 hours/ns, 83.346 timesteps/s -120.7% CPU use with 16 MPI tasks x no OpenMP threads - -Hyper stats: - Dynamics time (%) = 8.87027 (49.2869) - Quench time (%) = 8.15972 (45.3388) - Other time (%) = 1.2212 (6.78552) - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 11.6 | 11.848 | 12.043 | 3.9 | 65.83 -Neigh | 0.50025 | 0.52638 | 0.55163 | 2.1 | 2.92 -Comm | 0.34528 | 0.49905 | 0.66742 | 13.3 | 2.77 -Output | 0.0021305 | 0.0021461 | 0.0022686 | 0.1 | 0.01 -Modify | 3.7498 | 3.9009 | 3.9786 | 2.8 | 21.67 -Other | | 1.221 | | | 6.79 - -Nlocal: 2315.5 ave 2361 max 2267 min -Histogram: 1 1 0 4 2 1 3 3 0 1 -Nghost: 3187.88 ave 3236 max 3141 min -Histogram: 1 0 3 2 2 1 4 1 1 1 -Neighs: 53950.6 ave 54989 max 53049 min -Histogram: 2 0 3 2 1 2 4 1 0 1 -FullNghs: 542951 ave 554654 max 533224 min -Histogram: 1 2 3 1 2 2 2 2 0 1 - -Total # of neighbors = 8687214 -Ave neighs/atom = 234.485 -Neighbor list builds = 165 -Dangerous builds = 0 -Total wall time: 0:00:22 From de99dc89745992c4d1359f02e9029d8bc7c1ac1c Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 09:54:28 -0600 Subject: [PATCH 123/243] new output files --- examples/hyper/global.000000.jpg | Bin 0 -> 72265 bytes examples/hyper/global.041000.jpg | Bin 0 -> 71974 bytes examples/hyper/global.045000.jpg | Bin 0 -> 71275 bytes examples/hyper/global.048000.jpg | Bin 0 -> 71049 bytes examples/hyper/global.089000.jpg | Bin 0 -> 71079 bytes examples/hyper/local.000000.jpg | Bin 0 -> 493761 bytes examples/hyper/local.001200.jpg | Bin 0 -> 490252 bytes examples/hyper/log.25Mar19.hyper.global.g++.4 | 1250 +++++++++++++++++ examples/hyper/log.25Mar19.hyper.local.g++.16 | 1002 +++++++++++++ 9 files changed, 2252 insertions(+) create mode 100644 examples/hyper/global.000000.jpg create mode 100644 examples/hyper/global.041000.jpg create mode 100644 examples/hyper/global.045000.jpg create mode 100644 examples/hyper/global.048000.jpg create mode 100644 examples/hyper/global.089000.jpg create mode 100644 examples/hyper/local.000000.jpg create mode 100644 examples/hyper/local.001200.jpg create mode 100644 examples/hyper/log.25Mar19.hyper.global.g++.4 create mode 100644 examples/hyper/log.25Mar19.hyper.local.g++.16 diff --git a/examples/hyper/global.000000.jpg b/examples/hyper/global.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3064ece7f13d6aaa0dfe45c561235474a86df0af GIT binary patch literal 72265 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 NhOGTX2w`L3e*k{X7#siq literal 0 HcmV?d00001 diff --git a/examples/hyper/global.041000.jpg b/examples/hyper/global.041000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f5253865ec2b0eb87d99bc21e28e5b9fe685b31 GIT binary patch literal 71974 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 $cWiMj+bEAHICXS#MltvkO()i!` zwdC=BwcTbi?d?&Epl`qfOY!oEW*}x zxozt{N5^cIESb=uzE;N*YYEX;_%CwY^8CfVS^fQ5ZXc<4VGfQEXQ5N2&1oZ+ zLLrk!7t-t#<$4R_5;YCzk`nDFagVc{)Qi{X~2pTIxR{Pl-OwS0z zmdq%2e;PcTtKML2O2>$q!Qw6JpG$ozxDhW@+8IO5%{Hi`T_^m1>* z$5x9lxJxANXn(ipX3vAH^EK=HEMGQGCDdtiFzS^|H{63WtWnoiqk_?w@W% zOu9AR#ISXl)SWPPS6X{lbxyb#**|sVV{5B>?hO~QKD8PCc{kj(YDjFn$fjq2*l}2V zzP}W)^5KUwf_kz#nEdg9mtje0q6;Ss4YN!XosNKZr8lc?-Lev;kv+&z*`cI*!f+tF z2J<03^KC^wA2WI_Uj!ft9@ISw0aj<07l$~Qd~N9f1KeFbHA_+i?_k$>!S8-B*P*88 za42861U1(_@Jp}SyQ4oRs#zwHS)>O*@@L!T=lxyuW(rV6n6^nSD%cKB2@kOn<8x?i7K}9 z3}3(6tlig74D~X%eQR>c+YNVCs(P3=>Nd|4J0@%dZdj`YU|b|0yCPp{Vw=+UV3CyiEs;n{uj z>dY_h9$p0KF@DlL=C%~oq${L6d9ksjN;{I%cjQw4@xp5;+*AnX$y%4&`PJ^~KRC2T zH=e3Yh#5#z21ccb+O!?qz~1m$4fH|z91$-;H@uEXSNQ^5R$V}FuUFIsn{Gk0pg{_| z4u*ggf={_SyvqNQPdj$p-WG+Smx!O#((+J6?&@piaJ6m#;=(&|#(!|^{=s3nDJEPR z7sceok`Q!W7-6aNtt(Fma60C^i9y5s^A`0JQTa1#T9Gqg@ya&s>od9uEjhzt*7sLs zdr&VMyksT&9d|MAPL=@t?UOCf!&ZG$h31eZnxE-!OPXWK5Yo5hwEcdgw=aFS zG?slU;*U~R4Fc&1Ve^7_p&l2_v-SfX>O`UdmwM}a6E08Ya+=}F^(>%;p_3R`4IX@t z4#l|p5`eE9E_UtTP!1-4VHVEU^;ttb374a*)xfn=J0+QE{*V*oNv{bK@V_jSM~gGH zC#P)B7z^~RS%agLKPf5iDC*av8RG50Xy!~k1A|X70o+}yEZqe(e|^)cs`*?WE7*b{ zs5Q-Sp}|ve;$Sq&7~GgMD7)efj|X9pdOI3aXlo5}WJ;ubW$sU~^$ z(5rpo@pe0l!*m*rvzQ6HrHmw0VZtR!@_W6gwTH$R_n=b*o4-29n&flw&2J6B8f@e- z%3o7cB@oW~jr!0il5M5WMyy27+~u;qBgQ|G5iq0Tg(Y`-%aU9cRwha-Vb#@ItLjF> zR)hw1*=p8HU$Z5;l4if;CBa$r*&Bat_LmN-Rb6IOMs>_rVt#+*N8D ze%#l|XQf90Qs(I-Dc{S4j=>&Z(*6dCST#uMHw5tr8r;m`JqMP>$&!WOM&LYIqkB3P~e&8ZvL1; zym>p$XWtIc!r8UwMPX;Fbo|<0Sgq#^)h6+-U*PP-UV{b^X6I>rE@M!t@q$5OFT398 z*3;7&ZU2PC0Asa-JNTr2szT-*GpAB)Ms*&$=Jzfq#UjT zW@nW0Tl{w;P`fI5l%wmxR~u$why;y`sz~XwN#k&7G~IDQ34a|u7C-okhD#!l3f4f=G7$hu(T zI6lKb7o!bY1Es}VOPDiAq1zZSnPS@u7o%QOoV&R4s0g(ChM=oYCzWNdifzc``>>z(1>W6 zuz@&!Up4yJ6)vcH(EU9s?jlqvIcjbIj0M)X&#=5#Xk#x)?l10vjpOY#WMn1pssn<1 z7VJ+-JYz8c`u@b4W<8ci)C~6^BECEPmyz0{+2~OhOO+SPb)_DlD`5qcz}c7eDGIP^ z=<|z1;f<;iJ{ZwQ?4aQerB#_pbg0o}MaEvr-0ol#5?^42A$&RfNZBi7`)uA+R^8eG zM0uL}>1?KYj5ul9axk#8IBTPOvcYl*wmJ}fs^j~jols*Wu1Y3n5Ye~ow^4?0#$}YV z+yqs&(t7+&z}DcP#q5+es|QqR)Ob*BcR>A93Il5Gws~^JjH1Uh_ z{?l}8WmlE7&8nK>wCy6WdY44PnxsBI*)#gs$Vr4gw7e&qjKA014zk!mk3ZV=p`8a- zO84gHoYO`PnRFZnxNbH1gtdz#Wy2#q!^F8vqjcng%d1+`wq`>U*~AVow`~qw%Wx)< z2Ql{TJh#NUn}_g?>LDM)org}#@q!g%;2pODe6TaEVi@$7iqEotJ*T3;Xr? zp2mk3948#Dc*eqD*On_8>C2K~xzeV(-(rQMxM9px(YLH%YZ`UfnGErh4Vsx8*=00e z{cI-07c~qA=4ZQI$Rn-aCPpzFfML%X_Z|OfP-g)aL9tlk889eY9`xF48ad zl%8++a#y6W(&@q&vT&sJ)=6!@5}Q-xEXy2g@q5~#d2PksFH8A^2V@P515$0zKlNYZ zg}towo)|ex3`Aum@NYwij=0hHB`>UdXDJ?d<8Ra+K55G{6cU|fifn5tzfFhpos;mj z@^AxnFBn%#)o^u6i&U>_N~k#ZkzY(k!SXbFXS&&s9G4#guA4q=7*B}x zCz&e0&D$^0UW+`W>#ev&W_dM8S5Wnyv^66>sye1N94S_FbgYJUAZ$sZziM4u1( zw65rj5h*0L6Zq$5Zk$zL=rtTH6hLlu&eCYt(`PAC;GvfpijZN`h5m8r{k4e0*1IRk zw=au7`!AB#!7-G2@1O7)17^f*9{eCptgDB;dfJ`|;nTJV0R-V%v{b;qDi??HdS*@KsT|-BTLfDHCS6 zE;p7ecUmxbhB5S((eNfV>}M-`)*}VwV|oRutUj4cOM!`8QYy=u6>Tq(a^&io zNSNrzOLJ)b6Tv%$7Ia*aG~+z15{Q4~@SOVB9ew(`!8b3BORWv}M0x@LBv$MwjQf4y49~zO z$C^Vo7S9k^5yd|P8!7f7y+;wO_KpOx)b(iI0+EE=g-FNgJioSOs^ik!x=c9rtF*wO zl%oyP^5=gdmF3s4YRg@vrmCr|J8m|WQ)k~E4eTSHVlwP)PUY5DYB~*>$Mc-rg^5Xw zxNB=DLnYhJp>|<_?=kcunBI!wW67$%^XY5So}G?oQigu9VeyfA!TIAw^767fO_UhR zcI~luH8qtHvg9k;Yxho;!Vb>GiN~pkSc_4{rKuCcy72($<4V0;iLqK{U)6l6yRJL2MDEn(A7DDYmE9K6rv= zS(5HWoqW-oz2AEMBU8kDfl>GR(PC@2s__+%MEtr0tqGaA@@0jAEcP9W-D*@YJ`>bb z7`O1-8GYempql$i0-HK(fc}0_adaZ8KzOIUy$umw8DzIMb;8Z@W?unFlrwU9JVl)I zh*U2}Zz}Y2E;Sw zODfdkUKu5?pTDEnYSqVk@m|qa888xT_a(OS(#vfbpUy!w=FgPFa=o2`}&pneE|Ziyc_mc;Z)HqeSEhy}%lYU+ACej}A4#QMrej@<2SH5YXU$iosN$qJDP_Cg>F>rMA zyb)lhaCjjK?e$?9v>bjDY3mb@R+-3<;}^Z&@j4(%d%-urK>5d++GlX}$^t{n(z{eu zks>H~Xy=d76i*U9Z~#2ogbR}+VxN|U${KzpUwZ13hlMsCKjHk-q9tyL3)wtE2$0v0 zd5w9}+6FIUn_wE0>SL;lMK|-)$R*;(?`r}l7ubGItR~v*c@KJ2HMiGw{)x{N7iV6? zgTtFfN#ZyyuZfO<&Blr_X;#m$w6NZpMO>LzWZ2S#pLyvhs!}5%s24&%qT8FK()z6+y*!i%>>8-&763Fch_2R7l^y0Sb$IvOI zl3#@ZB)u^>;&O8(O5QT!LHSuCWs!}jq$5>CP>WW{ZJfz4O@Vklbo9=GilgdAct>DV z(J^ngP z4gSRl?6S#?9>=ef9LhppPRV)^0{8dm17R$s`W&xm%g_yKP_`v|xaaMDnf?Sr zb=2c{`I&*b7EH|gup|irRid& zitpj!MYmEzQ3<5qS(p{iBp#)?vt<#8kh{@Oq>S47047gJ_|y=FE~`2ybGO>6LC(Z? zQ1&kVl(s|26_cXkdu`L!)H|B|s&VoQ`RrQvIC>Ki>E-hQUBz~OqkwK(Udl-Q{;uBO zR3^QhJotNUh(@99`@v@HBc>FnKmol~@n1g?t$T$!w+Xh1q6DimNIEq`e{f*kvzQsR zE|~!$an{3=oe~l8pe}cBk=`NJ1+6zDIVYLFuU}wy(OA4yrg4=|z#tzTv^{S9h{uB} zWU9K+?V200O+z_wG*w)lN|~G;b5jX=1;?YPjx4;R#;oYut_b*l8%ubuPsIDLrnl(E zT40dl(U}zBu+r(KwKwZYzewf9`I`F;fUksjToTVl?T@|%?d9Etkz!nF3(0*+9P(s7 zBLQo|zIbAVC$7Izv4Fv$*H5t|dUTeX4fdmmgg0ydTCAAX$GfFq}KN%ZPU%d|c9%e`6Gc%JSa*?+wYFHFI!L)QLHGklkP#hZSPv^W+ zl@a9HAcjQ?hDNgKkhUAYFpzV@>w00aKs;8QltlUZy%CEW%cpyOpvPAQILS`GVfTH$ zixQnre=L?Q0_3ppV;-2QiWn>=fu?dtzNzSQvw#O8#7h-z7%B(5L8m|k7ocT>W^+4X ztBH)|2u{Z|Xb4}PFhpitqkE)nY%M2~jlG3T9NK(jgS_~ZE`g6=gvQV>ro|WK?dW}I z*F3k|ryt!gx#|>_SKqN32Asr}h2v)SPHVg2_B4#g_i9ZUPLz>$p+!w|wxCpvx``*w zmTf8p;uJe$MSkrNCsdM|TEjxeM&0bTYc=zwYf=wh@^FmO8ru3XRed^dim7FV{g?fw zCzixHm^Nr&%vrA~rrg*<^l%8lKjalYBN7-Ca5aO1fqJ zdp8|bBA7l@-XWivvOaat_x{^@Kxi?7wdN8@G~980I71Qa6$@s}ajcC^4&4398KYay z$#H3nt38&%ELt(ry-``9wieixkm6o$1wINHUi`MV`E;X^rBZ`gX#yN#uudAFi}i%qx! zydc(CW(HkOmDxKjG7C9}<90>bT9KNp(o~%y1Ma$T(xhx=Er*KQ@2YrnL>w9wkEXB! z0wDn=o;1i6{$PMH6BZArSd_mUcpCUU~=#F-hckX*I-XHTxU zNZ|*E-0&9-)_wp+`J2eVu%N8Fl^5uh7aKlgv>&T%G~@MRg|lq$?U4-9HBmw&eqX>n zkNg~wTDkuvpWI{Y-%=85znXkir2N^##*NCPP+iLmy5jA+|Fok?4rnT>b#omX8TAuS zHraK^65V?qrLsJaE9vPr{jY{Pw90KA2R&$82(7lz^$kVVJoq4GUMzILIMz=Nj(9rn z9Wk9GOU!CRPh>x3c8-PC7uw|jjA zTva4*7*Eohv^ri*I?vzjtrrc)S*rUSU%cEk%^IO=$NQ$@R|CgV&ipwW0TVdpu7dsksanH)LynGcv`cCz!kN|8HW zO~mdDtv($5Hm_c%tjpaZ|KE0X2W(f4;Is^(){U5h8{vLUsm|8u`eWUZ_J;X1A81Nv zcLH0;azzYun>NUYH>SI_UaGwRCv_MzdK3qdJVKBs8{8IqO8ar4;XQvasU6jwa}%Rl zh&)ql%vc7*nZZCK6H-%mq1?)@QsqqxsW+XIEc9K?{+9@9y8^y52&sBGjIB1hMmOH| zxH9gxEWC@3kZtI`lhnQHU%Bm$U)4Jw)?)exhlc-H*a>`ExP6G&hlJt9-^=Dd_bH zOoi&IonEeLh>ZZ?RXZJV~C6Bu|Kl(~0ld!-7P0LSdiH~bj~FIXIu zEqa%SVJ}yM(KjD;h^OdCCv?=k(x82j)14V}{_1k$P`5^ht4si*wkD@82{lfKV zKZER5w@R7D7xIjB2S8&^%f&q`v>PF!wNh#M$!-&7z2%eo=UW*$SO#@eHG#G;M-Q7} zJZMGvr+xB5%;RDEQfwYePtkvOKtyM$0uElg(;HskRIR$6KRT~~U4a;v$ZCuRCoUnWm?U^HjKmOgQ>dh83`>sd1) znzYR+2XEF2REDPJ1I_L>R#|6iY5lj~rIJ7%4O)p0mSPVGR4|diKB?4JU^8@3x1(@)HB8XWx8=7$1o}H8%E}658B2>|#}hDsgYX zbg@dx`KwSZCp%OYzo+Gu!JuW+=9XJQ?SXDabAsD`M@{bBO^py%^mI3%9lQ=9%m(0d^o{(h|>+E3?KscGf;i<`$Qss3JOrhnmSFv z-C@M?s|EYVWCi6CLHOmctVH}pvFmC;2H1Zf;m|my^6_?xHo!4CA#G$mYnVFRqdAyw z)RwM9M2n=LL&7j*D8Ri-)6B*?Zn;M)y;VFS$biIC>~3-ut0f)rDtoE=pBqPqfi_&JKNnT=Pn6_~&b z=!3yh9tp=CohOfQdL2COLE;NK?iqr6-S(Wd5tMJ1d5Ce}kVNnTPam~_gfTK#9+Y?| z5^q)&P6Rwv)ciZsm{!7abL|WHT+f(N2>xPJ8}L{C+iUvgZo}j~;&pd!{1dZozE-|G zuZCSV8hnH9C`8JFS35%AJf(1dK=X_8T<7lf6{YVVAfpBB;CxILrxAV2DK8B9nk8Rc zw{~5fc9(2@XEuoTV3Q{@H0Uek7k|&83yQlYir<5Dj|R&SWbEUmEF3e zSVzwVV?z;4E=GM52zq)9v3Fleef>q_29Vb=||7-nN9JygoJ(&iO6s{o@oQ$e*|MI7htcl0z0fA}SRzUbtfl@tqKi$y3%Y?V! z+|piYk+-dino*33V@#YiVe;37tn8<|UqtD;XSe^atSRmL_?!HrejQE5IR&f70&>JA z%wI1JoE)w-25)A>TWXSJzYDpO%Hf8s-QsMHN2+Mip-_oIh_4v#+>h`NY}Tt!*h^l0 zCiv-}3O|HVUH0(r)Nk(HF5iCdJlHIcncSXuVQ;yhXXdhE-xuTXkwI>AJ7Qf!y@27p z4o7$YM2mXsx2>TFW_eZJyxb;b{c4mGayY@@E9c0B>5?-e(x@XHk1zb~^z$2aD_;-5 zoE{Uhv3_)slvm3&d*Fm)8y)&w#*60OYAGq~*y+ucs_U7^5mr2T1%R35S;Vgp7<%`+ zJV!p20{j-x+utkopeNh)5g890d!BNGSU|x+h*B{iate-L*@LKhsFSHfrxsJpL$C)z zEJHe%i1C`T`|g{GyA|)Q3TGCKN937mw1)&({uwaQ+M5ivcB!%LzxJeYCJt(o>3g*r z<6d~_A!bSR9rp;4%?}DPFey8I>bCk{ywunK;-!X*C?`_ah7m33e%=Sm^6yW?mA`QN zjoNv$CLrtUBCg(qFml!cJ-<#I2OB$G&^}%l%)#dIDMB3;%FSN~|+6ZHTs0okrBI z=2*yQGtpSI0U|{E)g!ksc3;DQ4rYWn?P9UPlGo0qsnUOqK0aK5$_&R8iKmKj&EBqv z-GmI0f#_p6h|!k**OMlw0C=Sd`%(n=52DfD?k{OTT9N5-rEUMiYigDM-Rp->{?A_j zY4q$#(C^o=$YB#E^Sdf&tH%Rd7t@p0Wbpl|HO@<43Ex|dLmxtn%Vk2*+t8XEliwW* zBpmWAlcFb9nGwn#R~%VjL&{R4fC!=0sy>x-FW%w;^uR5UJ;Twt;b-KPDX6W<8B_K> z5yI8%0{Q&Q>=?9a0Ku}1`j!^+16&oyYUKfvTh{gT-`tOmX@GO=*-={)6VAGVFv1(q zUhugknTU|zF%_G%#h60FV<@QNs=5Lq!yj#V96B}*ys@2#x z+Y2p#Doctz@1!v5Yn1G>5S;uMW&u8Qs0;}&2ASO}x;2HahrI};BQ}edQJ*^mIyHtw zRvI(idD8&A;Ube{HU72VJ<`iG&hHEcJI9f2u=Jt6#eiYtQHj&GR)?_7gjV0-dD#V1 z8}d`vOs8P{5Q}dxB??wu@(dw=q=?(OZ;Sr~V3FobVs$S`qW-;;_DUcv!3h%UM->U6 zT@GCe2xqNy@+bT?^h2-KY}|>-+=>Ev6N)u4&^Ys~9c}y<;7E?mM*--4>1v3_TZ`3gqQJzz~&z2fi(Rz?RhI~x27CwC<4A=Nwl0~z7Y<~N!dUB6$)Nh@)x=~@pCF8-VTxrM# zx~tqf#Vox`92$F!_nWZQHl2Qw9A;J(#3EA^Ylog-tsjpLK*;B6w&r8GD;F6Lb^9i4 zE@K?Oj3T@W;(u;IqgB0vMwF?Ei*p=zeSc|9YEJex+sbcaz2Vd1p)91^27(yd&T#8z zPdLWUi|V^W7uMoWY+jRe0rOtIlkS!8-NrTq)1<*#upJu$OZ4Qqr09!= zkoBr3X^m)x_rmgMCj~XtpgH(_(%l*t^9;e8Qb4`2Hajc z6Na_OxD2XTRj9#p4i0z-#Sr%{#At=uqGZj~Y{+|uRmm;*RE~zK5-kKUp-RMzda0FOCZd(S*U`N7dU?8 z$U95J3xb+zi!m~0SFMGgH%nbJ+`hB@tre~4_*PXU`NSLYK|kCYdOZrO8HAzf^1+)- z{F~W3%71S9;@|qW6>3fOpzw`Ct}8CM(D%Ir>Z_aLb*%ZBzt=qcFir8I6#_p`A&VjWt|LHHY76j@zr{GTNLc{{jzz`*rg zkvo=Atw~**lCn>@W!%sVfC^(=9WK)N%aBSB?n@h`{m9}xHH6FyhSPg` z2ikD&>YsKNa?FpOXhUez%pR&jY&pV;e`d0ORA{jlL=Ed+2lNPUl$OxiGgh^Y+fSUHV%05g z@}_*ta~q&c?Wv;sS|p0%O&I#FxxX@RU;Z5VHI0tJ2l9FII=n51^tAqc`^`t5dWwJp z#oKs)u+ph4!II$o>MTA;cbmWY6|%#auMP{tP^4PM9XohtU-DoL?ZWwf z0gk_qZvEvVI{x?0JKuA9Z`dB<{qLejo08|NW*00Pjrvgk378@4ULZX;`{@jQ;?1lc z4={wA+jaA%b2JGdi8+|Tm72#D0MUDq&|v4pRVFFb#CP`Pn+*2I+_NXO2oC20Lpt*S zvPcXq2Hm~*jEbYVfYY}U>HYc!WGSO@bkXcESR4Gw?CxIrF0dsirS~73{sn|82?M@r z26Vp?tA@&+ANmf`l0~Ur2R$2#yHW#`6HN0_goZo6 zyd!KciBAv>t(~1&6@VtA(X=srZQwOQ_4A;*9=NuREEQ!7Lh2~dKi76)hb0E|&(6=i55o+n`q?a`<@w560g2K_$20F>Cut_B%d>G#v1~c+e^&^v0lz z;pU~W8S5?d#D;ZcdZSU_f51DPvtq5h30vZT!d}yU3}0qS_+DUAg5WKHR#t)m5uXAr zNy7nuMW&^wk#ozixiK_JSHJ|RMGF~>t`DQjMs?!sP6}CN7#b$yH`!%gm2abc^eE*-!3(1H5wZ~Kn`|+9m zC-QRi$%(S@s+Yq|apVRC05ic?WY`TsGciczsYT1|6?PM;qOdH^sy1QMOAoKFdoD~T zytG8@72)B_GWpdnk8v$V=HXMNcWyK4+hcLC)XDV7%mqL#RH~>_eG3%8-`a^MM7lL+ zhlKbms%6h*j%k$Ty(c3}sq(fVtZ+GTl52o>IG%T?$TaI1Qr`$v>c@xE!CiWOP*=5a zI;$AiHJT3o(a{FJj-A@xg(Ogq7uTsAQw(q?d8O(=ZMwCf1yPS^&kNQjri0kQ)|I*) z9=eu*>YK^U|GvVonE1%OBEjXGf=GUmyILEyk$tba&%!jE27u23+ zG)?||8d>rxioKRT&S`c-oU|cDdc@Mo2}7E|!8B+#XCbjFBECw1^?%Y{PPN#QtCw4I z1Ou+CKDE>$l|v$QSI(t#I(wti+zMmmrf903DzZ&K>l%)zr6MlaS3g*u&{GL{?aadq zlYWsQehScx_VxL;>GwTpCh^|G)e^iSW46s}CMWe56**ieZT`{)kN{SZ_l9%KsZ~P$ zeO+Y?M@@APljo*0kZ(-2v&c)ZRJerx7x!>dx;eG&c!lALHRTIwaT6-fI!E~+h zQ^xPlFD3p}W=C8~9<}1xL;#ajoXvgv*dQvSO+E|JH;5(k?t zmuYEK5+sO-pm{l$!_f_;$)EMPm6Z6a4fyq05*ApfvgyXdCI=RsO0V>OC{0pP8JppS zP0-Ffy(Kg)6+~INs;?xz+8)|ba2i+i$TPCpxfI4h5ikIj)(XNdkLyg0e&Eq3yJS5) z(+vDbqPFF+il!Z_e=8-GpC&=aQvl(~kF{`_K#$lwcrM5B!F0)f2sC^GM@`KAzy;13 zO^-)x4~-N;6O4brGD%KFu4AX1u5aw1BYRlEa?S**r$l~@dsf?@vh*tU+{}n05dPuP zNEoE>reW99H>rP4U*4nWPP&|>}Rz58x|W9NG!4xUlX29SAvJT<3SWJeX*!268H7f z|4Ki)^U#tKQ9&Y%IyzT(YFR>vv@FciA&W;MsmQ>LwU%hQ)cg!-Wkb!^Ut>PF99Vg% zH&Ok6?szxcoCx(m0c+V)@gC<-bi=tzfxbax{vARr*!jC722w}5m>BdO9c zGtv!`L!;Et-9rs9Fr<5V-_P^g``!C^{{RkV;9BQe>$=YK`yoez(aKkG8j8wfisi;G zYmXnYt!3pFfD@?^)wX#NK{2o!5$BnP27>As3lSzq zN}76`z&8L{B~Sb8eZ_5oW6a1B-)virzZejz-}(QmzR;)mD;{PV)>gir)6z{cQL5!T z-UUp=|CfE?Q2U2{vHU;S7nVyM7{I=$xyekn5TA9`Uc`MXnvwsR))-w>6>`lnB4dZV z?_E@}3*>|$Hh%{XZ?W22{vCIvdpS=k7mANCt7Ww;wE(s5xo;AO!sBKA{s zOJ?LGA7EcHGmwWLBGPQLJm6oOv~~kpmsJb-6w7MrO7`iA{O+Y4<~92(6gYT|v_G7h z;k$>2Utn`3fTo3JC*oOBfLOYC9?#CrR+bT`Z1-e?UJYWSuyezOw)Wl*ewY==^Du>X z;<`j7UpsZ(fpF+VU4}RnC!gfJjg96;<;7o@gMNQ-rW12cS-q@wIOxfK))7WRoSz{C zgmK;;QY6abuq16~Tp-(lbXq9dFeQSqO{|!*fzeZt)&o-=t&OAF7sTG`; zvbj%D{mRjqtc5A>OkeTeesL!$CfDHfseEQe*2oZQgJQ{51;AGICLa4Dtj{}g$kimKR)VFT`0fUr|yt7y@uMUYt&wq-WU@rT`Z1#etnNR zPQduAbA&p3a>&Nov+eRlBAaxU-pznsu0^oiRGj0fDaZ97adDC_-_ z%Jx=+ww_R)SYb(FHRE(%bEz%Nv3eUOL`0yLW4k)bG<5qs-yX4u>%`#3u=d`pnf%mf zk~niUdRABODsu02d6!>%!q0b76^zzfGW6vb9`YGlj`!}DHQT=nlrod1uvwkFh}Ea^ z_g$aoHMY)xwJrjR23wzFJ(r<4ijLNKvv=kU&%X9g|H1J-az?yesfU{I!a7>OfBl%j zqlfYweeRJVZ+ejmNyGVAMCb(34zK8{_#%8GRBpakTCBJg_h2GbKPZPe#!)Qr&3a8+ z=o1p0#+Fei_j9coIz3Q2aeW`Hn9#aUZjhi9?fM(R-qsJ+L(E3zW8R`y9J}!pi-6WO zU7%^@fgH+_%wTEw3=_|or6w__eyMgK38RM7jKXWW-$ncEtUkFp19;h@cXe;Z23~7x zQ)uJjkjUx@yCMov>T0ZXud)+!0<@Vd!=(7INX1fMBE8=(-MU-;(Sj=fbhh`UmNiv% zb+Q3u{le`;x)gAj{&F#SBXlWnH2!j7++^|DjAi!k2zt(u+pUAEqP?r4^eNic8Gc%k zhi8f+FPRcWV{ll1&Qd=%X*tZ3K8L|qNTQ(o_FuFSN~lAWH{VC{;Zv=W$}*AuedhWVVygM2j!qrlF(sBmNRcE82af zkK?mX#!?NX2$>XQFlJM1XI6TnmYgWO^Z5hkX#YgRi)V`=ZV625wO6A*ShmCi!NaX# z*ucXplUdGKIjrguH=ohU3XP$=G#dw zAw&1rjjDR(h{+d9sq%!ka6)3@)r~2<*xGvx1rWo08XYUl5@=fa5|?E<{Aw z9cX!XkoYT*Z%<2&&&Y7-je|`0dxKS8=I~A8{ml@X0wgyYfO-@!i(iaLIp_Ab2K~M= zv?We_>uGN!;fYBYjr9!AUxH9u^q_Ef3Dp5;3CEL zhJC->N2>z&R`S$H4s&o3FVctqfn_e z3=3Zt4&wUJ)b`u$vSd=KjOny@mpmyZAA85jk;7Y^0j zGmrJFmV2!ps!f4I+>z8t^`Dz)&p&pWVyO~=h!AvXoAkfJlZ2-ZlbP%|S zS_T;AN_pk?88G%gyS6VZhNMg zXc!qycXO78JfQqchNmdnhk=_3mh{_c%7{YK&28Uh6AB~S7TZ=FuJ{gnGM6P(T;GoF za((#flti(&qBmYaC=iNc{XmBOTzQ2kyE=z`oO|Y8%(g^n?>h(FUvw=an_#e)vWAK} zrYxeDK^}O5`$mrfKl6K;%o5?w^arOXOz1F~{)*eo8yq-9W5h;}H3^tx-{Bt}P#B=+ zA|}v&A-htq5-`p|`Ri6l7;IDH^Lr#$SusR066Y!(Id6I7WOJ}`@fiIuaR+v@s@YCn znqkBW9sJPV5~m0NND?p59JAkJ*8+r=E3PD8fj~3_5TY8IQ}`f8NLAwgbM-!V z;boI&1)Psr)x7dEPJpu`f1<;-F8ksu`Crhtp>^}b(jS4JP}mE;F_@P54s=kV1E()e zhR{i!>ifeE@i!kQP=9c0^K*1^KiovMT~NS72W@MzO;@e}P=0WQ##qc+)TjDHIqfjX zdNA!wA3vk+`{KC+j2f?@#DO3yshgi;negM2pHgD*dN0EcL>0~1^omrT58X%}wq!Ym zgf~vgcBUwb%7UR6&`FH#OZ@UkG+Of#&e{xCy}Y3$`C-msiJO%T4W)L>R!lXnX=h@+ zc;6aYM|{39&BiIhGAJC3^_MriN6WmrBb}x+ATyE@EAnI25aqjBKk9;>;TL)oQv%6J zY>tv4jmqN>__)Mzat9y{zZ#BjTDF8(cNgw2j zox#}L8S4(l1s2y_CI)s{xJEoLHHj2O?j-oWYnoF8n(GEyMg(UwD*>M*EAb=0is$cd z{eFek8KrxuZ{t_O&Gs@TIT$^hAKunE0aic?j3rzpt$X;_-m#jR0a}IXNHp)co`Y+m z!nPrwiSo0npmb|W+^Eg2vCK?sXu_%!x}%4P83W|b9wKzhQ7U3GLN3TN{k|bNr!xsf zzPe3)a?OShyp|U+TE9By=Vk?l=FA5m)EBf1J@O+j1G9bVJ~eCEGa6UEzlL;habK12 zzWe z#SK5ss(HUXoCn0Wi#BtUkxX-t?U0N04ZSyNJ!Q^sY+QJQSE9yBFxf)&*jpWaUT9X< z*RG$X34iwy{H#$EsSem% zd#tNIf4?&A9KF&^7_Ec%bgezh{;vDQle{%07*z|2BHFd{o;n+i4>Cf3=Qf*U~Fe)$lyHd-&g~${ZO38Jn5A-{U zfYxI8qpaTrYN=Gu3@>BWaP?jA5>f>zJ)de>Q!+;~b1E`tTJsZhdob*-k@%dLswIlk zlSg%zt7zr#d1C3d@uTNt|KW`u>7#Mga{n$Zx`k7Hc}Bu{eA<%HnrZr-%wr(Wiu*K4 z`jj$M+QjGGdA|NQj|lMUI1Bm8O(LXmp@=+Syro5D7Vab&wO0^sR5WB>70KS$!s+7~ zF0@heK*R}H(nKWo8-<1P>HV1SkZxldj+W`Zbn67?^=ROH;gq>?G1MS$+hwu;zIJlY*UiTL zk(*B(p*ilaIR|kt%+)8EUBUC}_wdWi8(@v&iZ(Lpqw-VaL_ zG)!4{!oY*Y-Soc0yjSeC*h<+v!PkZ<)j*|VZH^ZG(-gj|qp_B8|nr7H9p(U^o5;cA@{T92ENJhCCY*V7!xDu04JU?JT%k69v|SSjhtPY9EZ z{&s&nd3Uz*vPQc9Is=1S;$_%Hez(rdsR5|&))&Yj`o}=hDY%$9aJ>vjI&BR=Fuww_ zwZ3SDT{;F{tkoQ+_2{Jd*$1fKH%27fpy84I%R||^(LlW^XDh z<>WGwvfSQ4&QQ$7r-VLRjj1_%9zvquMD`<;nt?tOwGIBZTzuKbm?<%sSRkgjb0WuK z=naFBEi4Ep>WXU9qS|T?nSWe-a4dSu()8|aLPJLz%^gwHY!0z&f_4D;wtD|wAg8y> zjgeg1*L?+~=oLu`yyS+=ONU^L`pw5luVza{U9A$g#lhX>ecJY4{g&zGaBsNBP#Jgp z#4L28y0#oGGkvCrCQd-Fc2uCmRp!4__sBASZU;s+=i}AelZ%>_jTK+gyy8}vW24q$ zmOrjC9PfdhuQ(3v|4Gp&mV;m~J5D`PW7HqN*VU$+&}!HLo<(rmfhn2$=B@CMtdes- z<#kW@vueM)j)F=3jFBe#)Zf2ys!?unC<>NsL=R^Bg)%->TaXENMC96?#)D>=G~eKC z8`0%|O}y*U+}^JfV~@?b@_Ly~B|Qq&l{l$mznTpU>fCCjX>FV6B_42q9uLd`^qbTl z9N7z9=vK}X$LBiKeyqFr=Y3~IUL;D2g>el0w}4RIv4uN_LirhXy;}{lIVl1uMt*yh z^7TFx#E&|C|d1_PuVsmRUHfeblBIqB5$I&4v z_aN^FZLG6)0sEtxk&*%QNtKa6F58CBes;3?qsNZw+LAoW{z^9swy#%&#UA4JTHz=9 z!g^AzlK58f(I+HD_m6CT(qZq>69}&1y#t8S|aAX1}EFd(k&sPkxxCAqW3nO zOCr_MwDTZ3)jol`Rh~6*^hRTtJzRXP9~rFrwFN&ZBS%DUHCpWbb08!LCf}L3;P{56 z8gdJIDhJRrM~;!Ljph>YR?78kf+6 z>vyNFoyeuqsYyxMxlQv(;_l=Iy5FGVC;^EZge=(-r>kLx7R)^_A>tWXbX39+c?jtW zjkG&df!P=y7Kxt0SgpAJ3uhEP2^1sYg zOj{Ebzu#&HE4M<=|KRBC`egY15bUhZ-Vr|EpiWWbf~%z^;+*5T0`x!oM< znlP;xhD(8##w9Xuy=ko+pM;#8;AV;LKw>|(BGqlj!pAs&a7G4;&TDK<3fQUoIoAew z^~3DuY_+2?jn|Z`>b;}A74ig4PB{7E+Be?F`sRF~wpBN6U%UX+$dWRGphduJDVw9^4y0c&s zNm5(xtV(fi=WUaLGLr&ri0G{Ov35}Z4=?s8qu<5(*K3!1dB0)XD1Qe(e6C%z+VkeE z!y)R&i6VFPDQF(bu08a9mxiaHZB$k96E{($w2 z8g;rF-k%CusMu$y*-rnHVg-N z*Lvl3Yo3xm)L&&e_cpLiXi**$o!y$U8Aw*m;VbV1RJI%#o>RDlHT>gBmM{z1;rLRb z0lk!+juQWasFf>)!iL!9v}qK=;AGy17v^jfQ2w<{Js8TWNDz6{PZ7l>)X0Cuw=_Gu z$Eun}MB7!;$U5a$hNP}Y>P5UYmm*Rq#Rhg~C?@S?aILxE_5gl;Y0S z6odQi7UffiFj`$8(U0Z5K28pZA*oI@zz65Ps?3a(ufLfe$dWjr&1}=Lz$ba#M4M^d zD*jXVul}uN)|b)AED+(prk0e*p1okjc^8i-#^+Z}#kj*eNsr2Vy>}#HzlQvZ!O*`& zj?aaMUl8fz!LP~d^IfMS7c6UM=sSUMmmgTrO4 zL39dF02sbN!4BF@9@?13<_Z{@Zv;3AOp&Msv;-vEJ}D8pS^1i^tX2f|$30By_+e5> z`OxfNS?k%gYWWl8v~}V_Yi;Ab#~7t~|3L24CdrW-Qtw2ro<}i0I>H5oKqXrRVGxm$ zPc0#ZPwoNzSkl;qeo<~?EkX++lFkDf6;tT{;^e7f|P?4}Jp)b2K6QMDEg3hb`F!nUCctKoj!X zDbjY4GVM8d=C8PO1g4fsmB_cz3g`(RBkb*oqDGfgw6a7{eYu@p5DGC_Z9WRm;Nf>( zW21Z!fWDFlki68b##T;0%XongYPYi^mgh*=AWLpArw(BGh4{p#p0{T=;p$jW-X;vh zGKBwb7V!-%OK3@*H{47E9#AcOZ$eJs#=n}`7haYNW8aD2x^cziA2O#VsnO{5;$sfL zYCz+;%72~-wl&2j5W~ny`SgFE36x#6a-c2tYt3!aEe~X>ghI9#9wC?9XWlMX0D-W$ z7rMiNWJ_dNxVo9Z}KYrO*oQq$@Zsy_b^aQ|s42s_dKf_+jA~DP|$43~n*PBND zA+OWFM`<^&OvJ*;#>*!YH3QE%)!2|Hd+4@QC1Fv<8Yd*F;^TtncSMfi?!z*1=Slp^eTEmfXcLd;s&UUWjYq2bEW-y~eDu6q{ zE14hiwB&sQyGF)oM|K-0li7vPq=vDY0`(%DN zYk;pvm7T-F$GY=!Jb3v&V@Sq@Kqs9@*sKa*lMJB13^p?fp&=Y*jh8Zy-z3}xepjhG zOL$U6oWR|%VK#;AU7tTVUG$Hi?_Y_E!5^VPGkuKjM|XTK2k$LjAO!+_n-f*6McBuh zBy8lv48u>|rZqK^-ygpP*qK@r@n5j-DJvG^PX`zudZgV7r;T7Dog-t9UAvs6T*=IP zbX{k)9CfZy-heAQ<9ZDoVdN=Ee*S=Mc6WrDF@h!vuzCB@YP200?_>VDA>P*US1;<~ zHl5&-@!kC1dca5Rn-HqYqN#D#?iw$n)A1L^WolnyZ|qBecs^ZofbhIc_Ag_(oY43y zhm`8*dZiyP3VxG45_qd>OH!_&xlIz9u_nw#{p5Cwt^vB4%(mc8$Ud^K@k#4xKaOiW z)P88C$g86H#$BsIvw-dup@&@PAV>KtYq`~IeQv9SsvgJyM!!>nW}-z`*S7C@SypS~ zuy?uXeO14~6KBy3JtLW_kl&AmSmvhS_CTmO!H@TusQQu$=24J zIqd6E2c`_v4b6`A+sZE;rPZUGUOoCRa9p>D4+bxg1!Ce_`|;78zv4_|){-i17e^7u z0Cse>z*I6BaZb(Bg24Esw{g{EC3o|?BZXLiUxsLo&zLFNEx`@k7m6k=y&b68qMdwF z+{J>d#L8|SWov9agM4WNK5U6w^n56>lLAOJpvCAd6RXiZ%)3?*s!H22(d}=YUblk6r0Raa zz;HE^$tD~%$KRF%Nn!^u*MyAzSQdbAI!^_%QX~_6DbI>rGcIwLtmC`A9f(NZyt(&Vtb6d+kEoH?(NNNgug_GBW7nd!MWeA3r!@pG=`BdbD~->CZV_ z^Jc=w0QfNb^baL<(n_&Tt|p8t675W}Au8j|FOJ!$Q5kJ53yNGOZgVK5-AhS9-g8S5 zYn2#p*+zpCc-TdZ$7oMi9Ff=Myx9^BdZCf_kv7ETK`n<;asjm>O**GL`@UQLiS-l} zIPP2YThjB8ePGk^N)}CKQuX;K@=NE+mpg`@z;HW8#d#Bdvq%@Dk?;NH=bD}*$l91M zWAB$Yus_SCY80Z&0~fJK(o55HG~d<^`##nX=b7GP+bvLzr7i9&xY8PRAhV7o$*2r9 z!-Xd!h;~Hoic0;IDnm6b(!HK>{1oJ|bNjPO0gN@}ExH(9uhFqj3` zA*UX)5{arE)QZhAt1qh*DfH`biA#(cTDJ{2q31O4Vb*g7^KBzD!7yG(#c#|x!#i9w z2Fg?*U&Jq3q8euT=~RgFXEYQ) zj8B${A83B4hoZ*W8>I{Xkz{-P| zQN+(kv#n>Bpury@O%g|bgO`EjJ!0EAm|3sY9z{=F*3SShwy}5@qOm;#s;NbPBp{?4 z>~4eF{tu^PtqYQRUn{|X74l$0^6g@ag%MiiVt_I0NX3~vF@$v!Tl(LM=?NBX-*VMc z|32F!Wi$em%m;kabO}owK*?16TQWI1T1BFes{e9Mbnzt=>HIbBlL0IV&j|k3haEK% z7IRLMM?{&wql!Kl7u6`d*YlPuP?8r;VsRXW7h;b>YhYYzIz=f0OPf3oT5`VR) za(}b;sV;5_4En#rp5tj0cT81PxBp5 zy;qUjMqvr2!Ue^0wzq4It_JZucszhdsTyC;;H#(q#QQJ3zdd!HIhS*-0?E)WQ0+%1 zN#5N3xmuy5v9X>HsDQ3=p?;2y&B;k!J}VMmCg5yX zHfKT99*X{l;BeTXBdxEAc73g|Y+|o8n&d$G>(YqMSSf~44P@?4Rrs z|IE>;P4d9YVF3kpOHR}K>9x!lw%Kq(4=o!j9JLxY4B=6gCg{ujXCP3H5 zug5BMB0C3%B~u;+#ke00n8W?74~xwY_nTi^88SM=HPtCCna3PSA4*RZ?Urcjx`4ei zdNwE~mmg>bo&qOP90AX*({E*sxedvKzDyfE8k0`(S$%y3O;^3Khyez*oqOrp!0QG9 zcMpBezpreN9Ulzp%Q!ptD8RucA>RtbPZ$+z4=z%|`i~9jcifgibkMfS<~?NP!K{lR zpSPsl)+Y|aU^RmbWeI3=Ey-xhtG9=igP-vq(wL7HL#S|PEF`_IIC@iTq22()VY5DE z%VV{3{N^b7(l?)l(dAM{3;7JkIBveh)%di?<}qM!1Tc$G4V1~UkJa>pO|vR)u=U8Y=v!Jk;SVO z;w@p<2AWRUYy+Kg4xv<2@{10|>`b;Js_L&B@|L ztlzw`+#Tw(CpZ;iGXi}Gp!z2*jog!?Q3e$>wD%~kXU^pwiIt;;ihB~3^`*nVC9HeL z8d*S^z5(gsLLci7ZD|$zzvhy(|BhOct7)P8@0j<(g|+Y zKWi>BaPqXdtY4opdQD@hUbo{NyQ22UN*x>Z-TiLems=kkL}3W68jX9;8tx0S!i9=W zy{|qc{P0(+JiYS=C&x>=ma0ZP!S8}TchlQJ;JywA(Sh)&uE+eDki9#vmT76Hofy4O zZF~o6UI~;Wn_|C?i^mqtFC*pYq8oE6wpwJcfpNTpJyz6<{eu&R!C@LEyvNeRmvwGg zi#donjtff>cY|=-$h5sgr_T*==2pN}+C(o04kvsB!{)%7AMKKc>en)2Y<;FaGj3A_ z3p|we^;E|u^2$&(Jc;xu*)Sm`zZSq}Y10s;1@?BJTuQlGPNnI)kj5eo@4~c&(Q6>Y zy7qON4P}_ZApU40t@w)XSIJLSv;-dXvDR3}jt-QLZ)S?^Qyn}()6TlKVtV+JECv{O z_j+l&tp1qd9S#l;j<2pTe~aKaTUpiYaxEWLKqRw6&=9in#XO6Ry=YRDoH>x6_MeY%_Zl+nf=Uns;jzUVX@{|+e zfp3n-67fcZ6u2XYXVl>iRaj6lN6LJ9-fHNQV_g-o)kG)MI)Ha zUOkW0KHy0L{&TPpt0sOL+-~hucWtJuTe|q+LftM^v(H=cT#iccXV-`1N^QJqk3PjS zWGyF{+`5|4O3$Anrj^1By_)e$^tr)xvwtbjrQj-I9@Hll>Q?(}p+Bhh z1AYZ6s%}XJFaKU>o<1ynJ-^4vpZu3A_9kQu>i5VUXa-RPHtaT6%6eSwq8j)8!xU1q zJ5ApoQ)N{KTDoD5PcEm|#-`?$uKwT@n1f~AsmV|&r*NG~H~HG<#=HtOF5=n6ly`Il zomKg(6Sl3yXvN1HwiT~8?>l<|yCf3Ayv_zs3`#3wq_mNMEBZyRE+zF=?wvi#wbeGz ztSvq92aNB%yh{F#OBqi|`zBBPyW#S8ve0oqA99S9=>&iBhI_903FG5tDwFD~udfFi z_77bIwvS$zT)G03JaBoGsRfYWOiscN(-0T_?S}qRLIfWi^jE$-ipjbSlf}oOA&m3M z=&nBujM`Itw9Wa+{rbxK4~|vQZZX2dLK(5)o*A4c0qbk)-zq##6=N=$GkKku@381~ zBvoccPhwn1cluiPqhGa{%u64VP9Y5$f@}pH0_yZ-isLtHz`bT-_#m&$?xV;U%J zqcTQ|&3DvR{{Xet;sbuA{I)UU;Mu(L9;K)hho1g?<<;P=Q%V@JBY?!ZE{+=FU-7l0 znC8Laxa3o3Kv9f{?`V!nDPW#s{B|Ks!d)OwS`-EK#wa@;O9mYEZ?SdW4oHb~VG51U zxF@uoQJcH|5Wh3W5s8Gvr}{g&k7K*6$dVZF6use zGcW@gltUDU*Gd#&vRdbZZLWApBO9Tzm2~y{xSA!h%St0fR74D{45{35Qsc!<(i4Xw zXP!R@XKgEiRUW^Jqo6dAPl;g22{{DyEE?8SZwO?!b*TAV6F1f?*9jm(TyoPALK?hA-sTAmYe_3>= zr#un6Nr}BQkV%sYxp;bG)v6#>LiJ@HpKbui(3hsmA!{WO?&xVkX8f~B;yB^lPO!ZEh#9mXtAZ2;J#)i&62%jn*1LE*p?_*G(cO!1w)R%ua1a**9rXYAeEN z=6CaU2}YYy?E!+9M5V<^G(MwVZ9QS9%wPdPG|8`coI-3;)UDMo@Zd{Pjs4NwF_>IF zQZmzdvYtqdUdWw}Y5aAi@Lyp>J0!i z!3b~_>RN!k=u&J!(R4@rdgv9$X4@n7^4J)6xFQ-Jbu&lLZ!L{k%fK9_%D2NgK%(O% z`?NX>#d}?GPMC5Yty3w7Bg8U)do$Q9r<6k&R&InGQ(~E_J7h~UkAAtmFTN$uKWh!}B zvW5}g7Ag(;XyDB}sSP^waer|5OINSUPvHfQSAiRP|FR+=C9T;FgQ{iAV1&7;%BW*1 z_oC;OSohVNnqZDd;alU#&k#{EVU8wrTs^mi2Uiv{b0>}ZuPc&L1h^v1;lkAaM+rs zM%ew+gzKAX={1#C(qEbNP~jy}EK%R{GgtY*+=; zQ!0z6<1pTxZbO5O{dc*J?82~3V1UwApNVa+(%xULf`?tmZi>Q=fL+Nn!;cXvbp{YgFl=xz_kNDa5* z?MC<`yO-9EnPM>h)AtrMXK?0>=Kc6z6*Z4}fi<5U_;HspbwlvyPX^tITw+PF_ikOD z+Q6ScqTL{Pc8-mO2HEUojsRO!>UE{BPB#8<{lqRJu!&6~i0n2srQxVN5@}_%O?7&G zqi2$GjEExrhsm*y^)o(QcU<_py6G5N$$F=RQn{T=WZX_fJ&6qQL$5E#H)!BeH;$({HaeKqw>HRJZMlcSC!%0y+ClKM#8 z+x2&7vVwXz;6x-IgXeQ7vI%!_NA0QWhldB@Cu_e`q6$5bDSjH2H2`WHS~h7SbF_QM z%w!5>gdgjtcsl6T``hOH0ZKGJk{iH94kp{lWR0bvGW)`9AA{9zW`|ra~hW z-Pr~OS2Mc4;- z8?8~6x{fa%9DfxZT0qg!9>Jf076{#|=_+XS-IMtL1Jt)&=4V&ECw{9h)=N4-l!OUx%1q{}+U zZk01pH{d#S1*T#;vhVgjEsD=*%q6pXX-iF%g`_MV7Tai^QQye^eL8hfnnU|iO)I8M zd1DkaV6P;246s;H7DTAuX-qU07S=RYtr#pM&sKzrhFo1zK#tRNHGzV^G2yc;?O!41 z<{u%ajlj?TI(JFs$+%)Xk6MuUh5YxHP*zQ#omHgd6(~AZNz}98;DT=Zn_;KDdpQE< zmS6e^U7M6&AdpDyxbymNOzXJJ19!*0Oj?)S+Fg6K-bdGvb+w4&^8l7{O_`(lcog_< zxSjXHQ^d%zyb;fRQ?KB6C5jP8#C-Dw#v#&J!B0jBL@~h$7QQJ!fzu*(WojSfcHlF+fReTT&3lvAABqF&A$q>kI zbl)45iA?nshT@@)u|JO$hukG$?cqPg{;E#6XS+}x~a-1S;E33zCj^BMA32z&lsWl^Rw-67Qcrm=mdrFD} zOithse|&J1UZXd95EqiCYgsV0IQOhM!c23R1eo4M1?I3jS2t*E{-$QnzvH1Qhp;qUO(Ghyley+TsFBF5e%?9=EK z<#;x9*ckc_q0cvPQNpdbzeq=5(Jwfnaia5TodhT z=4a$6tz^QX9;2N{Tk+|LjUDJZ%Xe`#{5h$@Z(J*_b1bP+N3t@#0q#?E5d}8r*5-j1 zEvb82F z)F#b~?^-W8ZiQ@kn4~x$^mNpZbuB+U%Gh{w-rN+q9A3PoWRN$yfxZJvU(`d+1bt34 z6dL-2V;d}ukrlexzXh{-KR;sEM%Ipy2e&j1zYxk6Sfct5I3o8f8=osADQ;r%Ki)_= z_^&s@*h!V&=#WMP2fPur3Z|@pns4rKaU5ZXSY5DQHl0aa1!g0etxkp?rI3h zS0d-uLl1cit={`9Ed4s_pURlB@uiS9zl4vWq_mxHPYT$0Q2*S=S$nA>- z$cO#&@M6$dnAXA|+O;&jAF>!1HknrZfg!BhZ8GO+3M1~I&>DINMcbz>!*W)&P-~CT zwxk!b1>fRWK+x%SyJdOP)JinXJ1EKyWOV#pQw9}a4PfI)!?2SjfJ59%IH$;jCt{U# zhO^FHCLNK()(D~BGqfVq9r&#HSs=DZW(<_e)lr)G21iTW>bpfVU+1Id*p5)6MDat8 z8g;)o#DJPW5hlX5#Sk3Quv6g`WlAU6U*KQX+%T|Fx$D-{_fQa8C#CIuZ8w;q40M!5 zVuV&|l(>;HDxc63w#Tf7hD$iEFn7ZlZMBZ7UmdO;Jfr0+>PL(y0+04 zPAO3p1MytyOmjX8{o_fa658REGRYSpzW|{hf1w*kIOkZ+=NE(?xk}^4Z%NO}*z51h z?RvZytxPenEuqyuEgVf$wyNOyyR7()6(sS7bRe+^risxGmwnT?mAl#ooH_aeiIBi{ z-B?qa<1+s0L41>YMynX+`hiPKsFSpnRFxqetuOTD(^I{X)HXK2DO)XS`-5YogN@>u zn%|0NVIBN>e3!y^OmUja69|bo&%Rn6$eJa3PK500cp&+m1`k=Kxp^Z1$)4N>_$UE|eF?-Qu)k{YReSE8c`um@p;1YS_oqEA(vS0&Ct5uFKfi(bgi zb)(!_?fsLgtKVx1D1wNxBgEnv@TLuP#ij|I$0DP8CyVaetTJ*PMb#BMRuft-EBI_2 zzzjBwyG#}4K^MYL;ssPbczf@gZNJo7NB{UyE26pE_dv|tByH&cm)40%#%eCR;wT$aN`=`8C=^;nI3_*JJu-2}pu1JKq%VG7!%fyYU>DK6)I(zp@aax&WxwI%#Jc#$Rbl|9{3;#oQ>|#yx3iguS7-2hBsPJ!pEFqG3O?I73Ot;SmtU8)_?k$*;zM$sU@P?nQkHF9CTM) zi@V@#$KMK~Nf19oEB3A~%O81M8$VHYo=ebo2n2J~B&1#(jSAt0JlPbxcv#)}-B4d{ zq9Bcedl823xOrd#U&T`se_7uHG`8KQJiW-$&BgRjJhwVIl5Tg}Fb@4%q)K;;VqV-V zT6%XF9{Md!Lj+FY5m+B8OVBIPaDccIXmGkn=taD;KPMWoN|(}qB~cf-zdDDo}D*r`a+UU^O#(40SJU-C0DINl>;~*Ntm)S3{Nj#qJGsp()e8_RRfY zY!G9C+pS<^LT-3QkGNrO-xbcRJ_DUG@YZUZlc{Rc4r_a_gKm*pe#Q0G77y(bomi%G zIN)M{L))$Nw&i|1>0WXboY|%IBl>d>!$uq)FD$_JJ@Yv*Jrp;zZ9QMxey^m+<&&}! zdfmCn$H0!e2wTm~eth@|nY#gPyrMKPIR;dWh~?(iL@nD+MVnbq4^$b@(C&zR)RAzm zZZPxmB`zQq_$K;hU|0j_j0j|ezDo&=7GWhIcGeMpCESbKe{e2^rRZ^(Jtpfvu*1nU z95qA4M~YIk!$=4SCt1zUue!r7Kxe!g4A(v&YBPORKF!KAvIH^xHR#zn80(-`Owl%=LzlP<){6 zS7SJl#2f&~vEM^E-#<9J?*8_k)`11{4*Yt6jZyr7F^LJsC#k_G>mtsVL|fk7oW#3K zV9C;ua#*EvE1Z(@65%a|hc0yZ#8DaOs&JH)EK_B3?O zuHExj!f4Q^cJ6(*!>?C8A|4E$KiLH?bQc$R?Zwl9Sn7j$rz)ID3jHf zxQa8O>F1>^P+(7<)3szyL!IX^_=(ut+{)0ccSg#vV}PkJGCMAj&d*>Jf#h!v`SATy zk5x+ApMP+qPUz!!B;zH?JM)7(FL)jj(|{UJ+wjNKW_KGYDkiOhOGG z%kPW%m&e$%{yF-;c?{Z?PaZZF1X-R?nMjiNToeEg<48y-6))kFqr(_g!NK=0Uq$5j zzxk@qKch}^DXIhffUkiBfDAF%1KpV2c-WvA#5B3E#-`&iC&ip4@~VMxUNG;Bp_rrI zuj^8Th92sZ6?g~QtUx{AffN?uF8Ay8)-e<1EP|0p+7GKqp?Wtm3?WOLjeXSb zY5223LfY4Kw@5m+1tD-^gGIx}zPnuI%Lu}wI!%8( z>S!cQYhIW^O zTAy0PvfD<`l9MQfn%bZ|Iqo-|0$GVNDGpfN4(E<(y(-C~4KvrEoX5UySAh@W-qWqi zZf7BjuQ+Q%_rLL*Q^NF-C8DLCi>`B>>t38fwq_GTKDI~Ob-9=gdz&^A7;`n5w*tjU zc_5jW>8=RgTeH^uU*=t$TFI+tkJ&hK(Xe`ru8z* zax#QC&zs%LFV2iqYt2sU-NV4_$2zCA%Z%!wKtu$~*Y7P$!_rppf&jvq=^$z) za&*Z?&NI8@oQT zlz4mXge&K3VD77_opKQ&myBYTvMUB@;3_y40u5m6*mKvGcYF6mMc zlx`+9q$DQYBPJmT0+W^yL^{SKMu&8Rv^1j|28ULgOnoxO9*05DdKVXej zX60l(j|0vN!+D9au1ycu<+r%oZt%eq`${ED1_f30`1&36N6t`9{UT_uQ~$!LvmpHW zlyLR*a*=X|$(o}ybcA(?kGGX-p5-v~({kXc3mCC<4?ggzgy+w0j@fhpdyQ{tcseQU z(2xTc!ct$P0!}=qVbK|Z8EEEPt^CydBu$(6`JGehsId}4fTUe^Yuh9jB&ZstsXH}fn_;=h~u+^Tpp+5HN28q;#? zDZ>N|R!2U^uN!lh56?bohEM%|3EBQaoe62MYL04D^Op^Po}P3rllkflnpHITIWm!? zdwhu400QC!{@6ID|JBCH*z^n?cco(HJ(5cw+mK2nrC%293P~JJ7nXbNvS9{G(svo! zmV4a0Fi$rzJ;b7vdwN6P`tnk3km? zl121#4HXnB3)CrK?0>odaac(7d^FoQp2b#-jLV$u=hB}RV56qWk+;JOPS4FQNkQ)e z`m4&+F`X@#^1Easu=PBo^JNYB>|IKH4-9De2y;2l48zcHySuAS%Hs;Oj=ooUE6)!e zyy&9rj#Y<>hwimeX01gWoUsm4|Fo5g<{MHa{W^W-jx50N)&G%kemeLAMYk;5^-_JA zf$e&E0+mT<*r8n9epO`3@T@*SiBx#UbqILfArsgFbJ-Qua<*m+WXP55O1hm*EUS-I zab1v_zw?l7K#6%=st$Ob6(!VFGreAG5dMozsJAzJcFFP>(Rz(8^ow{;4apL>(0@fG zE5CIEH+?%@e93q9rZ04&zt%Ie0-k!k>h-vl{trO1kkHE!aNo!aZ?W89Gd5-_T|`og z{<0VjK&?W76yB6=H^URDqUx3I;-cP}wUqZN9&A1gqn+ma@iknwq4pv`w_jMRn}0^T zl-gNmlK-u>jYlatkK2F6+MO#W5Ds4W z05enchUHJc?qa?EqKNyeiewyQAkOF$KOl>YK@dQxxc#Bk=Ae>)4()<7Vl)@UXJ3_W zS=w(sITPsYv#zL9Uq9eeC^QqFP(TmKuF8w8}j2T?HZU!IYL0*dc20txj5#a;wSqAD{=CFtDg$ z&wzN+WKjIEw|<#WBjKhB$jY)@MX$hB!GdQ}yauUonSmD4Lh-AJVwC^NplBw#4o$j#wiL1A z_*XA^^9WoZ#T09t7E76T%D@_8$~U`jDf1Q9v9X417V|A(8B`ma|F%6i7ccY%mYC= z{2g7uM)qfPO-L1WNxDMVcTXhGio$ijCr4mHR~3cXvBL!f`Zs#AGi8&Hz96GlRE22ckFX`;?O;}M#lM_W+6%-> z%0HAfYCLx^4Q0+@VBd%3>?910D^RyL9z)7>TBy4jMNUVHX#N>X#og93%Ivk@k0d>0 z80R1BJ5de9p&h1w;hv5NXo>HVMz&GZlD@5xOZy~GfBtB#)3qTlX*E3^bx0Em^t|@Y zIzHI>)ua{#`*aD(#!vkfa)#RmzJ2)yRt;^@q!=``pN8=@DO6&V>W)J#%vgcw2a{b3 zH?3KFqQk^u-`>7u!hUm=kQ|=!@y<8#1v&t>G!W&1pe=J%mJHB{e&DQ z6-E-Dv-^b#^GeO1st97a4G)55*`LeRx%XFx=>a)o%6Qbld|M5!iE5K831eWcgsdW=(%&-mIVbRtQ4#R-1=4*`peu zHTH*vYf9u?__gPrKPrYEgB_R0@!KA#Sxt?~B( z_a{M85nFzu=-wR-&RsTkTIK}W-tSBQ5E0)1QRfjQrW*t{I>NLWwG{HY8yyrz z=L$cVDEyV zfg*J0XfUGje)Y=$kD7~}?u$r~oe31QX$OAQq}7Hrg3eIsDIK$~XbpOv@Hc^lcbH0( z&{A(LJPrCu9$^zOw$Zq!X{IMX-XuCuN?Wj2!99^0e>7GFtGcwaEEkS8GnQ-_X>L}^ zs4kAJ>O>+3);d$F!j_^85ho7`-)R7l&@KWQ!Wn7B%BdyNBr62Y`QvLu{0vh5 z!Y}GE*lPP4gR9yt;{AN7zU6DiJC6jjX@B5&(nhzzq!m67Jdt`BvUh>AF2mIgIuD-G z=7hFs2$u^;b?;+s4@V4+WR3@R4;)@Ty~aDRgR&${JI~nKFbdZ3wh|mbQWZsYZR&^7 ztwX$8xF8e}I&@iDjy)|UG^|4MoX6KPfK;a=_LzNNRSa9`j;?CxlI#09(A#%}p9mub z>5gOv5zsN74t+hn$EEucY9%?Oq(${Q`cx_9M#i~QxhI>o?sBgk)CAGx+M+{lv5?t% z<9$Mf;q1g$NKqi8#X3^uy%yz(l2#gdTC9J+Gfn#S;fgZ`0S{-PsIo3WS-cjRqM8y@ zTzSJKc_h1L>gt``w_s&ruQc#XbwHf$Kmdm%bI$y#SR?grSYFLNOjZMz=u;wP!rQ zjfzLi+oXeLFSCrgs@Pb80)#!J|Xa{?}* zNzGC0_Z|EBUOzYFOYLU=2MmH4M=M4|>^eFe-tku2^l)DpoV^H1 zS5k?Cf9t(fTEs+>ERW#(`E3S4`!NNlP@ zn?B$v?C76Ie)KOClW$;!;S}A}(X-O(EWP15F|d{FJeRGsrLS@edYUxP$a_wXr1G7Q z9m3%i`HNZeDS+4Wg0NtwpUVE3AVrsjL`huBxnpL&ai`3?R?35~m#a*TKMsS>Es(7_ z?f&_Ny?49m(-O=-X`18xd4APjSvVO@exkO9r2gV(^H^WXWpulz+CvMWOBY#qnKHyz zGQM->u z>Fx~kKxE?T&6arWWoY7O%NdN7uV;w?{$P=z`EDkWrkej=4iubsn<11Z>67u)*1eNB zg;ie7SYoh}uxzJUOM}{VHt~yg*dRuZCA>_-P{3U7`BdF{0v5)1#3?#E_Bj&#RJ6t= z;gBkF{~uK&I{yZ`XnpU7pF}CfAU#QZ01LVY5qeA_MI*f-=(J}#)lp$@ra`$Re4n1LoFqXBXdV%=} zo3vN&pBTcQ@ca}t3zIU)5T_A8xF$Juz|Zgt{j|8|=t5N@g~!%FbZ;i3KqehUL8o*a z1dAE1h6uYHe-2j^;OLv5iM<%OJHC0~p#D0P*v1WI+1ZapJ{x{~D=b{S^`2i^h`hk* zSjKhl0QNc&9~GM2{YgIkUkkqsRIBt3LD*Qm(;N_9A zByPxE6)1ruD%LL?Pk`5FH+$n+#)(l^9LbQ(3kydNGMSH|k%2C^XqT@6nXeKSfR^X^(n5`DWS!`@VJ=Y1kVvZ8=Qwdd;uI3W91|Xb4>4F_48M)T#PiW4$}R- zcJiIhi=NGX&U-L%|j#pxrA;54;LNRTmc1z zB*YT80tZK!%t~;)!|vU5_fB*q@JB$TSDU^Df<)y&-7iwGnsI`egG4wocB>z9xw)2d zHu-=w)|#SfGsZeVb$oTX4#Ar69MRs4~FxyE4hP z${7egIXOB9J$Zb)^qnQ~CeMTn(E@1H(%=9f&6*aSuH3q1F$V@D?twJOm_}~bIZoE3 z=n5yAVKuS8Ve&BNIEGe-^mPFBfW0Thbt9RW4RFCC!xh5Xr5qP%_LI>aOhK4a+}a#;E0#8$_&X~eh&{|a zf`=G+g;${9`XgC2Pvmr5>3oP+%!6uv4BP-rYn}pqZLQ(y45E;pJOv`DJ!<<1byrkQ zEqJPE&%&CJ-f=@HPPTDgGk2;lv#0u9vrwpJ89q?Y0Nk2t~ z_ijE*gnfvcHtT0%Hw$XFJba;&YOv5KA5|wHc({Q_ zr!xGZP$&H(@`x+~5b=NFIa9-&5tTMjW~zFXY=QGkS6<05k_M)cY)NbE`+!$HCN;IC5=Gq3+7Kl zt}7g@q4$Qf!s_LB7FhQV{Zx(G`G=qtZ)gr^@EAiU$ZlXElagpb{LbP z1{~sKptjE5v|m!5PjuPnH#B-ZQ!V=wU-JQxC{rZSG90%BWP`;4Z|!oji(6=eOiKr=)SlpoatyO!dE(d@ z$q|wexPSXNHFx`-iOZI1i8pGOxBVRf%VdeW>>2yG(`RlIrHsSA**Y5nBn4c$= zQOub=HR#m}S9#&_Httau!D~7N0_T^5a;UR2X=mj>`$$CIh@W`guZmQrTdx+aXMYyH zd$9p7E-Jh!=10w2=u=#%`>|{Y&+*;wFR^pOpwSm2^Ox9JZCdoKA*)rxi#Bgob$~3? zeLOa$4r@*f!Q_$#3^5HVYRx4{Qw_#w-6u(c6`!}j!j4aXmEIby?zH_r;H_?&34M$N z^k-X34lCAXir%0+uRV*X2e>9XX(v;f^I`p^=qh+R{`Bo_O#smOjG_1t)v?_j>%WzC zC+hgq%1caHG~Ib3+jv?e^KF380p9A0qH<9lJpJ3sqJw7Y4W)+Wc6Bp*gD$1cE-x|z z`lJ#XGcXdyvl`v^SBkP-4l9+Zibw-Ho`nl)R__f?o`+Vwu2mZ2`hwc0Xbqp5=t%VH z*=%}a$hds)R3|NfSKjD&5@*LUy(5Bw8||g@X*d3lUkFW>am}PVjz{Uu8``Xp%_@eyz_B}TT zW-WysaF7*;M~7B{0Q)l{Be0l=Qf&KgCW-uClcX%uWCxjw^YUO!x+@$LnUboDiI01x z*Ps6XFiE_utUp;5acStj5i5GYJJz#lB{JTa`A0?O37b(yI9JSg$N(=1)bx!T$IROW zB~#t|TN>g3N+QFs;OEeD&GpX9`#03T_&f-n7oEZ>jlW$+IlqU3dgqBfDu!f)@6ml0 zZQFbNE}hVSK=ykuwj{|I1DR1$P|xT<6-8-(%#D_zARR!dc-P1d`z8kn{?VX>x=XHJ z2FuB++iyu_r1iO(^sjWy0pHjUH=g!@5WGMaIdZv6jCW`ycmsu2unOe z9ZrO=>ar|gMXQjfnI(F=aq>~lP{dh6H=uEAPkb4`6%jKQk#)`G8e}hB&pP$@;LB)J zzrILwLnD*)tusZ}?wwA#!nOcWU9AjBf>C8g&Kz$ z3z!mhTLp;10aE8y+ueeg(pLsn3@w`9^EN@LzhWW6m;2J+UxYfip+^s!Y*Wxtuy{>h#j?c46V7?Jhvc z(#W3=AZkE{hQM%ephag7km|1X@4!&e7yMN)^GaL374$h zd{q2J?5o#EN6V|+RJoQ@-TYV6hU^D5?Z&6@;>m7%G_cHG`LoQX{Ikqz{3Df(*kDRf z(I|dZW_kX5Zk?Cby$S*yG&c@kK4nZfyi{(UH98;2eq-U*?t1>d3&7g)JQ zC@~-sXhxtha~CpK&#+ifF;BK}%*WmtG%k_s<<9-}&N--vdoxHqgIJY25yBn6xLpAY z$0`MSQLhZ3cqOJDDlXxP@uC=DX(7Ia+*F<45inB<7@Ue3^OHr+lsi7sO8zIbuFs4T z2(2^x6Ixdegw{2q*>>EDpV!SFzTkhVy2+>@rMX>z#3gb(EU0cS(KL)yhKTuIh4DkY zv@$%Oh=vv3IhJgik?(2TBc{0*J-`CgdZrw};<&smwJtih2Ac(4#1+91#ZrmMH2$anCPn2K83Y9w4#E0hhy%1GbMVfPz{_>C+@K1Iao1wCuDD_W327t|S_Eg^37b z)p@R#I3s9DO2|F^W-N6lczTmVH+qi9=8Z%YsAezYaJcE&*Mf;Cr1_gMAs=gf4jT3; zBcCt*mAOx7p|PgQpIzq>ZuC*n_aVo3df>soXYxLAH2 zz|Kumy(XEOZWg~0(r{l`x;34=;cJ(d zH@j-x>(5j2#Dc<^N9=efY41ASMvQ6SIfGJt$BR(|_N+WkB10l)T_h2oHum#O5jD4Z zN6vt3u5{H}%FhujBaB8=)wnc~%BzadQ$lyRtX?z^LZ5c<@wHfHt4#L$*>yn*`L*E& zn6*X@ki7R2hg}k?mhp4`na8C9ngj!%72N5VlI73=l&)oFXz`5|#n;s|jFga-WIBje z{IGfZF)}hHW>c7gCBo)7SY9Eb{WTO3eTD(=CyXX;tWOlanH^j8CQiv@ZBQ0fx8ZLF z@%A|rEXOGqJcZrQ{G_Dyo4_60Asspz`qWV7QaV#e-`Tc}Cw=SIgTDliEePXYc~*kI8XCZpV)m zXT^Wukn;b5L)Kf)2Cr8ZV`Vs7C+;uO?mB!R(M*JX-!j6igCA9v(ma~qkpO}-d%Hxo zi6!><_kgMlLJOIR%2D< zWL)(EV}%Ap?VIkSi}_>l+J4oKaSykEhD^0jUk^06X=S#84Ccf>{k3$~rSuu5{aet?oPc?(YR|qksRlp9r`rD_&+CI#OK^YWG!7h8+f&3`TjF$M`xOO z7~TKIqy8%#^5ywoJj!Eik2qzmBiF>)PHrS!RhyKCe+9JY^cHc?EY`FQxMeiSbV_vi zb#NFBjTO4I|JdroR+A_ZQ9x%9a0Q>6islp79^IRC-MT8r27~P)n+|Y+|8}ENRVhCt z3P(w~uW%{P+MS;BO;63kZ2&sQr3ssBV%q1H0P7mZC!pc{56i?j7)zH^Qnr+YkX%3m zMu}S2 z-HfH!exWLFAc8vG+~#qMHL@-O4ntmKh0p|<;0@ET5I+&W^)h>AKPDEP8$hHK6wl~y z+tzU>Ymm!UCOVhD(PDildyl#Z$`*ickltD~!w<)FP$i!0OBWRgDuX(Q>u7OOLv2F$ z2#%r8>qG^o<04RR5AT-O4Fw@e(c zjo&;Z76R!eqgihKod@8?`?^R5aOav2N)2qNuiV~UnV4?l=1}knh|yLp5Ft0lmOw9* zCm#30Dn!d?jJdD-m=gs#t6F&wyvF_N5E{vO!(UME4B=c@(wzf#giXx-w=BmJpQ}~N z4KC`=a|iytBbb(HQl~k7bnVw|ChKqUiD{cNJL&p?lZARBvYzT1rCXbf=L#D{ICbBB zXvlwudDmw39HjkcIzSJ7KYpwhFz#b}&p$(1rPh}qTEIHNR48!FwF0hibn z2ke0y`Z79CoaritAubJU2}Fk205qvS?I^Nl^L| zNxtrLZLj>os|APR>pX0eUwVbu;JRkt%=eG|`WE{SJtU;`W~XQVKSiA0{4z&1c#gL~ zD+?pkG;``}d8q}lZgphF50Y~@TCU2$D!k?$lBqu7t>xOJZ9rW7&qU+aPu}`_{chs3 z4KN}rPtQiuFvYRQ(_>HQ_`j_&6%%7iG>;LcCn>J!>o5fL{$98P_P&BfMO2`G2hBQA z?5lFvG=*vb+im+k#G^20N3Y9kNf-=aJ8Kco3{m?JfZ*OYA{w1V zJ^K1f)FG$DT*CyW1g;x@&k^!@^rej`_Lbt$cEI~K{k!&Bp0Qrw{PR4tX0QVaAvJe? zn>EOL{N=PAodF#&ae8PmPT^D*tyyOB_?#>(S!kZMw1p)mRgwdWF4F}2tjXFpZRafd z-jWX!OAOMoLZ#TQUb};ej9hS=Sn&WFT_G6acCiz&?ZTxT&wQO6K;p;{)uoQ^6DmE9 z(FxuyLCw1lCVRk$*QK;#Z#nSKJ1)Y!fpUjN4OxJ9`{_3}ds>OHN*I8qparb1Yh#h@ zBJp{iy8(g56wgAbpWW6T`KEgC^4GptM6B9ZCGi@f0ZE_-8e#V0lm@*G664|Nkb;6j z{bZ}7rL*63UT;hX4hs-`746S@$fq`&JE*xO^<5aBK6T*J*g0xW^RdumAL_o&LR zv`A_UQCY{f(9el_KNSq4xIOxn8<=d-IKhX3xWPO!QZ}y|S}zH@y`R*^=vnx#06`Jr z%U`ck%i0#>66chbCfIGw=tU>%a&Vr~KblP|N)zbFiozTRyHO$Un5q!;6+fM_`giOY zPhlk0Ms?S|n~dK6udeZLShKj{&R{y_X&n%pN8RV*r3KMPc zBGGH|1R5{7LwW8;!A$yzHS(o9`v9{v&bVI7SyLV#R>g zD%2*EAWF*M$JPm?j!5HU?#zjtZg^>Oh>J^}0$S!)rxCZI8X80^`d8uzf`#r!iK~iw6Pirt?v#YbkcLcgD**)t|bKIPFPQ z8&l}s(H`s2RX=f2$MfI@#YZ1TiyjP7-vLhEe-L<5rPGcW7`HyuG90+l`4kV!Vb9~_ z?G!EgKTsUZ|45)mm# zF*HkD8w7Kdy<+nq%yFJdAy@PQ^VJ)&xl-tw+{@vVF8cpZamZae^}YXZiX&>5?(@W~ z8Ht|*;~eRT0DpaU`r-hWwH~cj-@8v&SeH1)8$Jx@aTTcH7Awu8a>D*iarhwH;30B% zf~I@%KT6-RI9{K7cxB+m=4V#7ksKfXyssNj2xrCjs*pCZq7NMlLhy#sG%t>nbB0CD z59m4&$&ZPk)07RcQuCe(?G!vUQP>kJS03sdqj%qE^jnU@nLe(TF(C6sLK|#OV#Bnl zb@mEBYbe#z3TKH+NTkj6bze{cPM|(?&il)Ug>eD!s|NV9FPS?KT`;y7ZnJ;Vns2Oj zx59Gw90XKHwz|A3f3GD3?#%W6Gus|`0JF_0TndlT?xj~hmo%VZ3!L5!D( z9k+ID*E7k*8ZryPo>uDdtqGE0F)~-F?03N?w9iN3g^M?z>804f_V4!M@6x2SJnu_< z8|*oAHR?;#hbfpQ^qfKaRP~#gor`M0h8QT9ja|ONxHwfLa>-d@fOy4B7(b9wYdcTP zC*F47iEpKfuZ{^!5GN}M#3MwyOvsj+Sx}uSADtney3D)1vjp zF_%kzm^;~bT+RJU$V>pOx2(rK_3oG>B;!6Vg8x&RrH4Pmeufc1%FXFnROH5QvB}1C zN2cvhy61(0kE*0(-G1CQvTMhEmornr2+-PvL!|TXZ>_`boz_m7%6zLmLT1P~fxK+`6q^o&1 zYGtFmBfhDtkPmBYjWO%_aqT-)qVkOApI`elNZ-xiz{0Kcw0SMZ`1Jk0S4-#sI`8LO zneON_w&**Ik(1rh6J)W_w8H`Dn82iTyMe(x#e?!zmPr$J()aIL@2;vvLoJ?2yOMdC z-S*RWa(mlTA_aPDH=OlnR}}fPE4q|=Jjx-SHH9>8WC+{iDSohTi>LJm6Db^;|Xr4BMAjLP@hXRjk zYPa_S-dLLW_1v|2n#OZm#7sLV)n&y7Eu$V5$x~Rm<+cMm<=Df;B7wK8U)oJaY95D9 zJG7cO-nz^Z{pT9r_``4e_?9c(dYhqjY8lc@_&x|tuH$k^{_)*dtWn0F+ z_8OJ8VnC?t{rMmP>c`dE#-AsHeHr5}6``Jii=Zk+hAyB|RS7sjU*+uoFn=V!b`CPP zDG16UGn0;PQPy)c)%AWG_+`cG7?I!!jCmGMayol_%KeUr{o- znL&mf%JFu+q5WK~Z+DsW9$WNH>=NVo6=S3Sp=%)dg&ov4NUjsyF9eOc0>zq}+G*MI zZd=YiiS!9K6pc36UInDw%|+Gf_3y6|fd@O(*h_l_*_HJln z@EaK!|Bn6QpGS6xJt<+I+qH}LQR$Pia>s2d6OC}OxnPle!(J81C!-jQ%W4iq4W-%a zF6(N!gCoXyX3TiJT01G~UGbq@Yc-Q1&?212z$_Hqze4{<7lDO&9HU5pD94gSGa6}y zzl=#ovFH=M+rUemE!j)J*+}uWYoBDAW0r262#PNrsCzY@;u_${lLSPDYS_o0EWjHK zM`r0Lz&t7vAm4Jh(BPw`-g{Du>f7obzX?dN;=?KD&I>n_sR(>}mVuGmQZ2cr_ssAe zQ}%dClHd2~V*BO5lud*Nc%Wp(M%L6TW2Oe-<=_^k(r2JXg(3@ktz;-68)5n%=Tc9VebohJ48 ze${(;TD0#rhH0pQ!g>g&x8Fwm`Nfjvn2grHu$nCg)fHN30+un_sCteGqOf6}W}aQM zUE;Wz5}pkF;GN3>*DLw_PUUm?%3@2gklbj7Bm-}sboatJA#-WJ+=jT;MivL@7pPLh z?tA;$PmTu02qkbl?O&@S!R)Kd4`(Cs`VHhc2m4s>LRULhw`GYQsudmG@`j{YY+kb3`eY5uZDm`4WI&Z>u>d_56e z{QT_dLs`P-=i?HEu5OK8SYbxf8|Zk4e)j3TOIr`Afr^p1Ll+a&<+!VxdbKekwbEv) zbdSmU?aRn-<(W^#YsOOE#D(znOmvM7?}=4Qu0tAr%BUQ#XZbKk`OwwfzP}O_y__;u zKH97uih!Wa+M*fD<#OY4w9{+;k7Fm2IpzDGv6GH6S$)sxo2XcHQ9>aaC9=jktm+J$ z!E#rWvtte3UUeC7AkhQFqnc35ogB|Wom0Ewk{I++gy4`&+2b}>KPm{SAwhWZn7 zojE%8*TVW#rGyg^C(hrOKgP-P47xDCLeT4BA(gdFsu}jb37X|$%L(3D_?D>O1m7%? zsq(giXIxcg*umcfHqdjoW3tlP5j?GT3PV?Y0fP?j^#$((EzfiMv-0Ej-|I6L@2~U; zK91quVe^rko2@;e-cMG1`J15lSF)L^`~XLW?k&?7ldf{swdJ*yC&uY!iab0#)UWje zo3FW&u?0l>AYQrK4of`O>4RP|W&e_8ANQ=uQts_L*X#x6*Ral`LODj%-5yr+Zik|n zk@3dQr*sQ-{)$;XT8vBi$Pr<=d%feDyq?xH{2sg6J3Y1XASY1=z9PwVeuPxzw;jvD zCL2{*`_`qV_m-naTd7v!Z!>4fTl|t9Twm89w){0wjh}I-QVfZ%)1tUIHD2|y#Da`r`EUu&~)bvTh~8T@{LE^V{*+xTKf<5oI!S`U|n$ZJj-OX zRK+HCQE9;0_d~`DfOQ0FL5y6A=_9}sXBY;3{NPsttKMJa4H`37%}~A z&-45UB%HfXUT<+&p?lm6v~aV&F7sp*2g3JUMjG6tB8@tdSE4}b4c~>=dN0(-m~fU7 zGuK^W&LS>gXi)G@i9^h?qKv^jyk5x0&bIxI5>bG)l81ki?DLF;!4g2DA&x$8yz82` zf)VJ{-*8*F1xnxOF>dGGy}nplU_p$e&SFaN8}f;RKYZDxds64Qb9%S~9$D;lkFX;k z1d``fZa(lTdGT3AX9eJBGM+Ns&QXF_6zTUjCYIr*aT?4@`?JTH|2ugeaS3V$bCxO9 zjBMwOB1Aer-BQVVCmb9%aq9LnE@ID*I466gok@b284f)ULj!e)#mgfGFBAu+rV_a; zAC)AQt^3r3DkNH+Quuf4#We~0`WU}y@Yr%YJU%e)mCmbZ3WBJHbe!fsi>@Jv4DMP8 zJ{{RkT*X98HS@OJru`O6BP;A1AbLX4)N8On9{ibo_vpOI6&j=_q`2i0@9ct}<^7~EmHE9h)?nH3#8 zGO;o7t^R{5C%l}I{>UkG>amxX(8DJ*53WRyMV4Ysw5omL8Rb?rT;I9~j&ic!z4N5q zZTv@1n&h;sNnJ#~1xA44#(IUE|7dZ%6*YCcH(cE!(%e5CI87W8UDkJtSi)Kp8Ksj{ zWU}&e_S!CTc0bnMpAP~qA3{=i@{DVA`=VZ6PAy-(vLvrNElVzmEb{hkuYC$|6m0*C zqhO>wd>uGSf`w0(@?rfA9Ih`hxw8z0MVH1BdUle&(2c8`YD6S8Ckk#bRPuYCgYs1L zS0p7Tv(TlZu7$7cZ@1Ryeu?$;s@rlupD(QZLeY=$ZAyd=mwzASkALjB8}o@)`2lzK zolh^2=#+D>MfOy(ii2weuP5Rl-1n5)0XCk|x|jCXi7Nn77|G2cyx1mr0>oiKGELwS zjwf|i!mkgc2={b1YQ=IM6K;p}axyy~S*}w!bsixQ)`VP0v&+Zf6jSFk-wsOYc1J%eYx&m$7zYK;OGSV5>|KVn=F6U6Pz41LCLQmy&p1nbuQ%a5U;aj}6H_TMdoEG^rs8KT! z@0`_rYe0kx<@U&5AQyO=F3f*o*;_!aZ3K*O66q!Vvx3Og>)kW5o#_;INvXJ2GNT(kPiqUn4;mVfZZy3_NqF`*}Rq z>t-7psBw`6euPNc`W>pv@36s}w7g$xnW#==mhzyh9-OEskskVzRNvRugGtAq>19tl zT&hWzSPrRy?y!~&;%SrVtgZ-eL=&?&cwl%a;!z|Ct|w&kf*%U-6&a?<=hk#2B@DVS>k{y^1Zw_(1*_CUo=&3_%=rU z0b#^~hoGGOvQG#QPu?*fesl*-qGx+ygff}lfC%(AwH?B@r!#i$)(wb!xg10}u)kkq z=Iyn6bK*i^ynONF%Erv4NJ?70=XthnS56j);RhX?@6tT=F{ouPEb;EfP2QLi&$XO@ ztXS;ZBO4~FHvJ^sTs)kljc42W>bs+c zdU6b1g@NnE;OB1TYp?mDt9Q)IaNvDZLZpt5ZPwLBTMX|l>ej$5@SG-koJI(adKH>A zonW@t&_o#Pr|=;(%Je)fr&rDL!Tqqqe0SfQYca`I+{!;XCFODvGvp}Le!YTt6mP{= zqGIR{?z?HwyVEo139AEP&7%eZtT6}hg0N&nu7}mw^E`HPY(O|jGx?jeQkovtKt_6h z7Kw!~8Uu&KM_V7OKQBDKVREvW6*IE2XLu{XtY~7L_&xrerCqfw~j3UVAMTT zc2Zxve4bgO(Ii&Y@N!Brz{S?RfxpAC@ML?5M{MubKiO)rN^i`gU5d0BZxEYqDL<3O z#ldqt0nP6X)4RV3 ziul92&J&}5E>ks^*yxt&+~5JvV<^=^r+lsw2>wg5S*$3~D?QqEFFnukvrATJ> zEt=ghG`0&VcryZ)ogjXSjzw>?Z4(@ z`x3`96F}`PHMKg+^jx>y;eVJr15IL`Y}w+;_0Di-Z{BA=(0`mHu1zCYQX0awwm(R! z@;ZeD&**>7dvlXf4o;0uRH}LY;`f<;$7mYm{ju@9;>WzpPqOJ)2m6D6UfJpdXY@39 zwa(pnwKFbltRF>e4X(H37{vf7onlybxSLA#nFE>r;Wvj#x!gU7nO1hoNd-ML?j7%0-#g_>_|=>KhTVplOND`?z_11w0@rY)}&*N1oyZv5dwMy{QynSc>3PdTRNg677oi+fqDfRUl{i4j% zwN-KY=VuxI})lybs)-dVn8X_JWJaUazjSSA=H)X@|9!Fs<6f~_lO3BVbW`Y~K z77rRoQZ|kd_QtQT)-266WgjS`4;j-FZZ=TqTqMA|Ho?>ka)ZH(_tP^M$++hhHzmG_ zYwvo!y%I#`kuLXBhG>ar@H8Jw%l|s+Dl3<(mW||$;Y(J$91uOk;jyT^0=IL8(f3tj zuIIl>7#2q_fkiFhpEhYwb@XXKF-Y6BlVWUI#6o&#O?J-$@{W!IqR?DRu)f(b8 z$8I?4Q}Q)F2yix4ojs2;wSVO&dMf)`Z;JNYl%NpoVdv`Deti1F@fYekdw6`x`r|J~ zi;J{##=W_$e)AjTl6!Ma+=~Gui!zVRd0Ryi^u3&**~L4T8+Ndt=Ov6D7||R}LV0T* zNKq8f4qRKy?6<*#mgN>qq+fiN_4Tk7CNqK(L7OU*fVT>`)8|~_D`u32vqlL_5L2Pw z1jw2f_o;w-opn=5(;r+B5b|?C6&ykR^T&DB+~8RGqfaNzL<4#3;&7c%%Wx*8J2Nl zH(aEf0r>oyyYg|M?h}yM0yEbxpcJjhUx-?pnyJ)GdU?w4059JiN#{*b`PlYeK#Bl< zLX`Y>w|YhgQWe!6SF=p)AdWjDX!>LuF4r_A{F?ydfy_RYMu*1tO!<#GCv4z9_v5;e zVW|cUlvj?o8h{k4fZqg5Mz#KDem)a4nn2*MFvVp`iHT@*D3V41m-?F^Rx;oEY~W!v zuO?!R4@S863PpC6)9*9x`9~%pxR88HsfQ`e52H-rqv$G!Z{ZWF&MX>bRa38~T^7k> z&jf%nRK4BZZ*&Jaz|)2PdAbEY>~cmjz+*XZ!oQr$xcO$3SypODvo<~nKjm-kvOm3W z+1%I9KneUR4uH>6(7XR}A+l-fQRHue85J`;f1^^(D2LikeI4`hKJeKMV>i#Em#Vbt z2=R5|r(+}NG`Dey8Ufrb;G;`mKC3O#>$kbVrVn5#ax?pRtxX{T_r@6Xep*Ej>|_bi z$<6H@#NMQR!%`SMTU3#x^^+~E8+M0F&63Fi_C6rM+exP`L(9d-%Zv9Gvu1@9I-GX> z={lMF>T0VEv;E*@0PvXGbqiwNQ04SuCoh37C(G|c&}p6b)%EpRAPvjE3C<|D5Sp#> z2wjU4t$#N!C*g% z{qp7$${BB0G_O_l^lH^KSbf?J-q^|PeS}4ZW{+VXrrC>I;-|$=M;tu1urc*p7kT%? z(p#BhkXc<4l+t~ej}#%D)jj>QHQBL7o7tCgHr;RLU$qXqwGAdit6&YxnJK}iW?CVw zUP#`2C84!^yng2&imI%CFU-M4`Hi`hknqH$0*e;j&Zvq-4Pi8VX zidWQP>3YUW*9Dd(a8r$xacxpv8-=F73Fb#kug4Y5m?$vx`nb2jQ!gKO%3e%#y2ul` zFwqMpnkV-Z)>Sp=7Q-<>bGs+TBV;!4#)y$KD*z~)@SvT{x>`0=6 z2gz`U8l!{nJy>~sOR~QnAI8JDPg4eVN0EC*8}Lj29{FQ?|Mvde`PtMQAW5woc3OBw zv2EgC6Hp`ncfQEgU26B6G$1SAUmU9ZCOB8dMy&+a)M0F>x4|#E!7v{4w%ur1rXFcodGG-`>MAEBL+JZ;$v52`GifO} zY^vcHwK9Fe{3YHAQzUkN`6Kcse@WU>L3IF(#mu@jfB{49TIjDUbW`T2#Op&8y>`@%y8F7rRP)Hwtuk!JN^;aRSY2oY3kz z8}Nrr?SLdmOXhe>Yo6jJcGK&|B!iye2lO4$X3UW1HG)ynk4<@PK@(a*=IA>7+A?S8 zZh{v!-EH7jm%r8~^YwD&aZ-W==~@(9gMrrtrBtrxY9gd6fw?DA(M0R85A|Bxy>f}* zYaNE`>}_ywVDxw5K3f|$=37-L&an+6P(dh&-4@qb?2$GeUy?tkxS8DTxk`?C> zUN7)zn&WRLKl2zGABR&RjTT?&f%XCKKm9;n1}Nt3dlL1To>BSb1m%54^aB4>EJ90` z%*;E|yoOs+VZ?6wJugI}qmPQi%5(#VmeT>jy^dFL?~~|?O?1^zS^y@cu`$5Jq5nf+ z>372vjqp_VpQ4rU7l(1`d`x z=@`~LRc)RzwAR^Sbi4q#sO2_4*H8XTC4-C9u1zTSMly1>jLVj?V0zz_doKA`;CO&>o#7B4sF zDd3yzo!!o6t}Co-d*vy$K;GX2N|oJQXE!veSR&gwz)^N50NbvJAo`GT?wu`v2#y6B zr~Bk8`1fln%5ZqJlO-+dL(t0{`|Ae_Hxq%ax4Y0$07(uSWBpPLmG%!!S@lpR6{*hi zmeVUhRM8i7%QRw@Bx0aQca4`h5IxWKFO3z4}W7CWrquyoUMP( zTX?SyeoOLmmA-#UMldrZ1zS_uExCa1j}1{chFaa7`HR8}ic9It^ay4we8`_O<*^4> zd}PV}Au-(UWFB@f@HV~5%{lAu4qvBs9lj>2p%3nRbn=-uj;>Tzzv>GKIEGo(gI+Z; zDsm9|TS>(m_4;sW*XpJ2l#>zHn)XF;FBNdvJPj^n3aYN2XNhluiCjawM|zBHPyMcZ z#I&k*&Ua4JQzy5E#JBQ$4C@i5v1)y3EM={8a0rBo69na4>Tte&6T31OK2AZrLLdSf z4I*6MXKPrZ^J@>-j8@2~PZIOwQWP_QVn}RK&XG#ad>(sr9%+Rlei7LD ze6##znN^&%g(O9W)MbGkIQum>k#(?5H+3eh(GalnNCE6Th@Ol5E2Zm{du0<1xt1yC zDU^G$bdyDMx65(;+=MW-BHcA|`dW$jD+a9vvXJJiWDS~Bs{(G$&p!1};D4&kNKVN9 zBK5|v18E_S>o42GvgAU$Wj>-eWPUy*YyEHDk1t7z=Y^_mchm=*i>p2z6!1bbrRlE2ZvBGVc5pEK*$YGvNu zaFg}kFP~BaKA07R>sYzo(w^fRB-`uCb-nBC+~AUTSH2vb@;bEKnxZ>q`$GTlg^GXa zMZoH1H7T%M613`FPwBT&{1VldVX1e^RhutQ^a*{42BJ4kx8XC!aGc%ZPj)cH?EhwSL z>@L4!;i$u*-L{)I4uxfHvO@hvvZS*Q!% z=MvDE=Kg96#CQ1M=zv$bUnV46UU7T{Ez)fZ`Sv>Fxq!{9qs*+I5tGP!wBzyZp}*F7w2TWO_Jtil6tz&;um&)q0PqJMfIo;}}(<$888o6PO_frANhT_H8U z_3~G>4RW5tyR}uN_h88JSBG*Rj1*Ea*>ghhi610(6bw4xf?jNTaj}gT3H|BQ*Fj7U zjpr;C#TPAypUt?o&*R~S?}zMMu|f{ctHE-1Py0aGOW3o2BG`hO@PVrpcN{nrWoH|F z%S;6=u~8rkiDePDiE19do;qvaU+j)>iU&>95Bg$IVO5ZIr(@NyXxR64nX-DxIWvwE zp6P*%_5g7{aG6W78723P#k4{@S$K$z&n2ym2#ByEs5G=@5a-VC;8oFfy?iM2qRc*x z%<1IoJ*B$NDpJ_oqPaKi*{KefkOyAr&@l4lTcpi=R9FKYcqJ9N%$EXVwS%1;H1T)d zSZH*iT9&HH{j(?|$1`M47wTxz{4ZIo3cesG8-)hSqn;|kB^rAdrh*ZcPP3zAc^D05 zoN^*5%OHQS5-d3t2~N~}k+i`bHqF*JJCHi$PD8tH-*rT0kh9YXIV^xk`b zKtc&${Oz;%8TWku+pJLmJfb>2?jE(0DY$jZwCaBu(s9P9^hI|q0R zxQmO2hlhI?`*rv3U3>x(LIP|fBPPB_LQY0OK~6?aPWh0LhLVb&nw*^WF)ck46AKFq zCCwAIC(LY&%q+}*JHf%eN`Oy5N=Qh`Ohrz`{QtS#wgSir?*Q%qaB-dh?vUf)lH=TV z0$8x~yo>Ws1N>LRxr2*`oh9KtB4X?VRSy7naBy+&VCRn&0Q~e6R5- zRZR$-La7gI4u<+Qp_=LoyAIT}1S=l+cdHDr} ze~9o=GOMkF5=|$40(QmLSO!s3kNIb zzuUhA`yXe)8Y( zhWv_py4UiQjbM;Y|Il_xo{+8)uV~X-fNNUp?D;~?Tu%Mo$jKfrzV-QeJFrZK-FfVn zJ3Esz`1@*R{qa=#ms>z*^E7zw=`Dch(n$%q92Ie^Mb!OkKtZz^nn3Rsu$1t3QAFOLY{zu&>AjfQG02O&ej#|$ zVb5oD*D3;(?rgP}Y$weU*<2Kw#UvRA_EEyHf3;bp{}V&_u$K<73=>{E*+ao;ig(m@ zj=n2)su(y+x2zd;7taNmbve^7)b}!QJ%1Fw(`vTMZY`13wc1S8Hj%p}%gKM3(0s)h z8gj-^Vq-}jM|H15L0j@1-~sGE8UAgZPB4BjLJ8UuCgc$rPInp4Tj$C_@n(0F=;jm? zMm(+XvX6+C2!Xi_OI|!KT6}`CH5>2D#ZF&^(wO>NYP?{$K(BLg#Pbfdf^P~r@y&x?i93jDt!xhZTt=; zvNE@*R~+(UF=5#hF$vOe&HtRFjvNRKKDn;B$LMZbm&2oB)GNJLgq#Bzogd3fa(&8T zSFXARv~Xdl6Y^0GDtzUB;nc$yA33hOh0f$6eQ5C}2oi8$cPbg+j^$E**f4U)WtyIjzf3^{hxrU;&N9)Nt zEMr?0M%~X!)nWcL^j;#nXkCMKn*RK14VNDR-8p2M~I?x<-WAZ1H1hbG!kJ8A8CZfLf z+Xz%fkYjDI_XE|RGdT{;-P9{h_sft0yK=>wMGpoL zE1hnop6#HC4x5=hRoQjyN`Bp=kL3J1qFp9)Jl&m#&V8{MuhnJhWOpU?gw9UX2KWqI5kfo4Lmw`=?d1|SX^lRQMPV)r>w`m z{zRVQhw;ruCNfl7p$}ALsBm^!h}Xgd`z>+t<>@l!4_VPT##+8i4HeZo13y9Q#&_n? zdP;wW-z;5{Lk*8x!u2Mp?g_^n8FT5`CvvL$&0HNChC~A&XN3mVG_dqs{_GO3sv0cR z*9V;Rym=B`-2H{C-&f^04@RFofY8^IX-F$q36P4$Db5JRJdaaD9ERCgvipr8GCpMN z7;YWhTRVE-`DAm-@9~P~hVh~tFFaoqn1lujb<)9Jc>XZ?Q{8Zw*l;mtwq8c<)F=`b z!a!`r!L& zucppJx4~ER#Y>e(5uy6;fhxzPdd7R)ZUGRCBF0MC91Sj=;I z$0J4zGf}swNUYT@KxV@DxR-?*xV6^Nf}&%;1u&G%L1z0qM+QcP!eg5pX{d%#ATR}Z z_{()-lPG+R*qZQW^cEnnvRf#5^i$67gE7h+5}t92SXsIziMs_vVgDqFL8xQ=B_(bF zUt__D`q^7RNDYGh8b#Lo`M+};JL@Jet*AI ziF+_sQv&`BWH2zZbtld^61fGK8M$-%s&IyD#;Y4)HMhWiIin>=hO2^x zoylG=SLu}T<{3~Pv01jV0g1Vw=Ph8Q=nJAI;99O!;-|i7*8N+6)KgrvW#g#7FbbLE zXvd1dU^^$*ER~i-?Xoo1n}O@MZUNs43L;k(Vm6Z47g$b3+Li_8skQYInYB;lZvh9L zm(bP>rUgE}(jNp@+61?NuwsU#nT}QN=JB(0hdcgDiUqiB+PA#3l*wT+uBcRvZ#wjMwO~453jfv}yU2-lu3r z7c#qE##^UQMp7t>6XFunFb^N8;qiHvaqc>1bwAR)@*fE|(%8?xBNB7m?J@&~gb9uL z8A;4Z`}{zkuk8@q28Uz7qct#sdJK`OqEv~d=>u+hj<#A(PZzXDX2-dg>m#q^?ABO9 zr8%Z7JgTdzUxBx>TfyA$j9nn$+Q)hQ*I4Vn_%m*Wx?20;QYW~13vh#AS4|`5Cackk zMc+r@40sde3`B-!*Of5b0_Iva{qO{opSF*l8^N$xCb|WzhiflY79t z!OC2LH}hr}a@WIggJn96?-;sZ{bNf-Vn_c=0)e1&2*`=tAq1Tv_5Ta_`N02Ay2xGg z%XO)sQO8FZd@Oiidms$`QfJ2LGVp2Ef8YIk62X5qdH=@?yNbp$?5oc6op4G|uN6{~ za9*}vgA?H7rB={q@a|g_m#zIY0bYP>G^xxhuYA-tJDyeKn>|Ts2-U95U zATSIwT&T+gl=tlv%QZID>oDlEDgS$(tH|lj6ld(1)NQwbRh!6L0F$o=*&?Rj;lkh+ zfS{H&o@IrNA_IDEumCD6C{X`aB+-x6h1h^cAnR_}>WAu#r=0hBMe}X}H4lvZhcX^) z4o!`APiJWfi!Jhwve;^ME-IaPA@ZM9+cZ68Tp|}bFe$kOB=Gp3 z?hZ;EB-T4ti@)0_iwuFVTv9tS3m+SQL&97@7E~rJTiL&`j7i~zEisoL-p>Xv!LUMd zR&{r0FulD<`tUCqsS3?R6SKW6da?K&eCbJYaaVIHCp6)D41DDzU3ARV?eXCQC>IAa z`FDjt{A4q0t9J~%qHey+RrP}rRI!**e?iF6YfJyATfp=LIc6-K&*M2y$!lipnv@l@ zl0K;p2cmh=>1nnXVT^DoDQ_RFHjkCkUbzKyK*&-48a{LHpU%Pi;#s!Bk&1~;aVl5h z)&e0gemzO>w&tl6w0nusz|6+FA9I?4c~Z&})htEa;2v`e0Asi0TSw_QZ0@(PC1K{>7hj@WR!c0keL(u=e|7A$zdH67po$_`+e>BkRBmeL7Jv$Gowx;xvi`@hXEJQF2%?vH4Wpl(zvP23~8`%J8- z_t2@PZnIA1Kkh&c_btGhjCKJAp%V5nz*kci1s>C{!BoNvWjIH}jj)R^u#Iw|iEP(O zEuTJ>FOs4h!`Qh=ha5i(EByShpK0pH*h?leSKvT++1h;xt*J+!4_v$7$X!>uvh<`J zgTT@L63Nba3dR?ySdvlgG>f869>=<7ow@vVe~1}63mMZlnpiPb1>6miiL86PWG@_K z92$PW;TTfS@sBaHw8b{osp8R zGOeJ0%)qxnPK~0c+-enPHRvBvS8UfBn(V{Jh}L16zh2Yv0r>rdE0gKg`^l215@eBW z%9FP0RNP5Gv$!j;&C!W2#S=v2pyU7Pfh&D&sdgV285$ zcqLHPz=$uAv=@ARa0G@C!WQU^-9uj? z@8N@VjA2^Q<)gp8P5_D{lYuuZo#ki$Y=O&8bRjkhq&#nqR6Kv)Go*b9-x5W4Z3)ur zSz}qoG%p`g#CUXHSxs3b&H+)et{4&bc&|&Xp;jl;%B+=oWOvs2`+HjHs;*rvk8vCF z*=_~}gH<8biK|;cdPbCgSdi;3vTQh`o91i1le2@2{gK%VSzcDL-Of0*xtWFe$DTY^ z2{>)$k$;BssCWFSkGaV^nKz%-Cr{un{{9ZGC%km_ldz(O%m0$Jj-z7M>s(IILM! zUc4RJIP}`(`XFpaUpl5GCXhi^v}`i`CQqnd$f16gQHHu8d)uQvB-?hB2yauKurD8Z z!T#qKu(vke$hTbNBRV=p#_uR?{lg+`EAPTPrrW-*G*Zh%ku3M9T+%l*5P|M+R*X$? zcTRGvSA=eCdU0!sRLDLJA6k7UMQ6&!(oNNSaL9w$YU9?gcX(5Gy|>6dGW&FsA4t?S zA&8{A3mT60@X~F)yu{ExSKADET(ez*outX1|%UY?a5xJ7`=FQ<59&Q}Q2X5%4+BtR}HM=mJ-dC`x zD=e|=6qq4AU%$AZ-S2~D8t~4t!&;%K-x(jd#cVcS96Gq}1%mSRmF!;9%{^ITWiw}9 zdvqe23;rx{Ce-;yN~?QZCHx|&G`mJcwn<(1@JOIl=#9L0tWE5YZa}H-k7b(eyryT=f@KqnuU^poj_Ulh zqNX_0wF_-%(f2~5KRegZsHJWgp9sZxxax+VrXv>?ccgX1RL1HS)Rm*YqGe^Q-ZV+f zWYq}uIr$H#2-FSqKL^BulAALQXn5F<&x~_yP|;jJ!SOES%YXLHN|V}+2&^1{YEe)9 ziQbWFdNcc}*g8wst<6Sx>)7~@srW$#I4!(F+#)U$2=$Y6MamDru&ISq>PE_WF-1@F zgfG2>Inh#{1<`5wq}4QUG1E0D?fQ-tSU5E?>BL6>jw666_+#_fId1$7SJamM<=eMA zk5^p%(l)*|HpbSh9(wvwZ_l2G**Rx7nt9Tah_WKCL1A@crLi}5kD_v{8OYZPF0m@m z`-iWc`0f=8aq2OQmpec6=4>HOQU4O$k&KjTN?T~B37GQw$oTMmKgp$&QQQg`XReSf zN%f}C*LN=DBeOT@jnAc3_&&=k&+%shXzlyHo8<0!4CoBa1eA3cR7r(SQ@v$I%VBHO z8?@^wIi>ymcPvPL?e$~|KcEnKpnduI<7-s|k8gquUT-BoKZ#>I{D?1)L>6^yjusv~ zHTx-ceBMk%>dNV&pQUxJ6@<-@ZMH_gzaRPXOsEAvzs=KoMUaVIwQf?W_|Y!|uX6GP zP2`1i;4J`Zl=TbsDVyUYnXUVU95#|vSnY;IaeO{pdb=a4P-+Fq@{&vB8|~e3uc-k` zC+%AF`*4-MG9`255`IZZyu0ZaU={l1Jet{^&hYY_f8hhB}9?3b6BUVgx{y`XJN}a=-1e_Kshxr zIU9*RYaCKYXe!c_F&9XLNVBothKzG;OxLxKr>K;RD)v{@7W7Dm6c7hMT7Y`HZaiXy zkH2d(trE*0teQFW97?RsHgR+BOkQY(c3Dl^8sQ@?j-F00{F(TZbzhHF-5r3>ma^qb z`ODa-i}8Y_7v~Y|2RhBqFZ6@=l_O}>_F7o&!9zxz1B2-rh4^``;`3U6u@Dhr`bnCK zh}o-_BnRW#4f_{4Vtv>-KRMj4px%<&YiJzv{o|aG<5HiS8cEhCp!yGWvV{A}{zaX^ z=bCKa0qZH74tZBH{qomRG&_2iH%;@-+%LXnpOCx;FhbsgC%X5P2Pv z@8LRY@bE-M;_Z=!8H2+7ULHyS!G_U}!^&?5`vU6vZu&D#100kl!@+($Z0&7LUcy}4^H52I1LQjMfYd)yF4auh}gCj8R} zKZ~iUzOr1b-Hu76CC9z+tSo;2%&LE)uk2bZQXSHqp2A*oso!)ye{@jAPi3;}(UK_B zGv6_-(admMgnkaEOHq?{I1Jnec8^!NI{a$<$6EQ`=*4I8x*6PnaRa(FvU3dcMaH26 zD~E@v9NfhO1=Iq?P&;!oyh9*L_vFF*^7m=f0~ zHJ=zZO@g;lwu(&q3`ucyFyE`Gh+=wl%8t949HNu% z4fZHtbl*!s+L&>CTI+Ajc<1|&IOLR+wRrbwuY$OXV!zJ|=<%u4(fOTlon~s!q`|0h z|7=4K4u<#+X2Nr5O3UX-69nf*Us}#fQc*UEEp+%5*||=Iu=ITd-c$F@bz$Ja4{Y3y z9$!t!G(bVs7QcRti4PEuOhIuMG4yxRh9B5xtd54SBXUIA;V(G}@?=I&e}ftFJvXWdz9*UkbT=v$#~X zKN|Y}2luPU>l+soiTlxkvGVoHW9MD&pK+`^M)!_;x|x$cyXSN7>wKL!WMx0bJ%Q$9 zDEHjYpa1+u3(bH&)u%#_W?(0H17yv|JRb80Yn;b7dR%aj8Rd_3x=#E<-lub5xg zU4(N3ioGeK@!L#o&IgxxQy+zWns8$h9}~uFnlR1^yx|%K+Q9F5<(2J+Uc$S#MgxYn zpW9hrouv%AH>JX=yR`w<${{AjI81CNv)h$7WzYx0U*`*MiZ5PU;ofPsw6ejf6g;wT55M^Wt?~xc0Zw9Dt?lqXd3HM|39z z;o&`MxGa(Dyt$`XI;W?tIY`wT+9k#97nbYGI}SZ#y?+x=^HDqsp+xIy`#|>f@(B)< z0~K~$)b6g`z9XoplO2Jh^}tM-)Jx{E$||WhGuQTg5!l1BoyQ{31?V$WOlg+~+fNEJ@+UyyQyi|jS#I2~m@?;tsax3$v z>3D~4Blm)>8Su-vQ~iqLcDedLKE_X_Uj16o%M^>GpMrQn&=Dv&<<^wc84h^w*V@k`9NK&!{GRSQ)#Mx zKi%Ap5$hTgACHyWo#r5fRU}XDpXa4bQlPCR1{)5^v6oN&bi-m%WZFSRX1Q~n%ua=m z?gk5Vh&%Ut8syJ!(RIJZfODSZJ?HKgDp*FVzF3?0ZKGXIK+spy1e4mK-QfSY|^vK{X%%4a2a8g$}yrLIUL%# zdMcirlYqAOy;zNS8lX!>n$W)cS=z*KDFUh`ZxA>E$1PAG1@&h)-Hbr2fc94vq>RPhNXS=_CM!Pp`d$wn6h$34#(-!7pg^|kT_?r2ISPEURx3ka% zE*n1anMqVED1IDk)yj|xBW5HeU^|1F3KsM!r~^eyAh5CD;~Gl9G9|HH-R~R}O{eKfCbb=Q}cMMxP z7I0pehf}?-bQHY-MOxwS_!Uhw(;9U-NGf+a+88yK`7n%EN|o4v7OP?oq?u7}_r~!` zXs?W*({uFp7aY5ta`$C(sAtcqjvvk)OOkbabGxgH zYT{CFTsE2*27A|Z-q(^yUVjwnVx&~8OfM@2rT@zX;QMxsj0x@P`Tp@@iY-;rZ3b)f zYnHA(qn+c9w*LHb`wx&DPk3mys%y|Kz`HpLrBX6CooWBbw4NhJyjR8COQ%<(!(uF* z+GlKj8@U8{ZJkGR@>hm$o*hbxx(lzMzpo8fudHo}xS|tIx1y@>QoI<+C#HU&#*A?~ z+J(x-?N-S|Cm-BtuS>S{VUp#_Zi=^^zj^q$X%8L+kU*0WNVb2Wraa7IUj zqD(v;k7bJ3S3Em2R#8SI+E9hLYS#BPLWAZXE*RQJ(W-$8P7wnxl3LON#>6$hPq)JM zr|1k{?HCB>2HrP>NAN!UhYZ9%kN6=aUV`uzSO4JXgyUU-`T1k%$XJE4!jr+ere0`P zBk}P$SH#_fHKu>tjXnXh5NMtx%W6N?Zm4_z%WiBgyxpu#tme8OoTq|c+!zJM*}0e5 zU8477nM&@47Oa4lSiOV0$|T>iv(n|~v~piwNN(!zV*uXg3~Vi=>V&tG;|(f8?ZYjg zzk?oic@J#2O63kemFsgX-opG5(?Zo*fsJ%hNejOelu{a35y4ympH_Oh`3xBUOJe?g7cxuBfbjf+gV<;7f`|x z=wNCWT^R!=q=8uK12wHpsynGdR_rdQy-`L%NAzPlLJKsG!8zk?$JQvSe+RuiK^=9q{ZP}eQMYHvwmjXfl5A$5V}=HcWX_UKA>x>klQCcNd678*QY zU6p3CdW|g^4y-a7idl(zSDq;*9miP>cwFcX3pvQP@YVkj6&mb!G+0kD*KWTD;E6oj zY+hM$AZ8wLS+e?e9<}ZBEM_$?DXv7e2w)D&6hqf-*k#Z5KsCsVgVmIoopcOYIpkDQ;XLsU6EB z>c#)iA&Dl?R#s-CLSPEPU4LgV{kj{&8Y_j8g?zrb-|lc-(?Y9|;PGHXg{_g7@`H^q zp0lf7z=XG8WXeI%H~!Iiwlp6ueBiG_6<+7h<1aGxvz~1{^;aE!yV!JB2}au8qe4et z`$Md`=-A_i%qgO4=+WF}dU{n@G3Y?r-(|STNvlSEsHI-(lf-!en|`%HLU$RIW6Yy6 z`C+WBx@Pd^) zC^Dz5EO?c?iQ25!l{7dYT@tGIhDS}?gljyw_5;1Lc?W4S81GPi(Q|%`-ehj1%CU5t zg;kEnow}78VfMtt3e}g^{dR}aw|l%1daCUW3#rK=J~YfaWpD}yQ&0&?zo0o0J|2o= zX>Nc!q|JT{uq=J(HTj_8CGJGZ_!!hI0Pt<$M5Um#aAIS>7(&1UQ`gxLhk!8R;N*Rp zW^U^ztb^=`QWdR9J!g5FPPvBfB&+~G8{+)KfVeN9L5(=?iUX_Yc#az7`@FAfE_4Y} z%Cd~nwvnXwKN(8??uk*ju^~KqM*+|Wq;oaw&X1H!YhT%ocDnSx^LZAvn)DY{K>9d! z#M=)+boZ`7{Uuevc#}e_31?}fQ={Zm=xB#nN3Y9_!NQ~vr2vIq-P~2`IT#q3Gv$6k1dCf$p$We_TRf0HtUJ&b&OEYt_bXnypU4! z)ba-5Wy(;~mD(0xEP<1O>vkTG?wRKR%ysALkF_@$=+_H5p$ShP9gykE$*mIwXXp38 zzG594P;5inqvhp`()wDX&)dG|1kxHHA(6TRRnNLk2H!DJWU-W)v2`2z@(NCp64Sku ztCVl&e3|l_&g&Zi#c^-7Yg(cK9@wO&KuFN;cBwQl`)abF>>xRydoNoo8vS*)YoEjY#|b4{%pggjU}b_bn&2^++{n?bFau zKHDBm_5+buj zpE}=1W>)-uEmAj`Vwv!m*tzONNU&kBl+>I4$d!enss8z*tkho5;PjUxZor{@iT*!& zZK|32`u$43z^=6qXC$&=>7itq*&sVaZ@tP-V@RIIVCL^mYu2{VUQGr$j>SzN3%4|^ z+egZ|mlmufrzDS3Z1F|+jG{Ot^HK91eCJ~gR)xMIaM^^F>BlnU z0s;-+U+N@^vcn@?w(r{6_&>M)4tbdYYi#bjPS9D!LwqTe@Z&^@IFr@BVwHraX{FZv zba2^szP5P!hCGjqH~ZDsezpnWzEw;FrJ+Xfq?+1?|r}K?yvWgzSPAfo2?yw}4O# ztM3-g^ev!A(OAs)b1fh05RJ2oE!}pfG|O>iZ=}H^_HO}#zDkm|)=qbA5HqL#d|`b{ zDz)G5o7tS)t%y(GgA9lNIk|ZDr|M^m&~?1nN9RsvOv2?udPrkTv_~?p1&2t{sBfQp z^{Ju3)22o{wo=DJ3HUEv6q#n+2kk$#0!Ew^rY6DPu|;+j`|I>PCeFN$`n9gUaCLA1bkxYo+Q`ZoyeX*>U04bHO)zSLy=PnPmfSXSN>#6+OxTo3)|W9 z?Hi-Z1--u6iY}nlAbY2{Tz3Xhckzyh`!@$VywV`pz$bTrC|bT%5_kHN{(N{Y)M@mf zolD@4jHYU={CB`z?}OnG9>InZ>CLAfcic$%4tIeiURwtmxW?A4w*bdmfF3IKM49fK zS;+=l?U@_S(BN1tJF`~LpEqAEJ#h2V-*SjSq>3BmaE5r25c>4C?Livgr(NpOEX~c6 zQ-lU+L%p}R0Pb$2bjCXT_wFxz6D{Azrm^$TKK^dD%S-J^IsO9LIyT5i;js}#iOy(h z_LztLx&4CRsPUx-56ZY*pJz<;F+1Q+r^V0tbYz{|O7brV&pno4pO*F(LcMuC)}Dy5 zO8>{6_Cr&X)tr$;y~}x`KJrp3ZzNSiI!qIZf+)hr%{G)2RZdQb;9SMiSsZKlO~5Yq z9maB;J%fk21cL_CUVW5h2bL%s(Nv&-epb}+MM&<1n{`kUX_;JP{MEj)qxdIRY~8a4 zdQGs}?|5pR=un{dWk|AIa`K} zQe^_*M{)RkI^fvu=S~D`=9Zn0(O8p0L6MLhWMGk!vwis~9fxdY+(jJRu%^C7QQysH z*WYJR(Z|a5Jn8&&)<7=mcp#X`nV+AGHGphQZ3Y`T{yr$NOjfjA%vT89R(U<4JrAT5 z5DRpFKU*RS1ovL-6o zYY2SJ{i%^wq1QB~^{?DzhGtL6!cwG~ih9Ujb(!hoayo9=o}DamWkqy0O0s5-ppVqb zaj_Mkbk=d*EHg?f;BTk`JVtYf3oRtHCu+vsW_TMS008e;6kKV>a1W+`^`(kXCz}KT6V9*0N>q9{BVyWI$jz{TFTI_X68OCeKJ8g zUN9NZ>qz&uAbBEcqg+L!@y2*%3~rSQAyWQ+_%hXxi&A}TKWud=WgHg7Y2`*KuMH=u0nN(=BY9&LiUpN%&!Y)Sh?}?|ht;Iw=k6@8W#g>It75Un8mEU!kJg$;(b!+9CN9g|a(>v&wMoN#lXh zj8^fvH|5)}OOK^LTR4^~gM*Hnq@2c^oeZYR>`Fe56ADF%@3ze(e;lOKbj~9Hxqjjo z!;6+H@k=Q+yvcDaovSg53A zs+>xD@Mk4yz&Ld{`qB<^5m)I&M?fHto=+Z!164&WLpUtw8*?p-sve)U$l!xmr*#fG zB7elrT+P~Wm5*_RT`b2s(OpOJAM4@kUO_o8bYM$iXCGIHG(KPHRT<3f*lVI|P^rR@ zm4>;SPo)?7Znlk0!&j_JXDm71=YcD-C)A&6+P{vFoyHw~IDYXXPKC;|hX4u9_hrnuF_7jdr3s0LcTG(V-j&A=@)e;FXoane9b#9Bo)rqXY0NYX__9oqnx35z zPs*?3qn)SFr2QI3roJjbQp6i=rCj<|wHWmi=IG z?3lpgqo^Kflh*a+=vRX->IQ>UC$Al$RApuItd5#7U)%7QUlUaMM|%3SX(?tCm}5nU z3ZRm+^k*BtQjvITe<&PE5aQ?pwjw?+J5KML=dXYiIIn~T9n!|Hh9M<9M~4Z_i(^)D zL-5%*jBaQMQ^93voMU1nz3Qe1@ddU3u4ojcIZd=VbvFgc&rh|5I57A)V7??&9CKD1 zO`4^gQSQdL!NXgwePUen9L3UpH#2;7TQatOtIy;l*XMz(2N-vBi}t% z4-GbA4nJRgv`e_!bgqK0(~)gIT{pL*TPWmIG7%@f^Wd?&*DZmV7019mfiqD$c_(l=s0-Y_fKb z7#(b^mDFebtTcMKRj)WjuPL}K1@SSC(y^T7u;5@RZelG*rudhI&>7ACU|!p*-~DH4 z_flrn?YLfEb-j9oWVb6p7YNSV4$}t(qRL9nMtQpP$a`xsAub}rDlhJexa-QIU7wjVA!(p}8M);^}^Vf6XJbK2n9(@&pYvsF%`Rn*3>8w0BP z_JoPHr)i}#o8ERM?of>ZL-hEgV#_gm_(9EJu5NXf4X)@(&#C6CA)-`!saJEcP9x?-mJyyQ4q^L; z8%~UOGs_xU>2ymCwyu)p*{mx)FKG;^M?tEr@0Wb6O=I9Ztn=XtM! z5LHHFdi_DuWWC;8(UN-LO~_hf;0iq4?&u(|st%&o(IsfXp zbV^j%fg}r+7y5$oCFTOWNhdEHf-6y#Gj2tmuZT=#*D(0N9N(}tBta*A4Dj>>d5lsR ziUx-zG+;iTlyg_pMT7R4WD~NFEIiCJa%&{*_ukj*Yw`E7I*V#z@UIlZJOFKS6Nat~hQ&g;iuXQv!>vv_zR0Sr0i_SQ_6iU4n0 zHpii?R&^@RKK!9R2@N=EpXL_B$#mvR@7w|wTo;X;`T4(p0KkUg1Dyq&|)};UtjkWAF58s4)md1o4{|v@P?LU#~}3J6UJ~T9rF!b;&s%{DeG{#|<|JnYYQ@`89@?Tz_8P(WTgB?OD^EDd&;4}rSoEs8#1hJpq%qk zY_r&SDTytym}@So8!$1FIoBXK=t3)-!KR>XC2C}ZaEI#QCn1It4r*oNj}Ek zdj2=*EVg4z+idO@_5SYkbM`!;U3&1hsHXC_%;e;63iDe5t^jXsJDai0B#u)tOMN-M z1Qpvett%urWil5jRlF@H&9FiA`aC&k6tg=J3I*-}o2h6%l;17zfXgJGPWjr_BFlHdO zOSDxY&g7HW&M9ZQlyns`;Rs@8C(%zq*05(x!suUpM%2LfxK|#8$rNUl6+S&VCMA5ZMSn|+otwnH0|G+K_epW$c zcI-?+iB^tB!D!O*%VY!nT;$`4EfSs0x}wd+%~E4SY+SA}Jdv{3p|&xBp5J3E5~1>A zy5jWAIm;kem{W4xFUXhQ;Np8sm2E{Nalb2?z*)unjF-W4l$U4bU0_~`@9?sr#*R0? zY@nF}OdDMh>&OdC@MpU#AW>3JF|CI?RGU6-?%Vz!&{n%=+Ah!qusW=gWJ zd6u{$m6o0Mj9IPe!@>f&OzY=>l<#ALmo6vYxODVR4^xJ;Z=RVJNL9y77h92~4GqzkbpX+N$J6#r9) zZTWLHCMi&duSp^INrU~KPL1@l*mr+Vj@2E=sawlGtuUZ29BP=j+;6}M?#o;dDKJ+1 zLD4M)T_Mg6Ke#8I(6fXE=ES8E`c0n4lY$Zdf%ZfYLAZ6r9t!}~F2NvUxctd`bPYoH zbe-gP+uBq!c-&W>O%;oQ@uNl=wnAC#NEuUw&dwC&+?1U+mX}GAs{Z9Y*T_;9)gLZ{ zx-Bh#(RTk}X!Vtl;PdLkK^FtqgS=jfgqe9A_>3`;uk(l}nXLZLq(qmzwoQ4~L@Ng# zXL-q36>k*mLmgojcQ?Q%1S^MaD%-5jXFE-J~wLZ z%$g;SOBUm6$w}EV(mGdC$NY>emObNV*D^n?!i1=90eK-pN4J3TNyG%U2155^J>q){ zngsiV@U?bEKO*{9-7O$72$S2)g6my3>3+F%Dwmva^2swg+pJOpj!~qHoyeh;go_kL z&VB$-1N$mVw-%>|sUgJ!6hq3%CY3IG#y-Kht7AgLWllx+dJnA70xXIRAc?f)w8)no zmvCK+!lLILa5_6;6@J*46EEq&sRl!Wb^)94vRQOY^~=&mj9HUkvte89zJ?{frEYMmcpZoAezFLAL)eO|u6KOw!#TR_}nVTkN+~cc8uP8ZJ3+0o$gH zq01s)B~^d<+8j6C?5p;h);QE_*izvO6W1w|u|+3Cb#H1l=VXJ;3o7)Jm$QVUTB|t=N-#Da_G0m^F*+ zr`CXzWBan-ZmiFl;n9ZO(lxH~oW@>f|@mO(0#J7KZtbS0McrO?a zHVVCZo6%R~$=gmYgldeZBi(Nga?ChjQQtu$cMgnLj->_%aHc3Dy|sn;8=p!maAK_L zI+6{&shC;$GoCoSFI||sZmik&QnwyIK&MscCY{p&D4;0%b19$p^67%bP>9V65~RW% z6TTAV9lv4CqN>l;zPeqf1`gX2AsLA+C!vq-&{FDpyG6jFHxIXs)k)L!WTk2$YveHT ze|8F}PY9EhW!a5C>#oCGY(#^mG`Fv4#IjCzEWAR`;~i1fY-tN~)k_)uC-3-nUqPCb zl2ozTZ(h-AeiANYmvaBwEv4iP2b1}_VNcbtq)@`- zN(R``QlewO;QWc{-sIXWDQ~iVb1L-m`*H9-+UQN#j(yVe~meg-a{ ztd)T8uRk4(=i@@AGACVi@Sd@0yGz{@GxbrA(j!vfSQ;5>CJ;!V(@YRyo}U#tSvuj` zPWj@<8YIv_;hx`n-JCEnr@Ppf><~9sVu12m-l$PMLD%p*v3|V;L_-|5&^UWq(s$}W zs_gMj5QXK=DNRlx8AA{08n*tN!1gz~Y0A35@_KLd#dhN`V}?=^V};g>-xf~H`VyhJ zTyUWSoc(^TT)qPX%RF1E?=mi9oyruI5PhaN6NI4Gj=->e>D2V0OJ!hqlSN^H>M5o& zoozfTSsq5~%39?vPS9}!G#XuvZl!uk7_uQ|yH(`6(6i2*`ZXMBqnXu9!-kY5yO*>H z)+?dskNO2Is_<95KA&q&-8%oqdZg)vBsmir+iSu1b;@H;GySvc_z-~SMD+uvNbOPy z@LUPo={9iDW+p{g6g*jbZ_WxmS_NJS2`L1*ZOW>_HWT!7^ZWM79T3_wBB^D)LTZ~Q zYzgFZN6d0n_Us{>q0i3U*qAA}m(O-p)?h&TU+FZMkx5N67e-cQYsOUfZmbgAyRlER zm0H-yzJG zM=MB3O}arP2W*pWknWDr-J{1~Te&&Eu{+?LR2-!u6pUwK4V=7NDOl?``a}D?yB_hL=||;e>I{s%0k$cf61DeDC99mjoM`=#N{-w+Z$AdsdI^$*b@?fD))AAW3>sZ6_o4JDK)I(G56DTdt`w-) ze$VOQ&>XgpnH@S{FON92BI*0wb!o)fo1fIV$r^Zq(jN7rcH^z___oTDs0cdTO)?FG zv4(h46>Iv=RVi*&IMay-Y)`l*!`IS6@!j>woVp;yw}${x=Y7m9C44yBU{a@h}$ zdt}*lU#f@#9-W9|erU*i0ZjyuLw5%GCDoNYlvIgsi$#32cp2{c^xxrKb3ro(mQTQ6 zbr59lg6EyY4^$BPSkB^0{}-2xF5&XCvw;B^I52_ zl0!l*@o(5TL5{80eE1L14AMMk(b@is5jJFqjo^U<+MP7th044Md0tV~MMTrpzp(3z z6V769q#IL)a13L51T$KZg06+*oSkTYaNM;sxilGbOAJwJe z6o<2l4+OM}yTn%Eb}#S_FbSg*T(3Ca#@A|Y)~BB1G=4nWz5m?4w>i9stT3-(C-2;G zAqzLNlT`HX&cij}hw9oR>bj3EPf=mUQ*$nVhiVDr31e(mk_*i}=`_sBd{Dxxy=>FY zEa4TS_R{f%k@;uGPXL!JVroYTR}vMS)%Qgk>I-$$QHZp4oOHC3n|Id&c%$iach;pB z(S%-lt+3Y(r7V^FtC*Dzhb}MgAA}9oFD_8Ub&LOw6>{Bxm5Iyd^Cr64>824ZegAWA z_OBtF{n(R(-h|)vJq7_1H}|9%zA5|MJ4jVz1?{{!^7f!}j|u@itERuu^9u1}sRkv_ zaGdW=ls`50VhuFgUTkLeN4-6?>ga!-M5T!2&So@8kBg@E^kouCGS5-a#Xj&AtNv}+ zEUP|ma>0VSWRYi+xqU>{?W(rn6F4S}%4iap9paC6%6jpdDM)rnp$T=J?Ore{C5Zxc z*DEK;-bli>!NPuuVSy3Cv|U%#W*6vot4b!Jv}0e)c}_>`()LPCT;(fSuf=kLXw=;M z>HY{6+g*)Dw~I{l%*&aAHIuB3`e@HiaSJOek{31Hvz}EMoo>~5lzd*VH?uHUW0z37(c4P9vobRP>#f+7>|mIf9D#apeu%X?w| z(PE+b_a8cC8KykNM>#HP7meVRp#cv5MNz;`w4B0NiIaN|@5G%*4;q0RJc{$W{I7`K zzvLak_a_=61@%~D+)DFGt?#ch5!xO)DQd2&-yL(99U-|1C)O3hd3w zM`85h3L$jO9<`#!W#Dv~gVwY+lkAPQgoi)_%J)X;qIp>)%zX0mDAy*n?}|dU1zFCy znGY}>D%qKBUa3oE0R!1Y`dK@@Fx#+!fv&!r+j22AYLsND!Ln@j3_WW%1NihOZADh8 z|1N$Rsvcjd15@t2u(20`#MWkbw`Jir#v)xESe>Ga=`^Fog@&7$W)y|jtp2vxUDUUL z9MjU?C+Q5%;4fQ1g_WtUQ!Oa#Q7P!5!Tt8eMhNOI=&9v7ENjKSnKETG?2ixQBDHzB zCPxxYlm8L>2*6^p9z~1KU2x>(z?gs$Cf_YB(l*-%bm7pfD%H>|;s<@YJEl9|9zzV5 z+lCl<-$(WSRUTzR}`DUOYZy zu<5lnm_)FKtOQfI;JcnUC$)qOuolXMPP#?JFYMC`poMu&y?9&R>}B9S-kj$u0h|Cvb>ABcV$9o3t&Rkah^>esz-Q0 z6AZdWtBvlgk54Y|+ozkVC$23#I!c~$7=Iw?GXbN9PNSY%VTHO7KCjzHqghM}I#vXY z{EdcY=8xyFi}Y*|sdSeJY~#nMN)Hyc@%F(f`;D3b1!uPb?~0rO$(%ix30)q+Z&`4< ze~9do+H^uMW?AgXncoePQ^*AoKD%oE+lR#;M-HyUZ3_*{dhYf=c%xAf-Tn8mGeM&` z*+g9H(4KaITK0+#EN>vo0eu%(-#+93D~$t7>02}Ngs>4Qe(C}`d13z9Tb_$gOYB#o z+sz=GuqQ=4Fc|2>i5_3EP;C8ibD<&Lq=~9~N_fM3lc7?2Y`-S(5s>&>r42mTIr3#I zoSuH8QFJ*Vle%Nh#PrS+6MgG{al>DDVtqr!sQngdGS`|#3m@&%A4Tx1j~7F4hby*D zOjYtd(eZv-6_wxDC_{=pvt&6<0aS!ZCeX8Nmll$=s~BT^i9Dxvg+@a6v7ZMI1g=|e zg#Cx;@m(q=Aak)P92sm-k7ctUoIadxv00T}A;GmLsi!Yw269Gat-1_RwDX_iI~i!g z_Eg$oiHV6y+k^DK81WbQ;(X!gL&hTNy_R{M1Gc++e(Uo0vy13|P|yf7J*} zCM+tH_RLuBqR1|uztF;EB&^ISiEk0L;~GfiuoSbR!9$+k;0yX2TU>h-P{U_DRpn;l zQe?DmP0*zVT&w1s6g^mWR-tD3z4eJFxfYOQA3%KqYiXn!b>hv_y@G6HK3r3j5b+WA z4gBJ#!vlDaf^}Bqk8_*Yq(>KMQzq4zEtH(WXtpKXCCvUa$1yA4`79sA+Ad%?zS`^S!OL){%q68));qXw?n)viOxXGE6g@EdwnMot;aA zidDjy6hXpIzMq13=kLZeE=3FJrYgtjSM?gd<$XaF<1E%<#pY{Kpt5rV*q(emBb!8< z2L%0iJ821 zyd)|tNkG+u;fKiDEie%O=)+jDvYrQF%ZrtI0!LI3VlnPD*1tbmt}dhe?$U+uSSo5w z$QH+5seNrR zqJ&-2PHrvR5O2uEo*Wpf=ZTV}ZQ?ZWC+XL1SH=5>qQM{cR5bY}t&CD8o!$-oH3s&Ync1Yncj(51TqsjF3B4{;o3{gq!z<2AV2H5UW z=Ji_tpB=4$6O(LdH0D@Zoo*m6(Y&^)zalV4+OEqu=?#%mpoITqEn8&pbEMmcF%;5* zLPF~833vs-S}=C5*D|92tlJ5x79gjo^$p>6K|-R<{QY_Z0HpC;3DpR*G?c;ciOt< z1CB3(c3q)Vm)a@USv2}`%X!iy_-wNs?tJ%JTagpRkkBq)BM&ioapn5lN}qr%UzRYI z=GPy+!>~nOX~lgRO@R#61$h4|;!0TU+IY2uOvk#c%HjETen8=$sh&2y_+8iPorPclpNs7yxlyLa5@HFJoHS1LOj z`T7aJ1|{@o-12qBFQzUQsm_+?54PhEKmt2OzynPn(HIR$v<1^xF|}<9dBfw{t{pX(>a*6D zM6O*w5!qywler|*t7cR`O0JV<=l&rgnC9ha3ad^O(-W*U33q4;ABZJkW%LBtc=I)K z=aYt(@q64pe_5_=xK(x@*uc|;&Xae`31JGo8t|rckDt4yK}h+*7n2r+s7^7SZ{O^R zob^4US<~?eO=tU1VVP}Vw72ln0jc}&58%KiDlpooqOh~V;mOj`d7^z?bp`6zc9O(g z>9gB%=i_LJwK6_Z!j~aaJ@IfE%;ii@!9@8Z@Ufd7dH(&&i25ncGfU%@1-Yu7l$xhe~brBd3P$nE5f@O8k``w1L z{hV3H57rLAg5os$(%Ksu2bJxb+&y*9t634&;BB=a-4vJ68cqq|+(o~i%TDHb;1l6} zSO%jMu^~t=-=aki3I0U!nLck>@ksX(vndIeYmSu7Xrt)2(?1Ow;RV^(a+E!~)8!L6 zN2IM%-l1@?-4LIbxNv7j5hu9uLmgq#k@7)aQy26u(xPN+5R(NP4&nGW^*!uGjXebU zX5++62fe2h(27TvFZ{eDz`1Ba%LnlLFtHD`BRJ1Z-D=O|(L;h-zCfG$$q9UP65eQH zuF1l+>kXHRGj_9b#m{B`z0sXA{Cvif8apdS_)?Hk4q}}JO+&fM8OC<_4}XpvASl&l zEy$i)-k_oIcV91b+GNeB63Me0>pur4)8^-~k^XkCZ+aRBOJ*^{!HzHV7w8u6oDH~N zI99T8iPTbWGK6ebn&z?!m2DuVAP;+G?0p$_5kYP+LB#>9D-BX<#rIkhEQun`-1(2v zIvdAHQ(qQm+>G7v-w852o+CCoYLU#E2w)G6i5hOKn^U@1ZXN$n-Hs-^R`~s@meM}; z+qtJ#?ViXBeXlab?p5q(S)W{l+o+#7yeTtZ&K{{S(R1g7ZS5v^Viw_Q0K7Zkn)b31 zcf$Efo5@kI#3y!#rvVjX;~&QE3^7B_{37|=*2O6%3)Ix}biLfOU^rwX2&k2z~;x|4Q8ZARHCP2gL?uO6R1j`Koxwj35`KzSm4E!6oflH^?7Chzjg=h0al4P`B1M*xMN*?yMQE$oc z#FCa#VvJbw+tRRGCPKrPr0Ar4mgD&x{uTzSj4ZY|A%^Q;=(7(ulBN5KTNF+HJ`}+W zf!}|L($b8{Iq&2QeeJCwx^T^1jrsw-AcYQuU~PTYk@*pW4h04expxG?i&g)?CE<-ko~X3T zbHnfQzEXdT4j+);5MLfzl9q|c*xp}UJFWt8O#ABVjcmyMD4_dn8t2*%w%MGxL^ zSYa7iDhHz4C%@I|Gy~?A`;&RwM@}bRK{nRVbMr8n#<6F|O#`H_ismesecdoPJvo8*dg}Z+Hi%p#aC*{tf?(ceJ)&aN6LtpfYb; zA^pNzEq`a(SdJsqucnth#74^H%xchuine}xV74JGI6FCAZdY(Fm`7jNa0=-pvbZ!K z!*}^1QnM~%j<4g6CF(A)iF?A2c$reld3N?Kl`x$yah}VJM6n5#?;q+Da7%85Vszdt zet4Y=8_g;GczgI)qS?-BVT-S_t*^TwKjuW9K7d)3EIDO_C3V}xf5n(_H%^eclN+N! zX=2-#_qbkW&u{gJ{Iki1S_(!tx^*nKag2p-$OU>4tqWq2gSXx?i&#VLA!u&s_YvQY z0PFGStAMaz<0Rx#J&?25EQZrGcf?OkB_nY+UHu|=GUifx2sqM2KLxGpA)Q?Lv_U=*Pu&?aguFLWvVtU1N*!<;$u%^rPABjAu&hr{Aka&}s@0Vm2-L?V6Uw)LB zoGC8A+M&-E$MNQYVW5x!B(<9UUbp zJNN!)$fjiNL6_z=WVV5KN&J9!qFs^h1Sz+?ODR0(`{nO5;G`@?&e-qKc;}CMh*vGE zT%wx0E*oNn&ifBvx3ms|s_Lq1v1j2|%rC!LrgV2zdM}h)12`fsoK|wHte6z5nmmu> zI8yLkpv?}=XwDgq${*IcE_fhUH}=|knk_mp;j!Ygi1g)vXo5cR^swtDiCo$GPQsA< zK9ShaxZ4={_>}2b6CIdYc10nQuM@giuWI{PW>`pzcnOo-A%kHi2ASW`($1%Fgbb4tbeL52i{Iy_H`i_p*!&BPpOGC0d1%)5vn{-3-cC zq|iGzxi}=YowUiq{0}b?grGd!kfR5goMd&)nM1w!auXSJcJp$4>pdpswxmdwm97dA z4$q(88j?zq?vWnw$zY}6pfT4AKRJQRkk5jye*<1I*P(}ji2SacCHujdS+Wq_l^q?Q zEKjd&o!+9h2j4<|msBYBu&@oM^`sj304a(LLwE#C&_}#WknbWE2fm&Gf4%Y*1JCU|ouxGv zI-967Y0Qv^-(z{gr0;qJLcFX3^X44|_0^Hz3LgUE*@%4NYmG84V*I7$=_jJ3H%f+r z68&Vr;K%c?`m&_8eBCFcSvO)^A%W#tISxKx2@?M9nP4iwnjObp3LzRok-&i zVWD-`(SKtuj$0nvxP2I0bD5&1zrq|W()ASZrL>6n&zu)`!6<8gAO+%qQSG|FOY#Ea z#G!7l{#tv87iqZ|C!~QKnq@`P`6Nb+x_9xy93O@x5N+rKuVyq?d)ajuv-g4WirhI>xfXT zw22(n79WRrXy)(F&7;<=wPM{&R8uExUZ*k*7rU%?DhR=bAF3(toW?(?&8vL=2*>d( zh+KKlC5uFOrEG{7aRu}or25Qe0I(;nOju)Lp#U@n1YZf)jvyO^A%XVWY_yMgMr1}s z0k57d9g9h0rb9T@i{Sl}VH-739!z|B1@Yy|^1|+wfdI_s@LIy*XQzf-tRW2= z#;PEE{k+W}i;+4>J4ah54(u7WD*SU*WCRCpYi3eKTqz9OGibG{{_6CvSi}^i^2Msx=#9{(pfl%a^Xqb!;5h351`5n#osjauh3kI$K-GWr62f zzqZXB596D&*I=y(udit_KOL?p3vdLPe?HF_$Z-6~ z!C(UFc0M{(Bot%P%x;IMbquI|u%vTc7Ey~r?8vy45>SS3S1h)C2d)&t$#2$Y#gP$o zzIH<#A_L=S9s{zTb7d6V-HA#0?oavTYJ^{-c?)XA+!ILWpz(8l*lUm%II2P@iZ zJCNEiKtX6RLrfFA(ut6{-;WD?3WX!v9OGr9y{pOtH|m)tJvs{q#r-CA=l9*PKqgyt z*9KTlF|2Lb)>UhSB5mnW$VMHE6r(VX8i>H2Tl378pA^$b#Eex`-A5LsSg-zCHWTU| zD;ck{scBoKrMdK5jq*WDBcWdlh6rlAU^S&ZLYO5e#z78n02D1vAIX~OKO9HDq53#H z?j#zgj0`w+*j2Et7EO=2RphGL!iIKu$W+j`ky?bD(U2>_YrL*Hn$P=(D04ksX)S@& ze;3*B>wk4aeL^-Aljp0JWxI_5zrj1M?nWGkJzwus{7K)1MGzu?Qy;GO%Vt`HXR3SV zlx|z%?HSt?bdwuq1K07)sPDMN3L&a$pe~g zZmJzxakh;=eA&M78ufJx&SY9i>e6an!#TaMxB)k66ZIjv=^G+wY=sl~!h2M;2UZq* zVMBM5ID?Pu)H41cr#d^?z%ADdk-Yy)5AeB%eoKP`C+zBAFz;-H=C##vwYB#>_aLQ~ zc)BTkz=k@%$=_&(pYKoEtsU^mLdEwvlf9+~L1m77kE-uwl1k3Urdc0V^Qd38`lM8) zD%-o6H2#JXY-?{L`JF)L&FbSKu~^f|y{7++*l(R3t;7{~t&U}Z6CDV|V$x4@CBI&8 zp1`X?5a4rUmvE*_kz{akNqYTU@WA^#iMWQCh?HF!n&g+fkJF;gy9eGa_cXws+G=mI z7@zQ;iwUdPMwYT?=hobeD60$54s;JmH+LPP6ke|d%Lq1cVDwYYE6-8KGI>=;bH&yG zDuUCz6JOkJy;W)}lJV}aD()9r%NJ(CAVv{S8*@qmT;J`}UcX}Z+d z*kqH(7*6n~S+T~Y_4^tu#il+8A?v}ClSD#qS4llR1I;$RloQ~Og9MKwy{Ozi&D-6@ zCY40?HLMY}bO17hc! z>^ExR!r$qgjcz9Fu-G_@>iHwz0?(2G!n*R zK;35f1gs1t>3m|lKrvd9n##cV%7P2Z_5N0n?89?7QJQ;r#_a%eNpjruyAq}1FPm7z zkzj@vA*L`ciKSvkrK$KsvxqzKz4Y51EzzRR1!#8!~@XNAyr>Gey zfGzSDPZzBS+@#0Bv)ZYzAgdA9eIzWr7PAH}*9~qvs&73m%XpMTzC0;0~1Z(?5=Zv$cYo>>v6$;Kw&0w&+(voXL_+URSzK6)fqwyv0J}_dt6iPTp``c z=N4@DOBW4$h(+glWc0Q(C|hrvu|J>~ z{RJWXt>sAW*SrqMT?0cGs3ZM%Iw@8m=dR@}3G~WIQK$1J{E-i9-s&OsAAFeHgK%x* zyquG|x_~-Xap92wIgrv*nDSd9U|F>Lzr>Y=bTDsq_j4{q{HjOU41sq-@jVHt){Ix&e-!U_u(>&!VL={ zn)s9@2V;Dby*#O((6r51E32Wh?RR&%)Y&|UP4e9;w&xl$L%7_97Fkj?#i|jph-q34fs&W}X;=YQjYQ zRHHgDX>m*(0cb@6?rCAGjbgu^2gcZ~4}N8`*r?XH+-O1^p0)NVo#1RO`t~+&*9?U( zJcv|}&U(WbkhrQrY20KB);{J@_ehJ+02_^pijgFCcLDkLxDzMi4B2?z zxnz)wv4U{Sj#KggJ_#TzVm3Fn?9UxalcYya_Y*1=D-(|H2`1NU%z+hA^KMVthV9ON zu$9inQ#v$3UK7tIqVq^LxNmGuxjhV@p;uv@`XZ<9u{ zfefo0#stdvtyfjXdXjgWM6~@=lRcM&z6QCzT_Yu3J2K`geMo4RsdxH%8r+^NWb0Z3 z>GONt!9e+Us4j_eGbw8C8P$vM+3~wmrt-LJKnL}TgSHPM?6GiTEO9nK;q8Rjuz3yyIZwx2M@gb@GQ|hg9TTeYMt;rd&!~645rSwB=$9812N)Z?>gN4`q(U%RUGL>)2A97+< z_>&2Na)4s$Rk}bzdZH71u7%>_`feY$E%a0C{(bU47hlBnM^eWkgG3`3E($6U0pBZ);Rj& z;kzh`*4hE}mZd)VI1)P?n9_EI!~>A$0?Lph70?cAR~IZ79(45+wv#%UXrz#?u4_!z zp&4%N-<{PHKx1y82$AuZRhfH8-QQ_Kp$a?PUac$l{WM9bKBUx}-H&(bC%9lK%$;Qc zGfkl*H|-?2K=qh)f#bOQR%@(@p$|8S#Q?%PgLR4WENVP{iKle(}ihU&1~ofX!&Wta0UEj8utK5n8(0^>X*))>yZQw;sUm8 zHs-4aI`a=E5k*8yXx$}#vK;&BkXv`l zls<_H>}Z^yl&r&|Z0i+)rPFdD+!LMhOki-;^d}Pbfl-5 zIuqRjPGQcx>v423Eb>}!SH)%Dil3~G>vrR;td_erO$rVzl*2&fs``{Ps@BKzv`k)P zQJY!b`*J`yq`CYo4Cl*HPw3MyEcm3>QS9xIIs3hfOS$JxB1d+BlZbK6ygha?>(=TY>L(q;!RyM4!@F&Vr;v!SO8Be7vyJAZ*v*T~{t<;d z%`X9RlpXE?v|}F3?-#_^?$Ko@k{rCoosyJZ3xFPPyMXPu%G%2m3SR14KA8&4RymdZ zpB_1%BLj4&o4j@bvwA~unC`;~fs|g58;Tfi_&1fHLD#q^km_-T6w;(~MI~$T~L9eEomTrHI zTRXYk$gLet)<)eg5ZY%@-4yp?gmKSjjK$5@42|Acc|!TMcP z@wwxtv<<9=N6f{8XBKCw?vAM~Oe{HhtTSI?7==#?f|{78p>eG=H5FA&Ri^sNljIj8e-us30PYrhgwFq#HokTRh&|dtZ@+q#voZw z?{wJv^@q}*yCh(@9e<2ybWVUi_YH{-)J9V+Yg9G* z(=hJd_xa%gq_7lbLvjI344ApYn^-D4NATdf$UcxV6G0tmv`uPonw}X8ZIuM(d9qfm z+K-w#of3K<PJ?;!$@b|QV+^YS@D3!x&icX3ivxyrETa zLW9?SEsuY$n8CIGicy82l!3$>gvf5d#eOG5)&89Z92IbE{t_H-0YFTb?k^5eiug?i0Tyx>}!4c zYbKr8JF<*Q$X@P2x#B5#D?kZqoWxl;?3E~8!=SHuJ&FW!P|zELit?Q>x0M8(L)xcR znq1e%l0>cowf8ZMmzIBsxknq)SILX*9nzll8pfOWIvh!?^Rx$eZ^u-2;87iMi{&&w zGA<`Qiq$K0KvQ@wd_+okClv^gam3U+R?AY^Wfyf{xEOBY#I{k3*{-ezTvb> z8cP+SMiC#e^;+8NErv^}I1*cb%tkoZjvGp4LkdoFGn=j_?>5 zyjb%g>11YrM1H-CSQXCrhp2wOxu3P(Q*=Y3sgE~;+NwIoKt z_(5gU8S6cakw{}n>U5K1Wlv;>uRrC9!MzV<#e?=86S;S1P*6#mnbrA-O^-(zYa1n7 zqBlC>OBZ_N@uxOBtyDC+jvMIwFj3y5Y4Lpy= zg!w90Hfy3n(`BPQN<84M`sWuJJUbRQhU{&S)ZpE6`2+w`G(S*>+BT%B)Lw*Ay8LZY&y zd-)-H$b=*HV|4KNg&Ef&dVXDt9HcbVTD5^~vuZOo^=@EQKjymsRQ0VJzrb34{kjDilj2`Vs+4a} zS2{yja44XJq%OuSQkR(N>V=`cyW`H5P!vxK|&{*E{wn-zdwSfpT;ll>b!9l%oA z3aP8jOy4N#Sn;nf6YLh$O(@_jr`7#IV_{U4FDDHlz>PfvW=1kAY7Qa!tME-5eBs2I z<|)T690lq*Tvfl+?bkLkJotK4{fe?%{+au85s$SX3O}^P5dc)4G|@`E4Ss#aJURB^ zuv^L66#b-O^fr|240_s1F=6of^Q;E^*zPUvQWZUtUA~{|p+NyT=`OdCJj#BTw{6bL82U@8Gu9b>it96pO`t+OaSq+(LtPeQu zJlSU>)=w+GWy7aLuf@H8=;HDjvm!BqqF;o__N0hBv42V777O|__d`tht4T1yG&dxs z8vRb$KIqRW@ij_&Z*MU#AU^RZ>{Nzf0=ZIEb?yESQE(Y%^E_0yt)}GQ$*yxLy4d&S zd~=WEg_kjKcStJU&+V{o=?9-th9`^RzjD9%Ku3ZO)~us~>OJS`^^p;{h4;R`pUUAC z{C+gm<`-HbD-Aq4CjdS2J)nc0zLx;UU&Tk@tGrP(OITK$zTI;kR5N!*WuQ#hhy_%6 zJ*CLNz6dLkRIe)Ef9`uyt-ZqG-&y@eP1RoI+tSZjyeGoJNh#D+StG^WY#hiaoOlIF z@I2iaRocA&)Z+rZMW5s!I^lXc9Qnhr_oGt?i5g$xw6WS1R~QQh*L?7|ECZ- zANRWW*Xu=r6nOJ@4~09el37L1-kq|pZqHP+z8Cm;Pl`xvrCAoPm0;IB=1H_Am4ue$IWOky=*#IRx)w9V4OPLn3!=E~WPxs*YDB zEsZQKqhOjpyqSRVADpP!(6i(Ocdx`>zRPfiy!^UT zB`XGxAJ5Tj%>_Z+C$i@T>Wll=h;`VK;q35|^^{kALQF*BY-1kxQ8W{&+7K`8vr>%l zi6rgM@MEfO6slmZKYB+kog9U>WQR_WLA;tl*B2XpLd$zVty1h2 zp$YsoiIyr%drSHpchObMSMb~DI$gUmiAwpwbL}!Ci$uq;!V8-WJ?dB5#hRUhYB{G- zIke$Dt~2WH8MeYX5MPYfbmPRH2gF^%yOOFc=^7%qb0$Tc)_OB)!^Ge;qo_5$9K1e< zrfkoe2k|ts)%LI>KD+XG@w&Ry2I!pPWXG^2(r*_OBB&PBjzuQUy?a&*jL>S!2c#xt zt!N;6Mw24Zyf zov;~|9wG}Y$1CUNfB$YtO!yAG`nTPpAq14>%lccVPoO-k6X_x<`f~8rO57y2$N9lZ zrLeI8xq$-XIPiJlyTVKb?$4B&nSZ_phF@L)i^Fs<+#D9z-5F?q+3$?sYqQFR1DTao z`R}8oRoV0V#qBno+!0P{!9x(6+A1B=~`wA?v=-o3)8+~ z9+?M*W6W4f+dEo~)2ineCq&$OBRKAv1YqsR2l1T zVHY{PxV#UMK19o>k6HWvqa^;f?A*}63Gz3YX3!z7ZM%wrK*d))j!u`k6!CnuhtFEP zwt#&cz7nW<+Dp%LD;W^y?_W&nQ=rCO-_(t((X?>M8r4}^WxUcFk+ikiz7`TRoHlkP ze(d|zpt{;VXM_z?e6Om}|_y5)_xvvuyKSRl6LOJbVh|YC=xR#?ZpUZ&&Z@tvS zwX9~>k$DkBkLp9oBz}I&M^7WneZWSuCeh*VEsFlpI9jitf29d(dRzpqF;gNTV^$e} z-Hhm5IvQzf&B){Q1l}|gSHu2Y=l}l}C7&q5(n!7jIW#<}N<3ljIrP6vlu$x{#s8;8 z$@qU-l#;cAZY1TNMg6+j#=!FacZrfF`{*9L{Ff0ADVDG%{%?y?)co1K1Ws0Kbds6bLF)&{N?Tn4miJvXt=tnDD9my zR(bbdO)xvVwa*y#QSRA1Oa z%7F{V*_x0RT2|KBjAFaU1lZXtE*1err%8B?%Is#t?j+$Mm2>pBvrFQK>Hg@a?ndYA3 zYtr>SvTMRw_bC%{bi`|qAkKo%PT8@1q->Az{2f9s{iT?!Q2CjpmxweM!SZczl>mtv z;QN1tE*d|}*gx7FqsS2;6%9h^IO#nSMhSsagq&JkhT8gUVc$LCIX#`RWczqy#7!FQ zGlc6!Q)V?kYcHgL43tqZb>!AiO{*+!vK7dmz@HqvIrMv!ehuNU2(hqYwz}WCOM3mnpFU5#p8dV?EmEvLJInw&F8nsjsGc(rm zW2-JJ-KUWF<+yR9J_W`oc~8IozdDDO(RjU+gYaKB;CrcEgoXTgN@Z!^$n3jqAT)`1I2Wi#;~;-7Z+S_(bh9Lq z6O#HThVcwalSir+LEKw>8CPf!|DBhim=GR)QnnMNZWi%FY<3opta*CQnu zR&Yu!cg*Wy)W!fpvO|82gUY)B?*!WBUuWVO@oh-|UBxAi?|vFA*&-dPRWng%6={YU>g)<>HcW7X#$l`w=VoQqw$wZL%|i7lg%)> zAn~tcRif@N0NwSJq(B#dPHIzJcmsq?v?{0w8Xa6%^jbL1d63~g$h}4J-Q-2ko)I^3 z+MyHGTygglK|Izuh%IwmD429^qStPdNaXBL#;q$~pAx{Em@6^z;{cTx7L)F z=mS&Ydpec(^mD`NKe_xLw(dGAsy6HcHM}UGA_z*C3P^)=gNn3(beA+E-7O#~AuTPP z!%#za_ec&fbi>dvFywnSzTdabx6V3$&sr?j%(I`p_x;@W@9G%wYU|7k+J9T~3#l_u znce)cd0l>Z=hj!lnGrDhwAN#Z@Ui#!-t9Z8(UN+KBLQif)I#( zvyt^}VukSS+?n;~T%0$s$UckN=+`fDmCbW6tTqB-|Hu4&5dHcJ* zy;wLOl1S&|6V#Us)w7oDPqr0`idLDqm;?~cWOdNL!F$e+fqg< zs4v0M57pWltD(eFIrWlUu~?X@YNs)aMi<2E)6StEwUm9qWeC@WFKge8c^-TEK{jZI zme8YQq^2`s=mNCWMzc!@bENx+D|LxhDZ%uB#^|vr7iw3)$aKh6yR-W72H!u^aFzL< zsN)Kg%+Q%@id|Rh_ilVcHebmrb(SY~-5lw2rq&t}lUJbSi(qz9nY_7O&34h}zs=XF zyn-SlgMP|7xnA(QTnj`wgj9PY)vr*B_ zyTGTb%tPSa_{X1m)^6AC&#yZ+X-BFY`{XxKytHr2FM2MD0jy~k6wvmQTxeU-lPkSY zb$|XAyMQJb@AdbWxrHB-*JHuU8RYaC?;`D;o}@eZ;;a}+1OCjOJ3lLHF9A*B$`Zj= zv`C%>T_Eeu;X{vtarh^7w%_~ZWmG1rxvm5_VaP8IzXa7fSnuJci|;0X-KKL0@$u7& zs2S62h!;9>Rghzw zRV6S(fc&e6P9}@?J>0b5r>sD0Y@PMw>{jxF6=d&sW5A?+gjH9r@wyoe!Apu0SeXCg zW@d9Aj`)wz2-yl^6Kvk)tpwEkA{$+jKQ;P(l}-{TJuG8$-XhscQYinwZj%clb8FC%pXY5f2k*8IV}J)zN`X0@ zB_PPqsI-@O<_nO)fL}^IeDbV|c)hWECGX2qPZZI4>kbMnAAc2bjz}-4`X!Q(XfE`C z>KSOE^}%*58X^~XVWxLMw(;@np0W3pnep;D9nz4vM0_pc95#z(U@N?)Uz4eFZWc#w z`T+;Oql*f){@TxQvqg41a*YOno8Wy~o$!*1C2K!cb-)gu_R%@YdY3d~u(aLiJBg&3 zit{#edos{YZ%NL03c-epK3o~W*DON*`!wKN5Ehp@vkn-$F} z`gd{USD?IPHV4gm9#!(|gahRSstG>x@MJmfD_YN(tZQzy#U28@1u4^2ZIYE(b~}3Q zO^fzNnOH=!?GH|Td5mK>4ph-d_^2M9s-qr)O-kQ~c z==1!=1y4CgXY&{1C3s90?_@FJ9OIFO-AohCYAKg3K3$Z`1ft@!8s0aV|6*{W-?Vie z;#n^~uZHuEaQDs)k|LO+7a5`yo=H1kY(17>xl~@I&Zx;`ndF$mO?AnbGGh|J+$J#G zI)y-*UlkP;TrG5)J)@HXXx|tVBv$;@AZfQQ5VAi3U^(&xccfgRkhaZeapIU8P6-gP zpN_S8?naD)m4k4}KVW^DHc*wa5Ds~lzvP{7Y13ab$7Y*m{Ag4fhL*Ox$Mm@f9gMQwyA#^{idi2^WI@r6oFDL{2TaG`|9s&Fu0{nA$^WibCq3 zxT5vOw4*{o)g=5EjLjOUXF%Jn@6)5UZrdUs=|A94!F3DxJll`%5-0Cw2sXg+SDYva z$!(VXrzLVxKAOEvz>nX4YS?ydBe!9F4%;pT{&)oXQ*WBiG!5qvV9AS)zUrAsatD|S?-uYFKIPs$|-uQ}|Ea@3#=08oDB-Qcf!x0iS?UVTOQ_D+}>J!r<21%>))#@zA>C?oyj)ia>=s?wB)dWZ;V#a5}UV zy9=wMgl%aY@Da6dlqUA(omti?l|R8>khj)vDqghzB3JHoXWK_!Xs`%`i@L;F(x>ia zOD3yrIe#6~v|~=Ac~tMMOro<;C@WA+b@uS_zZm?)NL7!PIqFuB3kpIwZb!ttXt2aZ zDN_N=)(_U^w#G?`VDSqtTM`Qbk&b^5uX_FzzAt92MchhAf~Q>z(z8+iWf zKq8Z-KbH=vTE7yxj`J>;&e-oX5gySwmEbaX|HK5xdB5lO)HV&}F{K_$)Vk?n^N;-x zB#U}j*_+U^d#t8Z9&LF{_k#t-oVTNHS#5xBSr4`Tl_>`LISmaGlHhY{oBIe^EU6>C zr1ff;dNi=>%{@|aW_+6wYX|r}n-vGN&d=q<{=RaKFkz7+d%Rv)on+CbSjacoUC|^T zL3HEg#tLE_-?I*&crM#42gHQKsTQxyc&A?$i5I5jm;g) zGlPGnf1eb+LXV6l4ge@7PEJ)t5ygfmj>zwUL+$5~_iBzol_x~K(&cYB>`QK_fm7Id zlVk5N{>#EbunAK5S~)8X(&ESuj~nTJS642gwtlV0%z)chj5O5CJGACGWZrxRP)r1= zA1^M_!iCBZdd>O*e43XBq=(Y&Uen&n6$k%8Ox>61ZjMaTiaVwgHzE*d(P!EiuuB!X z0a#l=AGRT%NeT96$vfz8zSlB~<<={Oq-Ne8K8H^YAFEai@Bg)ON|W0fN0n?6E|z0j zbS4(a2@F}~1+~1Z-)q&?p|7ou$FniOj1kaixLZ0L62j8O~6od_`t;+nT`zk+NAAkI+0OdTWtrWLqylgbCjjRl{$DsJCPM8V&LNff3+F6J zn8v?4A_yD)9dy2Qn+H8j?zKqtvG=VcD|YTj&4X5*>YXh$)__)2UJu@5@xCyShQejr z*{}4ddmL<&SB(@0bw?C>Ey{&44h-uQZeYIf1AB{FXjB6Z3n z9YyzDimmTA@wjy(M?M?Yp4ku+t;3n=Hi3QLS&29mlxUFNWWcsG7U;45g(hEa@|DU3 zjO?`{$SgMp>Cm(?o0~a}o$EmtNARwPhN3Jq}yb;=#>v29=guOV?8;!yHKN`b#nyCxUP8hbHfgWA|x8ogM zTA~~Bd}?kzP^p4<7}?XYAu`vmRFOe_p9xlsQpVD6lf`5Ud^JsjJ8wN#j$F-Y8A~q3 zs9UdTAIdnGxk?Q+J$nJP5ALykU>81@9gge$^G0y-ZC{qsQk1tqINR@<;b+pZJ!ErX z5&slXVPI^thD;{Ye-jd8jorjo-H80^i|6ry*O~> z2jg_U>%X|g*)as?c&O9Adv9OkZFXmNVgvtH6P#(4gGDC@^fq1@br@pS#(&bG;RBxN z!$)g{-E`?~L%Pi8Swqj`^rsk0?e&au09Yf7*I--u@y%E)ia4NXhN+*`Ncu+RXrbk& zLj*Q!*UkIKxfSIU2^$~W8c>3w26%A1%^c6nhQgm^V_cH^8qH$Akpd)&yfk_~eM6CT z9N13p_hDG#w<2e$C4mLCt&blzAHN^7bVabFyuw@dX+J3uStoKtSc^kN4WJ~c7Y5LsOW*U>(9D4%We|_vLKl1UPSn_7u+F{oBZhAcE=t}89SpP* zc$ju)Qp@t~zgavcc8Z+Up<90roea_6C+{HdB_LiG7eNaw+mfg2Z12-Z>>QZhEH;`m zeV{sxig_F?s>w=pg!UT9pIVT}C~sZcTyxBn%TE<4gj%b}|0Awx0-yKxhG#E&xXVnK znSx9y(gU9mtrPx<>Rvl4D+b4H?wC3zFm7%^oyvSDFElePThzWE^RC!Tk@Ac&EkWG= z#rSA}mgx-iw&LJ0PtswaF^QyNdf-6dbFnLQ>r2$vg;?KDuBl}8(Ls#dM)WO5j>%(22eBaz(0T17T(kJ(x zg*=q<&gvGUU=`A5!XjQzois7CS*s};g^S0ehL{GQrx*V62>O)X-zsTF(%adN?+c^N zu%AQIYS{|&Pi#J4V0t4vzhV>}<_ND7^ICVwpU%aL>hX@*8!#sbKf8$Dh&}kad6G92 zxFI`ON&QYVGP6lp3m?h6e(+0pnN zFeo60+llJfYFkl}%QZ6G9n+=H9TH9Mo5w2dJGo2TPA&O1%ya~e7;;T_+K2sdDYx2G zjc`^Gn@cB`&X@gDtTJH0e?I0?b%=Dbe}a~K{q9w?%$K(YquP;oMnCrrUMx~1F`fL0 zMQcHCn2&5*=5bG60-*IcdaKhdDe05O3rAqE?{(B2)fxS2ymAYLW}Cgw;0Tf6 zbCwewf<+87v$fbv?uWh&N2eY9aXUkRtVNT!@2!hsDb?vk(595(YkY5?RNag+v^->7 zvZaY~SJp#1FS8EVvmIoPUoCm6<7h z+@nC;uY(|Hv(EIC*dq%;0u^ycXSZyM)<6*@{u{=IU{Yb7j2g>g-Fw{ zc;hEOG5TyewXe#lV#oSXRt^O~K3|z;QxrqBHxOsJl$`~TTFNgy-Owt39<~?QP*Aqx zTJ=LpZp4;DlE+1-tKHA&(y4-WuA5%-xaOE4oQ z?m@>Weu-Ldg{eeCcf8JQ${qFn%72%tb!aBg2ltShQ%RA(spDzpS{_2|Gbtsr6L%Lk zGR^vFAfvj?PPld=&-h5dD~BXI*vhq5by0X$W}vVy)~|7SlGw0c7(YKX4wwXn+GnBc zC|^xm>@^w}I#_6QWgM1UAD)a_eA8TOS$v1v+a1dD`+vAlNn=Auh<@y-evn)Pj~(}O zLbixb&7u4B&gFS+2Eiz%cUzLzcy+}jM*^?gL2M!({ZC?5+`>3v|M*xr~shj0jx-8c276J#oYVt#_3o)|-AF%6 z%_j`)=J*Ac8V0usDES3ne~z^3VgD75?^Ugd!?T++Jy#-!31{}8$hSU))U~?LUUJB9*$$`ZbeGs0rD=) z-uGK`ty5^qm1}}$9!`ClQeog>mUY%p+?mT{x_Tj;d5Rq$-xY5W1!<;;x2z?RyCptT zME(KGo4njtzj|aIs;W=y9CIcv!1L$C|EWur+aT#wXO6R{u1oQL58RBt}Z{nJ2Wyum8Xf1~_623IXtW=^AI%P(oeD9!#z(3i9; z8GhA(Icq!B>gkf(q$h^{q0{2A@Q?A%pE!2v2N^le;)$8+cU9i z;uY_O9p~`^r_z{=T3I-OtrnAQ~X5!*H8Ww zmuJaO=htGeW{M%Nl<6~RxdwJVr;SN*HfZ0(<*%qz?<)!bhj^JxV`r$JTyZ;suxy~$ z!svX`H`TYv>m^WJD(x4?0970LSO9cy!>jVNw!E*PX@5HsMDBoDDs8Wp4Jy8gu=?J>0|(Z_qNOpWdp=_mjA?HFk! zv6IOV$J7qYxdLx+Ve5&qOIPsqEZyRPe!rwDJW2qH*vNXZR2C;8rs(L-9VC2fWBcKz zUyfbdoz$oWM{JjA%yu3*>`dXZnv)rZk_dIL>~M(eb^rlYr>E%g#idW`i#S6_BWf$J z+;<&`rIj_udS&n3WBb4wEE8RIrde-?DlU5j8^mIC&_7nS58YP+Mm%D|>=M_%QY32} zV~qm2%>dNu-5jTAF2FL;BvNsdowRbBPOhw$V0@~Kb}t&ryLmUpnWN6eNyO7k#NY46 zb+r;LcC6zbfB4lR3Kw#|pH{mk^)i`t210k#PrRcRLr;F}F}I}K-NOOq?4fnj_E^O| zt0Z#-9GxLRuMFTc=r?vYbR~^Q2bhu_qz*-S{b|st7PY>HeC39CJZHbdFN)DBGm8Cw zPfF}cb~9Sgo7~o>g*Ziv4%Z(+FzkXvoWT*t*>qwLEn7dm*EO$^vk=U zlkT8{D|kNze(m{8m!kpmvEHxROCaAaH!S19YGgH4+SAm@C~KbT zZzo)(y0tZ@TkJi~T5!*SkuSL{@tc;p!jlf#{^mH9GHSlFK!;ydUs&FlsAaKkELq^@ zANjra^ArM@?}U1}=q#hVj!%AsyH^SUQ`Vt%rphf1Er?K-*D?zTA(NO6|54C*Q@&y~ zP|@Eco9SqwKHRbJ4PUjV>iZu?hjfiy<1eGr-Eb@#Clj@GTJEkoIrl}*W*MyOx>yJ| zZ*U`J`QhM|2o(yj5CYRa(r0s5iSuPmZfzX(EOtrT4_5LdRth?|_&o9o)x_^>a)j*p zIis7C40ulE9&5dh3y7+4OaLu$A8(eU=L%@PbLG1TH&mzdyxA$!kiwT_HX{>S^{aN; zia`BUa^R1O71K{OU8&yzYcaLGwPD~TMZ}A=#M!Bo%@;f4>oFgqR_2F6doe++TtAf1 z-r0Jj7<~nZ!VQWD^r$A|Hz0`+N6j!h8+mA2pf?+?fcr(eV<#O$BHvvD%);!H#hkn` zS9~GoH+58@Wa}K8)N|6ieaZ_6(qc!EQ z%C0Vgq|fIrGZReLpCO89`{F(j+gI6Tc(m9e2PTa8&vt6{yZ4$s)~X4))^zbW(fJ0W z35$_e=Ush{G6lFd9rv1(kNhh0iv5mFXg^#npuE*yU7(^F_@>sQ}V-Y0YX;O9$BG?+eL zx{zCNM=8Yo`#B%^*0dg)kQJt$>}S4sEL7r-_bKK ziq0sK1(+81u=PYl#4Jt9(H-h#{Ri3Q&DO}HzNnSj2@QdOll#4aKhMN?aHhN!))@OsXSPw!CTe&{!GfW^!bUll?4y8Tme9e3x1uttgmWyw zN?-`@-&KvI0i{k!+rE+5qutO=1~yU4h~8<7M;5o-T~=Gut=CT!d-6b8t81FiyrCuf z7^|yi`t6D7roWrmRq9o$zLwFO(CWN~v{|>iCR(~KA6n6KC9s^6YV^tOO|r696^iuS z7NE6SxzQFU8;KwExECN0rM4XZ6H%9T1naEc$rK*rG>a_B zA3TjQlmNR(K&w3CwHZtNb#LmzoNxRj!r#u!e{4aY%neT0i5SIrXO5b8UAjHz=~{NE zbJ-fqcXvZ1X0~RO`Kb688tOW;*ct9M2PjUs(pC$Grv*BRm9|c?tA{*zyz#sXM|G+_ zs=2;8B@Bu7&N@B3Vpn?O8A767>1c2WG)dJT&r^pF9#>@Q&ZoImpPue7UfWskz@6rg z|KW*+Q&^xSM2c+i%9OgQ5`yry!T=3>8G)yI4If} zMF}7lutr%t%yjZK25~rIC}I7K{89-UUyd5RleznYfF(VA7l~F{hndFHfQ(@JQ}7GW!h72`xis6O?r1_idkOu z?DT|{AZZiIHCe0{XrO1mVz6}SJ~3QrVR!J1o9^Mgb5Ke&J0E+|CV#fi+L6rNPHiIC zm#;eQBgXLi)mq<*A#cfu_aMK__Ssu9Yff{P=5f)SyTu)zUKykgkMc&K93t9t-{7v$ z3SemNtz=cJG+Jh4tN|LxCmxSI(U(fl?CjNGYHA&hQJjkXL+r<@;>reDEN*64_TXbD zR23qdSHcR1XGCq|{9Y$qLPSbvqK($}MHSdvf4NeAlw{1XTXR&&Dl#dgSU{Pu_s z!a-BBp0jVam9g*qwdtvRzLhgG{Vm+vC|7SEJOx+S{`^Vz7&?rZJekNl)5)=r0s5p|6=an#isv!w7er*&2H68X%t^0a|ril?bv(lgMnh z+UA!Y>^BsHiUV_>s`2N>UX zcl6K1EQ#Uwe3P^!3124wGN#h%&rQXhJPmvW*2F|KI)0DfS~Mk+MXs2RiZ`sCfGKm8 zmCPJ_g`)YKubK6l6ghjB0=eU^UbJXfP$s8)!{rL)oLvHPq-VUifY4|7j!rA-QO<%5 zSaf&%T_m2>e5lwaI7uQzIPrD>nbHLBTfdJgZ6#nA(Mj%`R;T0}TcP{bUZ%`}N$^YeRRf^Rp>*1o(WLZtX) zzhmgXJ}_mRKMmSPPQZh8xpSE(-Re-cE)wF!$rdWZCZSz=dbYR#eW54NVXXkJX7g@iUninmR(- z^(n5x_vPjc_F|90Q6tQgE)3F23YWecCpLg7mz~8o3-r8}Dm%nxTNq>P+T8e2Oa~FV z66t=ER;d3X<6{d`_EFc({0_zlAkS2lCObZLxha*M{GFFOazO<>O35phFU_0S8OguX zyTgr^gsq7sFZ_(%G@eCu9ciZ1ifq-M^?Fu&iw8Te@YXxLVxg zR)_?m(7Y!6Ls~^^6pN**Ej3=XQYt{f}gN! z=t$F|O1$n8sp@dAZ?fyLzY_hk6(5a4SZCq0qoRb#&UR=PKbLOIbHeIfhw#450@bI5 z5Z1|3HT-NE+ohzw&SeMBYKYOy$;pI*yTu{m?rGv#L!c{FOp8Wg8xXWKU3rw;cjY^v z&3iV-JAe7UK!qg^?h|sGO~3e zc1*V=*xGmZLHDw6O@C8@X7RU}oCNw*Yn-++ItYyR23B3zp6m6S>PGKFzR&%T1TH2V z7TH~b4I?2Ri*Z*<;A4R}#K%@y23?>Z=GCt?YVYU;{`c|)PV5F9Hkpa=NrQ`FOeITcSkJFD4S1zO~JYqz&?7 z$XnEtFGYZTDvu79CG+NpyhwoR$cQi2G6C@u+&`tO&0bJaI0N&AglxMBJ=!UeiX*B= zU>D{8L;Ty+*$}H78_l!qo=L&JTNmAvrMWyT|3b^_(5vapm^G|YbeeqCDNpOJIM258 zEi3JLP5fYH$L%vH7WLH1 zw0!px$;T>wiuwg>fqy5X+ zbF&u$SX^z!k2aU2{7Ho&iTqmPXSB~9j!N;$3=ANX?k zhW#iQ1By*mz>4!+O&cLu=6Xuj7_&hsjjJ_)jBnsV1WmNf@Obzug-Z9|>q835i-jDC z$D9fc(UwsJsc{d#U_p}la3;-|I}R}SjZ_WLz~pG?|BxiA1@|NgV^Hs!$wR4D?Iz%% zrO!tW8ps;{59Tx=l3>VoHo?e{IlD4nW=A}0OPyP0Hk+;ITsdOKD+aZ{5(Uc?(?tC< z;9HMkw1VWc;#+CfJ*E7+@;7qkA7tnO8Fg(dhY=(l&qA?|!NpLDf#K6ihhjbUgtyn# zi$03kJ4e=LCBU~f>L(V+bYO;y&0`n}L7(oEn2U}sLf01Arn*l=><0L1g`vW!A5ZJm zID1wo6WttB%LVwHggZk7%YUe*6DfhxTYL|!jaR4h9jUb^l^AFIt9|p6T9y|C)B%!2 zwzl8k9mAgl=YZZP%ybB9VJ+)p0{M!-fm)U`2+&_=A@SVb1Z{Zt?Am>o<6n$Re6Cy8 z)?@c5#dWq;3lCIz!&JUfS};`Hn;?0UtXZ84UpX=V)(C)6VRfz=91|H479?b zuXt)Hh03|ljm@Yoh}S2yGRCfG_;U(FKgUn*HDj7k)o~SIWB$_$M!T=SOj9rHpQ4d_wXeC}2m-_V)Us-6&f@;z4!_b3NeH_{7-r_txrI7ilwqB4 zm^h=l4lNCIN1XTA9+6nhXykPw=7&}Q#(T9Jdh?ZC&OH2|YCXJ1bw+kQI!YxTalWoW zhZiE|Wr?P*RO~MCq&ER`?wiPA`@lBY84~Er?ZQcgtXMb4kZ!|iPhp<}{>5N^0XL)( zUsE>Sa`xI^HD$3Ik$@>r-ab6K3n+XO`3P8RC;kzdZk3{$+J-1ESl$`}XUX7LJR)jXj@A;QBi3 zm&)&~TsLb~HOi?|2$xIh_90&FZhQ@+(pvEAVQ1t6Mxi=A73ZPqg$ zPBw~H<7bjS$X3~PzG{C!arNX}HhM{Cte~zbjx@D*xtr8YU;3Rn+oMr#9hvvReWpgD zHbnMcwTkYBueQ$LWP@AxTaD{(MPbJfO{&U3r)?h+#<}V4!57r&@kWqsU)$9MTIJAB zA{xN&Y=1n@#W0!1HQn;0TUy zuQX~z%ZJt~PQMqIDm{~x@?PGVh6LMdQs#XD#rBj~wmtrn#NJvfUV>IwxhAcaj@1%8 z)b%HgPe9s-PKqdEO%Gz`bLs(vs6H1(=K;@VEh*+t8 z(pDjj^E@k#8%9XIHpFfWr9ZXDMz=jzjl_~ui_~>j`7R07B_@y zlxUaz%P%QdKt?LjI?y2>xfTguGQ>DK$mGqp1eV6lWrIjKA1bDEiPGN^pm(4|rb83I zm0DwqAm;Kf<`Q5dC7*k~tf@v*w;W#4to%kuf}G3xFfe_7!D!mVeEiprB}0|4em{D{Ds@fC`iH`9jvs$OVj;aGrU-jQXr*_rwXh0cL5^Ll37X&Ae#`eXhJWUavT!iUH77`tE zAqeG{Kk*d%{+!;N8ce5w!}Hf9>( zIm%~$5cG;374~VQxjxd;i91|{g#Nbd2bE_@nHol2n@J=;%)Mf|KN zq$&T3$*6t*TEwrjA}Tix;PW0IY;&nD(XJj;-QA*PmW5;YW&)_^MzrmFxle<)Ytu`L zEQQuNnUVf7YyhN?H_$Mt$5dJw3)?sHs7OEFkloLE#wMnr=~TH}D|`buC(6?q?&U)) z%MB25C_vr#phRpWX}#+6fsq+nWrYZ4B~n!Zi2aZCq%wu3sJ(Z5N_yirSf53g@!}15 zE9MKsV@6wA!?%@V_|?OR1S-g}1TP>`&||z}G8z-en;+^?cIa(kffhGiAPK6IRW^h{ zbouu14yq&^!=mIx>CkGrZ>cKiI*ib&Q*ggg3cS{h`|Pw?ameW$pV~MlStRlUKuv5Y z^j0F82<)c16lQ@49pL!ONFA}xle!%qv=yM2s#)-*L$jAPv2DqUY^XCDCEcY%IasTe z$?X+!w((ar3D57Q{oL)O;r103b|b|UL%AD#UVgIW45y|k%J)OjHv*8Y7Db21p6`qL z)U@EqC=gU_H*JdOlf*F#_!B7Avh2vw}3JskmvR+jP9_EcKMzj*jmnWd{`v zxs+=?+BieT5g4`mxz1z}%BxW#hkYbG*%4vvIqa_bg@XJa~C9Dm?uryHJswtxOxg zw>o<-Z5}z2Dg3M{EJ?tdzC-MUwRjv={0a*cYiM6&Au{Su(y2uz!f;XyRcOj9=M!<(@6Nrads<7%ayP-O%M9K#YlG;j z_!zpRK38wB9FvfauwJ4R+b{+V6g#n~CRv&(*Ue3W>9d@%Sex*HIz#`SPtypquLaH6 z?%W@g_KoD*7#efc)~QAPje)WuYK{|i&4hiJhM~W1^_#fCHvUy#MGvs*4=8NHMATK+ zXOINNV{gwBp9%}vE<=PbPnF(sNDXM&wLEpcid-_o8CgERfXEOiJ=Y9BPO0T249==4 zD~p}q(XH;r)S^2EJFk*QnEHC!Wt9E%n`_QHV$wiS_IfH&|3S{Vh=Zt(JeYSfy5w5T z+DT#SxJ(4myp=kftOCQBa;s-^QZ!&=A}{vYJTTS(7OZqq6CJ@hYp@-|$vFJ`^dXt| zgxoB<`_j?P=#~F7`JF&ily?y+eNv%R?yx$EC1abh&65%O{aziv#PvSlf~+!7tRf~Gch?fwM6ra8^pzGP&eLdMW9}-ctZ@}5AWfSbLY~4e zl+`NW`QaEu6uyg1Y^8yyt=h(_s+i0&{yeUW(j;wi#>&I-)l@a$ibf(<%$af7FKc#wnCc^Hy9Pm2w`$tR-bz=-+4A#Lf zQ>F^7!uU}JNy(=E4iP7>!j%OjfOk9aokwx+_=ZB(N88RzAazZ}1kRfQu?zR_5U;Ee?yMB@p(6Tb2ba$M+fHRQdG7Zen zc9>nz@U#IZmsBzK&7f88a^?M!3oo5JtK(H<`RnpETK~m~yM^#heb}aeZr}9gtkod? z6QA6xyF{mdF!N2QWiPSQh> zY6XSDB?miVG{qoacFWzH#5TTCAti7;G+J+YtMdua`Fx{ublyDoJqGj;c9rt_vek@v zC=f>zrflzZ;BPwos)O6Znkaz^BV18#EAq#g4VPa_P3K2 zCNxd?Bz&!`D!FRo`-Y+*61>HGwP0NkTB!t%&l6p+L|5 zV3g&sJNdr=|F+k^3+00+TW^)YBbLE^7SZWN2m^h4l3Ux{YsjV#C*wE1A3Egr5Oz8Z zDzZ8u*q`9lUoHyXOpP^FYY!2q_Whenq#T7?tGiJ?N|Hf@P!T30lvglmMnMz&I`5}depw5scT=PQQ^O!Vfz2buo zF2HmgRQ_c;K&yF4-t>g~kc?)fflYC)=>|u2Q+c=W12dsSeLv#CD#51~Q-7HbUmN=n zFPbb@v7VA%h|??)>rGFt*tfogJ+E_^jbA|*cE(XB8mQ?Kx#+m@^oh;s$p)MUR#B&j z|0bfOK99}-)h6@FbC6b^3SLM)`qf3WQ>=^B@I7n1Yq}6Ywtah2+Fs{nJ~^i!>9k9C z`kF4zq2U3IjN~_9UW-p6Xz}fM^?7LqQ|#?*p2P_2VFn@ZOpQtBf8k9swcN6Fh`%xi zgS8P{ZL31thX(XZPU%NP+pHby0pdXRQu*%L?0#n&a%y4pEZF0`3+N+4Pf~=$KKWe} z_!5f>!^!J{5$xXj()^U{@z%bE;RR!z{HaM~DW{jR>3$`ZK=QbJ6q8<>G@_}_z~~0c zzuoYKiv3e?vp#+yRkge60cdjnjz)>CyMS(DJRdCv`fB%@J7BIgsQGRrMy7ohNZO#q ztE8H;5!2~N->M#DRL1#>bBN0x(|n))G&nR~@2fh`YywR0h1+A+$6E*k(aN7hdwU#| zXh!pMd=2mUj!S%w#&P1`B_!_GWxi6$xC!#p{H2*|!t z4=TSr6Ga`SE<^8ej>A1qZ(C1G{{jO$P7~oqlFu(>-pFF07@Zn~P*hi55j>@2-Xl6$ z4_RiuKJ<}v$>s1ssAnz!G)Mfty~Hu?-f_9^M>}2v9r_Pl&lZbSOQV&}a2UmEqX`U! zRv~wk9?8mIs^_g6XcrOzP&eWhCgOl?0!w8ewA@llD-0JJQQ7 z5^#T7P#&*g(ok{{lmo~dv=F|nTe~_|_o*yHv^U53aY1ppHq!QB8s35sQO5P)_eQB! z#%H3zx2EmYI(o@g{cGbbrYpqIK%MNL9FB|7R=SpN)s8faiOp}{o{R49dTK|rbeHw* z9!2HE#G_gy1}q*rNZsRE8Ue&RhFn%Rmyg%TA)=ErX7Gosy>2pa3o2;Epqg%tiHCxG zWqkLYe(XW2%Jolm;(75ezG=}wc$c=%i@IZ83F|PJiF0Ko{bT-W8cE@`&5pB|S%$w( z$P1F@u0)#LW_dZPq-SvO@ZWbVpRgV-eTP#h0`wZ2tKiQ(Ew{1JA1^Tj8$&RbW7BDM z&rOt^OG=#ivM<3thLlgf6@Pc3_PBG`H9D9A_;Z)xdc8Es;)g1P^qUpn(@5%t+OtK65qjHBi0Dn(dZgtB%+$!zFoR!=7R$m74wg<> zW0q4y79WvkN)YGc>wcn%J^#q<{d+ z?@Fw4Wb+Gr{nRfwI?yM|Cy*RJhUTY^Z-!kV)YHE_qav2UQDE4Re*>*nlEbKW#b8sA z{q?x5?;L0A7P;eZ$zlU~vXfXPx%YuMzxPMH>H>Udw@SQh??Zz>Vz5s5_Zgo=0~eZ)L7rx)}Lo z=q(dMgxN3=1&cINGI;wP*vw9~VkqdGU+J5^NfLPSSmKdBSLP}Y$!*D>lPD$3(|=eK z?_d*vYY*ON2_yUQZT2OHHwo;s1T5c8xb*2r#0KAI@=9IfLi$uCfErE>CS@AwQAjMb zD6g?B14_b=*_zdGdGrQe^xYZ06fxU}2NGaW1x3%45fI*B9E&GX*;|&*E=1Duz{0Z; z6J)(N7iWFc&VA!X)znkv#Yeyxaa+@;PhYr%+!sepP07C~yCJgr+H{fP^etgE_ZR$v zG%?c{x=n4Pno9aP_pqu9ySGgX{IoXe66(*h;wesxB&p(FGSrp+?eJxOOX33wa2p5x zpWFB?a_Yu-U`tkuY{c{Kx1{)zTEwYegKpmaZG5);|9cyMc2x8Ke;bd%oHsy(5>lCt zHyDMw9gEF-f9rh*Df7X?&mf6w3beGfmQL$cx67T`7Uz`8#^D;sZiOKz^W!+5TI@`WtrQ@#r zWPE){$4Bh>qGmqrYvZl|{y((cWmJ@3+bD1Z6%heJ=~5|aiJ>F}6a=I@M_L%Vgds*j zK)O3dq+=KnhVBmO?(QxbYCJdopZ9&AXPvXoI$zFr)*AM`>%RAO?dyldRj`~nVPKgs zjPPjl>|XhQ6m=L{{zKGRI{p7G>O``{FeabC2*6*th)df%fNQJ48!oicWQX}SkEvl? zz}%^HgxvObCSzE`cfPX5LYO z$7+>^wOv#LCDP=?i}!?`&&O93M=Mw_9~ggf6{|xDxLzytxvhh`4QGg6IM1bg^iEwZ ze73Yu;{eqvd$I54u$EM7`yu`FBJDf9U%76=NbsPSBO}@8+qI@+^|r$(f-J8IP>p?2 zXC9XG`G}B4Hn+=0Zcwx7Mz+2_UFi~%6f|KwWO<0>A46V^nFjv97wDViG@t&5JZ zspqqI&gHx$`jXwH@S0B*E=-x{B`i33r3%0#9v=r9R-Ywj-}n+%7t%z#jIj$}>+NJb zb}SH{oI3+%~Wbu9dM1A&U_{LkdUeMKX)F zoR2~fa&W->FyFN(>M#BN;~(t=^c+!ygmc+BNjJg&dlEzF;YA}S+=JB;Du zhs9g@%?UMCN0oTe#NkTF76fM7CwFkFKb*0${JFW97?9B@SLCrbFCbTJp=cpvKrWGH zX$X$*)2ls~$=2SdHNlnc<{1rvMG6O&~Y{7X{F7|_z;+|){-gE z&n3k?0sAF|I`aE1Fh6{*yX0<@Y3POLxD_zE{_#$@92H`Zc=g<&r)(k@2=cx&F-V&@ zI|OArF%nuuOuLquV)E=b0e0D-e28Z4F>N>`d4ze!QO(E*xO#3D zy%MeHy13!AusPy$i*p6O06R87w{PzNcMwbamtC zm>kT^TUL7_T4`&@HzSpg=n*ar)4YGjm`>7&dYK}xfdGlS543x?9HYNuIrrcw2@1oeIP>zY=-4AStxGPpMt z^7EY!XhERDM|~kZry8GDGfHN>uuw)NfnUkyuBr4R*@-c+OTEL|1hUn40CV%JR<1B; z@&?mM`VUN}TQy(xvLi#O{GWlfMNY|*yuJtbe55uzOU{U+krNXx4BAl1?v9A;b-rVy zY)Isaeze4TB5{vH=5R&VGWxX)3-N>9DdEjH&gpmw^sC?0A;&ekj-TmPzjR_RI3_RDY%He8_(YaV{)DivRW4U~=5B_GH4`Pfg z{pDq@BflSAF^LWgj%q9 z@0}nggwzAK#u`UDG!Q$>WiEA7vkhFykeW@)b0%oM+#B{pAf&s~gb_olI*$S0E+^_h zUTcMJN8qx=PA(>t6x;~DQ?`%qC3A2Vgjh_T(udT>%D$xkbw?OisD1fUW#J#J^4;oL zs~4}@KA9P5BMFI4kR3wB>C6o@t0U*JS=Y&mV)S({?aOmBB(nojPOpiA&(x$HML)ic z%q-=>dO}kohDBP)RHj10@Jd46kmxf%V`Yt^)GLJm_J=#TQn17hAfKQ?Z<(VyM>Rnt zF*vAv=;vhpIP`pON@sI1wYuCkv4tpbxX?R#78B%ZQ?fWq_j_wjxLCTQ(z3h#9vucQ zzajBM>f7BHKB(<<>;r}^oFlheBBz?o;)~XJk?7eyZ za@)QBH2boz&5@=!2gT0nCGNa~E1#$8)LR9xaa}v)fqG}3Z=1wZ6AN|!s$FMk8O!Wf z)E_vWR;cMhG5OvzOzRsBC3MC>FSHUz(kUPCWwx;`JBh>@w?nCB52E#2mSO|URP4H& zi^&;zM2X(ZT^(+Mr8nvCmF+*W3Zcu-m38{$m9?ttaeLR;x2my^2(+z%q|{VZ8R}?U z1Jr=e!uYqjcAaCvIT;Z-}8Xx!BMdYq|G4(WDi*+@VnAFXRrJ8G)d7SF>* z`bv40Qp!QZN$w2PXyi^UKfGd7H`>@P(DMY#^XeN_aAK$!i>2oU^&+p={EG;F1KatO z6I37Znkn^92Jxnt&#Gu|6s^?ea`~6a+hjJ2Ds;jUE2qWvn4uTx?|7bZztO}ZgcKf- z2Mm63JNPDS6aARr7c>Ur%`UwBJ^#ku7!O>OKjn#XW!HPC9aq*6-Eex$Q?^ee_k$Au zt@qo;tAf^xXU~Pd`e>eT`5jDV{U9kbEFG#+rbHW9tp@xuslABZ&hG2~(X`B)9CJ~} zpH^=fU@h{_osnxu#H7m5zPBVaE&H<&?vIP{+--qHibI2d3cF~T?(TcfsvUF^egVc# zNb5PHSZucRY}Bt!ZNdEyXV`PPProj%XfhJ=#hl>4mBg%9pg(^eoNh_nO19CU2lqNepY1>}u9Aiu42JP^dm|7*&zB;`FmDCsEplk=I+B1=?s*763=L_vGD z9II598>WF_&H6pt!jD)>*~i(e>?lsq5p=hrwnDZCnMb~1%^_p_?N-V|Xdx3_d>V7Y* ziNSZI*gSyWn6l->M5s8h`NAhN?{$nEwKP6fx3V@}%a1ehS?dccRq%X4_vcJ03g24< z{aAiebrFqp5547L@KP_eTn|$RH8wluER8f<>f37%Z{Q8t*X1?aFz)T~zQqB7j&8E$ zXb<3cSk#)(1m^&m1(FB^o0l9va98Y!|6YUUZ< z;16}@P{e?om)sK=S5v)1&q+t;&Aq`rPJV{7x?kH?NE!{yz1kQ)VjZ4z_Ge36st~tm z52imvJDV;cI2o!@0Y^jTGg)DczCz{<8BL3Uq6gNw!3~xYM3bTkD#`_V88{C+cw-G7 zIMyjRk4HmChw|@7uBX~KE+4q3GCwswK#h#2lwPZ!(~H(E`dq1tF14~@|AO8!`dn}& zJXE&%gUf#9o|EQ^fnZ6qpKi?N?{Y_et$`xb1}C4aBj|{zIrS7CM)sXMgxB$RV$d5P zR53pjec4AcwY6uf_{102(uvfxom#wpbc0Ifv%?{4rAdFE6n(;#^}L_Uy{Vnv)%;`w z?1>fbGZ^v@Rzcl%Qv(s*(Wn^@aC+K7{5AfWL9AvGlu}$(mgU=_aGa7Q%lAnp49s`B zYVqd>`TSqfp8?tH;`M9dQi>Cx+}L5D-(5I0ZDN~;OwEU978IKXym5NGrIurA*`I#p z39AQ-wrG^c59-E}tMGju`+1^^qV8h81eL|yYyUlY#V|Z`=_)#IRrtE7=pKUJUm$AU zn$Jq|@!Q;91Ma!opX3^M9LLkW3rE6P3kZ&8;dj7KLrdSPyQT?2Dm*`+u01_cMMbK4 zuP>ap^aJnKXC*8s1uebAan7?^F`(!qe^?R@)R`iYeIRpJ5c{r(D^m1OqH&h`4aXyu z(G>dmXo-zDq!<&O#~Wnp!bQ2UT20G9A!YX1RRi?n)#Ng#V@Hg|$> z_PT^-s8O;Ki9*2b$l>z6iFPcUlcMc9@s~*?BTtCa@8Mu^T0XEP=OhcXWAQ(}r{*(c zrMMGcUBCb4jDqfAz@>&s-u>69{59?@1BC12f3QXkS91doKE+uGZOx2p9vn9ZiL}_- z-}`$);aeBX9ndZ&(aYm@QY>Fu7@QIZ`T&>y)V$zC^)NdWE~Z_xxshOgRyS|DPK}^^ zOw%gC)-+OW@h%-GDroWfdz)hc(=;pZ(`OPkp^vWGENQ$M zQ>$EFvLB?2WM#-sWiyZN{xo#;Y>3{SK`hQv{j-_uv-hL~TJ`ZVdK>nFtHB7%} zc~gIm`QYJ?a?aIdoT1wD_BxF%n~35T&F&v0;l%Y;Hq*0kk$Ed(|0nIZiw0}CCI{x3 zT{tLc?pK@Jgxle9ZCg>;_u4oFo;k)Pd5kFs7Rsh4S7fZ0fBYC@Ep_jy#Yfvh3Yzs1 zAW=Ymges=xX@IMHwt=0jT9Ht{w0=FYf{vG3WG|JUn--}<)zhGJ*&mD;_Y-6We}vx@ zIEX{gI@v&wI+p9G#te(*6OHkw{)|0u$XLD+Z^8GB?1<0J=C04*n;R}g=Vgs156udU z3N~mCXEaT0iVIgg-=*i#ov$*N{JaZn@L-G>Wi%J@LE? z?@C|Zl{ELB7UY^Oa7_F5q}|C|4w+ETvZ19H7>c6a&R`5J9=tv8zZld{vmP@~dPwR0 zR;~Y##PcQ;=yXNKPM<8IF}3d1TeJCHdu%R^h|wdleJ8m8huMO*gd@8$YgEk%UEHQ# zT$vnkxX|E37flN6N-?JqX^F&dcTD{v^e(RmpMmJc2wA%!i%(MEy!y%FWN)ya!GeN> zuNty}n~8+Kn+Koq?(UA&%MNBAEr$9Hz}JnU7A43O-WQNbRh}U?u4?cfxJku_M!Xf zp@3Vx31q-rv;VlRptgv?f&IL(kJpQz_t0rB(W%STm%%X_@N+r@-ti)v1h|X-nb8X_ zMX3F!rC_`#fve5WDRC&pdOhA9S&EK(FYdl(=wK7Pjm^IAW!T#Hv!$JTwl?MTXT_rP zz88BOn|tsc_>ro@5ODe&7EvNjYE33ECRdv$R0t+MO%b*=Q~?AYZX$FYV)2%F$Fc$f zjoM>)dL!^e{pCz9lN?IZCAPWrD1Ba3$|Oq>sT;xaE7wq{w70)n*Q&y#mY*COxBxfE z;ct>mGUOwkc~XAlm80!Ur=$}$ec!p!%KHNd8xD-mgYm9pO+6NNU#hyt->oSNb|%}M z7W`%lyh!qeE@(GCy5UWbchLp5f-O+*5V?{CR5-KY?ESpkK5<*!)!$+)o7B2^L(YDsliIzVLKY0k-JA*(!#3VYyo$ykzSFAVK$uN5&(z)$*f$K%85t z7ArZA*Fo)D{WY;TQ6F(Pv|DzzTXO4c#Zd`1tJ`VlT)zYpcNnpJDLUBRv7H+0? zjyt%Gz&a%81yCK0QUv6Yv_6(e(}T6qHVIdAZ_qEX8a(XQ+<4IR!P=0 z)FCVYrCchHNIvOhZ?`9{)J(ylLzPoCjIQiO@QHK-AE3`ArS$0#hq79zB$}ss=i9Bv z>~AN;6oG;I91?e9Tp7?Ie9QsHO7jNdnT>nD9A{ibJ<>gr`hEmPRGeLk4*E7DwTL%j z92S1-oVHnLeN-o+y}`V%TY=~R7mpdwu8X#bggS5xr?@k-E<2g=;2TJ98_Eb*E@ z%u+c-7C*Lc>hKR%ut;3(k=&2ql_!Tqz7tPw#tY99Ju!9IWDLMFFa0xquFM$+;`rQ7i-`iVjk_u z;g5LMoC|tmFSZd5+oBi`6-O-}hHU|-scOKDTJWJi^we+0?gJoIAu_ryrY|*MC%3o zRdw*ux?ViV{jaL-f3SeO=P)nt!&}YU7tv=oEKft}?<`j^(e}TyJmjsL0Lx$PeZgg z@5dR4Rijg&BjRL@@@?fOA5<&lyrFhXN&$K0QCw{bT7@ktS!V6(bC+wplhK8pIm z5eYzvJfVa2XG7=u(&UwFv!c$o+m;>NHx?I_)M9Jc=P#}Z=fqUYm%XLMzv&lhvwn2; z%$=b&l$wHAed?Per=(4+lPgm-6ttC8;p&lotE+%S zVI)Rl%xQ6Q>=+7uv6%=aogU5GMhLUm9{{HP$v8>P2_f zI_G9^Zgd?)Q+^fJT^3Lun&nk}U9j*TKI82O&KpVOk`NBIBY<+k1Mf>=H@~7AT{ktC zC#BLW-Kn$=5G3{sljF7|FR0(Uwq0Le%?{UE+EO0{AAzDiy66U^{8VdSa*LlUw7R?V!(cdi|zgcFs#t+tFGJbbzWBI z65@wj^)uxK;3qg09txIgg>ZLqEy?j;bE#DH2<&)xbco4OU{G%s>pYz~97)x9i>`34 zmG$hul+DVjH<R>a)$**i3dpoB$BV|O8-8d9t@5A&hDcrcwNI`xS6d%h z>X3JQF20A`M^a(jfzhW9s%PulhDzDFPj5da?SPC`kPVhfcAo694>k9tfn7g%X?X^= zE!b-r9T|pg6DZt&F`97=$W{%f#R{(mK|N_N45r%}7(G-Uq0+pa+yNRZQ+(1Fav5Tk zJhw&pEsdvISf%g*AP4kIv1NbxvNl5H_9C-YC>3f(CgDz7)K5W&&8PLSv<#-}2X(W%h z{aZphKiI71~|Uax?up>Y0B2 z2TP27{9FEb7}E5(b}EOPqabT(Wm-X*uc~~c6NgAmA)k*>|FqatwPei2oy@bwnW>7B z?=}82=TM#wT3Ms2rF^dZT7U@iRW}&;DC?@klpl~#()y+ulBoq7&mJ6_1-k-XnN<%^ zx!aQZ`%J0EfwZ$DeG-l0>K`nxP@PFLf^K|{14+nFN@LD~LhOxJw^=x&}pA8~& zCCokfOc&-KN@?T^K5aOn01{Zv$Ctti`j=+kBuQRx6OD|wtU3qx6?P#wfYP=ej}K7R zjvb8y^XaJ)`8N2K7u^BXHi=AM5-x3F%hd}_Es|G2 z?#nt@&5P)eG$)P5b5fG@8ZUMrUcV*MU30(JS#Y)vcE`-eUiEnFEJAkBhh7r6hx_ou zMX(HMW_3g=G!>?|2D4?FH@0cmA-cX_N2p9bZ9O#?XZk4LvO41PP9u8+ z(>bG!JN+9uW)%kN8Q*o9m`$|yAm%pOle9Ou`!GB`ZV^sY%n-gwS<*y$vhOFVX=R(k zMyBF6u0{AFU$r}9;gHrwi5yQU9#7YUhCbqoiQtPZ3aiaM_bX?-pmBKIz643FEWuQz z7R|UXI)2kgrfFZtl!3@kfWTx@=u($u zL_0xAO|JU_{xK|5N-c~_Bks2x(-~ug654(dxl6fx$2lFfhqE|CY~^DdYH6SCk=yL8 zgfC}e!GQ9#$XLb)?;t*p?~S|NPh(N6+VjeNWXgAMX;~?-*_}MROlK#@q2MlohYylM z+c@|X_En_lBVT8ezXw-|kQIfWk@xF5WVN>sNfzdNUHLj|Q4ZlMldh5^ZX{&Z=k`X4 zd!fAVv61yShduA(S>Nyy^K$j#gccI~9$!K!AB)+y!SKrPZ2f03VY#zPCA+#T<+ATHS+Jr~ z&48kQO`!R}IjTXftV`wuiiKjPkFh>VZ~JK>TM}gG>M29f@6|vVNm1K8#^cV$;82$l za!z51+Ra59{zH&hF>kEC-fWvhFDz+o>I+YMz239$&ztioun3!DTBxjh+|Aeoh1(qm zVDL@30(pEvP~pNRG1u}8)TGj$NqOX=PhPz(*FMm6#)rzC6quCmP0K^oM3nB&@c&^t z3SkdwWg+GkpOa)sO_zv*5qq{tnjP{d8A`z!YhFqWlmOGgf$VW!M?RY5AnE+(QcSHb z+4;{@`}q)>yx__T*jFwIfPLi-#M4We#C9y*?bfL2A2t0B&?rx9btALPOQI-9uioFX#_pC(-+ZgBM1a`#hN0{tSCD7U z8|K`sNu$KrM9iSwPn$lzu*PK}`bcCF%u>;q-#$1#Wr?sN{%AUWHi8>Vt|nJv>o8no zy_|i=`@fYOXxXM(Xf{ixW#iJ}xj$4RuVpUO#oKM_!mVP)t7GX8R)7!L5Qvq_w(M)X z)Xua*sccN@BHk3P=!5re#mpCdQv;$}18=Y&rImbBg&VPtVV-Q=@Kv`>YEyJl`9qzJ z6s@{lIo-zdFYX%pX9hModkVEH|CBpFsY=MzVe0!%J0Q?;GNb$7!`lru~K9mllNqZp%h89sa9`BLiN+gY8LKs@*iPzHaCqJ zmI-(`EnTtezaD-JL1Yhivm@ot_uHp@6-C4EA$Sh6>Tv?UK$df+Tj?ANp4{n8Z?+cNYF++HnqL*M{!PES*ZnzGO)EgSvVdTg@1+N*0TOq2!KoeIA(si5-;@HiO-U8-#|cayI*u2p?w`&t88p} zur@Rx{~*3pk*3jCpd>1l5PDUd8=<%B^8}qUw>BGR;8Hw#Un9TfCEr?sNy%h@fcOxb ziudSP&0f+m7joemSDr-DHhX$^MtL7M5hmExfpUf>6D8L)kj-&KSM{skY=_az1j@baw~UM+>PiS%?8TJNoOdyL^6QZ z3xF`|m>W#|GQKNSl7>YgWWDFgdY1q=^a?0Tj3nw-2Az3$rBaEY z>-|MvGgcQiRQ3%q3`QYq)#9JgPnWDv+#&VUC=YzxYEjEU;H6Ri1UBtmzHuOU$$kUe9L!ICA47ZD z9<&}!cSdmz-{s;_-yw>}uh({80HC6;kq_04rl z{#mvq=$2M47AlTUtW3DsM0T|hYE~iY<00dt>C2hu z{KcLGbY|P+zAFU3n;v0~?aBj$ z;cQ@tk&x8+7XZ^?waWXtGGSomIaVu@(9<&VS324JM>#S_yz2@QHDVw7 zB^tu4D9sRGKrUGG^H%;}>13kzDD`O%?O*An_f6*8uHuQeew?(;a^pXLm|on^Iyz%c zcvl@{7n%|qcP=YN1l`w|dB5ZJr6j5_$S-B90T(uK_T0;8iQvW`(Si2W53jF_UXI^S zj+#E(jIpMqht|#)_HOi7U?y6coFy51sV{p0C`e#zpPZoAa>fYA-_z9d4s;L=-pLIp zv+-Kvez{hVll~Q`)l9g(YfZl1v24gu&*c_qf0Gm&rehtf@$gFP(?}4&(^v+i8b<9c z9@m20S>=CiqtdK$S=N@SJa4F+d}W_|m!oN7gFvCEvP}PvHNwshj<`fiOp6)kTF1c$ zNOf;kWG*50ug-5cecCKQT@2Euev$7azpzf3Q7$#B0kfvsos`#*0+g`lONPcCp4fPh zQsxwpm_HEz(0JEaNN`)iwQKK++%vh|N`visLI;rbujB>aDD6XTbk zazQ&jl!uJTK0%gdLstW@qG)p?;$AHuA<2E0c-&JGy#n2UV;BH7IdY_16Y9h2HDXIm zmZLep%k{-tNqw}29cm3_MlQ*u(x<}Ps|aK+f0@V?*#54-Ws@B%MJjgtB~D{kZVoEx zm2UDRh2{^Ry&pQE8-HaG4#_*%`!Uw~aCCj2_4Z1nb#FjU6&no+At4cTyU>3vJg|Sk zc~z!V-7|fZC?r*~q8G?9Cej_B^151wLl@Q6Uiw_~+DZeL+gV1}PAmstHpUB8-=ZzT zuGf~7Ab0m{_dJ#|D{JT8-Yt-OjuT^8_Q46xon+BnVzPnBhO#V{(@9(tnLt2A$Rhm z#e`6*{r>^MI(sKR?Q=Z-$T)^b&$%B8f`IR17#&uVPWkKNWT2~O{|u=Jy%m(VX0C~X zHoq$gPFLHm3k7g!T#+(y zbQ)fE#)+3!hNYw8)Z3Zz2P+T1e@#l7?WEvPpn0_2E_{Mrj#7Ti-zgahZ?CQIzWQ0@ zi0!_p;dY@pJ8p;D*+{omyH&ROYuXcTny}2u_ApFnwvEXpOi^8xkB6x+y{4MF>3?6O zDl#PPJUq%FFOSLwCjpJAB9a&N(T$GNeGz|+7(E`WXN@f^Ku$?_iX_ZFIyfbD_!&|y z;y}53f8^ZK(sZYP5~(7R;9o20pzp?l4@chxYMc%p%EP$ZE_^L9dL`G2p8Y$Pf^gtS zyVX8*>5Tpy53b=nyc5;kkI9@6et?Mchv)GYuer)r}#~zvO;~$W@&lu`l)aA)4S7-D!8)6R{ zZPo`2W%>2{nRU>9Ur{Q~MH!bz1{IvleBmP8-?mS$afJ^W-3*bL8r3K68Mr()hrbVjT;+64@o39>3R&@DS_59#Vk6_;Qp@X6&-@z_a=vF&woc% zRP|ml99)&t6Z5m@e9hC3>JyWsAFBaRZHji3C~IO+o7zT{WkY*qmx)mTmm}0s^ZAC$ zu`a2;RKf*{WQ{kjKc=G>&Y))kZWyJy&x}!)d-x+r&E2`L;26B4a-=cM*Y3`HC(kMe z7q<%$#DBw4qrw$V4c(n!V6Gm)DJm|fx`{6C{##m44 zE3c_ z{=H7NEq?Ry5Y}CG-;u`iLO7AIl$%)UG=VH>;2OlmVM;L29zip7! zb2V*v3OwCw(f~)f&UIc=D<3ab(qI%=96$(uc|2XKYAt zqJYN;Z|SWj?WfZsM~Zoqa}Us|7)?rmmMM|-AyLAW$n{ypf(OTi;snYf=_=`-kgBij z$dJ2ibAm`h8b`uiE_vo=iuhA|dpo?}`@`0s9$K$Azx<+1tGAgz7-H+SCXv=$&=s0b zx%YNDoL9%S@v-b9J(sME%=_oe`T@UKMWvj4t7rFZsZrIxE0o&r7B0+_Z&tdOb)8bX z*>J>1B@ubqNgfm88W49<78~35oI5q8cehKQemvzA$FJJ0=UdG8(lqC%wqkcyQ()yToSo;)a8!%35le3aZe!F*JBn((%Y^&H)yU8LEiMUeYIdw@)30CV&cKVg$bW0_kL0{3WN zA$6`()aJEEEe7m()}=(zG9vA738rayXqA-qtuM-z@9MN<*-ZeAGSpZ#QjbYX7Ui&g zP!LY_<;9*#TG7s5A>&kQSb;ue=?unknr&&EH~ajfv)@J!jB685do z%Rg8b+cgK;Umm<@AF_b>id(MZh{ZxZPq$Ap-=gG@esOn7{TW@5-|C6cdiZ0ZotdPh zJRnE14Dwv{!aLCmyn*U`1;v$m>SQ zAj$joSIKa^Q8Mn}>)vUyP0vC)M>wb z7HAz_!hvcSMs<%gu=oH;m}Jl(YmoM*OjGQ#5JS{h^#N!t2Ds|fCagu4mB|)Wttb#v zYJGv+KA0IuXcRdN=^Ip@#=Sa-^6i=iDkwVliF_=!R147=7R@NwtSG0m^J*w-Jlt;w zzKSg==@XGOb47W49`>N#z2DR~^&4C{SR%Y|Xnp;(P}yabb1D8Kj-$><3C?)%V1#`AhuW@= z$SgC~%Z`IxpvIcf=+d-Vuod=a1Hzn4Mw2Q!V^)QDo{A;!$3jwZRN`X@ZGj8Do@4t% zA#eJYj};e9hCAh3^P+YAmkjeK^x4oozeVYl0_lG#8T|9un<4y%vZ0?~*RH3yE&Kmk zM^d3`sawnIJ)VqKfh`L{$^^R}9tFx;bLB@yV7O6W@Aw>D^sKo1*DLnaks>KGVz8o@ z{J}LM%f3Xzq?V{PvdFH{4b-9+lJU~u!mE@gH+gX;Rhe(R?0T>&bjQZwRnZ@;duX+F zwd3sQg|@EO6VkMEh~3>L@!1Po6>I_nw46i8a-kyc;;1b$wd1%_QK}?RpPN>Ux z97{V_zD`@Rok)F&=UfX+(?{y4Y9~_2V*atz4afx;F8N%57HqrtKtz@#o@v+XA3enP zbU&=~?qcK0Linp*XM7(6r_&42;{NSPu1MM_=Zc})o+XPgd+VdyDm;d~g(4c~xsT^( z+{+w+VebsdpRaQY5k~0`7US}!p>{Kp=#8i2L)Y7mMwcvp9L7U} zJAfUNr%|x1pU>>7{G!pJ^{H#7#kg&+5t(Y;~9L(-c2k>0JhP~X#Ix9+ctrB#uG4v~^L6dJPI8Fr9l&*0%B zj>L(GO||^wNiVH?Xi)Z(joEPGQ$Z$U%)l-1_j=}ou(AF}n>fW{deCm{8rV z-^SAEW3rCM+H#!vgOx5ap0V}quCY2=zRkSK=&r#EeAOW8m$eL+9K$@20H=pCm2$FW zaodMv4=W8OUf&b=DuJqe{N_^G3z0@?tyiM)m#_{hAvg zKXrH(z_H6o@%?#Ykx#Z-mRM2JMlo}jMczPdtMtgZV)R;#h;lypm+ zqvCB&y(igjJ3>MIpPevFL-(z2wtqUgy-nYs`MOtO<*8 zh|UGGdUtn>I-#egjx~mt(ia&*c6rDwgs|@7UTF1)xxjGHx$3&8Sv9=q$CEU2j%C;$ z9P+6#)5qJ>D~0_e`~zin((Df&dfe6)^z`aw5ScM#HIZv;Sw89~J@%;AROf4zsm|{l zDxa%UH|&1|T4Zf^0HXde5pJW&9~JqNPGcMJeICd=KWm5WF>nLKwYsjC09wLqaW`40 zbHiu;DaIB|F>9S*b;e!Xaa}8c9x10vYfU`1=b9eBe%f(bEZZV9r+;k+J{JV$uLp6n zr4o{547K0SeI)*SNV^%TVe*o|@u}*7NB4X`e|6G9ah5-~>qso!oKwUq_>u0cUK}07 zkmnB;vPu@yt6W)CHho!M4ZieB08-}iF>M{w3EMG1k2Rb#z)odBPQUA?$oG4J^QBFe zF~RiPXmxkFs&qjXB=OwnXp9FT6u%~@6`2C5OtU3x19U4!^(U1fu=D!zCWVrc;O_U<$~I0!MwYa&@4T$ zC?J|X{gNUE8^ZpB#i9Mu_277sc97YF!3nl`-Em}nF21!kgR?3&^apEt2H5W{iV9OU zwO?}W{q2}Bi7kvk<~TX`RmvZ%Xffp-ntfbqX_Dxp)PxOhd+ug?-{@=fvcwq)@be)# z6ITpq2GczKEwU0>+TOAre(vjR)~PLN)+R5Sha%(c!&~EvKN8N~!^UqO75}cX8eA=a z6-3?7?q=YD=nj9o-43;!t0sT2My##V#eIbj{HCaNB1a$M4W8zj?er3C#V4RG?*p;) zO2-nD&S9uWK87@;U}Fw@6i@IX`JFQO1kun#dbngT@pye#7wG@426RFGN7sk_ahx{| z9QoToI=P7W2ug{6ngsP?N>TAT*?uFwr3SvVI`!{pvG+T}<>R-3ZDS;XfQqKD5AhXo z!nK(y{4z-44_4cF=eXXN&9sCBQ_LLw6@=FitUBYiMGmye0%%pW7hgDxkPG-j;CZiv zzq5EG6cFbqI{*6$z7|m-%6hQBNbir5F8IJJYw0$a7z(%lcrJH4l#h5+)^2o4A@2i; z^h(3m*c_e+9*O1#2~oj(!~Q&>+M1g9I}y24v<|JIE>BMGRy#Wzmqws0F%8VXNXj4S zEWNL`da;8!haJ6M6td*$P}kIaJGJj2fq8wgt$xto5+)a7G@q4q`Ugva;hd@+z8KNe z6~udPqkR1uICWksT-mP4raW2)CJ8k157rKlFqm(U<2E-Nap?{_EXr(2oUHk;`RF#< z?fi>h*awwsE)0wM&DqfW2g^@ukB*q?hcND?l=Rh9wKuuqfp{p^u&bFLt;CQZOmw`d z9EzAOXRNCc{e#sHd~Ai;Pt3h)^cXUfxUTD#h|yFCbR0>;Q~+~u8kjk8G;pEz;nj<7 zNNH*VJH6A~EZXUan`^z5{TbAwKq9gjc+ySt54a~#vr}(@UT>%G9Pe_Pnb!_i5~qdl$!%$ym}zyhN;;rWNAz|%V5#=M<^Kd_{D1J(K3F{B2LRYowO^$#r6 zlWtpLmU#bQ9crq9{opv}!tM+bXODn^AA*duLn)M9CXAb6rW??sl%TM8gdpmM%d7ci z{o%z>*krpLYyo@~wYqdrRp3?#PQlE@Tn(P>e{n%#qZJfF-W^~H;|G9n@Wk;J1 zJ6^2Z^tG%l-J@PM8Bm-~&JgTzal?`NHg!L?7i+D_IA8k;(Ai3kSIMO-Xw3t|K0{L$ zO!H0aT#pn-w~O5j4I?f+Vy+-u>zZ|1&0xbnSo3GV_EW6C&KVIj9%Hw7IXcxaeVms;D1}Kyl+-3;{V%fC8_R<7JA}}49guwwit5* z>tKcbVb+h4Q#sT<1`+>Z*;>k5NhM`;9&|H4pg}syU(bq5qQSyIXM}0vCXM7}u+{d~ zc&WiME@%lezP%xeq5m3X+Rn3Q%yh@sV4UBw;sMsnWtMm3(>tc$|!S1MEA%LX1_Ib6r!W>0l+=9B5b zG_25Hf?mPz*W+jIYlaFUe}^_)8G8A-<|!pjdbmmK0tqbb`O<|(lwTp+b#)EE+sd*g z9c4SpH6#H8)Ku!C&}z0+Ne(U1hTU|u>&6@{+9UIat)NOcwg@bn3}ZHSRUPn|QCtBX zByUP_{OF2(kyiYa0*8NG8F=n$L@T3Nb~XZzzkzR(abV}ul4q?q99NJIuO^g2-jWDP@&fOHfoN+1|k925kFP!ftDok&oT z-V6yKoj@oN0*Qh_W7v!OZ27f+?$3L_d)`yt=lRZg&$n1}*LmcbTMbMbMUNLuiAm8R zB|_{>Tfv)(0ER6fqf5RgO2yc$wNKBrW<}L%iJ!{F@*M;r6AZ#8e%lfk0ZVi>GRy5u z1N^_$BnD9id7yUjmY^HmJ)&ywL z-dUP27N2XNZb|GB>C-)j!%!Xnlb{X^n5}PabE56mH#}$D1JJDR1oD-WX-6ds0ri>^ z{{#SXv<9Kvr;qzsDN8IUpr6QfwOp&4ZY?^s7vK)w+v&_rEpbY6IUD{Qc|;~@MW8m% z;-^lQgysfs6Ok|=?lNE7)n^>_OPOt1p(rV^JyTHkZ?pzMND|? zy-&5IW)LG^b_5tGNsI4u6o-?U{RtuJ+L7f2l*n+d+5IRhY#7cyyzF|rxS0bu8iGAP zsMh351_)4RtdNqs>>k|^)9}5Xp5BtM$2;lyt~`kmG3Wr=z+jMB!s*+O?#u=QCn+)# zTe&bq+QO4sQx|{y%lkPhb=dab`3Umf;e}oD>i4)Sk~!Sgx%9(JRoKr|CX`2SP%HS| zBH}Z3p}`vD{DZn}VrCs6)-B16qd%Vksu{Mu|LX;RGa)A`8ehf@GVcq~c_z{Sc^i} zWCGZ8nfU2FB)qUbtMIW?rumn?Wfvmz;YRRLm9k7W=Wc~tPK|%vFx9WNU$e~HNI>>9 zIq|f)b>ZYvm>(8T163v}$GUQtYaG0lBiPsY-RjsmPo2zWMOY0tGRry=t>;d4&e@XK z0JMG`uC0C;7}f%da#T_;)h(K2xW``RU>OLV5RC80*tfkLV<^jTmZe~d>}6GKtW3a+ zv$T9dp{=Bdhf9f|O`;kow|YwgPvwO znLqfX4aDJO61ZB;6D=@@LY@_7|HoY=W(j|Xi_)Zuy5Nzl^LvMq+htpSAgcq2tKTrI4#umNYX|Ta zF*Z}01tzz4v{_wMRnj{@Skfwf=c{w%p#Cm(W`sXks)yqY8bq*e28BUe%0nyiigz5F zlRI!7`g0HtNksfD8`5TG22=@-Rhkj|%6G#c?WK6_rd}F8D#^ zy^p~AO_D%E`406J*H^bBs)G^hj*o#p(*walQyoS=FvwIM*M)>FR) zKnB;oo|b5g0yp#L9KA;46@J!7Hc)hXmR;_sufqmy_KVt63HsFh<6E9UgSQU8M+7Nw-%ls8Hm;CV645$kr3KQ^?$dNnr9q8_Gm_e!e32!ZY|4w@H%zId0G z{&}WF#tK=;y z-O%GKX4MI#FxUCg^MbP_U-Y|g4rj^WU6N8)(DQ*s&8AaFX%5$Tj_SI-ai&9-I4Q}l zeK2b_+oHek2KXmmn|)K5{x?`|@0&@aLm_u@ac@A&MwtflCUA586`am-j(5Z~XWj78 zEG$GT@=^ocJzTTpabUt|T>B)&)?En@)_&!-F4p{&ggbL}hZd9BzGt?|u%b1HQlWkL zL70V{_oJQFzph+@C7_hA$mpbII^C}`m5aSE`#reBugso!_t;xTqr|)^+cEdf)Rx3Q zZv7YBoo`2&)R_1ZSkE)n(hantNoCElAB~e{L0Ks#)41eK|H=CqhIy^B%I*Kb`mMBv z_;|+~Ebn9_7>#eNWxhmxuwN+#-W!OrfyRdP!698}I=`|M`+z!e^uCOKt{$`+i-K?P zc2LSr2m30c^S~A&$o`ZiRRx=WMtq_q%9hEd9Z$w+^lF7VvsO=w*@k8-vLdSPU7dm3 a@(T9^&ZWQeVPJ~{d6YdKc$`(+diO8ZBuS`2gRlSeQp~ad3(7@Q4`6Nyr)hf493<014hbz&!vq)>FVe5-e;I zth-JC5HrpPSpPJ@e>ALn*!MA`#CwQOfVrXSG2k8+HugQt_%Q%5cl%;~2izxlK>CD7 z8i!2H4EL!MId4F8CLZ(a@-_yI|JF0O9w9-dy_fnS4yL%w|vjfwpk7oU)rl$@2Flbe@c zP+0V*qOz*GrnauWy`!_MyQjCWe|%zc3I?B^nO#|3Ti@8++TPhkoSdE^&o5AySATI~ zVQ~JR_P>Gs8!i$Iu6vkexsUr77uG!w%!N&I|G^U;98zgDTr(%Kr@R4p{Vzc9GupfVP)9{Cz$dlG5;?J&3LI(1=+y~L$$gO~bA-8BxDV5;IfvTSa7Djn) zMg$HRv5uK{c|cweUyx5H`W~fVS7W28x6ZIuVOUw++@BLE>(=F3ACBbq_T-;eb$T@y z`6!mC6z)c${QH*Igapx%%mB1+@ejDT;FAT`OlIK8;0f_4yaE;6`s%QD$I!U&@snT< z$J*J+4XdG3G|fP{t4Ovo*APqcb&Po0RCH*49CHCPPD~9%<^y)+SOKAkgOjcnlD~)} zdQ)y0bwhsaw!jW)Y!7{2O2m{E`W*1@S6M~}BWe8<1s9ix%%|lzf{VG)lb5(CpUq## zf-&`ZWwakV+5m*RUWBR(xEY0KYq+JpPmb>ZZAXQ?fTR&)Q12km#Mh<>U|5U!nabl8 zh#*JcpbPN|TaJJ7T+PP#g4@2ATS6fJwT~HaIxDu$=DiqMWSvy6lbVqyST!7oN|+Vlr{CwU&$|aygZ!gc z>$ieUXOC=~HB*0JUCLj%-+*G`XFU)72F=ac#k4dn$|ZRAjOz+JvCKj@sXMGo<`(-% zoXF@8_P*c=-(2bBf9aXru-S!hlOD&DXov5h4+No>xzOSow>sQl2-%Bur+Hh(4>;?u zaEOGv*XG0#@Fj5_BdWl&ZBsmc6duC@HgNC+Jmbgc$zlr|Q+=%WH2Mv5VXvvIG;VEK zNax~z5`jTKv3@VDfvabH`K6&moV=O&19oJre9gtu@#y8B>ke;6S(D$bb=0dbiMI?R z>sHE%b~yW}?*Q=@>wY**DV>7%aNT+o)&$-K5b~%6b;I&Og09x{dDFtoz#^>npZ+BgqDwLrn~ZBrYXlXSfBX z&;;enF`nvevMOodJAj|g4G5%myqIooaZL}(IQ*q?842Fbphms4LDckx`{=~(ReyPA z78$qMU+T?U5qmvzUin*3+fusTHTw?mx#uQ|4pxak` zbI^UxhW{&l>&k5zo@F}*0^Q@d1GJ~;9#!e_2Za#v@%||QgnxE9iV@j5qu7_@DJT$( zo4FkFd(@`LA0(pOp3*daSkG1pJ-ty{pla1FXYz>y7h>VQXb%S-Msoh?aTl#@_o%Wg zEl&7^~$&Yo*iVf?Lpq<>9Du!O^}BPvH0`Y5<%GL*9cjPSKFZJEYv6SiJJ+kPiI-x zAhIxrnVrW2e>hV@cG}EI3-t~c3%yvbxD}h5qLR5FJo&%w06*M*-vO!>(GCWzewRD_ty4Aoit(4!plRQcD+wLRhHo?j$i5{ z;qcx0n3jcST?dJPD|+-!R!gfv=gKMReSjV)gGJF?%(DBhUt|o_^^GY=-~aMbPEFo;=F(A3h8*y3 z7nXzU1k^3UctC!_REVmk=AoV4V^hKyu?JdxOoTDGY!rurOMgtdyzH{#P4+=H3>3*U z4%Cen;c<2aI?S1E%%jQcEtaq44j!yLC6XGqxC4yw>P$;j)^wJ-tPDEtirUDVS~7l8 z!twfak9bx14#2i594kKfvUXNi{83#_{EpaCin4xnk20;}Ps1F@(j9;>8li#q6BoM! z1jP6w>d#E@&?AdNV;^clwZ<3BUgh+N&`1mmUWlUw`u#f$P_bwT?s`?7_4PZ??n8dh z%!=7%-gx2VJ3uSAt6Md+NQPr9)HwPMz_;V+LKWVwo%(0`RK8e(Y#eRpCK-JE?0eBi z$^iyg;`mDjb62Us(DJoMV%jjKj|Z+jujOtkU4gyH$6)_RKd~g|d)H?uze5Y9$ zb@C*}HT%rv4$!GhK-XDBpT5z=jJ7W1Y!HuU-s2|ba*%OoNQA@DM4l7xqi3m0s5~z6 znJ@7-9Hgu>zG+z7jN|y)8{7fD6+XMogxFE(eo`H4xuz`?IsmOvHzTVGuShU|4SO6# zBJ@`o#oPgsc31hDSt2AAewHL$P~8DoEEoL-rAXOcoNjwEQwyp79m&Jn7)kc^)wPZs z_d9@M>>VHiu6YNjyaR;&w3wB?@(;2G&MtL+jy?zY9#`#*mUfkEe>K05yBYa5#GzTt z%Bfy)R&$xya@+@`klI@7XhG4i-2v#b(KO7f`8PM79(Mq2mOH?jTh$%lk;AI$|b3NdMVsLM#|NH@T4?^$A2Y8lEZ(bC&d4lR~0QJcf%{!rFw}vK0@PQbba?87)`s> znQ^)-#hU%E-W($8MD8%^GU)dv_rE=`eFq4Bhbp`SNHH>CR<}~G z=XMBmh;8|Nbu4odLGwT!vxIOzQL9efjrg&9&B|!Yr{D7L?f~iP>}U&}pq-4$kuW5I zYdRg+QhONt2Qe-~(5KlOPsCJfe*};J;$QaaB#1UD;+N(8^lCX+I+Z*kHWBaKIBp-y z^_Bnn#qH zvw^&nJROGBMSSQ{NujSdV>VmcJ$Hcbg{9wCMehJqY-mNaRh^q8Q-4*aG*mbL4p8&Z z=UVdSRoZve{pbvX_&dNVnDpY@3Kb=0Y4R3mfVpE8^x9!ou3OD_&*#mV)NO>e!>mVF zM`;c)AEl*ksK{XYAM%lImSXL8JO5VdM6>05ZP5?k)1b4N=r}Go0Xi$^;q@t)kF_{c zIUur?uO`cmLCj;%2siBPKu0$qyJ~{rA@F2u)c+}X>wtOfC{jR-zdp!ydg?SNx>uZ3 z?8#X%AH)f<{)S~oZhH#@uQ*=ldyFF_14H$V+yraBR41OyXZt1lrS=&g|BK9%3n@=T z-vl|sO)5q@X;K1n%q0&0%6$IN^=s5D*YD|!Z2xlsb(2|*Zk|+uD(JHRHSK1&=l6zO z;7!8Kh;6e+XLMesdRz>8^$xHencbdo|HeAkkTXHe<`8S-aEt9Sz<6r~ta$sZ%QQtH zZko`N2Jco^XQ+CqQZB+;Sof38?dBa|AFRL~$tWJ}fio@#ll?oN3RK(z2yE;|JuJX`8-rSUGSp)TXTWjFLJXm%*sN6FckWgh+0qaQS>LRfHiB{j6XF z0q=3VJ=(9n1GtUc0Z240Z?nX~KwZwLze+4QPB^rpu}(cg$YN$Vh{hxDdx5- zI>CCIdt*k^R#h$aTB<#X_&{j&(*DC|{kh<{DJ&LKQl}A$DxuC}RCh9vB z{K(;^5PXrLZL{>LY9gp^oQ)HQmsZ?=TdUP`uFa1bPBT=Rsuqlql$d~<3geG0bP(@> zT0xAR@c)Ota3CYZjd;rUyw^LU#c3_iP93YgEo( zX5q|}cYt$&uV$UvV{&%@R*adNC{0H&CvW9LRh|4#3IhjE#CA|jcOLI?Vg-SxZRSvkuj9Q0HSg~U`C@cFC;Ng z??SLrpY+6HRBO7s*uxAfEiKzgIzM^t+uDOh^W&{9(ZRBFSamNQ+FJ?tWXKDheN5a_ zL!|JC6MN5j=|)-5KdM(Iv~^a2LK zc(6@pt-j>I^sLm1$xXDv^*I<7AuMJh^B>YYaR;z&36|tV`7$7@>%jT*a|661SQUvC z!Jw)R`&phKCG*>ob11*VtV7qX|JwNcEgr@JZp!i-MGH=aH!D%9;q}tx3KOcD1xZL1 zl;!Gt-|0RN`fGiIL}#i6q1+YrDpxGczN&fR(u|q@R%U?;Ne0vdf3U6uFmv@CO^#~O zOj^X_93|_%MBD_F*{Vh?O33utvD~sapr00uT)#rClAX%r|0A3cpHxZUsJeedW!rKR z703Y#!fE=Dfu3hQ+P_BJb7z(MBm0jf|6ZcFG?TI_eh}yT*w;P-Bj%+KTWo+dG8d%> z#G`+gS+B)riHfNDhhN5umb??E+n1=n+R!W5E)9O+^!N_Yr+x>Ri~O*6u87KH?PzpC zd4lMd7v(c&6AZ=3rmjxo6*g+vNk0 z>e9=R!Ob_fDUwe;Lso;MO2F`w+^UGc+hk!9*-Msb>I!AMY(3gMLT}+4 zei5&{M34uX^jJ*H>*}Ws=vbY}xp?$+*T*~>IYK|3swFP&m4}wAidh#P+^qT2At%$A zJ}`w2GZ}2TW-k^xz*>1-^v)oO;ISw%d$;PU+?I)q-y+A*N-lnGWT!Cp?;m7_A#INy zxE_6%Wb|Ct&5qpqT>P1r?gl*80^aUy`4Aqy;a}h#Xqcb8|M( zD00WCSgX(GW^KkboRuHDxiQjC@!V@YIPGb@FkV_Qs6P+0bIxfrccg#09Myv;M8;QtTh6{!Xt0A|L|{a_D>Amg_NuO$pu*v*k0(wBoj>Z&<+Ni=eXQJ+ z`f&$0Nf^jK$lG~3aozN8t;P_BSGRjO7Ges#l!sM9aE2hOw=xMvBn^M_@dQ^DAHi8@$Q8yj$J%HrrjUO>3pGUAQaot4Pjy^+>}>jlsdD=~PADE^}Fi zyVOCLe~^!4*vfM|(>d_R^1{7<7;hw7>?E?7%A4n#X`U4R$yQpGiFHO!~JahLMT?!-s}&<_8qAYP0B>jS~GgP z7SB6$2#R+2^yZ6NS)%nmD-l*7c7$#-k3wV|K5)s@%sNGkwI%$po+ffyqPeLn<#FAf zw1o_4M1>%d;)(b=>eXZN8x+n>xZB|qnd6dqoxWGOF21Q7#qr7pj?3dI?Y9P@ZKj6C z`B06}HEqc~0WL135GaMV9$(OXi&V{*Uhw;+jdo8M9EE`zqpn3l)mPDzSzpMl-Gw7G z>W(r_$LnpzBMy8RpK$}V+BDxgHz>+1)!Y!}JD3%Cy_6#rnGGekIH#~Y+K6_>etAy8 z7JS2rRuJg6N&pI7NS`xin5ayROMXV=DOsODNlW!@RTDIjge}++Y1G$NnRyE;jE6hz z@s_3%?@9{uxtx{VFRnhmmsZ%Q@)hRVirNqu3ocdB|KvHds27$~2X%d8Uhv5-w~nHM zsG!Z$A66T|(V;mh5PQ$^9&k~Tx1eP*eF@#@?H;)D648**q~;N z9>Qbra*+91)*4=QU2fh&1KQY1v*u6zIxf@2y$Wvo8NXw*^dyRfk<3cPK?^^M?*%ry zy!dbm(PQ-~plU>aIbYtqt>KzQf)h)!U&3>Pjl^p4#?ON)^s(oB)4uui_|MRl5=L358aW5JwL z3o=jDgU?OpCc;%zC)oXU!v~h2?o|;f4Gp7@-K-)?eiUn>qpENHl2p06R4CKlW>`3S z)F=^+KLp&hzw-wNp5tXsOjO$9HPb8;N~K}u*7l>~=RyY@h9aGEGbIxL@HnK2RD zZgtgb=B-v)S9Kr;d1`fG1x=~O@P*5{8tA-p4V8N82Jl26+QU^Z^y0{9<1lt3@aHWk zb&7x8)K4urlwxObh(V-GBkUY9mNsmq_v(JE0WIrjRW)AemmU|F#X5fy8JACvbtGg1 zL|OHBfQOz|h#!)fRr71M?7b$?!h^^RMiIJ#2*6`9Kg$NFNgnrGRmdiPn zjgbQydNX;4T+RCW*!yw*y>N4?5Pjj`r>%@%3QTOwu=@St){Bl+&Ch6)te&}I{1)iC zBb@5l8+d50hhzEM;hxW+tf|U%rXMfmyjQEl6nCod4$LERxtwSVc75*vBdXm^sm%F0 zrBOpJsMTX36)xrN(uIA?-mZ0P3Edc510S)5uiOtxPJRhqp@o=< zpRo1!16i;KQ@P4MossFP?bFLXfTGxrZepP1{?lqLXG(6T z)(12gk6dsMjd6JQk4!MGew&p4dYorAx;^3!kYx@{k@`4t$zEfE#O#2qy>BkqF=3i) zvK{VWHf7c2&ePE6SuJlwh#FR!f7H|*`0$&JKO=a|EG1=##%5@^)|qG_6sNBbd$!(t zrSk>C%hQuP%TPohM#sueaECEqUd07XkN-gM3zX1sLR1DkB28 z-Ke%PaWRF{k=d$tW1D@SC+I4~<(X+kJwBbD|G`%G`{M8Ec0uuMtD7MU!;q;WrUyYT zyo2YW;W}zx+=T{zt$AOVbk|F$yw{6xz6!(fzAAaTeJ=HSl_TEvy?cy@aluu^id>*w z6($sV#l#Zq341qZLl+k;-L{ok>?etmS@~F6W|7cwWfSk%tta!RB;26b0o(o1C3QrrYQ51=7m+VNWgtNb7oRHR$l@XTQ5h%OPgG`j56kks~o-^2S&meL*6rRz8ecaID<-}0#~L>^x6xk zp&ur0%)pE>WZqj2rC!{f5ze4G`eN+lM$PBl3H2@(y5aq0BK0*@BQ)?Qcw3>Hvs3om zBzn^CouwIki!=-tjXFw|2<&%4qjhClFz_Vy^O0$zG$=$lWJu@qjfEQiw_p)!9R$$UdAt2#XK} zK3q;08_WKagc+v5##N)4Q7~xAkIA-tL6!L)&ybg3xv&j2JdM8zTJP&enS;)1s@`HR zc}9d})l-qi#rPUg0koXPpz&W#Gmm|{MbzlTs2R~o)WQ1D$b?hDJr$F z1Gb;ONi4y-qX8Yi9eX6a@G=tWpz8cUJ^UU{M%Rsi&?l&+z0+;FCFW6F@$q$*5>`^1<3gL8qH2)s@s9dd(WD# z^9h>`iXMf_)9%?&W$|#lJ-xNOUv)M$7io|e!G+%ncGuYRu50t|02FBJl-qQkv^G6UC7pil--*(e-H{C804t5jJxx z(-+*qeh(B;Y71CvA|lP=jj6gykkeLnj4O(I=0I`Vccs*3D6qBJRc9V z7X27C2)wsLwm8UAAKy;%41!hHf3F8Spicrc9l_z8oH{ZLGDlQys}cv#UR+MMGf3aKmr(>jaS#IIjS+#1je{RTDldquSL*+fqIChh zw~@?fM3?&#aV2?e%yTtKwbs?zZb$os*(SM_pndJr&V4zY+`R#+@+Pr2v#`9Ty^lU7 zA(9NQT-!jhd^O{>s^28(L%UKr0z#1o+})JrHcy103s81cbXk}CQB}Z@H+7;~1h?xY zeJoj$R!@!gdEM&O`V)rYC>XPP30_%^ajkaTZ*cS!%YEAA_GdZ1#{SP0VwH|0vGhC2 z=KFH``|V%+?ti$E%~r6*h8x(8qXTPBFbQ##$-NBbNo$Tf$=F90OGY8|TZ6)TJjj15 z=+XzxZQc{vs~6Zye+c~py)n0SEe(Jl!i#D7HDVJqmcg4MaSE=5A|6fvcjG{Vy1^jsd0l3GjdiqRChsh_Le*6>`nzCu8)4- z{E9?Z9hwk|GyaEFia`0vP<>QYo;tH`_qCtxB6Ff>;?LJ(-;V;(a3p@Jcj@5vI&`hy z`pi^05q4=V<_qeCnB}pS9RAW7MZZA!R@QsTxb2uodd|I<-;55RD3jz*Xmxaq`{X+3 z88|HP7Vx`F|4{w~cXs_(?j$-33k%?TaPH*BgT&3c2$?{U!nU&TiEo?D&l~s;n^X(Y zBq+&8F7lO=q=F=duVa3h^%7#yTx`}m(4hWO{prh>5}?G}*hVdD@bL)&CvQ_+=V-4k zfI6Pn!exRKYgh!QA>*4QM@?O|r49qAbSx8J*-g?}Fk(~|cw8Nk7HSir>+kS|Sn?z4@Zi5R#AN4oLo0jS9T}HxJ=rWGkBI3ti@sC zN2#&$FWOvUY)dMhA+V%jEk-r@rK77^oL3cUB zm}le{MO7gxGw-!{yFcy8HRwdk{2N*Ky@G?Y;^l>2$rV8Osj-{B^QK+XNcjNbXB?hv zs{LwAy-~yq4K?0!)(XSh1^5xxh_^vkz1juenLreOM8np7;2VR{Up3;5bNq!q{9`j8 zMU!eA`={ooJ*&naH=EIW!^8A#?}>>2Sz}(R0(TWcTKuxgDAhdVRInwp^)op4_q`dR ztAc5&!>VhB@!1dymiUq+0m7&zO)duy$4AQIeD?cuROuSwA|DieC0AeZ50NB-VO%9x zk*=|9x3LXZT2u*j{PmWTimsOP1YDXv-e`es4*QqxlCO1pr#jn)kS2k3ha{eLH)+ja zS7eEVxv|aZDYA?Uw(AAIP#DDZn_?++)nU>3xdXQ0J1Sh8h>~~?8E0*2oR@!AQEHEH zoWGtjSaYr;j0j(QS~2Sz;wS;Cj%N^_zJ$0t2*cF9b(S%zkt zojqeAvm*BQZ(yG%<$>OH`N641(FZH1jS`;h3WIxY5jOd3n`Ix+dmfdRt8p-ECLR5^h zluX4R8?P_-za5A}ig1B(o}EG@VU_b88)D@d{q=N;TR*>sar!j&^hbYxcT&bW$x#g0?b*PZbT z)A2Kkvd?wK;DY1x->|NCw#ybjzIa#wz0*514C9D+iHL~3_lkoyBSVIlU8ZC!G36~e&QpP@Xtxfzzr4;)dEa|I)ra(IqB)bAqxR(bIK!uaK6PRf2=u_D z)e&m*##AiWS}Z@Y`pS0sMN|_8D=dvF(}OPp@+lYDYZ^}lQ(Qgh-FoMu9GWuPoAgzw z#4zu%Pp?`{7Fc(}v2;{SU1wY9W&T z2-{s ziT|lyYhk*gT_TpY_ws7C5jw0KO?Y$?YxuLYSqEb7LKZp$vu|(zpm8dNJFU&?Q>y?e zZ;)aiLD*JlsYpoi{ZIF(U^W?GG;B#AvD_AmMh;71?}B$TzWPyqIm>>R)u?35 zm9tmGU+=K#m)+4Q5!kW8JIK>lBXBrV)n6~A(_Ewdr@90IoVk!kP(~xR+ROJul^3$; zx}`yxJQdUopNS;Z9f<+wlED}cer4X($1!wpp9E7w7h?gyGH!5NNm1t7Q?2_>E^729 z+^0Tj&)Dl)D*`_2C^atyYi1LV4fYL*)z4`;Kiyh;oel!Z#)(E0))qGy8Eaq8twXGd z5(*VE)3NU{o;Z519U@2I6!MjHa|@O)vSQbzcre8j@#ZaahpYvfoMoPN0%~PSu?6q^O{6fR*j_U-b0!^u6#o-~|3dvmimhilMpLt~d z&1y{Vnc*zBWkF^deEEC`Vv-2)f5dlxv!5o2VD6Gs2Y4bjZvc6XOCh z@5fA-Z%8Pro}A#rK_%0mY*W*#P$V&>L5{{dz?wjtttn(`C?qvgj1lG#oE_S6Do`&x zLX5JtlhaOAblfBN>{D&-+``VoRXv^a#?(%vgQ}MVldNVV3JBK*n1{5mg*lvRk=XX~ zJ<>nelV7abG_zGS#C1A8)UswFy>GD+iOYr^eTb`n9nvaEP~ppC;c9pQwVu@})Do~N zEx*iew-h$KpUwJwQr+*wd$0OJdk1U}^;I27>2u&bOdm%-EahVEMp?a%tfQg9jc&t5 z6npRxVg1s!0LbKVb1vn0FJLXTBR-xloSmRf%Au2)TnHPIOD ztNkGIRie04(&V`K_M&FlO8^$_T0Lm_Q+D04cvv$3MoP4N+2P^*`~pF7*VC7Nm@0@C z^w{|s13Jx{t{`3y#y6Vo7q^q~i2vgeR~8XgUkPhu(aQeXd6aq-{_>OWR|^KU<1<1H zr)LK>z7*jLeC;mO+HO z0$#RMp&v?5*Xz3TozIMs+N*+24t?I2sU>_mYnA1*vNk@*gJ zyRkePHk?duHa~yedP#`sOk|MoZ`*DCV4|lzF|vFWT^wI#y2hp3-P4kA9L_Ozjs(|n z^%)=&r~kBQ1A;vWBDkp3=W+q?t|+>Ea>Qi~|QZcYs$5v@@2? z3z71(pl#K!##CR9v)}zfQ&8{-I8pwp7IoAU#Ab8j6Ae9?VJkBBgC6gID+Wh`tRoq^ zNpU1VWa{ICdJmjJueLfD$;zuI9%>o}ok7!YoUG}ExX6jB2EMn8(#~Hvt31h1F&3|9 zlquF@2Hnf5opBXQ8L|R>%)>8}pYJ)u+S&DOxpmu4{)LsO!(I>{y7BDWL5v_#K200$ z)B0n9%~<&iu`Us9%A9PD=z3)#YpW@w34En~JfoF%?e(8+>9S+VkCu*QDsl_r+;5f` z#I`5~cGbY5CO-v?c&}AYT{dp>7FL(St?51w^GflUe1zN|J3Auvv>(v@PG#9{0hI#X zd&A9SO^7!FvBCs)fu6Sgu%T*>W6+=Qq9Vu?sejVxOdNf4p3sbG{&O}vp(y3pDR0A@ z>ng9q)Z9k(;bnUeZ9J3rvUa$>^66WaR4;tl*BO}L{sHRrz<6eL&o$KRUVtG^9`4iH zMKgBAc%GV7UwYx!akP@KQXRo7gE&7sG~1(WlmaK%WA z(KdFfrnE63VGEvl8gUWATJzfYsTBTZ73gu&1Mtq#cl`&sIjZHFP9{>QWQs^RY*;OL z%#{tCp&V!BdiqH$_WNe?VLD4hb^M#%Ca_R@Ggp^qo)3#J=QnC}*`zI=k9h-eS#&NXBG%9Kd)v!V5#wIJx-PLT* zy{WQf<3+!;E8UJM2+i6f{)bN|*d|M7e*e*z9T$SwOP>@xQG90IkxuZ3_I1P4EjzFL&LP^xsnn+dp}TQ<<9WHl`6xyTdLlZ8 z@HqMxHZmsGM+RH2=+m_UMW5?jxthwPvD2#a#~}=U<~`<%8AUrn4?ni$GFm&fcwqeS zTf}8?EbYY{3@0jc-g#%&lJ9vMQcJe}WLk z0tyHGG!qfe&!X5cZ!=yjTlwAe=u%}qYr}nuB;h|p>6U{87 z7BuEs*a~|Tto{W2gtzz&)_*c)867u>I8nCaGw2`29h9Xuhi_QYh_3@neHa%TS03QP zHBQ~)Ej=MBPdyVGYPTnB7Y?>63`%LM^M|gQqgQ?5B;9t&cspB$8rYH*>3p`VYal(BPEfZ!vr8utNp@U7WlXtI^R0$2^NE! z^Ci_{Is^)Bb%V3F$d{Jk>yYbz9Dtn9ts#x6jJ4NIF32u*JDigXJw;E8OJdeJv|hmE z8YU4S?go83^@^}P?>H@Vz`60B;d;h~Vf3J_ESEg6?`}Zze&i_0+07Zow;Is~ev-#cX}Q_tGSn2Y zZIgw>U_oz^RYOLC$G?R=S>i+bz2h@Bwm^nu6{eA;0fEz@NN!347L4&2 z*iTk|U^Q(kTq4A0kUik0X!D{>_gz;FBQ;V$y}rqPT8TlHZxZOe0owbG^v&U(M0*Z9 z0yR2oOVfMiOpaBTE?JGA-vNGS`)?=iZH~u zsg8QvVp(Z#VK(dzy&Wt3UJPQ8)jd@poWbaBR(}s~L<~~4*;-ofCRQS8HhZLmG zGGx%%TNhKdp?)0~Rq_uKMop~asQg3u?TvAA=*TDTguA!fD=YcK4A@$#6o;^7YuD^ZAE7H zF!Cz)(!2@mDTUkt@=!7FvI$y{`AeRm@|u{`P^na@=K4CTg)ZCot05$pXV$G{^yQwR zWcJIgjv2#igt$4kR09WN z@Qhd^mV^^Sz5kA)4)s6Jl@aEe~ zabWCD{ung~^k4uFG8~c zupb$`)dr)G#F0YmCSTE{d0$X;H}%5@cK02xt=j-cVHEHW)fCaLM!@8-Xlk z$(7CL6?s0HnYbbmA?qu$>d(O16)nw#QR=|8M{3r8-_}uw;EYUMx`Im;>?*UfRNI2J z3XOIh5|$n7G!62QOq2Qd%ZFS%hMIBOu&ygd>lqrg_=npw|2=8%mUyh8@_uWt$dQK0Qqn`# zV*Hc67j0VtL9{O#DkcU`Ib2r;7^1f^hkf30X~u}cN71B+M)!F9l-4y^^Sf~YGP--E zp?jYi6***at_oBqA4p0dY?nZvFGrd@q2G?)#t1%oQvg0u%5f-j zzq;^ZNglR$%XN2KSqmBX=&WIBr=S)%WHG%ol)DQ{F0JpLm>EtW3AtZrVcH?gw8jj} z@RB@d7GR8D2UFUIW3vpfN$saCjW^NqtVfK54T5iN|AhKfHlIh;V!~aFa*T=0r??A9 zr~u;P8w@#rGz=d4fDr#8?r;m{Q->`&I^XC}7%D47Z&**7{xPJ)FaAqVXAD6fgK3A~ zbA2CidT(NE%_flM;1Tx41)fX3EvZdC55sSC+x58vbVxXhJ&U-&8gFvG=qayG+xY(X zU9ql4HV3V<$i_vsA3cB70r}o!R^9vZI&EU!g5thicSd0tY*)u_YGbyl)x$hFMSW`a zgY(pgiP09DK&lx>OoJGBwP5ABkFW%ZqPlMn#h(A4_&>>l`DML>xQQ=XRE2K9-Bz(q zEO5o+^V_pAH^(x$)c)FTVZ+l56v<8TSgdQ|0+2>Fl?OHTaR11^_G+&aEfTrf`|F1* z5=w-KEUM@~Xec$CM8bm!mrj%bXEL>7h8fAu#r&BbWOfpqpsN5@kNf|> z+dI&|68QldC?4_E(C5(6;n#}^?l2FrHZf|m5M)`4VvA1$IoTnO5fOY&y* z`2p$BVtI9r6!5o3afNg(5y^AobEyK4aiE5`6>2$ERd0nqWCJgzEN=LYOS_ZSN=eV( z^%ogJg^_DlaOrCUwj_Zs-uX!AunUd6H9vhErX+hV63vt;tG7v;#_qz_3%vt4RIKgw z9zOZh-}0^KQ9*9wZtkW1VmfkmH@-;vKK{DS+nPEAMZJ;}IW)v*dfusZq^|W2um@jS zDV|6*$ao7*+wg3Bq1!`vxWQ7j<6$>&KARN>lu(-e*0Wfa>qo9!Jola7Mt^wa{R7zt zSrF{-i~ET9t^C(u0!@@20#_w%Emq#(TLN`5-A}xE>(5;Vk*NXWal)fTb+I*NLFOQ< zI$u?Db^1l8i-b#PGA~>6LaTsQ-l4M59pI~KXS4!yZMlKd!lDI}{}M~acxpXC8x6Ql zTdoH`X;uVzGWsXmWoO%Vxi#SLygtc&UUs5w64??Eg_B8Y9MG_-)&r}L5H~iG zWng~tuJ=W^UtHRX32rGY_xwBB$L&)Wl~K>qw717mj|q5GoW{uo&+=>ZUg%agJa0W) z#wfjqa3ir`EDq9cJp5ui{%B;PMyEL>Ng`+r=zmr+w+G5K48}c%n!+G21Y*(<(I_37 zqM1vJaGm>3WM4~Je2pO4k3w@c6qIj9gwtl9zWrQykvDDIS6cvCUahX0quz*!`$-?_ z@mU;X26=W0sE_+DCkx#DdDc^hzSxKa!_Loq!&1kNi9v(@mDwR3eJqEE3)MGh_(3qJm4bv_tAm9xro$D zs4m>qs>(`R$$YlYv^#~Gqt!J4=cSFw3A*te1Wx%2L5R&)B=73TH0zMz%*_6 zS?^{NFZ%sF7R34^TWln9X-A5%w8~c!WT5tH5jsGG|TMy&sP$b9HuWUx} zLdL^@*3CbqdSgx-dGUvEhpdCsiF_jwlY_@{i$$kPTbX5HhA069u97JX_S@ExPmqx& zUQmmH0GIjxR#tpBu>{|UAxfw#{%cqS>yOBmmT#D{qRHDh>b=2mbW0N49zVRS;n^Jk zlodOyyPlly;zgr$=IK$hR}7%SNpTVPtyWza_R%hdg^*Jo#)v5m zzLcj1em>A?e7J%)D^ph+Hk8=Bt>R4K)YhYf_N}K??|iSBnu6IeiHgXAHRx1+K26Y` zL-`#xHC`c~RRmwT;SN{;4;=kD(v2kdF!}?kJ$6IlB2eq}uv>y7zGkJ4vyGS$Qwz+h zo!>QJ;rCq*`-^|Qn_=!AS}xjT#)zr+Nr>N6gp2TJvL`b&W#BOZ#aCayfFck?Y2;(S zEw{=KK@AVTYuLQIw13)XYnI9JlVK@IRb^^w^zrn$M6tXZliXr48uwTm6Myh=p6GjW zx$#;n`;#kU;s|6baDpPc2ttKOD=n;@U=37%_4(5Jf;UD54-iv}of^-8+DTiQ+MRS# zfgO6O>2>2iR4IK|$PT(L6>QSEG^u%$obsOfdP+g@%N7elrwl^826`<63-6UPoPX;d ztHE>(%X$efiC?S7uDd#0i%dJQZE;dPU?#6n0*{B6ZYG=f{Nc4f9A_C2d|>mKA+g7!V-jVC{JDt zOliN5H@v-!*STPly&LXp5_9WKzpkASndFcVnPy8DM)!kwV ziH+<%%`!ab3s@npdsIWP(bvw7_%zw2!VP%z{Og%GPb5Y9Rj7edk->u&g#$N5%O?T% zYIj_p9|=r9;k{(%TN!cbkxt*rUo)R{mh?Payfk=Csk-hTVyDjqHtc zz+d_nJ5Br$RnMoT(BXAQ{x7!PI;_bz?i)ryF%XoHkPrb;Qo6yS1tdqKG>nGPp`_%b zWt2#ap2X;s&Pk500i)UI-0!`-@ArNGc#h|9jsrNZeRp2x_mh9e=#4}Nusine(uZXM z@?GRmLHcyI?sjqYd|wH4S%dP=GUr%Rxr;%;TiUs$#B=TLFF3`9txx;c!L;GI#2pm$rVq#@ut>51f$Fv02pUe}tpVDeZ=trXbbytLLDV}=JOowZ< z?+dMWTSFwCrYm!n)Mm>cG%l)9e7KJAND~eU&tj{Az1}+|d~Rza`4hr?Er}jxVfIjs zeb-Z)`cdgi(F@(LJ!Cx+R{`8REYsVn0c;(xeK z$QhpT)Y52W`I(lSA+JV;!h2o3oAwHB(w?ZoX14RpCtF4RPa%#nrRjXnY-bm9uIw3( z)ciD}Y^P0VngzLoTWY~}gEmq@p;^Zl*0hgHdIrx2|08-@l&o9n1r2N!YCHqMIa8e3 zHL|>B@|Lbb#_IY|tK8fCA-)`W3q~p>XXt)_T;C&+RLkMaalR%){{_&3kH2H@wa78x zipR~2li+jLpc|oy%l$eo4Pw-bB@+am3u4e1PZ`H=Z{2s%g|5(x4dhxYQvCrTGkcF^ z+t5%fh8(ft$TcuHd|7yg%0V5KLT4s5xco?u-dzp($N6cA2sMz)q!JeVWu!SA9y^AG zc_D=VK^lw27>TW3kkN4ba)GUkA+qz5|HLV{#}ucKRy>&3 z$75v0_w#Z5T}5%mPn8KW6=V63phrjBcN|#;?vFNcpLpRR3yDkL%J^<7Qfv3~Mr9ca zPO~4PeOzb1$ihqTUa=2Wd0MR9WWdFc&9~`amzOJ>0y$~P-Z>3D_vwiq6@jVMb%Vc* zzqX#;ay60rcKk@F=7}_#6(TMe=Z8*I;qBkJCT7xm^{c2a6WuXDm){Vp^u&z_QF3+b zm)$^KiDZE%x;N|Y_~eWgM@5L~e2zD6cKS|d9cHotr~6q&BjcR#ylusG{ORv~4L0|c z%=`@S(->a=oZnG#ZkuYBFW$8@fABd9R-!#G^C9|yHgPD@rU+&4 z-JuuJ?w1s@q864n+Qo!C6c+S}{n|)UAkn?j_G0_=8zZc1ykP0@I&5~1+63_tKF2??t>h!0`=My z*H4ZSviQ_*gsI`d^C2F+XBkELl$DI>PZa64be+)ROhLBs75bic5PpeACBDszKX%*= zU;%ALG1y#C_8nQhfH>|)q^2*k-(4||IaY>MR#;@ z@?MguP*WqpEN5rK{XZ*qV|gp5vZ}Iu6+Z^uN=WxI7CWs%jr*#Yz`e)8(%oGU0@q~A z-#t}J*b;<0b5I@p_41exS{8j#{y;l@ynUk0A?o7YiTVKqN)D}2$l2L@P-w0=oTHnB zA*LgvZJkH?o)=%J?FEzoRz@3Mr|tKWrQx8*mC7tBjf9U&q6efF!D%u$8SV)v&(n+s z7Ghn!PIDXe5U&KV2Cqi>m5BvhzJTegP)&;?e(Qa$phLGHxEkH$aVnZGJ%`^m)mVu& zR^Riogst^}!c3m|&G9Cizk1oT~vE8hlWxZ>$vi#iebPky#QAm?CeNR$ptk&p4Ih*qo)rXb`i9+AA=BXjkr+D+#OZrG9oH%y1@c?Q$xO|zd2>n zFg#%s*RD!CZ#EX?q}$T&s4YkAS8SM3JCy#4z53lO1sW!B>KL#vBR5(E@pjF6gK1ab zKFBtnCpN^?n$Hy&dfEL59MVPHNYD3&7+0lwv1_moLgmZ?-X$|<)YdMtHY9$jwB86P z61KMOH@rTDXma#p0%A8%Gu_1n*XseU%gwavPz9}jqm5X}N0vH2jp1KbwZLGQzQm}` zPS%;xd#CP(4aku$G~&f!ZutXLs|UuZPgEJUCV=Utco;@0${jc1qJw@@y5N%_FyuCq zRNq_9!^4CsK)F6TaRm7Fojx9|vja7TE&Y`HKgcRdYVO7>E#G!g*6PG(Jl)~m>8myo z<$c1cEd^d`4F%<@pQYw5*f1NZUi<-;;c>A*Iev?^^X6vo#7XsL?NFmE>80G0*ie~7 z{|d*z)}jG_)!JaG$eTANo4gEX*gtXCofySSr%u%gSuL&jg zM7@BG*QKM`U|*JJRQSxJ0}1@ASPEu&N)zQOy1w$uPG%`FV6cZ5kgKv>6QKtZ^9f*M zh^@{jC&j(Bx(uc@lZ?QU*dgPT@|<*JlisGX!6AH zG`MX zyZ;G9qyQv-?TMvgvoJ_cQ(k;dQ&{RCiWxZ}Ii92TXC{mM32)Czg-fUCxuF?)$)_iV zQaDSkuFK~H4uv&9Ded3dJ$aCUrY{^O_dz^Q@_~B2OElB- z=fhWwUETdP6DhE^iQ_a=8VCJ`-*Z&4SwDVZUJ+lUNPg7(AJMyc4{mSAa^#OCBK|~r z3>u4oUIjpRca^eQ?R+mHmK91N=?~m?YIYnyT;BkcA3A4Hxzv>ad7=M^c&7+RoW3VK zbA=H=?S-v69;VQK1itC{+re=#M+`+&Ha`szqLDKjLTxY(w{lgmwD&5UbPI`m* z?kgT?{zsGp3L^}I{y4`5(#43ndn{h?ZqNKj8CidHxKBj%w)1sU z%%xBqr*N(*|MJ=uhx^*VY+2_Qu&CXuy!9Nr%S0VM5%#!cod@k2gNpXoH&d8);`Og) zC>DyijgPX)?VaIv-)Fhwk#28f?n=lNiFj@sr|7o38y7@61_azwq3(GSQ^K6*`<383 zIW;o(lDFyF4-{`Gj1e0=mXjZ_Un%*VyYqA0p)5eSCQNl;WqLqQWTMYz=|}|OmzUY} z*es_!@L~b%+w- zKv?Cf_mY(k`h6YEmW5WkJvkIvSxE4#zX;-!^*FD0uv}QMWVR0#ljrD@W~eXRbf|yP zX@PW~3GJTHfZgfY0*`k5p`rQZuizNfxy*?&FknNDLG)rCl!KLzrwv|N%4PZ#WS0m; z``x~GN6YV~``7F?f9MN!kZDwbEjHr1z>6gHIjk-tsk zMz(Y!NaOxM{Xi`0x+dN#(sC&QoQumm)Ym79dlMfMYJ>iIal=^tdOv}vTmOKx5OCG+ zNQ>nznkXa~mnhKPWFxQ=PT^yVNIkxL!U#@FtBxsHGJa3^*&2I`%JuY!YI*-=2!=TWg&gZ^u`)HEM&v;Ewd znAv1-+#OV9&&eeds$zL{ap4KTpE{T#w=VaMxH#ILhGTmk!Sz%l4>R2Q+IkiH&ovYl zc=Yvs&#PzUS!F*hrj>5*K6QNhm~`7T;H6dzb`n!$%{jchCQQ5J(D>sd^7 zbnPU5^R&k}1AYBW0q`@q;uzWf)4s<&E>o`aCb3+fruSARWBX z_w=azLWjAJg#$YD^ZFv8VuL_GzBX1}=h!r?L#ddkaX6|*Qbetn<2EUGL#q9SCivMQie5V?zYNSKKB za&P{28@cb17)PJF;ft0Fa2Ba?|9?-s=Cl>8cDJ_1jN)6-c>roS{jmi4ISodT+@-dB z_VixyZ6e~IH=Bw?bW~eN`z6Ji9gMb$`(=GMx<1>mS4%rY%XR!snn^)u)Lp8cs5gNZ zZ+VC7Nj%$jCcI<8n2GxvX7}SWFR*8Q*J^&K9aZtVGxrrmQt?){|A<&Q{MYa;=GhPV zwWZyH@au@ke&9R*XV=?DZircM&@pqOv%G0B3VP01Hb}6rk=9c{imNIR#nkq58I)@Y z^9&NveD!ld3pq=_Se6eA3(qOLU`v%8(kfWVZhm$eF6=c4d31YS>7!F}+wO*x<>du) z9l{;g)6w|AewdryV`G7u?zP}OHwrQd`W{Z{)AIYvR(W<7jBq<}QSzxZgMpSK8>F9(82^-%LCr{x1D{l6tMk@-;rt7+8!mtGbRveKB7 zcV;m9=PBH`f$O+^1RX#IMVo3~>OSPJUJ0rTD)SEvTq8Rr-}g)a2ozLo$5>9}pzXWq zgKn)T`~6bnHUw_5I)U3oCa_2h4YriNYQEq+8~#Wc(mDhnMd@|H0yUhS5P4PfH^OtVr{;MA~A)<@B%#ED9Y7rMh+Aj zFzyd8wco_tfB5K%SGr$2aY(E`I2$ zds>;g+G%AJL#}jNfIbu#7iyW5J`LGkINgGcy~D^oy1EOf1#P?`z2(+)GYK<4k`9OU zg&uYLF|642+;Oqq)0e?(Dwm*qakd&y1}PyD=TA9PD59zSnbjL3Qv&hc0hK z?mKc9$KPL}Lu5*(Wgm4p@qHGws5M-NaB7Xuj_mmf9GgpWL@F07JH1* zwDmSEb9(f{ylyveggrLog~%MZyv4%2o=HFWPU$Nx*My2~R}lt?ow70$sKe}mKA7RX z-pNUPA2FjU;}==uN0|%ooC}MuT@V;zXWz!%+-3~kFlIG%^Nat~VMc;(+=>z=oEYBn z={gDVQ}#v6NVyk{ZP&QjiVJbjkc z+p>Gq91+o#HIvBdkrI)`KzMsY&mZn)-l)Fv2sT0n9x(e&x}Vu-RK!E~ZDg9(NhsQg z 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 P&E{FN#K+mgZ_NMM5OvFy literal 0 HcmV?d00001 diff --git a/examples/hyper/global.089000.jpg b/examples/hyper/global.089000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..094e8b5328c95e55222ce8d8ef640a6aabbdc1c5 GIT binary patch literal 71079 zcmdqIcT`hfw>BC?K>0JNkdskRkdu*E@82h7d_w+&@&9wXZ3U3uzXP}fz{h(I zxI>PIPmXun2>{~cyodL%2Ke6%?+*T5oRs$;5E0{UsCoprgNKiQ2PZ#H0o>g_xZeSH z$?s7x@k$dsR{co$+~EnIU)1mW%x}utDAh(#Ed0if{tt+rQc=^;vc6zrf5{;rC?qT* zD)#mt8Ci&&yn?!hrWRCNN7uyE%-rIWrInMji>sTvhv(OC0f9l^gF~WYV&mcy5|ffM zGPAOCa`W;F$}1|Xs%vWN>f1XyySfoQy?vu&;}es}sp*;JmDRQNjm@p?9rV%h$?4fS z=Hl|NUU)b?|D*jc#r{n%a-3dwaMN;^@ULEYcieCnKKb2yOuPgX(yD|X9UedD^Sl4# zP1NtQwg=4oYA8x$#}T5ZECS1{=)bD{OSAuXiuwPKH2Y7*{!6bJ00}-GZu0QS0bl^8 zFNFQqoxfKqtwcmwchN!TJxv;xwDz9{haC@zhksb9kyJ$g2)hH=(%T((J>1pD6#Zj= zGB>?vsw1htN=L#a$zA9ZJ%0;G`1uUA>1R-5gFs(nU06rB|>$iv$Q$3CkrbI)c<1qhpcgv>@$*YrvHu^o5$2reB4 zDY<DIa>3wuvzRq1#T3P)yYO*FeN ze7`CZ#%*Z3?QP30gkmEZkOEYd=FziU)V&;@k=Yj8Vg?8Kq9H?ER}M|V?RjkZ;4wHs z6Pea`zS1sBZ??*iE7hM0_cJu59G87jEO%5Gq!ET5XK-`Ta2e^!lHtK!lq-=(mSvxJ z?EFE3OL2lV78}+?)v8s-?iFX9k4MPWj)K*LNj4=xYA|BUt;X%imh*L3dvo}oW;%iR zJ6fUDo=~<`Fmbp<>2w%0NoQqdGbQQl!d40x)?65r$siE}^HRED^Rrr@EseVWw3i03 z)Gf4nw2MJf6>Y0+AO2A6RMB^oYFRZz6wQ7!=G70Z`5Z0V*LVMUy*>41@Qm^n+8rLi ziHHJm`9DDYu!*k5^+ z=w_ zT?YfGKTh|=%!2K_;$Ztjc~RfjI5E{*K�OBz#x*Zahq~LEt+fQ~eEfk=QANF00uG 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 literal 0 HcmV?d00001 diff --git a/examples/hyper/local.000000.jpg b/examples/hyper/local.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef0ec0cd59adaf184019cafa7fa00746be5828fb GIT binary patch literal 493761 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�EQLSG3m1l8T4Bst}&((=xmWw)5 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 NRK7Vuxas8cPgHlu1? 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 z zsr5G5MZZi`tBAHbZpHkOPai$5lzP9i2^g8#73NfM2oTP(1{s`~g0l)ckX!_K#owux=m3eOln(*YNqw9B`sd98p z+b8ONn0`5);hB-IaKVa^OD&E5sp=&aC~9LpQ&gsNDW1 zfmd#X6?gSv37aI(fotx+?96A&liEd(>7*w)!n2R#+In{A3a9q zq|wBKeO@Y*SNsLgsy_MRbe}5FuRFDYU;JlYJwCy@kW^|3{26#Pc;Kp2*bFH_A5Hfg zy^Ac^vw}!3A*W1TZ?KK!MN>=d0mUf(sLBqW`GIoPb>~qb*dN1a@pL67&k|XnSZWJ= zx2gr9`;Vwk#u>NO|DqnGFzk`MG;~}RAQrK=e+72>HBxaN=P1P2#riPux$Ky_)rpdj zA!g;1cPP2*e?<0;t(JsU2R=+H$J;x!%^Ov3rb~I#?D!#sP>D57!%~BG3w>i5P;0rU zWjpuG9PF%Co+=g?z4760@=0P~ir)>0M458--PfC=a0e0Y%FJ6WW!qV4EIag1=`;`bNY7B3jAwH`#rJpB+GTPRj|pT2-1?-$ab1|(D-$U?F>+qC| zwU8SuV`R`a2B{uS66V7?s`jt4Jpb66>7Up1*^ZelB?k9!nRjMS(YEMIIq1U(YKSdb z24oz4Z>{I;#&q!F+kewGw1m*>hE?`gy}ma>mJGFRfqwN_)ayF*;V+rq5-lC2ZYA0i zUacyK(Lqx%2>lr>Ttg3@%L681!*X2t@Z%0#JTkrAKHG-77S+(Q00 zQsjDQd%0a(ELs`}Q|u|acp@8GDdhCq8Ys={<{e^XS53vST|ZZ#8M3fUaH{naruU@U zi-&SshT93UzcoHtBto59-CwN&O7Qt#mV}Q0zAJO@C_n^y6Nmx!DJzw`{~f z*K9oQ<`$w�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 z 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%0A{&S827`8 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 DjY8&0 literal 0 HcmV?d00001 diff --git a/examples/hyper/local.001200.jpg b/examples/hyper/local.001200.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36bc9cd7bc338633e5a9066b2c4e918dd0a0d29e GIT binary patch literal 490252 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�e*Jf*$QKJKd_rbGjgo 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

7Y0>ZM_}zx8W}_3@o5GvZb148Z_p{J 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

9g6^ay9g2H_)Lv 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

hK$*(xbvJ19cLt(p$H7 z0U;dNB=2JR-dL$7+i=WtbEdYsqdj%VeY_iPra%nv!on5-iVy9a^FL60QCO7Uo*qud zdr73b!0N-dbj}E=Po3~)iahB$xA7YqR5rT97S&&@F={_lHBPIOP17X1RqNrs0fLTK zyH^iDjN&z!ZhFN~1;FT~gn3aYa2g(^4sKz0!D`h5YL#!iKE%h4sl%)%i+>!}RVCr8 zt>N649(UV|!qon|<*m1F+>)*c(RSvfBer2~RTO}W=crHPy1FHS>9^!%H%FHiWH)cB z5uKcHQ#j9r(9=CjLh*g65kG(X0(N|qYjhJ556m2Z)bn2$KENiGaOR{WqV)-($oLCk zg7?#RL+Zahqh*)qeC`1bx+@9d4LcM58@ewy=UBfQ*#ppd@AOfd6TN#HY494prAKA) zzlKV#o;JJ#l=4zh^^-cZOg1K$`ZgF@kngiDVLlzVb& zpSF?82ms7;+nAOphnZ1w^C`&-_>;|2^xltG0s-w;x(Ru4ARnXN=yd)Ee>Qq zABDk$Z8*Bw{jM*WD^ku_5-6-9`DVzoN2)SP_=qb-yhL(Hypbr%*cElNc1Rz=D^&MTEF8{p)Qdk^%`@!g3>4#TH>6k`~=S(-E zkTlq4@A*zz2F@_Z?J4T}+~J29zQ(^Xe1H^I5O+Wd`v_=8N@^YSDu2_AaNzxouzhn= zIm80qoH$)Q;okDzq+_1Lu3FS_5dWy{wGMbb*A-@XY>><-hjN;?^3M-ct-b~ z+yKvrDx(zU2N=!tT2ci&i*fwYeL1>ZM#iQ4^N@ndfw>~5L&No!nGV%uI z=dVjci^^eu#P_!Xhi|oLG$W?QaEIAbzmp`uQF$-JS$iPB=@?&0DXwv_l08o_`8>rc zBXZ}hjUeAPvtRUIkY;qCA!8}Fg9K^*gG|*I9C}<2JHRwwU*zEJftWHh<({WsAc6Sm zEqRW%9LtiR@O@ZimIaT}?@ib}M9CicjgsXk`U}HnDgTPU`_DpiQ|>R#M}O}l%)YMS zvMS`^;3?GC#2Q>oSUS>w>z2f^6`HbXK)aOc0v{@U1f-x3{o~Bwx7vzRUuLtW7Lhi! zjg(!?qr(ldC6Vl(!-c=`Uh*`%m}x>pHR~bI7MGM^M4d8Toj5Pn`J|p1`(k9`Gr*s7 zI`Gt(1{N7zb0NWG6AVkzFnS*HW3GB$$(l8+_!aOR_KSyqPKu%6a)O1!w2`~p5oVg3 zk(^{9W*>Rqt^~_b?J?tO>EJ<|GS_=m$a%gJYIPPGc$wy;H7B8@5=&AaP{x$}6y3bPZ*T|Ygb1V1| zFYgFk>e;#g0!UH=D+vV+Y~gnUd%?@hsa|VR&7T|s9`ZodTy41xioyi?651XN9C;NW zF?zDK#rqayJ=4~1V;9Y&Z`6`8&N^K|e=qm7fw}3s>uhIUQmk&~X|S5Wvt=BmtJRq~ zwmMAXaq2_#`Kn*({e6Ckd(m#D{pCnMMNfWuG&C^EWIk zjDIY;<~o?Y-7KtZmoM~aJKZaoCNl`;7-Wl59`6(^D(%_adj^ea)(f%jR2kb!bdUKt z{`SWrMsIvL7IAFShjBrczIOwjwz^I<|AsV5U!o-eFItE#fcyVU4f7*l$FH9z_xMiG{1DIwz%10}xy0P|+;Gh`h>uY*Rm#`+s{Sqngy=bIdC zk2hBM6+VMLH)tjMT(_WpWD<_Qjs|WBhWLUhO*t zvm5(!3cm}iG<*eO=>((N8CG;{hSXk5j9Cf^N+q>16S(^SXk&|7D_SI6b1mxu<`Qym zhEFudMorW$&E4Z?{;upttPd4@R~sLelQY+S*Ck_q&0U*+^cjLM^upv72ar&Z>;gn! z7r5|GyTIe9@cT;&zIJ<-oc=D-wqmC+8j)r^OUcnCN0IOMS3GjC>~2jvy6KrMDMJ$) zys=ah=67a)4~YHQ>Z=Y)?n`cSkCiz(qXix&mTuX9n_}f9KuuOs3QXL%0EG`l=*tgI z8x^oQ|6jx5J_{iUS$a7p7kVeI-C_F8uvh(d^Q1gnmMHrrXV`dg%jDXpvT(I3@pfmP zKm+D~l@`l5C@oj%4&{H8)>QwiQAypz3E>+krYFV*<2I3=La>r;7gG1y@K~2GZ45sF zk89Wzn>8$V5cw2HcNTf_mjM4_gSRZliJoEroMz2qAs$p$Nd9k7bL+PHb9e@Pwvj`) zS65^}WJ&i%@Ml9$HytjAh{peiV8FpPy(X@7>d7ebMwOYmqsdCu6nNyh9xiSYU$fa; zI4OJ#Uibj-kIGfxjX^bBHf;x_<{M5ELEnH;YVUC#%n+H34G8+NFg`k3B>1~|F?V)% zQhd8{UpQb-Ws23F+Guc4-^R&$cgRBQpRi`nhjO$+2t$aPi_6DhTsU7;o#{Py=<(a+8etp4`6&ZB!BDM)DQJ-)yn5C7={=nCd>a#kv08T zOgL6Q4*9Nn9Uf>K_05;(PTcXW6J2c*o$?gV9It6efJk(^--P9klLGt0!*l8^cUn z++?p5^)v43%I_LVJf#|Z058Ir*Q(U3))<#PgTq4Oaiv$nioy}c4q(w$Eind|s zyS!RAQR@C2YQT$FRjwUAY%dRbmMz9(pAnA^E>30{n(w{{U7)@|m2t~J3Lqf&<*?ca z#ct7XY8W*`-yp2goy>75g2r8vEO}NlRJ(ClJa`JcZx39VzIqOtW%>1Z7}+$yGv}@_ zm=eSF`c5wxK1~xcf6jc_H`P(8g>Yo?-b3)B2!_bB8*4Fi{)ErDBV=cS=rkHO)KiJ= zFNyW2y=&TnO+I2&myIBwAbM8;_G0#7Upw znWT4oPAj9PO$>LR;#+#`}yIP%AT=BYMPpWd`3Q@12Mx+m1TAhIVv{se$OzTv< zG9r%_g|<{~?Q)Uau+V=ruqJmLYu9-&8$Lz|M=qI%Ftt@w zB-Ot;T)uLqpc4$2%Nc&8Q-yo}K({9+J4moQEGmi9=%B>gzYRYJoaO|lhn4^8U+6}k z6YzwFO~(K1Ur18_I+zagShf|Frpk@v^?px>=6fg!h&IFl$9aB1g$3r}n*I7Wrn!Ym z{^S+~gI%XR6Kz1OZm7KjO>{y$PXgD`Z~B`pTGr5^`jY<}ra5QDRz>z0UM|>vk24E) zrgdf>-yXL*!37}bTew2RdF%w!qEsi~G+W@x4>--I-jRyzr)3z;VUbDSCh&$VA%tZ@ zW0SI#P}0{T>M0f9v;T&mKiHG5BpAXYmsjoqKTZbl<2*|D2C4xW5DIYqL8gy-nh+gX z+K#{J!p-kI_kg4t*xgdfb1wo;M5q8Xg8&?6vci2;7S@l+VJFf$HOywz6U3eoqzd?Ykcmg**~z^WC#2=+FpD zCtIo=oKj2(Q{$^?^fPlE))fYL+u9f1*ix3K`ObX@j-0D>v{WZB1Ai`G(CyJ-AttF- z950_zo?RNoaGu7bv?OoqYy%5LBVee5fCCv|CG0#R9e#PLz3ilR$aFv*H`AQbv?tEg z--M1}`KIc&YrNGE3I*p?#`hQRi~Pq1Me=a{kW4`7gyv?LIEDmP|lD)t*o}muDY; z{{uY8lpSjIr^tiJQQqk2Z#!ZZvAqE)S~T#q$0b1#SFKc)PW_xo(J8bpxA3N)(tRjtGP+m71VOL7G zw`3eXPz(sRP6;&sn}SX%FODOiyj(a>*?1IbxqBdPJk|J9Ks9k7pz18mvfgL1%D0;= z6{r5Qyh3Jw3#c0QFB3x1{>!;nue$K%QpS*!qyG|6K`IGP;3NT6@oxdu$-e|tvVehp z5Fzq{2odx!l4D?HoDX%N90k9$#Q#{llE(@uuGA5Jn>>JhoZYD*KIg8d%l>=H(0w!d zKa-8i2gyd!VY2b)cwz)48%^3I$8jw}7z(Fm1`vlb(wZt+OeYK`&7UZ(KhtF3lOSQ5 zANM7((B<5hl$2cncj64j1PsS3YVT^d0A1sLpcE7y+3{FD&^*ZWPq7=V#6hqTXL6ii zk}yfhuJItQwJ_=CNsUS*k<(~RXU{Ve-nQCLndHcK`^?MW3(}u;iscxIEf4VNNyYt1 zIqZ^Vhq(qBesI`hQ&ec zqtD*Coi)60l)UWpSBFX-*&~zaI~v>*)L^2oa>*K9pd)(F7OUAaN8Ss&Q~82C;?zpr zqHmXGQ1N8&3e#Pzm-2x6ORUJeP+JC1)zDm;V=E*L1r1&r@N&92O>BcIhpAa^Qv! ztN#46M?o7i$9=t;#n!u2{YKdwlJmNPOj!CLH*=J1UA#G#8E4*?3VDBcS~yihxaWPd z6w2!UqxWf)%{C;$GhXA3COlpA7)PnS@bLRD1=qJ%HM|Bh)mL8+?}@EL_Ut@kEH-Q& z+34Ej)_g;E&ZNhCUK(=qa2A#2f(y5BaK5BnnitfSOr>SK{G^FiHRQR&i0DVo7YGdt zJPu<}T{iSs2=OU&bvBFSBh4lbuQkWV#@V~)DqPXH;%;Is*(~jvE$+=jNUJ$pTwI26 z(MB;f-21|4^@+505iogzmW-(|;CCDPHO`owWXTJBq)8bG9`eJef`P&w9MSU2z6{A| zv@p!$U_4)eNa2gt_`K?HkZT;+J6MRqO&9%=TVA9LtW#V5b1GEQA^`#!g6_-eJnS9lP6=%A8-^oOnix;81< zaKwZcq@UifILr+Ph`H!(0VvdDrsOrw0O0~lwZf#uhko;y=vM$j(x|T#pG5CAac~lH z4eK#3)e?pi+d)Xxfzv}gJ0I<$+f}N)7n{Y-U;m#v-<&CxiE}L^o$o&j$)iWDA;!ST z?R(Z2i8x&Z=3x|3Pjm$6NIgAF_0S-Y*YK-S`#>_g%{2Bj^4w~HoY~Q}7zjXkK!AE` z+(=wXbT#7dybxP@*t0ULTu2k)9a5s9bNaUxr-eM^%(6s|YZSZ=Aze@e16sEM69^?ugceFN6};zH(y0a9H^wCM9}h zh}YzLRC4-LIA;Tg(7@hZuXMN_ZfyBUK$lCb8T0iJf4d_P_EZ$Xbvd5*O_ilB);%|O zeMw7A^1WXXT~XlM0SBX{JqJ<{pMz#pK#xz%#kvJb6kE+iSwA@Qj-Bnydo6rF`chu=2eiwv$B88~UHP{_hmVW@h#YbqTBu=h0-w+bIjH*0D}4wvKH= z>0_&9Y9qG~Yw0}}cvmVFYidinbBj++yBvLNNvZ6bxIqbgZk^W+mBtT`k?+Pvd&OMQ z%L5Wp)A!9{wM`aY=pn-iF#{{_OUW&a!;F~WLdI}k!gCXi=EFoNu$xPxkRtTRXi&*5a_LLmAPp|8xCJZ;S|K@ZkwtNOwEKGG4QFH);*9Hp9`DnFU(PB)ZkvQ|Iw@&{b;tfcF~}3Q$#L+ zbyN1(&C&t>)$!3TuP;GY^3>^4g07JL`6tixlxa%_JgjYB_1Wt!w)HuMjoj=ZylTmJ zB3dJ!z%Z%gCiQ7@lFhp;H)mu>`Pch73n3NGyD@3oQ#nI6#g^Zb8LGT^gT2qq8CJE^ zZyTnM1-&Apy2_X)hUE-*UP9`E+9qlg?l2OyRQ~y0@A1Vsta2&B1WwIY0O5{ z_R`0lO$~MB+;pw>SnY0rGOS)Q&YO433dC{-ty+y!*Wjn`(8W>jj`~(!EUaOI|5#}l z7p?3Q8SIAz{^Tj)E9K$75$W&;*^yr`XdRLVpU82fzbMK6Zeg$8Y}J}=dRd5Eq}Y*F zzwf{;leJF|FZ{C4+3Ui$!OlOv@(nPe3qp9=%;t^%qTmjn$uZ&UI}i`3r^ldkb1Oj6 ziCr(M+$Wxz$tOU(>%e^CaO}}&hFkQOi+LKo<{mGLLKAc z{_|t`=b*`=lI2~Uh?m!%(>V0fOw%OYPl7@5aeKViC#>Tyg(ahy8xmkvv7&WLFDR;2 z-5)bml2Gd7l{qHGiu`XM5Z&YT3ax=z&m_=2R`$x?tv-a>@!WyUrx&P{0|7~$f`NUj zQO!peFPIz!qGUCP^XBfY^Xrp@nT_U5-NCwXi3_4E-mfk++PO55 z;-#*QEp24KtBj8=#*UoSHLota(e=7jyGV!@HI|8>An-5N8_xXfeiekn-AGeB;ffT1 zV#NXHD+LZSF790)%wNtQ4R+^DzVgU<&k=UBPL{W)Xo91|Ez7!J%0Esf?Yq&4@dXPD ziz%x)eK872Ru!6!>Zq*z_5qE$9o0%^h`OeH!2!##*DwiFy`iCU$<1z)#4^mM4R;=M z?9qj03Ny}-yI*QcYI+Wk(G-L6{e-Ph^va%UJOCMzxVTMml-fkgMiW*H#OwI(d~A!x z>vq9xu7_kKNe7x>-?(E}nWy2F0lk!FH}aNy%07eN8RWMBsgBHXOl2uf*OVN=DM3{{ zW9{}m4CoO`#8kNuvlpWx27sY{58Se|Z3wl+zr@Cmy_8_0SpRHHIg&vuX zt5bZN9qkrR)zmO;Y2W$DWMd1kxXJ=C(w8h+YpZkIyyJ)=asU{eAdj~N!06R`ZU@yO zdKc>xW)Hr+o_X4;p-;=>n^n9L9PbqJ@s2F-7w1fZkG%=)5tx*0@rR)WH@)*nm!h~c zr>KrSVt#PDzST}4D@&H1Sldv;Iv|{1OwB($Z^+H2*mf=P(IZctQl?7zt-UaP{=Ug{ zou;PB;Z~_w-TvkFl!1~FW-$}MasLz1_Wn1bZBOk_M4MGZn`7gn(|$!3~}>Ga+`oAGz;9*sHjMdTh+hy$qR0BPPlJ>VN@dr1Gv`{g&Lica$4;7ZLm2( zzNYFq*j)KJ;^7Ty!VV)ZaU$ z*NgtDZ&O#`ThBFpz0do-2+d^U#xnliK68G+5E1e2a>$K19x`=>j}Bo0A_LW8q%FmV4jG5S|(+cy&5lbtNf7UGuMh0jsPkJMl7cTE_UJRPZA z$asu562R1NUE?2U@}Y-I8x zI_Pr?Wo4zF2E1Br1O2+j^tF~5&0@(@<$H2dWyP&2inBDv&{Fn zAQ+mF=`8x39UMU@U|d`ZUwSH{88TjKly#q7qe&$?DwMHt!~l6s*K1zFlQFB|OaAX4 zVFXw`t#n1}AkY6svnNWO^_IEMJ4fo(Z=y3}|y}Bp)&b#B8tl9@l z(NqGg8Obqlb?K}k=0bt~qm%U%<6JJe(*%mw7DVH;`7J4$#GR!Kyvwnp?in&a&5Q@X z9sxx4#duB4L!vsja$#n+7V2&+pTJQ1vdynW6sbUb-g7qiykQB80pPVepGwZ&_HqP> zPfH3LfcTu(M931~%lV0h-cgJc0g9)O^fb31Zh0$5iI@f!%NND$H)d5{!gl>u)f=LB zbcGve&(0a@g}4ZW9xx0SlVlZD0mG0ol8l!-gA({SGOFiG)=7M}XiU0)2v=_+GP|u$ zsFawWm(sUBVs>Jp`D{3+H3=9UcLWJ1bam65kgj7epRLT<+FLL|`QoSLl6u3CNY5Gwmm522~ za&a*H?cykML9@c2_yjOYf%>4*i+E{K#_7Iagu3)J)ys2(M8L)Ore)vJNz~)-7VwO# zty&(gP2cCH{9?*@se6yv3tRT;|F1gw@tlE>OC%Qu?*UT19Jn~F?YL>Dsb3&ItOFN^ zmyP`^Bne@dy&%ql{4L`+9JCC@nQC20f~VNid2rNUy`!d}U=Hv-2b(bnce#K)H^y=i zB{ppPhluBDmIyUMJwZKP_M>BWK=jP#7XtEKjj?nHC5(%GAymbhVbJ|UoHU0p&O~}j zVkrX9S8Mh0iQ_`hYR>zgFwUDv`XeJ>GRr7@0ln})Yy)P$Z381?y0H}tBwNiNWM`{< zvWXeP!=8(mLk|FkR&|*h;X!NQ%~b(@Dp%=v!OIsyr@nUj(AfZuQWrDa&8W1*m{rZc z_2MgTe%h*Aiw280T1qv1r6Ok8Sx{zU@z%nyuP+3{v3WiJr{(VoQSNc9{H2m36$Bz9 zcQXr5kvt8({BTbh`WgVh_2#mX((`jkI`L&t?f6D(tmVT_nm(p3Y)>lDiy-E6!luIS z-rKaT>(P(7nClM!pQP>q0G|M-{y^n#z-KK0d`97ZX?fWLh=%iS-k-&B?RWR+OaI+H z;$uMfP|K2((Mh!)19!X``icx|!qwgequ~7u6F8a#^q?Z+GG($PS%~a1&CIZu9=A*( zvJW*C&T48*%#iWXEL}}h=D8GiOw{a)$pw6W++WIpK%gARJR;dl!2kt=&-#+7N$jpt zNl+h^FD~>UT^d^$wII*bxq}`8O2km-Y{IURfYm_x)0Nq7+f}zlbl{fkjq6H|gjmH! z*e9A7I`0r}xhi4Kh*aDdGv1=om%yqLgy& z0wwPiS7d?5j;UU`@8rsxikZ?^E6&uSJf2ES+au?>Wnb;A^*rbrf2JjOD9COMAtZ@@SmU$U*z^=5t50f~V`obyeOIS_?nW7PeMx4p8s=?0 zRV=96EHENg;zfAj_T;cx|1v_S9X zZB!H2fm-bHNJVS6p2o9Wn=JTsdYbczO;?yG*kw)O9mRs;iiMwxk&`M{pEu@|%}Pov zIBM|rCrX-~8+HRqAr#KourK?L=*3i+lSn?=-o;>RA|oLd@I}FK9^rm zj`bQ8vM(zHDVoQbi-{IOA;U((nToqLJqq6_(iQM`n~~@6{W;m=iyo?aD-MibORq?4 zOet%*IhJPZ_?RekIOsYFakeqooKjcUwN9IoMu!fS#NGF@i*4afBet#FBfdq!dhQ0l zyKEWC?!Cq!P`9#`bGO+4xSu zCRmiiW8R@H$iv85ae>)tm8eCp&DH%}2LdmJ#+#T^>e+rTOZg4u1xr^h35ux=?^HTV zPWUI&FINeq!(1P(eGs5AZNdl~Ck8#Pf#Qi}<|JgvCD#pKYPa?!K%T z!>$}r=VBBwN{Hd;tDclQ1D6M|bt(1AkNOMZT4T(DJV*w69$U7MuyVmJ6YGhS2nDPl zrEyJppL2reyAX>f;Z~>9)*+rzhHXj!#fmreU79g~eR-6H)ec6nT5o0>$gURXbsOg~ zHmik)TYTShXRH+Aj|vcad4Dpwxp1EsK1V#DNt0F;V17zL@?buI->FTGB~`!XxPY2H z@0eBKb^y5#jpEiZzn%<2>}M=rm0_u&Sg={f{1O04m%i3~PRn*glSaQ;5am6Q-|~Mb zd-HIp+xL%KQIus$_Pvno`@SXFLs>@l3fZz{8;mVkvW8IB?CaQ&#dO zll%D$b>H{*_xt{y<9Yt@H^<>PKj(SAuj_ifio@KC!No*l;nA}LcJXyM_0xieZM`SL zzmrk7i>h{X!H{O@)fsTzreNPGLdP!sQY8wxt<+q8Bo-KN#7r$?0dKaO9(OYpqh|}p zi!6{s4S!{H_MDvBtl94V^)dDC~0g?_P5ym9a=Lqa#-sj_jOjqA#)|CBI)a+x_Tu zfHmQUaXKM7DY$we^f=^$OKt~Wrt_2<4kjIhn(UNgEJr)$bA-7?Xc|1Iudq2Cav^W< z${fpn3DQns&UmT^0a-S@_3qGlE{g`E4F1A7taiPizkT!2^#`NnudYT+A`?(O$pDDEt|CN)I3MVrT0OxjULm1i_^b?si>^^1#Ex(~t0H z*bv6@j6y}8Ci+O<9bhQQXA=e%mIAy0*??ky$|h|%<1++(Gxfd7(Pe=g*ItUdGN16E z17my4Z;R(|p%+3OPnp(^MS*>VT7VyrKLPuSt>&C4{RZa9;n!ox*(whhZnD58DJRpt z`8zF@f-(SX-IV@w-8_BRJ=WjuC!ocgN;U!Vr|lY3Awd3Q5BLZGIU2Cb1FYv?_6BWo zY^Ww6_;PcwR;U^)E#)Vf7%{oeCJ+S-WI@pyFJ(0~P)S|$jHs1*fA@kl@TB@M4MO?R z>m_{r>1szozb)hu!(090&r+p0AA#CfWo?~@DOGdr_b-*`f$qSi_cc@S$18^7ciy@* z6ae$sD5UI<{ps&j-tGTb<;!U8W>ml42p$C|(D}o)Iell6Nb#x0)p0NS+E|5@YXf3NYB%pD7F;vwP&V{B2k3~^eU089KH?>Q8IWD|cLhVap- zquZz3t)C>%Y9j*G+Br>@u*9gfWHQRT&nUI39e0CZI7H`1~;#Nb$`>Nfi3=4PbV^*9MdjA=W_LZ*7edhyf%srbEfq=`K#3nr0=H@ zBST+zmhmcB8m|d&5}9~(OY4_~8zEnbN;=>qv}@BAuP<7MTr!A_nSXY-mjgHy1V#;7 z4A?&uOs5&0L?T{(wxkR---uhb6Q67~$BAvI-i<%jstR8QtK&4ZUi09SGBnLR4W@M3 zJdh77NT*O~{q=QVqg(>ulkSlU4TTyP*cn+qcXhFx*im`avBDC# za+4z%-xM7JeP5@Gtb1|bNqwEWnn+*h25aP7wJuYPCIT3KFn+5#zA758kON^oSIZG{ z0z{NLE+`{B&|V8a z6A58gIugTv^wzgWM(8YHu8wvXzBV@gH3zKko`{~9y$o_=BUp5r)AO6JRcb}MH_2*D zATb>`upGnHjWD|2{bJUeCl>c}+mqM@TzdL$ECi<8vf=at$4NRlzkuCDQa@pHbBt%c zPSefFe*KrB2D~-K-ISw)?jY)Ut4-C|ZL*)Y2>YD{dOXdPhofhF2Q(L%!*5{jnd%UY zh$e1bm3T`MESFHRs7;MAcz`0y&YN9x9w;yoM z2RU5Vpj9kXmL$v{IK7((_s`GIjhEDowJt4$k6^NuDk|UIBcHg=@Dz_h7r^i{u3N)RlY+qmz^z#| zu1_&YClBaq>wIwrm5k!zz%vaW*bRk>^0cRViH{MF*k1F^CU&a<8P~`d)Eq7j+}F&R zUW>hbuAE)dECw3JnW8!7oAcP})=jQK?!*H%{+C-PgF6c&z-72#IRF1VED=pZb@UjR zF`{Af#rgNEOtdZ7YyUP8Y#@!8L0A>|7a48@BZv97>R*b3$&xQ_rwbs7;XzB1_)(wQ zn7!&H5y*CJN{I2@@f!LlZS}eagTJMk)qhk3aaYep%`1R4uwbNSKcSJ`=f&Rlt`V${ zIIzew)$?coi#$s#&Z>!g(;^|qIhH@hM<=k8S}SnL#u$>=eWtP@mf)xkM;qCD$t~U2 zVsKVb`fVcMJ2Mf)ZKw{vaNCm2|Jy{s^(337s~Xwds%!Em2mZ%9Yxc&r-UpbhNP)>} z;*k14S>zQ<&>t5yV|>hD;nr#k50aljY#M<9XsL8S^W8pKja<5Y;0^>86@ zfp{2{-xbxNTG=?v!#2647&>M|AuQw-X+d9+4rn^!2W^#9615EcOXrmntRLy;YQ^yA z0N%hupAC23%{}##w^(URV1cdQ)d@FZZWj^iI%PwX+s+<$y8X%CA@QI(DeW%nwXtj( z>-%k<_OQesSu(o z`$V?W?xz(=EYwSV|z#c{|DKEn1u45tq z_VOxFB_tZe>XGU^X&{ro@T5Y4FT_H(R9APg=Q4Ny7zZ9%do7f`2&2QytSGx5sgbMv z<5xNhrAK@!9#>N5#sUecoh_C#Z+fkE{t2#5@Sgmzv>;^K`&hVpI}14tlwnW1H5Q*? zNFd$H;9AWD*vQmK%dcC6$fXgvt%I_lBD2@UClbzS3`b@nw^Tt5RB+e>Ok4GWHFxrE#z%$do&a)f8^ zOLl9_ZQ~e(x2_#v4m`w}1170XWUx#=Iw;Q%32xlbZgQdHTT7#E?40uh7F%g#mr$AU9kK&ZG*OtSh zMq3VkX;zTIyc6{7loa8s_Qqn(bIcy|y|(q)XziZlx^NipN^_+k&%@U`g@FOw_U&dO z^-aIhpo%%OYAY(4U3RygsX0{5S(5qSQGlKZc3EQ$(RHEwGt&1*+`jN6(h$60#g$5J z6MxCiN%^Yu3P-mM{V@@Y!^qAL<;*-?j|UgR7&aMYuW%HKetr)S#ZIPAP)8?di7F-J zqXTeMz1whs&&ki@BXiGn=s1G=b^TcKeHQE|iT&P^=`p~1b-M&f^XSvX@B6FA&nh>z z?)a05ZTcxB*P?42w~x|`3;s7x0JeDIV_bIQu_8pZPUzJyDKeh}M5VoMy9b93nlT|P z4feIt;;UKqEB{<8b9J4GY56b6zR^Uf@JB0$+4;WU4B@rbNN0%p4BRge6tXjMap$L6 zBlAX6io-%4cX;(TKW6!M2k}RochEPg-#ACeyb>tbEV#GbtzHzrt?AZEiM^UmjWN%( zRV#~9Vjt%#BM7@};NDzxWVy$7y-|XJ!J^rE4lrJhw9r1b7v6}So1NvOWBG1{B~(9B z7y1!=KfP(lF+y8@SKg%mPKmyw-PN;gqE5nF`Co^$~lkx@| z&1wMq>Xh&g_SF=?zHU!;0+zpnb0(!Hl5Ch2^uTo}&tGZ{!|rEa+X6hs(EQ)v*XH=~ zW*?QsH0rhiG?m1@?C{#73P~Q5{l%!x#glR7@Su)Z`%Sk3>trq&&Vrhi zs7R^SPJ4N>8M`Iz6TKLk1~!Vw*Uw4X_8Hs=d~J_gJN5ye4^^-$;(n{HbK$}JrJW?a z-MQAZ`wli^?^=gOzpWQ!)dt05L(s3O2|_h7m(x=&18czfJRVfFrP=fc3iz*K#wNI$Y+tmvJp(f#|)oll#- z&$MvWAUjeb{6p!?-1VY`0 z#?*BiOe>YPB+DmR9&*cML%mcU8aNTe(Z{^EU|idkiU+9WfGt2hn1_m1@4)_pw6vi* zZ;zHrzXR+HA(R}+MEMC5k@wm6N|K7ta=1g;8MvIl^FkHIozZS6N`(KS5u{t%;X0d? z;Rj`_53^f?UcGV&+8y(kspq9@0RZK2kQm($yol)3XvoHV3Dg`_ngJisG3J(4+`2_B zD58DX@_O}njMJ7z*~s&>fss6CPW@Bzn1O6**5)3#u{n8Vtr(g44f@QSK*fo`jCL07 zg+IXG%NuRa#fuLgg>sJUQ`UU~p7_%`T8Q&kT~#l>^abDfLW3uAA_XlBe~)S&uk1lo zk3CIie-c46`#L(fDro40HClGVxGRHfZvh0Mf6z?VZaUz4?Rk{>iZ+bQY>-#!cqV`8 z^yyV6T5y{Bx8d8_Uq@Z-kmjBahs#r58cvDdMvAE+Isp`lFJfMpJg)n4->B@wR zL%|HDR>pSg$#x7qMf`w)=|=&Uz+Hypr48c+k`~IfU z`Pfy_K`bxIBLg8HcEe`WE~F1sC6YM@Ttdg&os^066DjQVQRy!>k8XCy4!!AcnZOtB zE-8-f9`SS>lv|IpyE@pf;^YZlD1i7VqaI=+>=_p=N3v5~zDD*iHDx>)18lc3!IOpw zP)i*_G^>#p738M!ARTb@aFe=- zBvdOo))p-2LUK#A+iNi~pI(%9(0p}LTXC!CL{+aiq+{5?-f|==gEvJJYRv90E4>ZX z1E%bb2+A6N;wvB01xAGje>llH*S9fsgpZ8@<1T>Z5*VF)5POCXI{By%ieSPY!3ta1 zQ?>v?j$WeJ^mC%J8Var5A>09bC!;fVut z=>Ug|?)mc=YTe1w{elrylg+@H6_?G+vfRXNOhiFlW;|mekS3L1k)PP#HN+} z(E0m|u#=GF|=54RQZY!DoLa)J=M zcM=n{+B=)U|)CsXy^KC*Qk9KkepmSAU^P1JpRe(EP?D1XN@TEeUg3U#W z|3H=V%W|a=NSt#MWLG(5Xr2;?PjXIo^_Tn2cg0c5n|{u_SBMsr`j{uoST1?GotM`z z)-0&)U;siaHT%01x6` zH~crMa$N~lZn!!ol+Le6^!;|J=%eDH+mrAg5a$G3_J&n3v(JeZD<$z|}qwRPYYyStzR;%Cvzd^;CU$F&&^ zQG#rL*&E}{p2AJiIgmTh`?VTf|50QMG%4*%hVLMLqH(HnSzzw|>)Iowj`iACk zNRiu#eeq{UN8OKe?W;lKVYEH8s}u3vW*4M5!UiMw-z4eW)>rsbV}((v7Lxtg17$s+mVoX@3m(1YW1 zZBlD_NY&1&=U_kT%ZK|B3}eM}4I>D7} zsEtm^(nH7dGL3HZW#MS-BKIFSmuYuC3ESE^o2!@u(A{u%`P2c7NiS+Srk~6p{wC_u zdHYk(gA&jChCHr9d~XVo=#4_94hIsh%N9*%W8^UzkZ>JudXy7$&Z z9i0px^b=!?_3?!m_0K56KsZhYKzb$v5W&d+Mn1-|*8FkYj2(P#vDWcuNt2d0)$+H} zz7l#6oxIXgTPI>{@VmPFzMK^ohh~u8S#j;G3izVwFE&=i1_;M_2V9|)kJ{tMH-xCGI2Ym)vsf=w?ps00r4v0Q}a+ zz07a3OwTGSfh-iYt{qHgmdzlXA4dPuB!AlEVZwsmpN z*fgRmc5UHFgH6kT$UWuv4qzPmPW<}d=868$>kN>Cj3Ue&w$fBPY^>0D`1+0q13KDk zZ)jEDQO#5xN59ieYlS`h-?|Mavoj$8`zas<@CAeblAhK8I(aQ!Ef4!dn^dKwuin;ep#2g#(p#|7cdVylSTX<5C+vXRuD&%VzVe$nZA<9RN{V>E@3oBtKGr;Hj>Z zU>X%rB1|IDqbde;hH1)c&po9ThR`?G9zrzQ>Z1lT;9Cxxi(^cduas~mn*u=JW=(tM1K2wT%R3qr{TT! zcKZSFByhh_(nq3(dc!frq3kGF%HO0=EBCQYLiWJ(l}X`47-O~1&fd;_CUTT@$Hq|T zWJ7Jf=dJbjdryO{tOyv~KQlN3&&F>UG82o$T$sbu>6D}O$bAF8Cxxi4SXsr=Jbfv- z>fxFJ?_n8j0-;WQ{Xct`Hd04CE!Vj6_4bI3cvC*oO7&?stqN;_s5P8A;6;;SnYl`# z{e}Z&6MN+XS0kCP>()fg$~*He&tdz8!qpz)kdo#c=XI%*k!rpqz9L?w+7`{ZW*;5Y zY1HBbCe)s^*QWZ*%B))K`@oIfJz$yWVGhomVABQ_4Or9TUwdaQv0pMJBc3~py+2xQ z0AP~mS2m65-$~+~6I?+re(dEzX4;&xAn_-RSZ$^pnYMK3!y}7=UfSnd$$gxnIPb>s zPj5;q31C+It+i>Yjn{OlG~OR|{fNnjBSWdU?M|t7aie0@;19w-qvE*80v^EcC#i<# z_6-!h=_zZbtq(7#$y`*q)A^1g6-3yZPLnSlU3qCFYPnoenhSyPmnmiK@Iqx#haHW`OB+ek zhpD2FZFR#OPjW7b>3p`!Jvu5{;~ecsLI|_j_&zg6)p2@onx@r#xn8GBq3w$#a;S{b zx-Ekg=F~)3fO)lKcwgX)NBhXrj8Qy`k@8a}2q#t-v9U!r+R2&Y1&(rKPnH)FD!9vi z7&xoJCn-y6lg~NWdki=noX6VXYfqVLbJFH=QFT<~BWm44+NNfQ)6KOpiyQu7$?l0+ z@nTWD-$R~9EAtgiJ#0&)`TR8gyJhszCnVx%y!OgAusO9bW%;Uak~fbc0Rq2S1IqBs<HDiVE6E8Ksq!Kdk_t33Lv@ zv-*Nh8tw9!wY`Pt6UIDuLtwojx25*;Qhk--c-9f)JNd6U%K?P6ZAk*$@rEbetf%fQABh60V*x*x&&ithPBXLt zAdjImDJi3h)y6{`?Ky5YA9`9I>2GDPQCgOL_wVo}ZnIxZ1OJ7mThCn-e;S?Uy3g^G z8wBr;Sp>vwo)f2B3ry)e>3WbHOAD@YqWZJ;_T5_t!U~_AXF-LOl`0_KyDg7y)3G}7 zJX20t))8AQozE|I1&AKxSn1HtJk4Lv zVyX_H)l0mlOEzm|{0;Ms&Ge14`EY&^L>B66ZR_tTy;k0*q0PPg1wfbKOUPxwG|(X+ zlFuc5$wY=FOU}byL8a&NwhU6+U92JwPj1$Ch9}pr{3DZkA{^hAi_QoDF5^8EQG;qS zWq!Et2NihDsKN^1$+-rUbCyqi-S)%_ay7@>pZ+YKv7F>>o>7}KPq8drFcoiE?P4Yc zf{&Y3OjNc%Zd3l#;YxG!Fqb>vA*mu$hBca>K7i&PtpP2LvI##Q@~nFrc#MTK!&%#2 zdXP(j^)kqIQ9~MN)7HpmZ%uC+@=TL7e90+xjSY;Ae6lyFDw6C@Q9qAkl_`CDmt#?Q;rU}~HQpaaoLWhW&gck8t0OxI?07tI)n&q+%V|H&f5`~d)Wl{VM@ ze7x>@BJtGuba>Qca$;g7qGlvwxpuCsc>YAh2&02UfInO=rWmn7x>=-tKJ0vPb$d`5 zZ%}O=kIfYfeVPfOn(TI&{@KrQV3dyD zP(jsbdB7_kPi5bA9miUsAFl~yp$P6}SO89%i={q8BKa0ijF%;joxj z?*8<4VyC<@bUu%zv%9<4cJ(K1NQhV%d*roYPFPWlVXj>UnY%WHx&3-v`@nMBrVs>p z74#S0Mk#>P3fed2uR_Y-&H84;qj?5cXeJR!yOo7Lg|c;83Gr6JjT3nVEk@5vXtWTYe}%DjAK+(zMCJT zG-??8C;VW+g&#HM#A^d+LakwHow#}Wh#xifVPQ)?4gh`a0!zk=Q5g#q_Gb&*X=hUB zS|L@!LlZ@!D3^2ydtvv0vTM@O{^++8@6sGD{SKhAYAS7&hY|Z8tD} zUzDR`A=C)?$i5Pl^}vCX32#d$guB}bE%ORQsc+)REwF!zd=C`O9VCFu%Gijj9tbB9}K&nGSti985g2ddJ>P> zyPNQKRqay=Onmm2%Dg?hVu;sHnSkcC@W?BU8gB^SGJz1VYalW;RNI9{TNg0&>Sv>4 zR{fTrfkS+_Zqmz0=Y*$4X}w#1p`R$PB9CZk$TBCp!xE zw6s_d4Mt6>q4;3HrI3ZL*uL7!XnlK%5COJ1VK&dtsUPEtbyIEzYHUc%k1^M zA*0*LH~xhs2X-^pEd#k5SjmV^@5CHO(ayT?3DTag4w+x}dSs5RcmM8R`O^M|9}64) z^snbxfL+6vzHyDN6M5S2 zWL`ifUsNkcuBnS)%m{UGH?Qz5RS7exa#a1IqbMM&!YCw{m9hl7pqULxwP{7g@?~;< zcw`+S2!P4=c@1+?^=4bV7o5Hr!niQuG^wqmYMko4HY4F%yzwjJyhz8eEk6m{zwpR5 zU%Y@d-DF7?bR=l*b^%;cPZ!-VqV`^&dP*>Ln1ayJU1%0B=hK$FR4`>5r(Qh@Vm}fkLDV!nc~9-pHM`vaAxY8Xga?lcb@g`FSRi()kaO zR6r%k5KCu6!uYt-c0nKihrE;d;o$}Q{hw+mq%w*sHw*J_1N|WB0LG9=`bQ(xGxr^& zd)PpBEKgJox@clg_pV{D<-W`P`!v#TSaDIKCdLajA*=n_JH6Qz*8OT0O)NLE`s=ME zwztGTbe@oj6YY_mt$?_mQ|*CMBNjkTl`jPTZe^K`_5BI5ysOq5Wk)akf@l;05kOz^ z%F4uS(>I4dCV$PJ6l@y2ggoV(fXU?Ao@?Nfnz7u;o8&?<92WB2=XEI z@fzY^@`DfA8r;|-gW_xMZjI(jcckMxX!J}puubp8EL=OJ_uyod)smO;2g>d{#?#Q} zjwscKr_LlOF*TFjNOZC~IMRaFb^$qhN;Ba`u|D2ukX4^p#9M5HZXDGBI$GuInjEif zI#Ky34;;1m7oN@KIp|iK^Y^XCZ{V$Xny3!tiCgIhq|R4Z8)}RryKav>dK_uVz=up? zs2E%~2Nt(d87|&kM8B`*e;FIAaATuAZfrE5CJqUcqxD6BC{hkw;vyzt4gTf=QSznZ zxm?x1#$eRkK7(61n`OXJSuwj`X9iidKVH|Orq1rev`O&uuUAro_6MFo#Ybdr6hqce zL6o7IGLM@os&#}UKm3VAzI#9VTlQQ3|04U95A`@@o#anEG>x9)eQHsE`mocr$6rer zu>IE8mrn0aPU>FK*bvd@0F2vK#Z3;3qK`~qN6k#Ibwzj-=rcc{ALT}%*Z$FuT6Ys+ zMX9Q|Y}Bg^dsu8+u80D?q4K(R@8rXQVVORoCf;pxE})t4IlTtWvTb0ctuwpZeE z3^nGWCTkb#{iM#}bv(efjR-imZHG-2oV%nZTqD=vHjjWzACcWqoos85+tYw?k)IS$ zMuCT+cP7d4$&bo-J6Z=8is>fC_lC}vw7p?qNh{p!{NneMDIo)G-RA8CC=xS6!O{Ca zUaS7CNZex%N!AXBVJ#@KwgGKhHLY9hh`VY9rB1=ZQ$mpK-C5 z9K+FJhBq#QUpi+`E$-1UV(L(3?-d>uz-?LBx1+`=<+E$VOytIVVW`N?bz|o}_>OAb z=UFw{w%+4p|3JXVZi*p%h$bDZ4Me=%tn=s)|915=#%r;lNgn~zP>JZ22YOn(sR~a4 zlW;}A??_~0Eyz*lw>L@)GMpQfxn(Lk;3Jj{%!`x!jgHOy#S2v>A`8TJ@;BU0cppuP zeBgL05?c=@qKJK!*$$v+NK3&25I!=BKRwadnLA^mbMce+cuuui@ea8~Bv-!z}csFiD?!>m5}3FB&!ixsSx$e&nh zs0Y+n3g!LCz>$zYLi@?DH?=nsY}EljBDYfC{BC2Vhe2&jj(%M0GxH0;FQGotYqb+0l2;icv5eq^vNr#?knpzknYA=l0R2-c)b2>rfc}%<+(9R zl#$nl9XKu}EcV{#gy{5t7Bj!ja^l9e=Ax=4p7>14T~b#5!+wFEpee*-)ga^KGNp#> z)SJhbdnRRVP-THzO&aLilZvNfCzOp}6#LAh5r{+u9^Ayvq#@dK&5jk#*4}35^ zaR*{N7@N#8O8w!>yq5%R8&lh}hBBfq`0HQEHIi<7g7eka^0H|i+9>L0Xc_#ehyfCPFlxSh?l1(hm9NuYMyfby`!f>3=V%{BZ7)8V9{-LZ@?Oy6vF4oE2Cf~TjIdBafj&Rj@r`kguAZW zkF3(o!P)vQ3r^SCBoW7n6Ijy;vl8?HYADQ2{&g~CdJQ-4kA{S~5#S%0{+#|Hq4`7m zhz8U`OlaU{8+x{s)vE1DpB6+ql=cLG;u$j!CEkS4z(PtVxN*3VJeRPR!z*^{^~Jm>LeNIsI0&Ad{Z)Vby3 z#a#A84=uW`OdfZb`*mrcsA1T=c*fLo-4Mkbh=Wil>P)c4_m9Hg{fm%C4^;@i?dCtpG1o>ToE^ zY1?nz<#w083mpYix-+UUmtpkg<-WN`0mL|4PiUblLtmUsq(D6jx%S6`ClgTZY)p$J zjOA1O!?)#1b^lH(gl+dPR8YWWlbV zYqpJ+T>K=PDXo|o0dS=vZ>z3O>SzmIqa@Q>B-A3kF$LK$Kv~jtZRL&`dCXPFv@NY| z8EUCNYI$R>&A%%tOtQiEg`M^}W%9ekx)tcj8q*#6NC2zQ&A=(r5CFM>#@L61bi z%JHKou!s89D8gHVp&AGfwaMDCNPWF(0H2^un)$ zuD**}l21oD7#Q4{vZ|o8#gL2#XvXgRY}@I0(~?UJ3O9sbKmXytEV%4LCN&ZJdL}-h z-tgO!M09jv4M6X_xy64i$M)+a(>d35oRYv)@TpV$GIkc`nIerJ6OzX z3sp>KvjWG3TdCvz)EJBI+T^dv;0gx{gLYRUsDXmIOz>b%J%dNiRm;a#AJ6Iyk&HRPk2VE1~!9On{~&UIM9Tr*M13`HiS@*@IQQ? zPtCxBcRhhcT(%t4!UbZ0q;xfmJ#4ATw=3KMl%w{yNSiA@=|@PHQS*1qNZ+{BX=HR6 z5@!+#;Du%iMPQqVZ5(eh6S`mmqtw#D_#QI3rKJqJ^3G4T`bvYp$%vvaZ?qpyM<-Yx zq=`+HpRjYO4oY34UVw=Mcko^}86rUBW>Y_Pjs0zAW@rtKbQFWxPaZ9 z!kBJ;gEES}*FlhqAvB{;K#4;`{f&9Zcd71eMRLF#p)R8-yBfM!e{w%DPu!BgZ!1hb zOxovp_4w^&O2eS=re&gMS})L{c{bT@nEp0;~eiUZ4Sh#E4e44WN-9p zSAj^Yb8mfY;8Mb3>QXC4f8mWE(VLyljz0u3KaVg~ z0IV8#RdE+A0>=QVYtg*WxQqtOPV-k`z8$wa>yr|c$O|>OsPM2twX;fM)&RTNbi*iC zew^&O?sDUpcsSmqj4vF-Y@_J}3d;=Ev3LK#W*oH`gq3J}akv)aJz0+ey{R4w^`NWG zbY`ti(@w0&NRm~<$F3A&?>3@S56TBh**-k}9I2`WfRdH0?U-26X_LV(vKmI+!K2A6 zDEYSoRGQ5%YZu(Lr(Ni zegG=DVrI^E8al7{g-=XU#^VVEN?`+#V1ngnFdSXLuVA00bNdq4aYaZ339D7pl6jQ+ z&fuewBbn&@V5mj@#!!x3ubtEVc9yJ{eLt2`mn2ph7E!)cTJsy7;^};&tKsb!bJ%q6 zHNgaT_nU$Lz>>}G)Zk#rDmYj&*%>T(H}j0-`sHO5@PB+%U!;+>qHSzC1(ehHx;<1C zrTs=m*5ZYGO6_j$Yt?{SWzbH^8kBV@6h#^OhONHb_tuvDOT=RQC+7|u0ulk%GRHZt zx+wPr8oQgfCICd1P(+Op;<7%Aw;&Dcx1gYDn6U<8ALDCba{!R<>}cU?l>#`z|GK7T zb1LJ=g2wl8jSWaxfut?7Pf{Ak^F0FqlpNU#H@^VM#S#OT%rg2%p(A7+kr_Q@c>eqA zt?kIr(>v(IW?zRK(_6WfP9NTMs~q)gj1;c5u%h3i;vXB^9;Y7LJSTY)oTJ1V)adAO zDp53l6)hgQC*3$X%9qH9-eQ%(q(SaeuUkj7`Tv2}fOglwy2P9KxJQ|WyJitEe+1sUiJ1u2VO*fZ#IkYMp z#~n-9tC|9>YvQpp{ zVw4(_9uTDm8g+&(HHoO|U}Jo|(ZU)34k#x3sh|8IP~IgN5KrfoW#$-o&_U<*+ppA$ zqxR+kwCFj~gX$5v7~91RN=Rs@c&u&ZokW0uH{2RpNGq{tHclPT3g-<~onTh4N|yF{ zm9=iVz#Tjn;FA8j&cwZ-i35h|P#@bT0v^AvE$@6z*$lIkejNMlrMGL~ev#wWIRejh zG$LP%a=p*^q;AC}Djt(~ybh={9QfU0I_6nZdJ>aw$4dC#TLHhpuV5Ac%c_i)?H0B0 zqk1AY_j^TP&!#C_jDv`jKg}|yIuckf@sAMXutq9O-q0BA+%w=c2C=&?7lrz z4Q2iYDr@EFUYvJURH=~w3D5GB1`S6kCzJ`)Whk{MPdO*CgiR^a8hWpKEHB9v4s!9+ z+s_M(y;6a#P3Kq{*wu8B6y4o>CZLi@NLXVG(12qAG%^f_Ms7@|_%|APj(4xQdcPuH zxC?PBlM^bp8zZDOutvZCbN}a7=|t0|MRO`UCeT>TyLU?Y9en1NsZ4l7^6En<{$Q+W z87AZ}JPp*`K$VFiD1C#cTgZZz1VShwt)h+CnwKT)Oc$y{jSnOQhvds;G$#V~ryQlH zXVQ$AW?=9;WzitBycD3f;@HT72jyuvrld*l z&tJbNYgT;3eVTay;x5FqeV%7r#=$CIX}QM_xy#j?cu$2@R(McCVgu8UWBWIWmM;R=UtSPppvwpsX{BbHc&IJ*QG?>K7ylEjj&#Ysqn@ zUvOOHs9p|6dZy~ETn<`Wj8WHQAz-EXrsdEQlai96sjEJ59Dg62a?Lrx(u)%puv`27VMZb@l%!X;=avPsGxjqqJ(y`V?AJE1j&!eHDNrJADP9 z$n@^bb-t$>zl9kg#U(bwiswB4JD)$wE3{f#fha?oN3*vytUsx|YRo;BN z^-M+S$KD>I^tUf#?b~WD$XcCpUF%Ox#Z5N;EJ@OsD~I@Z#$#3{m4@@9HPu%X8SJ?e zde69$9Doy$7c~^Qi`}yQ+2%aGT3C{RzA@)Q`>pFgaebw z#@bqYCyn*}pHb#-%t+Dvp$<<@r|O;LR9}Z*`O+1!xz?e( zee@Q{nzWb9$!6#0e~Qt?3YGRI&*R_3i^TTTv-rfSKTK&HHP>!CO6TrDppNdH_N^RL z0Ix(0B8?^v!A{2W6XQ0(neuCMqj&^qVi<>Zt?W>uc(i_qHe*${YnM5u0+0}{ZOq;e`wkPuO^Gejc)-?dkIZ7B_IyWPIearW0%f z!`mQS-x^Ci-8xFOusr4FbMRB2nDlx3(~Lc-N320EMo6vDMBO6F@@4&#D>4B-_C3@obdmA0lq`EFX*D52JoU2hOR#m!`Zuh3{bJGS;8$rG+!ox#SL?P*8z6+xV? z9NCAz#ztF(r#3uu0e&kWO702Y_ota!%c6*QWUKwJZkCt#MQ)?d#s`1Tzh|DgE zbbsjBl2807>aDES-P@TlkI`cBOGKr-Pd+6*^l*r9B$i~Ml3-M8lewC^#H-zz+?};B zo$Q#Cq$5C5)doz5$6~TJ;qOwda$CUV>tosXC=2pAIOa4`QZ%H`eT87RG5W+GW{0OJZ3K^cTMDIkcy z@AW+5xfajez0ffhnd;4NCqwMMB!ZgAx6d;kOoqnOa!3L!fBaGTIix<6y%f?4jDs|| zaq!1~jDtOl>p4hZ!AhU>3!%u|T)T%u`FmgolzXvi_N&8&{L--2&?Y7M=&fqg+i>GY zpFE-kengh*;86Z+>3~Qr0xG;DZR)<4W;RXHO3kDim47}D1|fqsxrooe$W+wV{|_)S zF_NMKK~&~WWa+aY>1To?xo(8ta9%cYg*Nr2-hAT@c+?E0T+NV4#-f!wxN*=H*s=WI zG|4*QO_VZPLlTvMvwUH_8tp4s1t!qQ{!GCW-&@B*!&-H}6APeoogj)KOP%Sw6Rd9l zkUu!`-37XpiTg)BzHqPupNt96wMvrb5xl(kGHPPVe?$DK-Ol`J=JJ#FUApgDn0Ot@tOfpUgsc%}gFm6}mX()~)egr1!`7q4J{_SZrg1@Ugc7wS~v?BjE9(I|m+$t1M!lpL|0qf>c9uEOGtJ@g&H$gsIqg^qb^w@pFAJ ziU^#QI-B9n=V)b*D=xHONKXv*=F%44Ocz4pqv}eXVVwS_`A_m4k(UQ0f!ty|rj6-# zCC16NWPbK_MUtFRwo803jx_!OeI5GZfNIwsp=5DQ@QQFBpm$O*%d~XOBTCmE^*|`@|WyP8Ecdx7|0&-Lw$KP&2SW|2-hHvP8&F+zW2NN}V9w;hf zgJD*UVp1u8F1OuRf^aQmh>Vz)>Y}HN-U6u%C8F#aCVYoiOo{yS6`=-k)IKYYG@gy| z2QH6VdTW(Wo93WrOem>e1|>XcEGN72Q^UQ-D6~C!AyOnw`=Kcv;3yQs7oWQJIAk~E z>8HTpzSZ>8PnS&zJ6nXRQGn#i$S?nP>Sntl0q-qK=RX1(sB{xr&y2095r^$xgBfws zaGJ-SA;$^-!kgfn9yp8EX(bDFaXpLETm|_v`NRP1cxZ2B4_!hbLz>KsFx?aFM6ab{ zUy6AJegLu75$*y4mW-ZhzGnC@m#2;OkGv={jR$-)wOr!n0`jKq({B$$Ehq;{gnJ7l z9bVx9X2SRYNnBlpM()dBw>L^j)6g0tUkB6wHh)s!RxD{CSNF3TPvg2)tc)`}&CUXM zKEX9j>1E$0Fu~bS#Zj38tY&Wi#mW^)CWIJS+Izeyyl5}H6YwhxYnMkW*_Nn%9)yRT zu#dLym6z<%kK`D{<=iFd4GBKcFS!KDSFcu5_MIfeQI>*R_TJ5O|i&wA5cU79f z`G5lsymYBWeg7+vh^_`Pm@iY5Re`2(0r{^us<(@)m61!!0K`9^gOYM}VHp-}8wIP#fnB=_vNEYWa$8N5`^^KJN=cJ)g7mwxK#Eirft6g+(DXCq zFszD}9(#YEavT4OWVZsX1o8`E`iCNv*~VeIV0k(>G2EYVM3Y7^!OC4aP?G7Rf4tGW zXbW1${$HhqTec`UKiw(jbBcA16cmEV*`A3%XMknPYT47HnbheG6De9Q@aYTp;w18Z zqF8(el**bRaKeB-#Ij7AH7_f=W}Cethin^MuUr(c;*eqNi2OC0%ETqlfC=q7j_Xcd zNh``!`VNzAEP5;Ph3#BTn9_|8pG!zFo>k1fz4GSv7rZJe*^05`6fWm;HKBz8r-k5k zy;b(@lR=rj11Hs8ci?#?;C8xzQi*T}5uNEU{zE=9bQ$B?P4~BaW@~GpODI zz&uz?;&Lw5egEBUt=lzd@<<;L>yrHz>oUJM^Xk6A39S9o6q(8pz8qa>ZJgWbKgFMZ zlp5VqNpD1>)LN_e=9Ktyo?IQmXC>E?`u9u-v@QLt)KpyCa^TrcfH|3(XBI9EUB%uV z=FspbH_W;7tt3|SAYg-qh2g?s;3`Alw-f7U{udzmS{NUTV!In*o2%w?JWxLGbh-MK zBJABJblO0*@P_S8z+nCVuyx<@RKNe@$3@W~rR)_Dub*T6Fe1Cs*d;iy8@2l&&p4aO|*Jg9AkD{TK>T*LK#1ilB&g z6QT04??XE&P^uk!ayEvAlSxL#+r#<8iyk3dSoQJ9_59)W(uI*kMZplQh|5D4T9=xn z{0y407w{l6_$9cZQ)ARUBgx78d$#~m_hb2w&AlXvrybl?MtOxM_@b5O5JOqJstNlY z(I$2rR|kxB7;b7%Z_YdL=8AnkfD=Z$A)8qRe!mbu`u#%8^KaOxz~^Ntzyc{F$AAIC z?~!}UpW&csd3+Zaax|gvH(K3$f>u9wR;Sr@@=*J-dvtLL`UU%Jku$#ml>?}ss>WWn zhf~J681VoZQ$HlLlHMD9qZs{#c=PYqUJ3UP=kbWQHnC#!YJhh?Q1D}M;a0nGzH6Yx zhA^pl7O8oQ7@>9!%e(;@5TJgN8?B6qNkxn?0!u5)=BhGcb}Fq=X|~I@tbJf!;atN!yvpf8{6eo zO^z!jtXS7su7I||XSU8%$3}Kmt9pSgvhKnjg(g(6hFO)9`Q5IOX?oofn zZ9c(9Wtx#6j5sfRVFbp7_R>0=0XuxI$NjTBRq5?d)C~1X(mPau&!+kM_QjaY>H?gG z8$D~2nuCoB1z^n0>C)*<&(m3QWGi!T?K{9AwZoOLjk@K7^fM^VccLm(J};qK($NNe zaLOxc9LcEx&u*{$jPa9S)8E;3by#13A-?OUgm-B#HrA#eZXOB55ULYx*EJsz{rN); z@VfU!%Bb{hsm$$!>?KzQqSy4bE9T$vWny(Q_)t78aT{)Ctt}EqPWrkvurAoXuw_5Rz`h4)RhLSI+kwN7T!^ckJa@o1&E(F+SFb4K`hnh}2vA z`zu@KTkAZz22UX~oH!WSOAT8Iy|xVAT&^M;0}tKiPB#cmS>6=Amr|r<74A(wG+;1# z60$-5xgax~i7DcW^LY*y;lNh1v$oJ0gsuy&OW>+4O`G_&3zrw$mPF+P-GEQAR+{94 z4}eJ>M2bpviaY4>wbbWM&tTlRaP?8Q2?vpIYjn0yNSNr82QkhPqBL4gVHz{dPp$3@ zL>degr2Zm$#|dHBNb>nB8iPS;Xr#7{-p{Wc0mKU&Z)*3Kr3}ExOF$+-XBs)28L^pO(93r650Xo**N(; z8m^+d@zk6d?;s*^Rz$jMN3PRldu=igTU|WAf;VNJ4bS{$Q+?}+&tGiM&bXvH$`(sF zcipKxk~fYvy^1axEd<({Iu-GTTn=sq2K(E?&PyGep$5@md=N_@a)UT~pZ4lJgrzch zt}_}9BG$t}m55tyo7wIO*=}|=)8NeY00w|kJ&eEr1Rb+SRV62Hz9zsYUT(Ag`Q4?4 z7pT;hYCwY7TZ}K3n2BTYhlAIX;}edJVcSv_g$!>C2NrdJ{?l~T=qA0pH_wJJ0A*Z4 zv$xib1)1AcbOMd@gf@%7Dn()3Gr!9)PT+scp8c`g4f_js-aI431E(=u5i&e^(9?LJ zeCxzav-e96gd3j7txKUI&Y`E3^91} zqC1*xUDwfETt($oYH*;D1}QcK=#ud+aS}wGedCKod&s61@~r26b=ubkx3k3OH!k#3 z7cMk2&d%X-MUNEcz5qVPRMMs7l(xyGpzXQPtERpG1O%10TMjM;qLxA{38?jwaJ!#gKdzdPX9(GLXSI@!GAXjF>BJK%=ZRtZC1{dL=W?c)uX^O^?}>?aiA(X?Sb@MD@6Q4v#+Q3QE>ub~v0a&q zEhIneP7}@z4h!;^=AZ)V!@vQFMm0`xR8dhS`HvIFl8*@s0(BZKe4}3jWp26sGv%tOgSiF7&!Zzn2`Zlpk z=-u;@FDeK;Sy`id1_j;|$xMsP%gr%f{?K1I9bfL8z4-a)u4kz^()7)?IxXsYU1FIz zH98hZIHx+AvfJQ=Mvz>+JUsfID`h($_bs)%aML}K`o3O*uKUS@U@jJm+R`D9MZ@KU z8tw_`(AGn2hr!yET^iHp`lN^`(6TU2oAOP%j314yuq`c!WnV)t;*5boerRPa?50g! zmZ8A6tdXo_W!+aVsEB(IFKWrYjg~Qin`j!bnIo<HNB`eP)d^#hZ|1uhv&6h#I{^bAOk#rA_^2MxslJ^A-mFT zwF{z$#>gF-Ao8#2=5$@_Rzd98?_0^5C$)1w;?=&aLe(@Dy$K*eJF}58WH_;$uy+IJ zLeMgNXiJvGXpY?)cLo!!fCg-725H98Z@J^(h;nPKg+ZEqTXm*sW2$1dD~$g$f@?z{zaeig3hcxA<_9Rlhq z#VcT8`31Pw;N;v2#jblB%BVEpW2GxNKSk_1L!3=wvw4&jYUT+ytKDVki=c3rKslDB zLKGcY=^mhvpd2iAB&ca`MVEt~+F7?>mC}UkXtVd@zf6jPAM|dCpkd(;{6hVxxv-WQ zHsn8e4Ii-Id*yolNV;qCBTm~KX;I1d(r!pK>e`=#pdU3}X@15GURr5N`AyG=mpiT( zh@-^>O~rldmRMNP-M~YTftarT2bDu`RDF2TC(Ryj-#fjfIwuUkas8!B0Jp?>f@G9` zuZQiziw{guck%3469{b^?J-kG_XWo}LK|)6nH(K-b*p_=tbWuL@Rr_{Skz3McuRiR zxv?@FNkIQqnBY`U&6k!LnlhaV zZFKfjF@GTm-Ps6V?m1qTq{gPrmc_gx)Xg*{S{Cq$BGXh}W03+#0G-1PeikOrcrev5CN@VUGGnCQDx0GlHf-3v$8Zzo)XLf(C)+Z=U5Ga=foeF=r;jxKa0;X9asH4Y8I(kK4M?^s(^Ee+`S83R+T>1U^FM*p^q{g6tl#vHW88&+cG=P-x*T3q_ z!mn~*GCRGub9=aWnwy^zpp2*aN{M2+6~O4;Yk99?kZ1KXj2Q^4YYpM)OO|N}O9MTa zX!(Z%NCAFji87u8ywW>2BF*EFJ~jM}Bv$+L$J+Jt84Nfpb)2tXE>M=?J8FMv#r^}7 z`@-igR_9F)v_?Baf0(a|S#DD!js(ciKKO5jw$W86Z5f$;UKH3xDj`5U+Z!lt8gFk4 zR{Aj*O##0ccbnpp2M5ph&^d*2;jB!!q2tZYt80^KwQul)>@-H? zqh+MHl=eFD=ocd|htMWnG@N_^M1g=NQzU;453+(o1Juw$vpkTYH#Z-V*aC+y8JKHH z&cgMydRSv5Q?4Sl?UyVUKO0U0DKoRTT+IuJ8JSKC)Ip^NLW3Rb#;;t7OAK)f2A^>H zc{saHkzE1@V5|Xf07SnF&8E~1Pm#v?ORg0GYju%$EcEvzwc%B#4o z_VEnL$|HszwVD9bjGw1e^t=ArEQmza^_{gjfLoFgl~l|*C1uLLHy)u4n}Jj-%@5Ys z$Gqy0N5h0JtRlJJM{}V)B0@&C@`nnV@F; zi8RM|&N5+sR23MlN@-UOKqH*kZ?}=3ic8hm-p5M3)V7%LA{1%{ZIPzNV>~nAY5=4J z*)_1E{UHr5EcGHhOvpW;(hSsS-~CsV(Rs~sYZ!@3$ODsh&7#H_M?Ig%_~Z$Zv>RqoL>?bo)ClW(kN0m>MuyCLrJn|u;`->Zzwge9oZV2x9Uidc*;F0LW=n(58&z- z1TL>7?)GG_e3;;P^7=IWABYQV+mk03372l9Y6D#{2%)m&yGXAu(VaEoxZju6VpzKKq!lNd_KA(-MPn{&CpLW&Ot%ec>N~K>$=o_Bs2GvT9pq(`O2;H%h2tj z{PUdjqQxr*8L1W%oc25&AnA_&iEim0C3}l(d);2wnZyjsNm)2ohiRBIt^!mUY<8Yz zAavjciNE@=kB1*uTMFx?c6*MBN>2;@tHNpFQWb)hgAfc zPESMo&PV|&&VVDS*1O5d({Plh*=y#j{CT`?JYbXkA_}>wM{ESpouuny9_^IO#!!#0 zaj)tOs$M7Ah{P$e4L0Mq@zFR+Q?F4BWhkD9EWoXo$9TZb?ZQ$m)kLq<8-{B&WET}_ zYtOQHh->W1Q9+B_CNGy2Os^(uH%>O(l6X?k=F}yZ0O|T2-duWZi@E`9EsQ5k^MBg3 z05T)yPXL(Ao~24!Pzjtp7R|tlBe*&Z-W~+CE3!OI1Wu{D$DALkaj|);ZG9KkQ4KoD z7v$DX(zKZG(T)URS{@w^)6AY2viH$rFn5-wc`JMs-Q-(ipgY;pn13_T2td!#i zW^BnbRYl8_c48{m&(J?1gw5akC?LI~gBjEleuS8Dh4Oj)Pn$NqHupLl*jC0d{3Wa0 zZwrB&z3Q%wcXFeBF2P@N76@UzBFfAITulPa>}~}deD4u{{a;{a^}oQ(W`GRvos>9o z=Qv3&;cU$wMM7%S(-pmpOL$PGjmh1SrLpZEh!Uu7`1|Wt5wn=u8+RmGg1V%bhE29l zFDCh3K$n(6rF*pmE={-dC3w2RV++_!@c)Njda93GGW>+o1%A)*J`OCcj%Er{ z;nWX51N?^h9uT^#z?yfYQ;mJEX&M5)`!y44E94k_kold>{d={LhQxvPkpe=F!7o@x ziW(q~D88~UrQJJMkfOl{+)Ct3$Dg-9O|@;)o+jW+{0}!bZ72PB@FsZzuVFkrSvWbM zt{3ac#?N@of?{I31V|6ENY(?r|I!^}F`)PFP3Zl1U;LVrf%n*fQxf6g+hd>#rbAUn z*B*~VY~@r7foS$`_~r;QmJ_woAtVLXbb-}T(ayp;x^pQ_O|_<;P;M4Fp)PgypC3)l z{ls53ur0kwkS-ff_7YQl!*X5V+=Upz1Lv*=g1`in&G`fF-Bq{5{}GrRe+x_}=dNEw zz`;w8aPac@=itRm%i-s;KABDl zyB4>!izqy;an!1`u90fkc@Ma^OXY{LRefqIw;rP-+(ziGCvSEJ7DHJO?T0t?_;k-d zAy2NwdUvrfjv=cV`2W>yE;NRQv;jZ;xU^l&*nfE?#JEOL#o;kqPArMo*N@%H_hojt z{GVP=w%7edBwL>i9J}&0(tr$$ir?7YZ_Y5&0ZfeT8YGTxL@PTeQp)`#{r|727lU6U|8rbm-r5-d zxe;0u=QDJ^xIVyNQdIP|k_BX&4tb_oTRBdK8NA%%^ye{)j=}~eB;$Cl9N^%H-ZOYq z{Edy5Z;-eY^x**bXh#0Za&kySc4P36#Cp>J>lbF?rCbG@iQDz=N8WS`Skb$5G8&@2 zsyQzvZO43?&5Y-AH^E+Uctz}PJ<6Mob0qUEhv3-<-4VA@8Trt;rw&1hEZ2ia)B8pm zicm5ZpVyCoa`PN+VxjC3G;F9#mP{qA^+t&KxhI#HytSFhx>#6iaPkhB>iPHFv}1dW zpWEO0gl6*M=YATWH)ZUzBPZ_vsp49OIVY1gC-u3FPdRU&dNq4)lnv{ahJM9_bb=$v z+9pFnUi^%;2W=`)CKup^urqTZ4G_0to57OtYx*h<74|6V2^Ap6^lE1hP8niy3v-n2 zk4h6Z9D+Cu;oHWVTvgk|7;9LRWZBn-t%3Nz8mjD)HA5G0H(5Eon>@(AfS^0j=})9o zo1OER_syX;dg!3piAdfp*T}7GDz6^Xb)Q)I7@mjQg^(be*5V(2>|-jwKpOy-Mma=* z!m94#&E>@>gzQuBKQL9?H1APWyceG=?{6MhVc*Lhgy8S4YSsFeK5)vnpu zQvu-db#uDvv_n`uBSFS6_z~hq_TkIJ%bkpdUjn1yJ13)IIRvS}H^JFw^9^>Wn4S#s?^v=%epYVtqm<$u@<~llQqnlV`!$-v{)t`HY8f^G# z0Ncv6%3(W{9~cZ5bw*uQJTG~cijuxn;>MPNoD3E|1LPI28IM5l@u!ZT!v%0U?GPTg zN>3Ws?0P91t}pvPIehMWP8U~$k`*u<%dZ=P#0_!z4kB0?eFas&oDvzfi&A$1r0nJr zzWWp@8#=mbj&kU{;A3{3bpAme-D~g%qPyqRzzdBg4na~L!6vgRa0uY|C2%DCjg-BB z`{-d=1Kr-CH?|?9U2WPyTKeX16h1#dciUND5kr-3%?vmbg5&py;P`zce);K`OKv-# z^UH`s*#givH$xVxXumE#abr$|40YdeTm~QwEy2J zi#8O0>i8KA^6oHp|F7d`>-QSQjj8r8wmoJ1SgtW~0|Km5bguRE?@dIH`%@^FCV_zc zvcn7aeQDogNT~n+eZtBFPFSw`!1|C!dHi>M=mNjHHG^Q;)klL;uT4IJ!bPZj$3inw z9hH6`u>9!2EZ0&xi`}x9tEKGIhl?4#q1v>By!j~{0|*(_H?@n$PE{o|*a`s2)=JAB z5-ue2DAK|cBcmk3srAaEquIgAX9i`Rg`)Dr`cRL(o3r11QttIy`xs%9LPYDq+Jlwf z?BZ?{1LLKR%T@PqA#HoC5*3%F)U)?$GFDggMeQhAQ<1zmm@qY0=Ip1#CcTF&@H*zei2=_HUNe1NT2eS1i_CS;4RhS{s?}5`>)CW$T1#5eC!^-=@^}p$?wQ$EkMWgWx3RJ#8pQUWMp5O&geIO*SW9}?mrg(_Fwt% zZg3+XfKw9Z5bCwEWX_5ySW=(f}{-ExiQJM2WZ3 zF`3SW^fFG{aAudTV|w5>>t@*#D~<}D=WiMM@1-6NO7j1iYyosk!oTU5nJPauydqg} z6R(kt$;En1hx(N;-LLQc>qVa;t)fIhmvQBXT0?`2;xv%6v9FZd@3Mui#0C>(Jl!;a zkzu)lp5uH=mJen_tO|_#y)3H}QFo7(zmfICBBblQlAAF#UFnPi!@5#Y@6LU%xvg_^ zL7K9lC_cip-g^&?W7^KvX}DH`TJZjv6Q7n)y2;}{=MDMTs|Q_pGKhC!fuGf=sqeY@ zy64)s|7?-ZW2{_$sV$YM?ebs)f_LMtJi`(Bn zd&6kgNFheCnpYeV*-3JF6>M16pj;d%XN6XZFDJP(wL*T%B0}Vq$m@c$KZzKXSOQYD zYylJl)}*vD`cg~u&Vv&bLlbxkXv|(saUWe<)y6q2pw*NCp(tCgYj|q)TFBe8S_Q55 zBqaJk^k;YJNK(5oYbY>IT5BXsfi}a1UXkkdX8<0PJC6+sa@_>hNQz5tyVyVQ*l-66 z<3}tkS0J>K0FQn87d-a+eMFl_)#K!S#Fk5mJX2%H*{hi6*>6L}U}B|Q*wvI#G^4{; zy5ovsT<_Wbn@Tm(ZxorOcZ%n($bj7np=oZtic{UUo}d%jMrN;%%K&ej_ri`L{8NXr z9DKX3_lkT!$OXK|)uQ-#492W#hag%*Ty_X1AINs6`rFhO@ioBHNX6UbHn`2R@Qf`E zc(%!6%8wOTXY-qk>!zJ!)y3Qo(jVRwx%x_ixGwrUK+iQDrS8lKxyI>LhQd4RV^rJ{ zmn6>a5S=3#I1{#X%nfe3Fw*b_FN>U!R)4GX#)OXAL`mNB4GBlOGq?~_6I#OWXGQU1 z5S~pt>FO9>+d}`BirZny!r(oYriO7E8;9b<=6;HU!$Fy^s>!YihCC7zien+0G^OZO zd|5L%LkJh;_Gx5dZPx9?c}szTsjZgu@x8HyGfM49|Bb&{!-0#0*Vo}bw^pqyHctS;5z3Iff647fa@nwjz-<)`Z}SmiAglYhbi2PPi{CL3!GUl zuAG&o;P8oS+!y6DvBu1?Q3~XDcv`xg=29u+vuPzpoZa`*@YSQ>=2=*6qIMKbcH~8$ z@zh!a8%cxN^)l*>okMA$#&r^N{YBI=IXYX%X>7t%Z73RL^~eG!kq0lOMz}6a|Cl2* z{!J&7a}EwGRX-#EQIj}H5{`ppQzF2DXvEygE}L1ij#FU!Iq%Ufu}i{SOa?qG1l+*t zhE>Vl6u8RFoLLSo$OTg5%n_MyBLY;W1^Wxpfx{kJJ~hJ_SY4Xxm9{6^K)b}(phm>F z^sOmhHQLv3yt2+MDM%D>r+iCG1+yDUE9yS#T=@9m{#lodC4@wFryMIry(~hjM;^S)$~OLyj*&)hG99y2o>nrhOy&p7J7h#gK>*;%$_1p?K>m9kD~ zK8IPo_isr=&QkRd+9hELeC+3YG>*N1U~*3CDvD>&=Mu;ZA6EEt#JoIikw}vUUOM}$+oIO~cvNDYw*_8p@h3pV6PL3HOY(KjZ zUiK#4q9-wOFn}oB5}}dGl^g@Ql1lH^xHjdz6O8#-f5K_s&jlZ_zDjCk$UV+=?kQS2 zVirz4=Bgq70ApEhx;%yl7wAJ1e}L6UKg207)%ce4w!HcajklN&xIn@lCPRVQ1zmvx z#NbV=k%8lf+S71y%AyV<5Kb0SlCD7O$X&(DS7T}4@FSbX<7TCyD*V5QZoiN`*h0`3 z)o_$~H}{+5T{hLvTt7;Q6xs36iAw&dZ)!XnIkPz#9U>!%yuUC7W}I4C9M&l+ ziuXA-=$6KZ&&`Zv@NMH+OY`LV=nPl}TmOduSkJJ)I;;%-vXD_LdHlm2C;*`)HWZ@{Gw<;&e1)Nt-7e__g(%GdKA5Wzx2Kn3 zcUNXF019ahW+czrCummhG9weJz^_djvv5qUlTdIkDcdwwxlSeD@yyu>|9YUIyn8bf zmxP%#y`)B56NVfavbbD$UGGkMn4wcQlZ$`GeFLwuc0*%YWM4}0G}vjTA6RL&xR(e1 zLn*L6Ax&8I3ho!tUzwmax58(IAT@~n7m}BKb1)6fGR;D1vq^Q88EyhOS z+I5nyO7>SitSYWw&MwmgVe?<*4mN0r=$}Mf&%S_~otN67x7;gPu*{ZJ+iK2S)+Qvm z3JA=`LQkKfHP97uBY14*vYQPcO>CL^5b z%v4NH3;+tLFbxNXc1RTyC+LEdX8Uln&|qGCVtHKxs&Z}6Ivhp>bd#qx&w@P;knh|= zH^TI@G**Me3cJsI9ElySvc_`^Hk<*@h~aQ|r6}!C_y>yA*wo9gDpvm{MuXYY99MbR zi$(jbL)7=ue z7MqK{?jGYBA#T`P{Vmln`r+&WPNA>QS#4$_ND=qZdhUSW;K|h%PN5!mAI0TK10D0w zYb#E8K zv&>!*72YF2$<;Y&$xk7xBGpRw(u1&iLoRCO(VSs5<2WE^vIo13b3t~cFlXVOOv}A6 z70vzRv46N@ZZMgiF@FgtMmn!J3)`kR31!rsv%>3PSl%JSd92@$W;c4WQPD(pPb#nI z3*lwRkm(7iVh8$1H|iovsv!&(D3&ft95%WU;i zUBiZeYtZ0HGJT|*Fk)36WgLM(qw zT)O2NDU`5=?R6$^;N4bW*w1$I_w@6vFKX#qWUN@KxOFsNTcBq=4tK@Ut}hv0Gl=lq zTXeS_SKV6#r;Ijh9FcW}XOMQ^L?A;|4L$E&L2y({7S&9WwM!h++tBL7^i3X4W!B4E zJHDHgx@|}KB@3vJk85D6&<$6i>Bg#(<`HqZFhzOq7|B&>r@(O;JKSDdI_01bd!ATA z0eq(81BuWtBFBY18%b}G1=?{#n<)CAA|${ZLK65PbJ@^PXp$N=@YqY13$xVg2riU=DWbM+%yX{K;p z$bD@3)Z*xXB``{^N&(gU%5{@m-%yFBn0c+|d`zXiMw^mqw>%|>LvWo(*a9}Kq1!!I zJ!2yJ9izaPed!P^DSEheRWa=mm!tuqJAO4mhGRvEQZ413^=N!jM{)uxt!{h5^D@RX zsNq5}j#j^6OqB7E+2qn!gG>639MR7up0_5^n-7rujPm+1*VcalcS(0t^gc>0q^4Tg z&-H2_N>TYtMQry{a@D+i@NUv9$%xN=7r0_D{pHW}m_Ew)bZ9+!$_6SQZPX!}VZ6g8 zdtV2BTKq5iQ~X~CKa$jN2Mza+8>VXC{mY9^m%B0^GHEDIGZuCSkz_S=(70JCW+4Ci zDT*b<%ttDpGu?YF2Rd&vC?Fzp!D0sJt}5n^;lRJNPdfj%fTU#n_?H8i{0|5Nm|o{? z5r9LLJ1_2~&BRx_4{nD6Z;$GjH6;wW$=Oi>(F-$fmUb;E<&@*1ftWdEj0Sw6cv(h= zSp;kGvkR;I`G@xN>o1k(L+k+B@G(ZIeE}sv4wiy9hr_p*hHp*o#+__o#kbF?MmGq# z#8KuN0J!1mT!$BW+oNt9$o!KqpJe_e`}4hWYB_=HGojd;u65AM`f?quAv8KG7MWPY z-MbHT{=H&wRtlJ>_(wIt+m&9xI-B_+%;eh71s7j93u6e^PY|I768|wGCRV=*8xT&h z@-R9y85Vj_F`?k*Ufs2*@t}g~jtt9%7Ieh-R1%d1RwA`*+C?wDUvD*1`bQ!7#J?d?c2qRO+7i;!b1M<7Ix;OK@MzTrEheBEiAFu{M~>M z_0z<5mp(-)rwtc}`Qvx<*GH;U@b~nI+jORRESBO(LAALU%Jvk-IbvI>qp`{`%xCv| zo56mB#U)3Ck&)xUYUJlApxCn;#MIrcmjgc3$G1YUrwQ`y*7~~Ns$qK^-D9bul~VAU z<=ZT@Yt}xb2E01km}X{GLp8ponexV%j|WSnTNyX6cSI7!YsIx4cEV3Q3m5z@Og=(Y4nnF} z80H@>WjjUeEai`7r`_)2)|ff|MI=8USP{&S&d&NKr}lkqs&Phr?rdz0SmI1G|B-y> z;oR9CD+p~cN4}@qm1Yl7RNV#_f4O(TP({wFS46OnLHWkW^u zBQ^z@9y{N|BLS}pYKnvUba78-B1W*8!K`kOD26cOX_m$`DDnyeYu&ybm91B!-Vg=T8*{@lRq|Nn?6cL(Z#>`P7z|GmI|o-QyrJTLmw$>+dzB(R+uTJ z%r(}q2Hiqy3@+r5Evo`tu$VxC_<5H+$AU@&8RZMIV*vaNu9L|Bll-9eqPPIy0!H8s zRZlKpCVQiNi77~9HIzxl%VJ^vSdMkBIB|>T{wimw**}qB^Kppwbn+^!?Kf)|bo) zY)$w9gQ90D^5f_4!=?&A@wg4nqg5T{I<88$!M>$W?H(sZ+S+~g`&NWyA@B_;K)V=# z^)_VG&58_r?aJ-_FV@u_6W6lSZKgNYk2TCuKq@zZ&vZ~FPflP z!VbnIMs_Y32u%$<37=f$N!N96<~2##HE^g}#DTML6f#$fO>A{}>oV`# zVxngSe>SkpV$%yS=2n!t*MW4e8{g0*4QIx8awQp$?M;p8xF3yECSC`TJ!>Me@h3^- zlkH1N{0A`Ga2BAjhF$Ortsa<73|EUXo@!`AFbj9DJ;t@t24{}FR6nN!miSIV`|h9n zSDKt(sMnv}3+Rnk|Jl9PNu8nBp@*L%1tSxdjGR=NqZC(AnwpL1(=ttWIvP#Fg z5lL<~B17XAHEVf$)3|J8bBL6kPGB3{>DE8@uTHS7fyXO5Il7hh#|bIVrryLH4M-CJ zQQ~1A!I$9cQk5QMylg#+`zIGLADRAkzz=mlJ_XnaI*szbbs8Wy?ow}vnSv-?P#}|1 zqtL+rO=t|CqEPY!FqSzSt3ktf!{}&MotfpwugmlR%lmu_*u7v@Vlc|(V`5*hW=aRI zd6YzGAlPE#G&T+(G$CT*v*$*t4&jii$e6eObL9Kmzi0L*!l5WLARIC?1Iz2L#gm!+ zAD-sv6zRsQ#yDYQpL*O!_gKF2kHPkP2it4<%qK(8LmvnJcXTL8M;V9f#S*Dhg7;u+<#EjFO|FpM;FbPh>nztQzgjD61*Nm80 z1hojaOmMpN33vU0Lw^kY)(r{x+R5l}Xp*2C`km;8F9F@q=-;|w(0_G9#O`lF<4jB@ z!R5`uC16JJJRC&0YCsLmo~63&{tJ}4;lbB1OZC1zYL+~ zzsy}eaZ>aDPLj&xzEd?G`Ttt+W9HiX4>((-qFd)FoB!^q~> zN}HThaZL)~X>QKF5)laTm_0vMy0iG!77OIs^nSQ%Fn#b6IRbZ^;jkd+AWVYPjk^pq~sL z!fqaSp3qMg0R2?*du@@850jRzf)Y=BLsq~yWSy)7Cm&3H(S#T~HyJ`E4;uF>9@PZ# zA9Jk4*bb`SirQ0@#78$>^*5gQ+(LgA_|=)x%@SOX0*0?FBD;D}3$$J#74f(IL>q`F zyPUm%69Lb7`g~-gbczJ-T{#DP+j%~Em>=&l*R=E}S1Ea)d_I#-eBmVJ|NA-Y7ty$a zjb_8z3$Pa9ISk^O0a9#=&p)&v1`v3v*4QNB`58CgE2+_o3R=|GJ&Na=2cbKrf zd|9jDe0Vpf=!4NKaU#ZiSbm`u@BkBBh_pfD%c%2mfyv=(y{_+^UNmH68M|Iin}*3{ z{tc43KBB`rw|9c-8q@qdFG$`&?5`*!RfGe}t2%KC0z9T@#CMGW{*x?0%24S(?4PZ4 z=xM?iJFqoVR?ZRKpJ&$C*#GtqA38@-`G56LbD<9xg>oDfs+B%$=i|7LlemyphOTHcZR}ZIx`8joR@iJJQdITXwS+Hq;b2&L2j+Qy=Ho;HNhRGm6%MjNX zS>UO0vtB6*TWn4#_v(R-icpf{q&2bYQf?!`bE;dHmu5Qy(uGr(B>K13w2!%=er;YX z6(S}~<}MJ%Kt?roIs6sR?v+j@u3$75&fh%iQSs3$<7r?*f1{ke=1WkBmiTiwW@qJm z+)_&tgZ!KEM}AZa1(urh$+z8!FMN-v(0ZN09iN^d|49%kMa|Qf>i9818P1#e(jCrI zne44^+LV%#K`kSVSpykbVm`j>>0+=XK)q}Jsb|(D;A)NRgnJlo&WFFMOBeP&d!32? zn%s{o#2g^nX=v)*^ftbyUu6?iCQLj&gF-gB+9?D&V{jku)m@I$S0NJO$u1YRxZ4)j zKyJmn-;$U*Qkw<`hKc!)t;qRQRfFX0|CuI^qO(kbqC=A9+tEsGb%$#MGfG8Mj~Tk- z6qR#yn4%ctF8&mJb#WoicC(FwwFLxU6@~^yXd(zNVVuE^La@9X3|V_I<0c8=I#$Kx za49WD7~enjN^k`jcHpm4hT-)Kma)+A!;|fdpke#`S6h>NMtBJWH0)rikjl5TqB~WD z3t9HYl>PYVrfe5<;-B8~WFWrCtp^?sE^I z1g42a$8?yRt8y|mgZ!s-#{55YhN%W-w{lnKApC30Cjz!c@I)>DA)!t+(X3ivkT^+r zd^T0HJzS|B@-eEw$fgCAu+Y13!0v5%m~Wb=>Lk6c>?ez!Xg2utG3;4$ZSah!-q&?q zL8GA1s1%m~z*t{`JDXA+Gl~b1pKCA#9>WIr{Rv_(dk|qyD+L~(-HypIqiN0SQzf<; zlYEW`l}|2Yn}@u4UpMuc?3D(9yGC)@g=Vm ziyT#C{0#bv?5Q+$-K{K*P#@o>PN^k}gMG(leWNqwIHBg9b+m2j7ZDw|W*l-xOE;eJ z<|5(-3|HJfPu}95vlv zlX$GOuJ2QbEE-9$oUYAD*-N%v1N#n`3*1DWk^(Gfx?o!oUX5(#dsV8t9phMm)tXb|y zbs9#2XN34X@>uABP%76dj_@02M<{o^42X~LM~@H7dOZa`V(X{5k8&N@(dVOB_`=S{ zX-O2{FTq@K>{(=Bhzr!jM!p?b*)z2da}rTq)l3)&)v5e3e^#b+|zUHDi6~9z&b|9Uk>@fv#T5ZhMt_h>d|4xXC;X~DUYH# z$};>@FlsG3YiioJ7XFogFkMWrd!_p@pos5I_m_Tkcf5Qaw6bElo?hZ5PU;s?V??D| zGFCw+tHQiY5lJHTo{O}NS zS{S++bD8L{y;PDUbGNSm!xd%+V==HDkEh$-uUI@M&+nB=vH{A~!OmtbNKakz-1(GC z7fRQWvt%#No$H2brkla3jt%*W>qyzY7Zj{^p*c?$Oyb~YkmMEXLr6}3o#dxe{dkf} zHq`oEoGi1--382|3}7WujRH}P+ohFgIa9()iu}Ejb_(SfaKfEUH?Yj>US{_&_a2uk zE=jB^No-$lB5B6Hg)xoVZBKc>9-ejHs*$GuK<1FEi-~GR9dT)mm=Bh0=Ee5_q2x@L zsyEDJT=}^+Ts9KU@T$p!DTs#clf_((h9y3r+$BfaqZv-8Umdz6s;^I;w{y5hdjU zU+JRGx0398>*PmlHfXanQ*UIGNBb@b^kk$sNiaLDX{Cg4m;czOmH>VR-=Az7=gkkU zM#Gb*hBnZq9}BTut+Tf;t^;CVq(D+rK<*hL9;yJ_1-Sd1Mglt+$7)Vg05A%_-~QNst?LMTHx^` z?|o^NZyUGr^(!+RX>;v&-@o71ul*eM_3WMcjC&RJhS}CSx|*-pUtAz-f@yAVPG$hy zj2bAhDOjWArAFFCDqEH1$+$&z`8SO$HNMpFVJ|6x5Fg!Q+?R3nySxnk8E1^!6WB8u zRp|Sqcj1(8j+w?~M2kdd$Ia0(A7&cM$(rundJmqvW|J;b16IyW(TsagaPx5L1IRDe z3fH59y;TN7Xbb_uh>;IxseGhrFEos)Y8EP1O=S3g?Y(y}obCI-D-k4- z5WSZK5j|S8MG`>}MDI2UvU)G8CkWAlC{YtN>PD2+dl!UN!m?N`>RN)ulJk)F{l4$- zJHK;g&dfRgoH>~>lRxmR=ee)vx~{u?J~Y}y!!5ihn?m#qF3UAIxS z@vCWIdp4|z-BylrR9u#J*vTEq7khi5zvi+|)M8i*$E9;Do>03c3ACbvacmx;oBIX1 z{35!C#gHo9<;`9Jj`6tbDUh8i5zjKj4qu9Bxa}mhm`|Q!e1h9pZ(|)JKhL)2OwJDQ z{UPFQN^LX%M7%Nhw`qViIT4US=Hu*M*w$#&ALt?HXgDb!(Vw=XUrtkf~4Wn#bWXun9f&v^mu;T!*tEfL^L@S0H zsiF!*6CY}8Y7OS#1J;igdMkGws}YuuR4E-?=N!JmaeYQpV=qHK%+C)*ns3*nYalJ~ z^Cl!_$%RRfkXYNT-H{oxl|F}6j%iRspJ?C78UJ;n1*-ZHEnZ(V=hDh?$v1}AjwzNN z0Cm(?R9JIIs;X~N_9p@)Joy-Pjd#HgXJq7u(|Hjvdc^yLrGs?uk_}X3S}_t+oqKu# zfTrz{Ut3F^Cc0G~UM{LM{e?wDLl$=c9J3>VI(13^0pUT*9RGI^o*zK#0$-mw2jLmg z@d?8Ll0OHVucPN4n=ixWQ#_~+`vRA`wyscFua;D0z333~2jD7~HBvSp!IK97Ttit$ zC<`<~S+%vBVrLt4H1JbK^)tWpt9tM<^I)2FIgzgjzZ7({jdygq=uMIsB_+3D06g@@ z5SRRM-JEI6n6$rqzlNDaM3~(t{gwLv1qV+Lz)G`nj*H)BO!`nLFdB8iXwK4A<(IwB z$X{gSa=jw0Pgg6c5)!uZh6eI7fFy-5Gb+cDw8_bSw}c0GXx%RssOyX8>e_yA%KYq} z@2~DgTa`H>YC}KJ*D=fr#pIKMK0}=89?0Kq-~smPLYM1Q>%F?K7>c0C+ivh`QC)Fz zO6bT!+r6hVHmT(Z#{XS8j>f$wWZ{1hGX+ooSK9&@Bth0R%^KbRY zU)}ZAVgC=z-#inq7aIy}%-4KdwLXS;8EqLvX=Q1V?g2`7X+t!S2t{>=ir*3YQJ^lh z0;%EHS|PAph?zOzO@8B%MQ>vq`Y}~JajzrOP}D!}T6AT)|L`tbUuoZtON6pANwdbv zTZN@IfDb>OK)FUa9v+-=B_&*zRHtW!)|P5?%GO4c<-a!dr+GOz;G2CXzJJGM&7I*! ztT`D65KLM8a#wm*Q@f zjbjzvak2Ura~rWj(L*8j8)X}N;Ek?JZS|z=N3Sy)eVBFoG9HyO3HX)yk+8nljcDrf zR?8^G)bJS97h5AdXUF28FWbA0@-sdg;R43hAEJ6<mdw6Hm9_v2G?YHmPcEfJvt|l%aHU&wzGUL%DBB z;l>9Nf}Is+sv%Q7&8xP?OS4hzW0jIib~Rq_E!PNhZXWzJbTMi6#3Y&&V}9DS`-uZ* zvy*sLf7BXHO5}Joq<*!j#N<@(0}zDS>$nPCtV3oRCm&fh!i6Ehjf1dz=8w1u6CS`a z(I8%!;z62j{;=IEWt!YCD)n_0m}*r{Fm#K_E?j7Gurq|#zl91>1_fO$U2rhzs2lt^ zP`o-7^084knS1fEoC$2umXFOA=zpY8J`DkkUCV=6Al}JRrrWp}+elP&y%yn#h@F zpyRvh)wSd3MCJF_UTC|)S?U9-R1Z2(Vzt}R8I4_OMb)Vm*Gb7K)N8fbk zIWLbvdfx3S2bBU^R9y9t)mgCz32l%8&LII%$ikmVk-qtprrr`4WnM+4LpbFw(04!7 z{$1yEWHpj~j%sXEV1TxYo{;gt;JxN!{@ z;xS9NDxII5Dvli4) za_I5t4F^$kLyMYWp$obhf(8_E|AQupcR3^XyL7X{3v9#7JvlTT*J_w8Deo%Rpi6&D zLtFf$D*$vqg$>W&=ze>T+xdOzCN@rao46ligNAk3XekxnCO|dQm^K2M@o_>;#p4KD zQ2e7n>13zB^x|uHv)?eBpX5nGY=G>#d@G6>8(LlltdWE=%B1xO{0r5}zR5i2*UqWa zAcGF1H-@^dwY7C?r?%7@MOUidx+r{5z2XE$1Ck7Rav_irTR7lGQZuQnwbPGLsEh?T z$g+W9vb-e-*Hpw3j^6jNYWkh$i=(idgRO)=`DxY4?#54ZdaOBYfk{?Of!R1xHPG|F z!2RMw*Vjs~@13*7{|5J)S#(TkMxtw~gU*#`moGp#FLo0aN|Li-QF{~z4`|DDm=e8y)5yb;jH~c%GCau#59R1& zHQ7ve^_tktaeZs!411ODHlw@)o=fo|8EBLaI?aU}w)0A>y8cvrrhip@m3teuW^2mR zDniL<2i7Mnx>&0B`QxR#Vq?I{zFFcdWE7Z+$YNa!ARiNt2Bsq1fvJew=Ti~nN*8=? z_?$NA{wBDNr$IOR8Z|ixPxv=*4?=&eIO+6uGYfFP#(=Eo-t6(2Nt1>k@=|(*hk8sd zXg&e@>c$82uz<;f<;*iyjxB+mNbyrtgss%IORW>v0eKH5>8fPLb{>^OB|J z`T$46DZuHPc)YI<&sg|63{sbf5%^`s>Ykug|E`mYl9f z<*FDRe;Ra!+rVMk?LEJ6FD8@6y;QR!a>0aeU50OLR9}CmHL940_W>vC{bd*qu8kE7 zxD|Au9id#mn;dlx?2k1za8WS=i2c2=(43fPC+n3B))={isp`67q(Rl5?a5_7$UKI1 zH7X7l(OJ4+9o)_Ljloj;!l5z>GfkGIS}PHZ_b@4=Cq&JR;)^C`_{MqDWLSIt3# z%57bqm;C+}33?K}EH9Fsb|KO4wzt5^<1YQvWr!6Qht;0 znNi{eU&G~e-7{yZFGp;M^Vl0jd~=w$p{6)DIsrf+(W#F(e_wP5R(5PW+|Dyuz;?LD zGj2!pqB3lI1s}mbnx0>I7(h}rbVd6OGblCjSHQ`L&1_m8=FE=~kSk68ropHL+BKwp zqnkE+Br7gON{J*U9U>_km}m@Cfp!5v7087AwBN%_vdeT<1#0eo)-k}!C7^L-0w4bv zGX6#JPmU57qO@a-476FTi#L0GrgT!`On3ix9S8xGPQx0Gnsvz%_maF+$KhqL?-RJ! z^K5L^A||cqJJ0o!W~@|b7oY%jmh3K*?2!ekiffxK0(duvRRfWRK8rLpHquNyPzmbe zUVAObL|Q{8D4)D-js3>W4^DMNW%OI1w^4#k5Uod3p(bzfwJHd3>;bV8^{=4=-!bqRYJ5s5 z$DbHLjcan;p*)G9eLuJISu5SyyGvfRR?bGUQ%JV#gv>{49|*O|vrvQ31Fcox=~@5l zI`I(8-y~fapKlHDTn@(G{FLOTlJh=fq7O*DKib2s_^ zP?M!^GdlS~Fpt#S)}IDT3%cIHdUrHQY(i{PU!=I)*w;&s-Q``!8EM?KBCU%9fFb7q zr19MR<#4WZ()bstv;1}D9|RcwFi<)4ZIN62f&U7tm9IpucipeqMqpHszxFfujDzTo zf8?WyQV&nPxAbZ?-UZX$2*F9T2izSOA5hcWZdY{kBC4&ie$plpN9<(*g2*UKvfb^a z#*m$>XPD}~oJCd%X<`cU;RyS`IxIg>J@y4O^MC2E67_9r)oph0*Zgz2G%~K8$JPE{ zFytdX!^nTMGxX?DV{i?Sy~r{o2c3O>6Y#TAI0 zxhf|Vfu14__aJ%sqk8Tiqo=vZC|<3^R^X%{e@(@MgFqk3c<(%_hW~P7JRi$oyiu$u zRV%kJIfg|s{$41Uy z<$KuSDJrxT0wBiI$;-TpQ1bNvV!TAu&gLePUidI%5oT|x$23HZ>)UPftOoQLW$xc! zwJlG6Gvol>Wzqzn%>W)ysx9HBr$8yvg=lU-mIllK7B_M@*7G$DeTIVDS>;CYH;dMe z#DM+`K#c45!I{_qqbJ=b64-jD<~E|$oEJ;}R>%Uusl^E>XL16`_5Wo{%lO-t7L`yP z@bCvI@?1H?Q3h>S8?E}IoS_Il6JvOmb7b%M__(0{)};X*R#-*e)iLg~NkGZ2Gvy4> z0jmuzva({YcgJkHo84YAd0G>f6D32DbX7w{E+e4PM^BRu2kG+kSv(WuUIhzu$5WI^ zkgPDhW|%u;j0cUZchCjg{ZbRD-XPKM&KYjRU}OnS5oV?cBH1~MtQlO9fTv93-;pH; zMApLDyhX8wQ}PFZ;V)Q%5m%8-7DxKk0b0-aGd+e0S~Cc*Hh;|IR%#}Z!GG%!(bu~G z#6JNC=>}Fh^&8qy{wJa4LUJ0X9 z7D%U~0{48QaA^HcWr))gqDDaz3`PxYjm@*+f@>uS9TxB6{n@B<7*x76#t)4<$BLCg zY`@2fCcn&G`c_&xo&;Clo3(I4lLY&DfAki{MHzpNzm&)zNV;`BEBT`oJ&TeQJ$JgD z#4C`B#WuRzxT%g}@>{`+u69SCcp^nCs}N(PjCaF><>HiJrLPbfmo8Dm2^2fFq=}{? zbX{#sBYimRO$R^r*>8f%T88~~ozh36+G>kU$7$S}B-$dS=jIu)1Op%CWQZ@|$dFN+ zhh4?3Yi~Oimi&yQnF-C3PXxVi5~$e8lz6VvZn^vY%sq1rPl3*&usaCPA7bpi#M#%= zEqT6DRe-yUL!44LXvp4USU{M+*v*<3cqQWU>x4JsuQz*;9@N3Xs?H3TkePDR#rEUmD+sf zT-|2r=OF94c<%XTy0xZT%_9wW_1AXzAhmZt+!M{-{^3-g{+^JNJneI*^4v*a7o%KQ zAn}I++gK|P4u(t=ZJY=JiRbj@>MRZ0YZzV|WWu!^?ckIAg4kfn=(7Gsiw867WzgIa z<5<^-YtoG8#P_2O7=?M6Nm!m%%>*KMLIBY$p(&P>v{N%f-pDWf+OZ};zHUc@6R;@(6uerbQsvt&ZvO|9W6h;WaN~Vizr8AngoHrr0m@-ypw6 zjF>1d9MARd0A|-$+yDXfI``YN8n7-wLwc3fyx#Ws?sju1$iEP$pf~o*`coak{ji}h z(Gk#LY_teHJQI6XZTGjJc(7!({wHTPjO_%`oEv{^7z&8;>En)w<9evPg)(ObGFF>wgw~|J#O9@!vL#*>)6Q!IX_D;6$#OGI0rZC|3Eb*unYkY~i^dDKS(_gaOjCo`%^$c*>*Qx0T;E$mdTrRe5%)%u}*YUv6c~vxgeo#|ji|?4o5KS~zg!7tq8ZzG*LBPv#iv z`FYnQGxwb@*3=*hFi@{uVU`}xDC*Mk%rU*+SHl{mbom$i+UVPSh>{c({x58o-4PwB*Sy$%B( zY`STL&~dN1%AiDyc&B_g0MU?UZZiI^Fh0*^ zU(7DBlc7rTVZ@z}7ytgM0`UZ-g5TO>W|^M*PoG>qtx7f!Qw|j{o>B`Tr|cmu+#+%a zZ7Z>|e!j%VQ^mAjUv+A5uN@5uDQ4V8T^C=gl8eUWU@tn+;<>(8`6k5*+a`PR!Re>I z7=JnS=ri(DjSHYRgx(huaIoE}OYBndW*9nsW5ykU_uuyF$fPSD-cu(5kBp2gZPB>v zzPiHjDMDn>a6JtPO~puT7+!@58AbY|bTi<`f>gT{Cq?g1UimS` z8t<`B`ZQ@eK3(zeO~oo}6Rmvr)dC7e=4%G?7>*w!!t@h2`6t!amB1eN?r4sE;FDPNnb5`2ESNf#ue^sK6^8567 zWxbOc=OWW5hGm3#9q?j)6Yx#)9ZUpr_@uiS=juXK$xZqVFk+=;sr4pXQYVDy2g4xy zO!n~X-C)YJ@~CmI4kyMeYFi!fj0(MX8vhK5_=t`4M2ot7=e?;)A4qhbu=+Bo4JBe@ zV59G{jIt@=R0dkWVvhJznfQ(k>)kK<&a)5%x*}%U;)_l~Y*&Pzgu04(CP$J?^Ygr4 zRmt$?*`q|0SYbU2v3b&7??s*|uGZxdTcV}vuuN*BOXeitXU1oHh!JEnY<8M_AZTOHU^2nYoY<26WZH`&k< zZ3^4_%vA4<%}#sFSy{UJx>#NYxilEG$`Edq*OO|b(V%@?-lYjHB#QzkQl zlLzBC3TzM3Dr0Zh-q3VdlC3UuvJ-$`yZWv;xW;pHB8C_QU6{Wjv0)1U5o7`vyV=N{ z`}52h%1Q^SbLUQ(N-X3f!>Oq)1Umg;VIu(0Kr;n zF5G1`Kn$U;5J#L$ll~NTT;!_ge_JnE;cnZpmr`AniN@&r#9!4-ef}$u7!38KAW3$eZQy3AFanbW+>{8xTX>b4RNgk)u&kcK zaoc^3S3cP_V+-?B-zIBsJBoQX#TMbDzox~WdCFuYc$3}Y;L(lZ+0R3_Kg>1Xz+V`4 z63p`_@089Spi6o&_Pi=d{1KIX5)fC;ndHf|1Apq=%!#=5=F^+yX$bMAWJ1u=jc zhO`}C&Aj)%QzAtmPffFe?d8)4Q-FbJ6hmRhMj(FO1qK|TeiKv?dMq2FABT+cyz1(L z8`cb+%Y|uD^s~%<896fUN6unS)JnTkipo=+-z=8;t~+d2Pu#*KU{%3%{;6uQcj!5E zpS~g^k~hV{@0HKh3tUJQs+cO{xJnER$r#|Skb{%1q$yyPGO-=yNeK3;sNUDFOlvvQ zuUejR;7H_y?cKe;xTKi2o#WQRnN!=%LJ*ZP;2+{@{Fnx{9J_D)V4 z#lYLDrvB!jhRTocJq;$;ixBFlW%*YD+$zBICW##@Ye<_#bFD~^#+AV_wvmt9@|~ox zD{BT7hTqC%M`$cgd(m}fq`)Rxf)YPI-<;}Tv|VS7Ghjh(3>w?I#nE8NQarkk(E~BS z@E3U_K%6#D^5GA5 zgbTXq-)ifQNg5v{!L|1g2B*qg77G?6F_oAb43nJIb#zy?_P4C0TK9Cm$IQi{D)CO( zYwMW+wzE6Aet_&p7av%0{Pd#D>76h=br4jrjGWd#nzrNkn-ge=Wov%USSTY0GB1Ha(#sP@3=08y; z^uI*e+W&Qw6`vUSl?i6v+FU<=lk3|&yZ&|9|LEdEQBm&gLWLR4MDU|oy@Isq!R^@2 z&=C-g?|jcAR%$ns?|y)k$4}VJWt8=)upJDz2e4ozT4cyc z*Q6D!19%!u3Lgde;v6h%LSDzt+;|8J$N{B7g76C4B#I4niNEBj*CNHtjUx3z#|@OFFzXl6FpLC`?~EM}j!&p>I&qLb!o96i zj=424`q0Wi@O63An0z=&QjT}DU{vs$?MOQCl610>p8Y4$EuAMiZNx_R{98AHr({)Ge1K5I#l(Xa`|Z|bbd!Ny$SKAxID^E@Jx3qxifjxj|ei~!cM!tu*6HO zQXC)!+!fgX!`lwzos4eXlwBrIg2qK}6JKy$jCbZqX1#?Yk`Lyuv=I}ccB-Bx+J;xq zmF0zB#bo4O!@k~I5f=)z3IJQZT?RsIqhS+lo<_$iTS~{I9TfE^z6Q1|apY*fOt$UN zih10V+p-TA`)^8e`W4lj@B}d9wF0l$O6(dR$~lZ$k!_1sj-%e717GRO(KHStA7I7N z(~^Oe=B>5|6ci{CvavN^uTr5vqM>v6qh z%q#q%W)IM2())E9Tt#1!;#2Fq?$QoIZG%BJ}mHIrOqo_ zu=Et*8}5a?GHZ2PVK;0~Ua$4c((4(rU#YT%V!9?KGViGSYQcBXRXJq?SwyW|uk&2tGKz_Cs%r<{00oIyU+yiy}ADpESi8&d6Q zf9|{@V44i)oFnhin^8u~x7iI58(ZJ*@1U4!5&7CqQ57^ubV>y zyOMqKQzON{?TeVaN5)fpP?5)B*3EP$nq#Mx<5*O2vSHSvj~; zP|2Gl9f7}s#svGY!n}N)3UHxoHcxW`t(6_uNQyStkM@eZBceBz@_;MCPoG#Yo2mB6 zja=`nN5+|Z>W}RrvyJzC?46~RV+H*r7C!GyKGRJXw%jG?vg1Z;MhDLGjIK1-LdWv$ zYkv~?$il);$xLvA2>oNWNJy$wq_?0z)3?b>&qEbxSe(hA)Tv$N+al`zj`PD+{RCD9 zJNyEhFW^0^iR%$5FDW7nK4~8#ld-sHVacPa6)hz^OapS=e&f(R%Pk9+fhEzyKDt-2 zMr$8_%{KD5!7n=xOV?>RhQD6$lka++qHT))eUY(ozx!CP)){9dM}ClkZ6y8uI@|jn zPrMQav>1n4YC#M(&$+|)UP4=c6R7*DX~Ly{J>8PizBorF`bu=rMwvC$QPq$Ns+#z#!yF9C{G&pFlkyNwNXuh#dR-0Xog7&%qWvJDWGV3k7b{TRFU-Il^M`$D^P4?Tg*4xb5HC~8l@0Bq)^ zT`3IowS2ET-IIK}Th@iB6+S=6hbBo;s-w9g#-0s*A|zpp2IHcEvC_m*?~Sp?YuU57 zEUot1za{zNY6J4|E7#>UfeS5Q85M-nWlL?ihwOOn6f2Ea8oM^8Z6XW1{T|^8Rk>+uZfoEx0*`-@6P5ME{=K zGenZu?#U{7%T)=zYS7!ZcsN>CCg463;AM?(gbyRX-sxs~NP(!fZLYLn3yoF-mfp^u z*^9LawW&6&q`miP)bP4H9wnH zK3|fue|Ghkj1wiE364$7FW%Rr9T0PK+yQUQLhOU?w%?2Z5*X;Jy00OQL9klz`Eb>Y ztnq!6QihWqH3N&Bc}-#HbNW0V8llG8K(@CCs@PIv4{FDp?OjRR1bBV!@u^yE*qI5W z7@ekO1GA5^IdiUU($mo9VQu!IrMxTZ&!_-jS3*Q)Bnyn&dOf(IQuej z`a404TSI#460AXao6_mZl=Y5v05_!xZRd{36zMoq_|>7mGS}_Ks93UHQDo@Cn*BDuGd}0Ou>MrKSHjtHeU)@#WjWdO;(GBK+8dgw8Q9>cTLZ<%s(WHrbHR9tCKqIxnhTLTWD*G1{Wi13PG}q**9651T1yBv6 zcx(IqlppEU4B>>_nHLDiT3%EGTVb4D`QWQ}?}eeGr53_11o9u)F(eQY)ViujQg5oA zmD`SZK1d!LIWArTPES{EGIdhkUFc+ z2FbdT64tXwwle%CutUN902uo#Pgc57_t5Wn9Ur)M_@#sGsa}^Wglu)}Z_H1Wyu~ZF zVI8xV8bAjXt4D$1g2q;NW~W?`)hJ2imza!-%&NtgweGGPd>us|8yh(Ts{JN2GkS>) ziDmd$H9mC2WaceNpZD40U*luS)H$pDiuS8!HcBfbXUMxpa9-Wz>uxQPk}rC`!T_^K zGFG%J5*@AWd-(0~OZ#%>I|Dwqv(WOv`ln)*W9rS3T&X+^A=;5{_S3BNnfl2$w+WgzL0icDoB$C|G_wWdHk~wc9EZmol8>~J$|&NzF)VOD)?76mR$Q>QKMDszu=~Y3jMRj}oWkn#r4db+_($jDfc2=2*k5HX1c@nYa>*lNbQ=W~y z)6A7{6;h3iQ*E+gTtw?I06~#ao)8o&7-`V@{9zMC9D2%UbhF)q{UVu9jE0mH&1|wB zbi>m6_$u5-(9o;^Vg-?end!x?ykvllikw2*j%Ich?+nP!jHc-i^Oa?gk&)ADfc*2< zlj6UcB2fZ;mv@tSy=Yq2F89cFjKgC=4!(itkcle3K%RzS4o6c#JKt96m6k@C&a9~< zPgZ`BV#gb10`N&}X4=!>7$R%jK}Qyec&UXCmTFnBC$-pL**+b!h zYi7oMa#Lw8j{8~$X{r-m8Fd234&^IT;8^Z$OicC!S2)L+(ueFy2`1cJ0%+a-RZR+J zp~1nPC?M>bhR~BQBlMqBXa7J-kc1L!aWsjJUVT|x;&(0ClKuRE0Ltrs9e`*SS)SL78#pULD zWXtD0r%0+bR-&)l3ney0br)X=(gSUFT-ii-lPFHU?7_vM=V&I~2=>?RKj+j@E8bG# z>J1OJm7GXy_NlB>5xv%VFPePqG~xEwREs4KokhDyCel+=77*%v(dvQq&B+}$26qb? z+NfNw27v|5;3>!(j99;ej9Hu@nXyUAoG9!#_eKtuCSz`h+K+x@ z54qZvfi_vHtAf4^(+-_db0udcY8|}7oc=65xKsO^)4dtS)bpxxV1WfBX47`PR@RBg zX2uCS<8IuPyb&u7$A&C)PdV1w@CghwqNhK`a@Ok9l#x8W&wfm0jFQ7v?SDeMPk8(t zY670dY;WbR+Mw=)9$lB|@D2}G^NRUlaxFa$=+>TK55nch?0lkt{Y$5UaEN^f;>}my zOr)1(1bFJIhVVX(z*+4dX?Um|Z9Jfsags-5W#?P%*4S`DW&kv54EX0X%~PO~_8ZX` zFMPk6G|}xd3YBaD6mCnz@g)k^)2}{gG!=*1$ zN?fZSao2nagRzqZ$75<+pql88I*DMX1_`=&jv6P_;`PZA3?Kn&03<+;d+H*8BtU%* zy_W$AkW>B9MBscgr5|N*+f-&I8%uw$wsov5}(Q8}!V^N08{rR}%eYw3%!T`OmliGAIv6+od>4d* zkEU<%@Bb++=`><4&FrBx)O8#J=b}(#h?1AX;sx=;s@;D3<5`YB=o9r_cIM9K9mR4| zZl@(OrUH911BKrHmDLbuS&ejh?6?oH@e8i+%0>np`7s6ui)UPHn;i_=|Jg6f3n8(M zf^2`r6Jq67TH#X>Z5%Onxp(GU1`+0O=Cc_5SP%_-Uil`gQybw@{pv2v#PfkO?3-+F zOEARHthuh_(lyGmv&gEiw0;?>9XkH_GWQo#mLL35lI;H#S$&4RI_+HIh`DLvdGz zF6f3jly^`VCD3bis|KVkm}vt}l)zAjIgua6VrB8X7F;tKwV0re0Ggj*N|4ufSVx>m zWTT9ErJ==-oF@^NcVrI|29zBZVnayhm>e$3N_0>lJ4Y;7ny1p3{RT3c^IlfauF4D- zdj2Lz4#cOf1h<*$g%1deKFPJe4t0Eh6FK9@Ge@lc^RW>VKHMP~KXIyD7me9Q zZ7E>SqS1n^ngTX@3zplyGQ<^$lq5~(`wASqS*RK@geK3aXC@b|9!Sea2qo>sbtEV4 z$8ui#7(INqYvjR-r_VKu^ff#$7T%ggDvMn82@GGc(apK8Dg!~rjXjKu)og1DZDRP| zpA(~NCuqmz?_}m>Ajgg4rVB5viY#WMn*oU)29cQP5V9#TT#CVw zR6T7PZ@MrGEt7qCougC#QV)Z}=FQ5OQ3}M;;sQ2Dp!LLp5M=pzT$OGr5j|yWw@CvV zo6N0mBprZe=el67sPk#`Z5pdc6n%AEJ2omlbbN}7#VUd6@(ODy*lvqQKfLf=Kc)by zjXIuRN)F?wu714P^(Z38jS6GN7So`(tzeic(+k+_M?9i#Cac4%RoF=3{6p~?lAq

E6JuT(|^{u zyYIO)CI}Apch7{GB_8ZZ&R+D>NN8`O8uybYPgq)`W3>-?UE^0Ip9dVb3-4|-9^0HI zB~^D}&}txj1uX*<%R;U64cu;dDxcOS%2iLF#UG(iDhrO@3K<`Fyu00WL2NKQ1)|FL ztNVY}+Y0`@-nQA&8ED;EUnlNN@!1FMu6mVk2U$}0Vj#|)3aRKXXW~CS#k6Eo|%F{ao zXq>}9_xo$YmnWVPJi8ji7Cu4gCxU3;=I<4|XVrJl^#_FW+TPp^f(>Fmr*78UI1*UD zlc;sT9Ym&NlE{=LZTW}0cS(~u6JBeKHfU}WW7?{Hv;Z(|IESyxYhRj17?K$x3E>Qq zk|pwGTkBtPamUg*fu{vH&VYGlNs*eeR7YVky=_&p2C!M@HzLnn1_S!ned2X`LrA%KSF(^}iHKDkll#Ek0UYKFr>c4 zi>_TC6j@PaO}i5V03Y9oeAlu|B9&H|@InmFd!3_Bli7^(?}x^9D}#@XwYRT!NDhy7JZnLbKAE#jMo^_w{uytlhVvodeb{S zrqPy>Pf)jxQF_k|!wpO0_y4-?I4j%JB_+=6rbgfPxW(sXPIhX9380Oa@Zvsb-n|{O zh6ZhX=-Cz-f>Y!wQd%1CW|6~`}RR}##BlhA*Z`|!zIF?zSbo) zV`$;2mRgc*Fmh}H<#X7)%g=<&u79$nB;1=Dv$ZUCIYCnEJLJ~K?3l;&DZN$ts@&btR)JeKvf9#aS@HshcO zDUKhqjb{EUury#~b^p0oltqFTe+)4pv(BATo<7}-xy{v2qJ`3D13RZ9Mp|kGmGI3U z31>!F7ylh2qB1wTlsPH8BXl_8`WdaLeSPYVhrkl2&n@K#66jIZM$FfUCG)j3*J+#r zynqKl`d6^2G4CoJkLc@c*h=$q>AS`9r`e5uhSLqOFaS4ShEHrL@vocj(SCMguJQ>! z-WS{7^Ek+Ca>Dns+1DZAL$1Ox>YQF)!XF=fXp0G!q9LMoRsQl%xB!2w5*Nf-)7%Co zR(3q4B!H0m{Ie*w=4>qKLGJAIsl&9;Mufys9%#a#cjs%QMOYvfz{) zZD-SRhg*TwW)4%3Ki4v#C>uS$*2PcRIq|ZQXAyN4fxYo-^H=yp0c2|_n@!Cws8uu+ zfPXRa?3A_bj|n(J&PJXuK!Y$g_GD{E2_@e^H7#f0(@<&LN3s!*@Kka@srd*@t%b9`WnchX&97xz0af z!k_FVSZ{oGo&Pa-xsR>JXPSKDqFik_>T07sa|fy28G3+G6E7RK7Xfb;J)S*G;2LYA z)Q2#v4;jlLT$a6qAlDJ>=ug>Myc_g^0!~4atcYAI-cSi*S_lDn> z6ggJ)=hgIKtBfTv^-uWo%}m#A+N8&pK2T&XKf8avy?@<5n~a`SAS9Qe6Sk`J{-T`< zXWsx(uXEf+ARa6msnH5{WHx;N+5>Ae3-$?ql3nF-d!YxFQAaf8H>1LtYIIqMgV}v0 z?`Dz${^bWnibBcmB!OH?N6imghX1;0|Ncv8k~w`DPyTs6t|5t;4}h2lUjD4l-#wWh zI(zxY81B=-i|yRbgO(pI+8-;TFS)AzC$AW{<<7GjRwu`$|G)C~x1!b^%w56WJ9#(` e?0Wq8{J)aozZ2yD|NsA4F#Lb{evtg0{67G$sJa{g literal 0 HcmV?d00001 diff --git a/examples/hyper/log.25Mar19.hyper.global.g++.4 b/examples/hyper/log.25Mar19.hyper.global.g++.4 new file mode 100644 index 0000000000..6a066d0d66 --- /dev/null +++ b/examples/hyper/log.25Mar19.hyper.global.g++.4 @@ -0,0 +1,1250 @@ +LAMMPS (28 Feb 2019) +# 3d EAM surface for global HD + +# nearest neighbor distance = a * sqrt(2)/2 = 2.77 Angs for Pt with a = 3.92 +# hop event on (100) surface is same distance +# exchange event is 2 atoms moving same distance + +variable Tequil index 500.0 +variable Vmax index 0.5 +variable qfactor index 0.3 +variable cutbond index 3.2 +variable cutevent index 1.1 +variable steps index 100000 +variable nevent index 1000 +variable zoom index 1.8 +variable seed index 826626413 +variable tol index 1.0e-15 + +units metal +atom_style atomic +atom_modify map array +boundary p p p + +lattice fcc 3.92 +Lattice spacing in x,y,z = 3.92 3.92 3.92 +region box block 0 6 0 6 0 4 +create_box 3 box +Created orthogonal box = (0 0 0) to (23.52 23.52 15.68) + 2 by 2 by 1 MPI processor grid +create_atoms 1 box +Created 576 atoms + Time spent = 0.000785828 secs + +mass * 1.0 + +change_box all z final -0.1 5.0 boundary p p f + orthogonal box = (0 0 -0.392) to (23.52 23.52 19.6) +create_atoms 2 single 3.5 3.5 4 +Created 1 atoms + Time spent = 5.79357e-05 secs + +# define frozen substrate and mobile atoms + +group adatom type 2 +1 atoms in group adatom +region base block INF INF INF INF 0 1.8 +set region base type 3 + 288 settings made for type +group base type 3 +288 atoms in group base +group mobile type 1 2 +289 atoms in group mobile + +# pair style + +pair_style eam/alloy +pair_coeff * * ptvoterlammps.eam Pt Pt Pt + +neighbor 0.5 bin +neigh_modify every 1 delay 5 check yes + +fix 1 mobile nve +fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 ${seed} zero yes +fix 2 mobile langevin 500.0 ${Tequil} 1.0 ${seed} zero yes +fix 2 mobile langevin 500.0 500.0 1.0 ${seed} zero yes +fix 2 mobile langevin 500.0 500.0 1.0 826626413 zero yes + +timestep 0.005 + +compute tmobile mobile temp + +thermo 100 +thermo_modify temp tmobile +WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:487) + +# thermal equilibration + +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.07583 + ghost atom cutoff = 6.07583 + binsize = 3.03792, bins = 8 8 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.327 | 3.327 | 3.327 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -3213.9136 0 -3213.9136 -51843.125 + 100 223.70164 -3209.0653 0 -3200.7375 -26575.84 + 200 345.18355 -3206.1371 0 -3193.2869 -42327.268 + 300 411.05681 -3203.8465 0 -3188.5442 -32455.226 + 400 446.05938 -3202.2976 0 -3185.6922 -35377.683 + 500 435.52439 -3200.2131 0 -3183.9999 -31477.028 + 600 474.70282 -3199.4049 0 -3181.7332 -34761.287 + 700 492.00191 -3201.1592 0 -3182.8435 -33036.989 + 800 440.88631 -3198.37 0 -3181.9572 -34669.762 + 900 475.14414 -3198.5845 0 -3180.8964 -31191.883 + 1000 476.87852 -3197.3442 0 -3179.5914 -33731.074 +Loop time of 0.339602 on 4 procs for 1000 steps with 577 atoms + +Performance: 1272.077 ns/day, 0.019 hours/ns, 2944.623 timesteps/s +98.7% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.25294 | 0.26196 | 0.27409 | 1.5 | 77.14 +Neigh | 0.017554 | 0.018856 | 0.020498 | 0.8 | 5.55 +Comm | 0.027196 | 0.040838 | 0.050409 | 4.2 | 12.03 +Output | 0.00025296 | 0.0002721 | 0.00030828 | 0.0 | 0.08 +Modify | 0.013425 | 0.014212 | 0.014999 | 0.5 | 4.18 +Other | | 0.00346 | | | 1.02 + +Nlocal: 144.25 ave 147 max 141 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Nghost: 527.5 ave 533 max 523 min +Histogram: 1 0 0 0 2 0 0 0 0 1 +Neighs: 3477.25 ave 3585 max 3399 min +Histogram: 1 0 1 0 1 0 0 0 0 1 + +Total # of neighbors = 13909 +Ave neighs/atom = 24.1057 +Neighbor list builds = 91 +Dangerous builds = 0 +reset_timestep 0 + +# pin base so will not move during quenches + +fix freeze base setforce 0.0 0.0 0.0 + +# event detection + +compute event all event/displace ${cutevent} +compute event all event/displace 1.1 + +# hyper/global + +fix HG mobile hyper/global ${cutbond} ${qfactor} ${Vmax} ${Tequil} +fix HG mobile hyper/global 3.2 ${qfactor} ${Vmax} ${Tequil} +fix HG mobile hyper/global 3.2 0.3 ${Vmax} ${Tequil} +fix HG mobile hyper/global 3.2 0.3 0.5 ${Tequil} +fix HG mobile hyper/global 3.2 0.3 0.5 500.0 + +# thermo output + +thermo_style custom step temp pe f_HG f_HG[*] +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:705) + +thermo_modify lost ignore +thermo_modify temp tmobile +WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:487) + +thermo ${nevent} +thermo 1000 + +# dump output options + +region substrate block INF INF INF INF 1.8 3.8 +region adatoms block INF INF INF INF 3.8 INF +variable acolor atom rmask(base)+2*rmask(substrate)+3*rmask(adatoms) + +dump 1 all image 1000000 global.*.jpg v_acolor type zoom ${zoom} adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 +dump 1 all image 1000000 global.*.jpg v_acolor type zoom 1.8 adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 +dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green + +# run + +hyper ${steps} ${nevent} HG event min ${tol} ${tol} 1000 1000 dump 1 +hyper 100000 ${nevent} HG event min ${tol} ${tol} 1000 1000 dump 1 +hyper 100000 1000 HG event min ${tol} ${tol} 1000 1000 dump 1 +hyper 100000 1000 HG event min 1.0e-15 ${tol} 1000 1000 dump 1 +hyper 100000 1000 HG event min 1.0e-15 1.0e-15 1000 1000 dump 1 +WARNING: Resetting reneighboring criteria during hyper (../hyper.cpp:133) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.07583 + ghost atom cutoff = 6.07583 + binsize = 3.03792, bins = 8 8 7 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix hyper/global, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 6.015 | 6.015 | 6.015 Mbytes +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 0 476.87852 -3197.3442 0 0 0 0 0 0 0 0 0 0 0 0 0 + 53 476.87852 -3217.9192 0 0 0 0 0 0 0 0 0 0 0 0 0 +Loop time of 0.0358047 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 0 476.87852 -3197.3442 0.33187212 2213.7063 0.17396269 129 131 6.0069324 0 0 0 3.3552688 0 0 0 + 1000 487.34979 -3198.3697 0.19401776 90.283981 0.23468448 543 548 6.0069324 0.165 0 0 3.9974111 6134.6092 0 0 +Loop time of 0.342707 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 1000 487.34979 -3198.3697 0.19401776 90.283981 0.23468448 543 548 6.0069324 0.165 0 0 3.9974111 6134.6092 0 0 + 1059 487.34979 -3217.9192 0.19401776 90.283981 0.23468448 543 548 6.0069324 0.15580737 0 0 3.9974111 6134.6092 0 0 +Loop time of 0.0359111 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 1000 487.34979 -3198.3697 0.19401776 90.283981 0.23468448 543 548 6.0069324 0.165 0 0 3.9974111 6134.6092 0 0 + 2000 522.93873 -3197.4748 0.1540961 35.745265 0.24952495 120 131 6.0069324 0.1645 0 0 4.0370436 10213.644 0 0 +Loop time of 0.305975 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 2000 522.93873 -3197.4748 0.1540961 35.745265 0.24952495 120 131 6.0069324 0.1645 0 0 4.0370436 10213.644 0 0 + 2057 522.93873 -3217.9192 0.1540961 35.745265 0.24952495 120 131 6.0069324 0.15994166 0 0 4.0370436 10213.644 0 0 +Loop time of 0.0335248 on 4 procs for 57 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 2000 522.93873 -3197.4748 0.1540961 35.745265 0.24952495 120 131 6.0069324 0.1645 0 0 4.0370436 10213.644 0 0 + 3000 485.3853 -3198.0446 0.081070047 6.563707 0.27460406 120 131 6.0069324 0.145 0 0 4.0370436 13331.739 0 0 +Loop time of 0.269706 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 3000 485.3853 -3198.0446 0.081070047 6.563707 0.27460406 120 131 6.0069324 0.145 0 0 4.0370436 13331.739 0 0 + 3059 485.3853 -3217.9192 0.081070047 6.563707 0.27460406 120 131 6.0069324 0.14220333 0 0 4.0370436 13331.739 0 0 +Loop time of 0.0265908 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 3000 485.3853 -3198.0446 0.081070047 6.563707 0.27460406 120 131 6.0069324 0.145 0 0 4.0370436 13331.739 0 0 + 4000 522.88476 -3199.0496 0.020170911 1.5970319 0.29388643 548 555 6.0069324 0.17575 0 0 4.0370436 14355.723 0 0 +Loop time of 0.229504 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 4000 522.88476 -3199.0496 0.020170911 1.5970319 0.29388643 548 555 6.0069324 0.17575 0 0 4.0370436 14355.723 0 0 + 4060 522.88476 -3217.9192 0.020170911 1.5970319 0.29388643 548 555 6.0069324 0.17315271 0 0 4.0370436 14355.723 0 0 +Loop time of 0.0280094 on 4 procs for 60 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 4000 522.88476 -3199.0496 0.020170911 1.5970319 0.29388643 548 555 6.0069324 0.17575 0 0 4.0370436 14355.723 0 0 + 5000 462.24647 -3197.3076 0.11575138 14.679837 0.26299192 130 132 6.0069324 0.1664 0 0 4.0370436 19342.466 0 0 +Loop time of 0.234847 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 5000 462.24647 -3197.3076 0.11575138 14.679837 0.26299192 130 132 6.0069324 0.1664 0 0 4.0370436 19342.466 0 0 + 5054 462.24647 -3217.9192 0.11575138 14.679837 0.26299192 130 132 6.0069324 0.16462208 0 0 4.0370436 19342.466 0 0 +Loop time of 0.026547 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 5000 462.24647 -3197.3076 0.11575138 14.679837 0.26299192 130 132 6.0069324 0.1664 0 0 4.0370436 19342.466 0 0 + 6000 463.33022 -3196.1897 0.37378421 5855.6457 0.15072771 122 123 6.0069324 0.15583333 0 0 4.0370436 22854.021 0 0 +Loop time of 0.244725 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 6000 463.33022 -3196.1897 0.37378421 5855.6457 0.15072771 122 123 6.0069324 0.15583333 0 0 4.0370436 22854.021 0 0 + 6054 463.33022 -3217.9192 0.37378421 5855.6457 0.15072771 122 123 6.0069324 0.15444334 0 0 4.0370436 22854.021 0 0 +Loop time of 0.0267512 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 6000 463.33022 -3196.1897 0.37378421 5855.6457 0.15072771 122 123 6.0069324 0.15583333 0 0 4.0370436 22854.021 0 0 + 7000 496.34089 -3198.1795 0.29031005 843.70994 0.19427864 547 552 6.0069324 0.14885714 0 0 4.1079381 27854.511 0 0 +Loop time of 0.229727 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 7000 496.34089 -3198.1795 0.29031005 843.70994 0.19427864 547 552 6.0069324 0.14885714 0 0 4.1079381 27854.511 0 0 + 7055 496.34089 -3217.9192 0.29031005 843.70994 0.19427864 547 552 6.0069324 0.14769667 0 0 4.1079381 27854.511 0 0 +Loop time of 0.0260235 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 7000 496.34089 -3198.1795 0.29031005 843.70994 0.19427864 547 552 6.0069324 0.14885714 0 0 4.1079381 27854.511 0 0 + 8000 468.63017 -3197.6685 0 1 0.31412476 275 556 6.0069324 0.14075 0.00175 0 4.1079381 31930.231 0 0 +Loop time of 0.230083 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 8000 468.63017 -3197.6685 0 1 0.31412476 275 556 6.0069324 0.14075 0.00175 0 4.1079381 31930.231 0 0 + 8056 468.63017 -3217.9192 0 1 0.31412476 275 556 6.0069324 0.1397716 0.0017378352 0 4.1079381 31930.231 0 0 +Loop time of 0.0261552 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 8000 468.63017 -3197.6685 0 1 0.31412476 275 556 6.0069324 0.14075 0.00175 0 4.1079381 31930.231 0 0 + 9000 467.53307 -3198.3982 0 1 0.3075376 543 544 6.0069324 0.14888889 0.0015555556 0 4.1079381 35292.432 0 0 +Loop time of 0.22948 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 9000 467.53307 -3198.3982 0 1 0.3075376 543 544 6.0069324 0.14888889 0.0015555556 0 4.1079381 35292.432 0 0 + 9051 467.53307 -3217.9192 0 1 0.3075376 543 544 6.0069324 0.14804994 0.0015467904 0 4.1079381 35292.432 0 0 +Loop time of 0.0240657 on 4 procs for 51 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 9000 467.53307 -3198.3982 0 1 0.3075376 543 544 6.0069324 0.14888889 0.0015555556 0 4.1079381 35292.432 0 0 + 10000 496.73768 -3197.9106 0.11921512 15.908682 0.26180389 543 548 6.0069324 0.1531 0.0014 0 4.1079381 40303.236 0 0 +Loop time of 0.237951 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 10000 496.73768 -3197.9106 0.11921512 15.908682 0.26180389 543 548 6.0069324 0.1531 0.0014 0 4.1079381 40303.236 0 0 + 10061 496.73768 -3217.9192 0.11921512 15.908682 0.26180389 543 548 6.0069324 0.15217175 0.0013915118 0 4.1079381 40303.236 0 0 +Loop time of 0.0275102 on 4 procs for 61 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 10000 496.73768 -3197.9106 0.11921512 15.908682 0.26180389 543 548 6.0069324 0.1531 0.0014 0 4.1079381 40303.236 0 0 + 11000 526.76049 -3199.3263 0.24399827 287.99939 0.21466325 408 419 6.0069324 0.15945455 0.0012727273 0 4.1079381 42710.668 0 0 +Loop time of 0.226262 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 11000 526.76049 -3199.3263 0.24399827 287.99939 0.21466325 408 419 6.0069324 0.15945455 0.0012727273 0 4.1079381 42710.668 0 0 + 11058 526.76049 -3217.9192 0.24399827 287.99939 0.21466325 408 419 6.0069324 0.15861819 0.0012660517 0 4.1079381 42710.668 0 0 +Loop time of 0.0257103 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 11000 526.76049 -3199.3263 0.24399827 287.99939 0.21466325 408 419 6.0069324 0.15945455 0.0012727273 0 4.1079381 42710.668 0 0 + 12000 488.24107 -3198.2441 0.34073209 2719.0951 0.16931693 409 400 6.0069324 0.15558333 0.0011666667 0 4.1079381 47154.117 0 0 +Loop time of 0.226415 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 12000 488.24107 -3198.2441 0.34073209 2719.0951 0.16931693 409 400 6.0069324 0.15558333 0.0011666667 0 4.1079381 47154.117 0 0 + 12053 488.24107 -3217.9192 0.34073209 2719.0951 0.16931693 409 400 6.0069324 0.1548992 0.0011615365 0 4.1079381 47154.117 0 0 +Loop time of 0.0232868 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 12000 488.24107 -3198.2441 0.34073209 2719.0951 0.16931693 409 400 6.0069324 0.15558333 0.0011666667 0 4.1079381 47154.117 0 0 + 13000 467.87203 -3197.0681 0 1 0.32542353 275 556 6.0069324 0.14869231 0.0015384615 0 4.1079381 54700.864 0 0 +Loop time of 0.234386 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 13000 467.87203 -3197.0681 0 1 0.32542353 275 556 6.0069324 0.14869231 0.0015384615 0 4.1079381 54700.864 0 0 + 13055 467.87203 -3217.9192 0 1 0.32542353 275 556 6.0069324 0.14806588 0.0015319801 0 4.1079381 54700.864 0 0 +Loop time of 0.0268174 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 13000 467.87203 -3197.0681 0 1 0.32542353 275 556 6.0069324 0.14869231 0.0015384615 0 4.1079381 54700.864 0 0 + 14000 494.97859 -3197.9767 0.061678009 4.1849114 0.2808878 544 555 6.0069324 0.16885714 0.0014285714 0 4.1079381 55284.212 0 0 +Loop time of 0.236772 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 14000 494.97859 -3197.9767 0.061678009 4.1849114 0.2808878 544 555 6.0069324 0.16885714 0.0014285714 0 4.1079381 55284.212 0 0 + 14059 494.97859 -3217.9192 0.061678009 4.1849114 0.2808878 544 555 6.0069324 0.16814852 0.0014225763 0 4.1079381 55284.212 0 0 +Loop time of 0.0262685 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 14000 494.97859 -3197.9767 0.061678009 4.1849114 0.2808878 544 555 6.0069324 0.16885714 0.0014285714 0 4.1079381 55284.212 0 0 + 15000 487.47593 -3196.3193 0 1 0.30681413 124 135 6.0069324 0.16526667 0.0013333333 0 4.1079381 58845.637 0 0 +Loop time of 0.228132 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 15000 487.47593 -3196.3193 0 1 0.30681413 124 135 6.0069324 0.16526667 0.0013333333 0 4.1079381 58845.637 0 0 + 15056 487.47593 -3217.9192 0 1 0.30681413 124 135 6.0069324 0.16465197 0.0013283741 0 4.1079381 58845.637 0 0 +Loop time of 0.0253892 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 15000 487.47593 -3196.3193 0 1 0.30681413 124 135 6.0069324 0.16526667 0.0013333333 0 4.1079381 58845.637 0 0 + 16000 514.29619 -3198.6976 0.15192442 33.988268 0.25030702 287 568 6.0069324 0.160375 0.00125 0 4.1079381 65959.225 0 0 +Loop time of 0.226636 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 16000 514.29619 -3198.6976 0.15192442 33.988268 0.25030702 287 568 6.0069324 0.160375 0.00125 0 4.1079381 65959.225 0 0 + 16057 514.29619 -3217.9192 0.15192442 33.988268 0.25030702 287 568 6.0069324 0.15980569 0.0012455627 0 4.1079381 65959.225 0 0 +Loop time of 0.0258105 on 4 procs for 57 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 16000 514.29619 -3198.6976 0.15192442 33.988268 0.25030702 287 568 6.0069324 0.160375 0.00125 0 4.1079381 65959.225 0 0 + 17000 518.58789 -3197.5021 0.1333678 22.094631 0.25689258 116 123 6.0069324 0.16088235 0.0011764706 0 4.1079381 70525.413 0 0 +Loop time of 0.233751 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 17000 518.58789 -3197.5021 0.1333678 22.094631 0.25689258 116 123 6.0069324 0.16088235 0.0011764706 0 4.1079381 70525.413 0 0 + 17052 518.58789 -3217.9192 0.1333678 22.094631 0.25689258 116 123 6.0069324 0.16039174 0.0011728829 0 4.1079381 70525.413 0 0 +Loop time of 0.0248473 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 17000 518.58789 -3197.5021 0.1333678 22.094631 0.25689258 116 123 6.0069324 0.16088235 0.0011764706 0 4.1079381 70525.413 0 0 + 18000 505.83228 -3198.9838 0.08205079 6.7148239 0.27428244 552 563 6.0069324 0.15644444 0.0011111111 0 4.1079381 73252.823 0 0 +Loop time of 0.240134 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 18000 505.83228 -3198.9838 0.08205079 6.7148239 0.27428244 552 563 6.0069324 0.15644444 0.0011111111 0 4.1079381 73252.823 0 0 + 18056 505.83228 -3217.9192 0.08205079 6.7148239 0.27428244 552 563 6.0069324 0.15595924 0.001107665 0 4.1079381 73252.823 0 0 +Loop time of 0.0243995 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 18000 505.83228 -3198.9838 0.08205079 6.7148239 0.27428244 552 563 6.0069324 0.15644444 0.0011111111 0 4.1079381 73252.823 0 0 + 19000 527.41862 -3198.5008 0.040305357 2.5483534 0.28765437 424 263 6.0069324 0.15589474 0.0010526316 0 4.1079381 75984.28 0 0 +Loop time of 0.22821 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 19000 527.41862 -3198.5008 0.040305357 2.5483534 0.28765437 424 263 6.0069324 0.15589474 0.0010526316 0 4.1079381 75984.28 0 0 + 19052 527.41862 -3217.9192 0.040305357 2.5483534 0.28765437 424 263 6.0069324 0.15546924 0.0010497586 0 4.1079381 75984.28 0 0 +Loop time of 0.0237539 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 19000 527.41862 -3198.5008 0.040305357 2.5483534 0.28765437 424 263 6.0069324 0.15589474 0.0010526316 0 4.1079381 75984.28 0 0 + 20000 451.64207 -3198.7796 0.047092391 2.9831142 0.28552298 570 403 6.0069324 0.15125 0.001 0 4.1079381 81688.471 0 0 +Loop time of 0.226179 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 20000 451.64207 -3198.7796 0.047092391 2.9831142 0.28552298 570 403 6.0069324 0.15125 0.001 0 4.1079381 81688.471 0 0 + 20053 451.64207 -3217.9192 0.047092391 2.9831142 0.28552298 570 403 6.0069324 0.15085025 0.000997357 0 4.1079381 81688.471 0 0 +Loop time of 0.0244102 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 20000 451.64207 -3198.7796 0.047092391 2.9831142 0.28552298 570 403 6.0069324 0.15125 0.001 0 4.1079381 81688.471 0 0 + 21000 469.69339 -3200.6427 0 1 0.3308786 267 268 6.0069324 0.14852381 0.00095238095 0 4.1079381 87660.496 0 0 +Loop time of 0.234504 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 21000 469.69339 -3200.6427 0 1 0.3308786 267 268 6.0069324 0.14852381 0.00095238095 0 4.1079381 87660.496 0 0 + 21050 469.69339 -3217.9192 0 1 0.3308786 267 268 6.0069324 0.14817102 0.00095011876 0 4.1079381 87660.496 0 0 +Loop time of 0.0231035 on 4 procs for 50 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 21000 469.69339 -3200.6427 0 1 0.3308786 267 268 6.0069324 0.14852381 0.00095238095 0 4.1079381 87660.496 0 0 + 22000 473.26326 -3199.3284 0 1 0.31249141 544 555 6.0069324 0.14786364 0.00090909091 0 4.1079381 91920.285 0 0 +Loop time of 0.235723 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 22000 473.26326 -3199.3284 0 1 0.31249141 544 555 6.0069324 0.14786364 0.00090909091 0 4.1079381 91920.285 0 0 + 22054 473.26326 -3217.9192 0 1 0.31249141 544 555 6.0069324 0.14750159 0.00090686497 0 4.1079381 91920.285 0 0 +Loop time of 0.024776 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 22000 473.26326 -3199.3284 0 1 0.31249141 544 555 6.0069324 0.14786364 0.00090909091 0 4.1079381 91920.285 0 0 + 23000 496.07543 -3198.2605 0.30577111 1207.9075 0.18697914 572 403 6.0069324 0.15665217 0.0011304348 0 4.1079381 92558.536 0 0 +Loop time of 0.229916 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 23000 496.07543 -3198.2605 0.30577111 1207.9075 0.18697914 572 403 6.0069324 0.15665217 0.0011304348 0 4.1079381 92558.536 0 0 + 23056 496.07543 -3217.9192 0.30577111 1207.9075 0.18697914 572 403 6.0069324 0.15627169 0.0011276891 0 4.1079381 92558.536 0 0 +Loop time of 0.0252325 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 23000 496.07543 -3198.2605 0.30577111 1207.9075 0.18697914 572 403 6.0069324 0.15665217 0.0011304348 0 4.1079381 92558.536 0 0 + 24000 465.43821 -3199.468 0 1 0.31415739 543 544 6.0069324 0.15466667 0.0010833333 0 4.1079381 97530.178 0 0 +Loop time of 0.231022 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 24000 465.43821 -3199.468 0 1 0.31415739 543 544 6.0069324 0.15466667 0.0010833333 0 4.1079381 97530.178 0 0 + 24054 465.43821 -3217.9192 0 1 0.31415739 543 544 6.0069324 0.15431945 0.0010809013 0 4.1079381 97530.178 0 0 +Loop time of 0.0246248 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 24000 465.43821 -3199.468 0 1 0.31415739 543 544 6.0069324 0.15466667 0.0010833333 0 4.1079381 97530.178 0 0 + 25000 489.80528 -3200.439 0.25812453 399.74019 0.20865662 543 544 6.0069324 0.15368 0.00104 0 4.1079381 103216.01 0 0 +Loop time of 0.239562 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 25000 489.80528 -3200.439 0.25812453 399.74019 0.20865662 543 544 6.0069324 0.15368 0.00104 0 4.1079381 103216.01 0 0 + 25060 489.80528 -3217.9192 0.25812453 399.74019 0.20865662 543 544 6.0069324 0.15331205 0.00103751 0 4.1079381 103216.01 0 0 +Loop time of 0.0290521 on 4 procs for 60 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 25000 489.80528 -3200.439 0.25812453 399.74019 0.20865662 543 544 6.0069324 0.15368 0.00104 0 4.1079381 103216.01 0 0 + 26000 454.33199 -3197.9264 0.15449017 36.073692 0.24938278 283 272 6.0069324 0.15788462 0.001 0 4.1079381 106857.47 0 0 +Loop time of 0.231679 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 26000 454.33199 -3197.9264 0.15449017 36.073692 0.24938278 283 272 6.0069324 0.15788462 0.001 0 4.1079381 106857.47 0 0 + 26053 454.33199 -3217.9192 0.15449017 36.073692 0.24938278 283 272 6.0069324 0.15756343 0.00099796569 0 4.1079381 106857.47 0 0 +Loop time of 0.0229361 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 26000 454.33199 -3197.9264 0.15449017 36.073692 0.24938278 283 272 6.0069324 0.15788462 0.001 0 4.1079381 106857.47 0 0 + 27000 493.26662 -3198.8515 0.17523126 58.378293 0.24178166 260 271 6.0069324 0.15388889 0.00096296296 0 4.1079381 114287.4 0 0 +Loop time of 0.228356 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 27000 493.26662 -3198.8515 0.17523126 58.378293 0.24178166 260 271 6.0069324 0.15388889 0.00096296296 0 4.1079381 114287.4 0 0 + 27056 493.26662 -3217.9192 0.17523126 58.378293 0.24178166 260 271 6.0069324 0.15357037 0.00096096984 0 4.1079381 114287.4 0 0 +Loop time of 0.0249045 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 27000 493.26662 -3198.8515 0.17523126 58.378293 0.24178166 260 271 6.0069324 0.15388889 0.00096296296 0 4.1079381 114287.4 0 0 + 28000 516.59709 -3198.7939 0.017083929 1.486614 0.29483028 543 548 6.0069324 0.15278571 0.00092857143 0 4.1079381 117735.24 0 0 +Loop time of 0.226666 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 28000 516.59709 -3198.7939 0.017083929 1.486614 0.29483028 543 548 6.0069324 0.15278571 0.00092857143 0 4.1079381 117735.24 0 0 + 28054 516.59709 -3217.9192 0.017083929 1.486614 0.29483028 543 548 6.0069324 0.15249162 0.00092678406 0 4.1079381 117735.24 0 0 +Loop time of 0.0245788 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 28000 516.59709 -3198.7939 0.017083929 1.486614 0.29483028 543 548 6.0069324 0.15278571 0.00092857143 0 4.1079381 117735.24 0 0 + 29000 498.78313 -3197.7551 0 1 0.43523955 543 544 6.0069324 0.15648276 0.00089655172 0 4.3557073 122569.32 0 0 +Loop time of 0.239195 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 29000 498.78313 -3197.7551 0 1 0.43523955 543 544 6.0069324 0.15648276 0.00089655172 0 4.3557073 122569.32 0 0 + 29059 498.78313 -3217.9192 0 1 0.43523955 543 544 6.0069324 0.15616504 0.00089473141 0 4.3557073 122569.32 0 0 +Loop time of 0.0290976 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 29000 498.78313 -3197.7551 0 1 0.43523955 543 544 6.0069324 0.15648276 0.00089655172 0 4.3557073 122569.32 0 0 + 30000 466.86137 -3199.5233 0.23621441 240.39961 0.21790229 126 127 6.0069324 0.15756667 0.00086666667 0 4.3557073 127229.34 0 0 +Loop time of 0.232616 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 30000 466.86137 -3199.5233 0.23621441 240.39961 0.21790229 126 127 6.0069324 0.15756667 0.00086666667 0 4.3557073 127229.34 0 0 + 30059 466.86137 -3217.9192 0.23621441 240.39961 0.21790229 126 127 6.0069324 0.15725739 0.00086496557 0 4.3557073 127229.34 0 0 +Loop time of 0.0269623 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 30000 466.86137 -3199.5233 0.23621441 240.39961 0.21790229 126 127 6.0069324 0.15756667 0.00086666667 0 4.3557073 127229.34 0 0 + 31000 471.12992 -3199.7598 0 1 0.30984418 567 572 6.0069324 0.15541935 0.00087096774 0 4.3557073 131258.9 0 0 +Loop time of 0.229214 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 31000 471.12992 -3199.7598 0 1 0.30984418 567 572 6.0069324 0.15541935 0.00087096774 0 4.3557073 131258.9 0 0 + 31053 471.12992 -3217.9192 0 1 0.30984418 567 572 6.0069324 0.15515409 0.00086948121 0 4.3557073 131258.9 0 0 +Loop time of 0.0240388 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 31000 471.12992 -3199.7598 0 1 0.30984418 567 572 6.0069324 0.15541935 0.00087096774 0 4.3557073 131258.9 0 0 + 32000 510.4372 -3198.4263 0.38770138 8088.2308 0.14217507 511 546 6.0069324 0.15328125 0.00084375 0 4.3557073 136077.46 0 0 +Loop time of 0.230157 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 32000 510.4372 -3198.4263 0.38770138 8088.2308 0.14217507 511 546 6.0069324 0.15328125 0.00084375 0 4.3557073 136077.46 0 0 + 32057 510.4372 -3217.9192 0.38770138 8088.2308 0.14217507 511 546 6.0069324 0.1530087 0.00084224974 0 4.3557073 136077.46 0 0 +Loop time of 0.0259738 on 4 procs for 57 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 32000 510.4372 -3198.4263 0.38770138 8088.2308 0.14217507 511 546 6.0069324 0.15328125 0.00084375 0 4.3557073 136077.46 0 0 + 33000 517.9664 -3198.8477 0.065094278 4.5302347 0.27979105 136 255 6.0069324 0.15212121 0.00081818182 0 4.3557073 140653.16 0 0 +Loop time of 0.240719 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 33000 517.9664 -3198.8477 0.065094278 4.5302347 0.27979105 136 255 6.0069324 0.15212121 0.00081818182 0 4.3557073 140653.16 0 0 + 33055 517.9664 -3217.9192 0.065094278 4.5302347 0.27979105 136 255 6.0069324 0.1518681 0.00081682045 0 4.3557073 140653.16 0 0 +Loop time of 0.0254009 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 33000 517.9664 -3198.8477 0.065094278 4.5302347 0.27979105 136 255 6.0069324 0.15212121 0.00081818182 0 4.3557073 140653.16 0 0 + 34000 539.21923 -3197.9619 0.10137745 10.515709 0.26786575 119 400 6.0069324 0.15088235 0.00079411765 0 4.3557073 146106.36 0 0 +Loop time of 0.228472 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 34000 539.21923 -3197.9619 0.10137745 10.515709 0.26786575 119 400 6.0069324 0.15088235 0.00079411765 0 4.3557073 146106.36 0 0 + 34053 539.21923 -3217.9192 0.10137745 10.515709 0.26786575 119 400 6.0069324 0.15064752 0.00079288168 0 4.3557073 146106.36 0 0 +Loop time of 0.0239374 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 34000 539.21923 -3197.9619 0.10137745 10.515709 0.26786575 119 400 6.0069324 0.15088235 0.00079411765 0 4.3557073 146106.36 0 0 + 35000 495.28481 -3198.2101 0.03728079 2.3756005 0.28859913 543 544 6.0069324 0.14882857 0.00077142857 0 4.3557073 152132.21 0 0 +Loop time of 0.227014 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 35000 495.28481 -3198.2101 0.03728079 2.3756005 0.28859913 543 544 6.0069324 0.14882857 0.00077142857 0 4.3557073 152132.21 0 0 + 35061 495.28481 -3217.9192 0.03728079 2.3756005 0.28859913 543 544 6.0069324 0.14856964 0.00077008642 0 4.3557073 152132.21 0 0 +Loop time of 0.0271087 on 4 procs for 61 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 35000 495.28481 -3198.2101 0.03728079 2.3756005 0.28859913 543 544 6.0069324 0.14882857 0.00077142857 0 4.3557073 152132.21 0 0 + 36000 522.02047 -3197.5464 0.023049198 1.7073613 0.29300366 132 139 6.0069324 0.14975 0.00075 0 4.3557073 155779.35 0 0 +Loop time of 0.230395 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 36000 522.02047 -3197.5464 0.023049198 1.7073613 0.29300366 132 139 6.0069324 0.14975 0.00075 0 4.3557073 155779.35 0 0 + 36058 522.02047 -3217.9192 0.023049198 1.7073613 0.29300366 132 139 6.0069324 0.14950912 0.00074879361 0 4.3557073 155779.35 0 0 +Loop time of 0.0274341 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 36000 522.02047 -3197.5464 0.023049198 1.7073613 0.29300366 132 139 6.0069324 0.14975 0.00075 0 4.3557073 155779.35 0 0 + 37000 493.66881 -3198.2972 0.29065621 850.51576 0.19411822 110 121 6.0069324 0.14783784 0.00072972973 0 4.3557073 159446.9 0 0 +Loop time of 0.239665 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 37000 493.66881 -3198.2972 0.29065621 850.51576 0.19411822 110 121 6.0069324 0.14783784 0.00072972973 0 4.3557073 159446.9 0 0 + 37055 493.66881 -3217.9192 0.29065621 850.51576 0.19411822 110 121 6.0069324 0.14761841 0.00072864661 0 4.3557073 159446.9 0 0 +Loop time of 0.0258739 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 37000 493.66881 -3198.2972 0.29065621 850.51576 0.19411822 110 121 6.0069324 0.14783784 0.00072972973 0 4.3557073 159446.9 0 0 + 38000 471.56021 -3200.0689 0.21390468 143.23918 0.22692985 546 559 6.0069324 0.1505 0.00071052632 0 4.3557073 161793.64 0 0 +Loop time of 0.231827 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 38000 471.56021 -3200.0689 0.21390468 143.23918 0.22692985 546 559 6.0069324 0.1505 0.00071052632 0 4.3557073 161793.64 0 0 + 38050 471.56021 -3217.9192 0.21390468 143.23918 0.22692985 546 559 6.0069324 0.15030223 0.00070959264 0 4.3557073 161793.64 0 0 +Loop time of 0.0234141 on 4 procs for 50 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 38000 471.56021 -3200.0689 0.21390468 143.23918 0.22692985 546 559 6.0069324 0.1505 0.00071052632 0 4.3557073 161793.64 0 0 + 39000 488.60708 -3198.2279 0.29546108 950.85261 0.19187758 410 412 6.0069324 0.14884615 0.00069230769 0 4.3557073 167145.63 0 0 +Loop time of 0.227483 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 39000 488.60708 -3198.2279 0.29546108 950.85261 0.19187758 410 412 6.0069324 0.14884615 0.00069230769 0 4.3557073 167145.63 0 0 + 39062 488.60708 -3217.9192 0.29546108 950.85261 0.19187758 410 412 6.0069324 0.1486099 0.00069120885 0 4.3557073 167145.63 0 0 +Loop time of 0.028059 on 4 procs for 62 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 39000 488.60708 -3198.2279 0.29546108 950.85261 0.19187758 410 412 6.0069324 0.14884615 0.00069230769 0 4.3557073 167145.63 0 0 + 40000 507.73002 -3196.8491 0.012490865 1.3362947 0.29622904 543 544 6.0069324 0.15095 0.000675 0 4.3557073 171194.28 0 0 +Loop time of 0.231293 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 40000 507.73002 -3196.8491 0.012490865 1.3362947 0.29622904 543 544 6.0069324 0.15095 0.000675 0 4.3557073 171194.28 0 0 + 40064 507.73002 -3217.9192 0.012490865 1.3362947 0.29622904 543 544 6.0069324 0.15070887 0.00067392173 0 4.3557073 171194.28 0 0 +Loop time of 0.0308156 on 4 procs for 64 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 40000 507.73002 -3196.8491 0.012490865 1.3362947 0.29622904 543 544 6.0069324 0.15095 0.000675 0 4.3557073 171194.28 0 0 + 41000 479.11448 -3200.241 0 1 0.94094448 542 544 6.0069324 0.16480488 0.00065853659 0 5.4178316 171224.32 0 0 +Loop time of 0.239781 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 41000 479.11448 -3200.241 0 1 0.94094448 542 544 6.0069324 0.16480488 0.00065853659 0 5.4178316 171224.32 0 0 + 41055 479.11448 -3217.9192 0 1 0.94094448 542 544 6.0069324 0.16458409 0.00065765437 0 5.4178316 171224.32 0 0 +Loop time of 0.0248787 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 41000 479.11448 -3200.241 0.31626598 1541.0515 0.18185743 398 404 6.0069324 0.16480488 0.00065853659 2.3326665 5.4178316 171224.32 1 2 + 42000 495.84675 -3198.6432 0.1729929 55.422961 0.24261343 275 264 6.0069324 0.1692381 0.0011190476 2.3326665 5.4178316 174484.67 1 2 +Loop time of 0.226913 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 42000 495.84675 -3198.6432 0.1729929 55.422961 0.24261343 275 264 6.0069324 0.1692381 0.0011190476 2.3326665 5.4178316 174484.67 1 2 + 42056 495.84675 -3217.9192 0.1729929 55.422961 0.24261343 275 264 6.0069324 0.16901274 0.0011175575 2.3326665 5.4178316 174484.67 1 2 +Loop time of 0.0239749 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 42000 495.84675 -3198.6432 0.1729929 55.422961 0.24261343 275 264 6.0069324 0.1692381 0.0011190476 2.3326665 5.4178316 174484.67 1 2 + 43000 533.30453 -3198.6415 0 1 0.34377427 263 577 6.0069324 0.17646512 0.0010930233 2.3326665 5.4178316 175038.14 1 2 +Loop time of 0.224798 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 43000 533.30453 -3198.6415 0 1 0.34377427 263 577 6.0069324 0.17646512 0.0010930233 2.3326665 5.4178316 175038.14 1 2 + 43054 533.30453 -3217.9192 0 1 0.34377427 263 577 6.0069324 0.17624379 0.0010916523 2.3326665 5.4178316 175038.14 1 2 +Loop time of 0.0243425 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 43000 533.30453 -3198.6415 0 1 0.34377427 263 577 6.0069324 0.17646512 0.0010930233 2.3326665 5.4178316 175038.14 1 2 + 44000 497.19886 -3199.3252 0 1 0.32411085 262 264 6.0069324 0.17947727 0.0010681818 2.3326665 5.4178316 175732.69 1 2 +Loop time of 0.23413 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 44000 497.19886 -3199.3252 0 1 0.32411085 262 264 6.0069324 0.17947727 0.0010681818 2.3326665 5.4178316 175732.69 1 2 + 44056 497.19886 -3217.9192 0 1 0.32411085 262 264 6.0069324 0.17924914 0.001066824 2.3326665 5.4178316 175732.69 1 2 +Loop time of 0.0264681 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 44000 497.19886 -3199.3252 0 1 0.32411085 262 264 6.0069324 0.17947727 0.0010681818 2.3326665 5.4178316 175732.69 1 2 + 45000 501.66497 -3198.3133 0 1 0.89133337 262 264 6.0069324 0.18806667 0.0010444444 2.3326665 5.4178316 175885.32 1 2 +Loop time of 0.233324 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 45000 501.66497 -3198.3133 0 1 0.89133337 262 264 6.0069324 0.18806667 0.0010444444 2.3326665 5.4178316 175885.32 1 2 + 45053 501.66497 -3217.9192 0 1 0.89133337 262 264 6.0069324 0.18784543 0.0010432158 2.3326665 5.4178316 175885.32 1 2 +Loop time of 0.0239007 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 45000 501.66497 -3198.3133 0.31380779 1455.5922 0.18306993 549 547 6.0069324 0.18806667 0.0010444444 2.332667 5.4178316 175885.32 2 4 + 46000 512.99827 -3198.7869 0.30973921 1324.4339 0.18505929 547 552 6.0069324 0.18545652 0.0010217391 2.332667 5.4178316 180703.66 2 4 +Loop time of 0.227399 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 46000 512.99827 -3198.7869 0.30973921 1324.4339 0.18505929 547 552 6.0069324 0.18545652 0.0010217391 2.332667 5.4178316 180703.66 2 4 + 46058 512.99827 -3217.9192 0.30973921 1324.4339 0.18505929 547 552 6.0069324 0.18522298 0.0010204525 2.332667 5.4178316 180703.66 2 4 +Loop time of 0.025696 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 46000 512.99827 -3198.7869 0.30973921 1324.4339 0.18505929 547 552 6.0069324 0.18545652 0.0010217391 2.332667 5.4178316 180703.66 2 4 + 47000 508.06284 -3198.0819 0.17828926 62.67216 0.24064067 271 544 6.0069324 0.18404255 0.001 2.332667 5.4178316 186245.92 2 4 +Loop time of 0.232521 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 47000 508.06284 -3198.0819 0.17828926 62.67216 0.24064067 271 544 6.0069324 0.18404255 0.001 2.332667 5.4178316 186245.92 2 4 + 47062 508.06284 -3217.9192 0.17828926 62.67216 0.24064067 271 544 6.0069324 0.18380009 0.00099868259 2.332667 5.4178316 186245.92 2 4 +Loop time of 0.0288792 on 4 procs for 62 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 47000 508.06284 -3198.0819 0.17828926 62.67216 0.24064067 271 544 6.0069324 0.18404255 0.001 2.332667 5.4178316 186245.92 2 4 + 48000 512.83356 -3200.0643 0 1 0.96810224 258 544 6.0069324 0.1921875 0.00097916667 2.332667 5.5485401 188226.87 2 4 +Loop time of 0.241704 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 48000 512.83356 -3200.0643 0 1 0.96810224 258 544 6.0069324 0.1921875 0.00097916667 2.332667 5.5485401 188226.87 2 4 + 48051 512.83356 -3217.9192 0 1 0.96810224 258 544 6.0069324 0.19198352 0.00097812741 2.332667 5.5485401 188226.87 2 4 +Loop time of 0.0259903 on 4 procs for 51 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 48000 512.83356 -3200.0643 0.36239559 4495.5483 0.15738105 280 407 6.0069324 0.1921875 0.00097916667 2.332667 5.5485401 188226.87 3 6 + 49000 490.9639 -3198.6936 0.21113624 134.32512 0.22802517 114 115 6.0069324 0.18993878 0.00095918367 2.332667 5.5485401 191519.1 3 6 +Loop time of 0.22826 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 49000 490.9639 -3198.6936 0.21113624 134.32512 0.22802517 114 115 6.0069324 0.18993878 0.00095918367 2.332667 5.5485401 191519.1 3 6 + 49054 490.9639 -3217.9192 0.21113624 134.32512 0.22802517 114 115 6.0069324 0.18972969 0.00095812778 2.332667 5.5485401 191519.1 3 6 +Loop time of 0.024157 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 49000 490.9639 -3198.6936 0.21113624 134.32512 0.22802517 114 115 6.0069324 0.18993878 0.00095918367 2.332667 5.5485401 191519.1 3 6 + 50000 502.62206 -3199.7905 0.22799901 198.66723 0.22126947 119 400 6.0069324 0.1885 0.00094 2.332667 5.5485401 195910.67 3 6 +Loop time of 0.226578 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 50000 502.62206 -3199.7905 0.22799901 198.66723 0.22126947 119 400 6.0069324 0.1885 0.00094 2.332667 5.5485401 195910.67 3 6 + 50059 502.62206 -3217.9192 0.22799901 198.66723 0.22126947 119 400 6.0069324 0.18827783 0.00093889211 2.332667 5.5485401 195910.67 3 6 +Loop time of 0.0268276 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 50000 502.62206 -3199.7905 0.22799901 198.66723 0.22126947 119 400 6.0069324 0.1885 0.00094 2.332667 5.5485401 195910.67 3 6 + 51000 508.29336 -3198.9059 0.14109933 26.437299 0.25416947 264 275 6.0069324 0.18907843 0.00092156863 2.332667 5.5485401 199067.94 3 6 +Loop time of 0.23022 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 51000 508.29336 -3198.9059 0.14109933 26.437299 0.25416947 264 275 6.0069324 0.18907843 0.00092156863 2.332667 5.5485401 199067.94 3 6 + 51055 508.29336 -3217.9192 0.14109933 26.437299 0.25416947 264 275 6.0069324 0.18887474 0.00092057585 2.332667 5.5485401 199067.94 3 6 +Loop time of 0.0267057 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 51000 508.29336 -3198.9059 0.14109933 26.437299 0.25416947 264 275 6.0069324 0.18907843 0.00092156863 2.332667 5.5485401 199067.94 3 6 + 52000 506.84322 -3198.7391 0 1 0.35895473 264 275 6.0069324 0.19369231 0.00090384615 2.332667 5.5485401 199119.85 3 6 +Loop time of 0.248939 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 52000 506.84322 -3198.7391 0 1 0.35895473 264 275 6.0069324 0.19369231 0.00090384615 2.332667 5.5485401 199119.85 3 6 + 52061 506.84322 -3217.9192 0 1 0.35895473 264 275 6.0069324 0.19346536 0.00090278712 2.332667 5.5485401 199119.85 3 6 +Loop time of 0.0283017 on 4 procs for 61 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 52000 506.84322 -3198.7391 0 1 0.35895473 264 275 6.0069324 0.19369231 0.00090384615 2.332667 5.5485401 199119.85 3 6 + 53000 477.74415 -3199.3706 0 1 0.31797782 264 275 6.0069324 0.1960566 0.00088679245 2.332667 5.5485401 200597.61 3 6 +Loop time of 0.226147 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 53000 477.74415 -3199.3706 0 1 0.31797782 264 275 6.0069324 0.1960566 0.00088679245 2.332667 5.5485401 200597.61 3 6 + 53056 477.74415 -3217.9192 0 1 0.31797782 264 275 6.0069324 0.19584967 0.00088585645 2.332667 5.5485401 200597.61 3 6 +Loop time of 0.0249364 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 53000 477.74415 -3199.3706 0 1 0.31797782 264 275 6.0069324 0.1960566 0.00088679245 2.332667 5.5485401 200597.61 3 6 + 54000 467.64603 -3198.6476 0.12868765 19.820426 0.25852702 575 280 6.0069324 0.19614815 0.00087037037 2.332667 5.5485401 203111.2 3 6 +Loop time of 0.242983 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 54000 467.64603 -3198.6476 0.12868765 19.820426 0.25852702 575 280 6.0069324 0.19614815 0.00087037037 2.332667 5.5485401 203111.2 3 6 + 54051 467.64603 -3217.9192 0.12868765 19.820426 0.25852702 575 280 6.0069324 0.19596307 0.00086954913 2.332667 5.5485401 203111.2 3 6 +Loop time of 0.0256515 on 4 procs for 51 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 54000 467.64603 -3198.6476 0.12868765 19.820426 0.25852702 575 280 6.0069324 0.19614815 0.00087037037 2.332667 5.5485401 203111.2 3 6 + 55000 504.56378 -3198.2318 0.01979034 1.582988 0.29400296 556 567 6.0069324 0.1934 0.00085454545 2.332667 5.5485401 209967.08 3 6 +Loop time of 0.243744 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 55000 504.56378 -3198.2318 0.01979034 1.582988 0.29400296 556 567 6.0069324 0.1934 0.00085454545 2.332667 5.5485401 209967.08 3 6 + 55057 504.56378 -3217.9192 0.01979034 1.582988 0.29400296 556 567 6.0069324 0.19319977 0.00085366075 2.332667 5.5485401 209967.08 3 6 +Loop time of 0.0273646 on 4 procs for 57 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 55000 504.56378 -3198.2318 0.01979034 1.582988 0.29400296 556 567 6.0069324 0.1934 0.00085454545 2.332667 5.5485401 209967.08 3 6 + 56000 564.45428 -3198.7813 0.20223936 109.26492 0.23151007 78 91 6.0069324 0.19246429 0.00083928571 2.332667 5.5485401 215831.27 3 6 +Loop time of 0.238614 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 56000 564.45428 -3198.7813 0.20223936 109.26492 0.23151007 78 91 6.0069324 0.19246429 0.00083928571 2.332667 5.5485401 215831.27 3 6 + 56052 564.45428 -3217.9192 0.20223936 109.26492 0.23151007 78 91 6.0069324 0.19228573 0.0008385071 2.332667 5.5485401 215831.27 3 6 +Loop time of 0.0241504 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 56000 564.45428 -3198.7813 0.20223936 109.26492 0.23151007 78 91 6.0069324 0.19246429 0.00083928571 2.332667 5.5485401 215831.27 3 6 + 57000 515.72168 -3198.6584 0.31159686 1382.7848 0.18415364 544 577 6.0069324 0.19210526 0.0008245614 2.332667 5.5485401 222695.11 3 6 +Loop time of 0.30046 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 57000 515.72168 -3198.6584 0.31159686 1382.7848 0.18415364 544 577 6.0069324 0.19210526 0.0008245614 2.332667 5.5485401 222695.11 3 6 + 57059 515.72168 -3217.9192 0.31159686 1382.7848 0.18415364 544 577 6.0069324 0.19190662 0.00082370879 2.332667 5.5485401 222695.11 3 6 +Loop time of 0.0361512 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 57000 515.72168 -3198.6584 0.31159686 1382.7848 0.18415364 544 577 6.0069324 0.19210526 0.0008245614 2.332667 5.5485401 222695.11 3 6 + 58000 493.40021 -3198.8621 0 1 0.30931038 275 577 6.0069324 0.18989655 0.00081034483 2.332667 5.5485401 225894.02 3 6 +Loop time of 0.304723 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 58000 493.40021 -3198.8621 0 1 0.30931038 275 577 6.0069324 0.18989655 0.00081034483 2.332667 5.5485401 225894.02 3 6 + 58055 493.40021 -3217.9192 0 1 0.30931038 275 577 6.0069324 0.18971665 0.00080957713 2.332667 5.5485401 225894.02 3 6 +Loop time of 0.034838 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 58000 493.40021 -3198.8621 0 1 0.30931038 275 577 6.0069324 0.18989655 0.00081034483 2.332667 5.5485401 225894.02 3 6 + 59000 459.13337 -3198.423 0.32299123 1801.3772 0.17849812 117 288 6.0069324 0.189 0.00079661017 2.332667 5.5485401 232785.62 3 6 +Loop time of 0.267864 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 59000 459.13337 -3198.423 0.32299123 1801.3772 0.17849812 117 288 6.0069324 0.189 0.00079661017 2.332667 5.5485401 232785.62 3 6 + 59052 459.13337 -3217.9192 0.32299123 1801.3772 0.17849812 117 288 6.0069324 0.18883357 0.00079590869 2.332667 5.5485401 232785.62 3 6 +Loop time of 0.0229472 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 59000 459.13337 -3198.423 0.32299123 1801.3772 0.17849812 117 288 6.0069324 0.189 0.00079661017 2.332667 5.5485401 232785.62 3 6 + 60000 491.26878 -3198.9291 0.28012983 666.16416 0.19893876 560 567 6.0069324 0.18678333 0.00078333333 2.332667 5.5485401 236949.88 3 6 +Loop time of 0.224423 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 60000 491.26878 -3198.9291 0.28012983 666.16416 0.19893876 560 567 6.0069324 0.18678333 0.00078333333 2.332667 5.5485401 236949.88 3 6 + 60051 491.26878 -3217.9192 0.28012983 666.16416 0.19893876 560 567 6.0069324 0.1866247 0.00078266807 2.332667 5.5485401 236949.88 3 6 +Loop time of 0.0231369 on 4 procs for 51 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 60000 491.26878 -3198.9291 0.28012983 666.16416 0.19893876 560 567 6.0069324 0.18678333 0.00078333333 2.332667 5.5485401 236949.88 3 6 + 61000 469.65564 -3198.3735 0.086199081 7.3934564 0.27291787 562 564 6.0069324 0.18445902 0.0007704918 2.332667 5.5485401 245720.88 3 6 +Loop time of 0.228656 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 61000 469.65564 -3198.3735 0.086199081 7.3934564 0.27291787 562 564 6.0069324 0.18445902 0.0007704918 2.332667 5.5485401 245720.88 3 6 + 61053 469.65564 -3217.9192 0.086199081 7.3934564 0.27291787 562 564 6.0069324 0.18429889 0.00076982294 2.332667 5.5485401 245720.88 3 6 +Loop time of 0.0245876 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 61000 469.65564 -3198.3735 0.086199081 7.3934564 0.27291787 562 564 6.0069324 0.18445902 0.0007704918 2.332667 5.5485401 245720.88 3 6 + 62000 520.14843 -3198.5458 0.35275062 3593.8982 0.16280322 116 123 6.0069324 0.18312903 0.00075806452 2.332667 5.5485401 250136.37 3 6 +Loop time of 0.232165 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 62000 520.14843 -3198.5458 0.35275062 3593.8982 0.16280322 116 123 6.0069324 0.18312903 0.00075806452 2.332667 5.5485401 250136.37 3 6 + 62056 520.14843 -3217.9192 0.35275062 3593.8982 0.16280322 116 123 6.0069324 0.18296377 0.00075738043 2.332667 5.5485401 250136.37 3 6 +Loop time of 0.0275648 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 62000 520.14843 -3198.5458 0.35275062 3593.8982 0.16280322 116 123 6.0069324 0.18312903 0.00075806452 2.332667 5.5485401 250136.37 3 6 + 63000 506.90141 -3196.9575 0.019630501 1.5771264 0.29405188 577 555 6.0069324 0.18190476 0.00074603175 2.332667 5.5485401 257004.48 3 6 +Loop time of 0.236446 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 63000 506.90141 -3196.9575 0.019630501 1.5771264 0.29405188 577 555 6.0069324 0.18190476 0.00074603175 2.332667 5.5485401 257004.48 3 6 + 63059 506.90141 -3217.9192 0.019630501 1.5771264 0.29405188 577 555 6.0069324 0.18173457 0.00074533374 2.332667 5.5485401 257004.48 3 6 +Loop time of 0.0258729 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 63000 506.90141 -3196.9575 0.019630501 1.5771264 0.29405188 577 555 6.0069324 0.18190476 0.00074603175 2.332667 5.5485401 257004.48 3 6 + 64000 435.29185 -3197.3025 0.08981574 8.0408468 0.27172259 266 267 6.0069324 0.18060937 0.000734375 2.332667 5.5485401 261196.79 3 6 +Loop time of 0.224694 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 64000 435.29185 -3197.3025 0.08981574 8.0408468 0.27172259 266 267 6.0069324 0.18060937 0.000734375 2.332667 5.5485401 261196.79 3 6 + 64053 435.29185 -3217.9192 0.08981574 8.0408468 0.27172259 266 267 6.0069324 0.18045993 0.00073376735 2.332667 5.5485401 261196.79 3 6 +Loop time of 0.023932 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 64000 435.29185 -3197.3025 0.08981574 8.0408468 0.27172259 266 267 6.0069324 0.18060937 0.000734375 2.332667 5.5485401 261196.79 3 6 + 65000 484.45338 -3198.1013 0.27900382 648.98038 0.19944752 85 87 6.0069324 0.17955385 0.00072307692 2.332667 5.5485401 267611.45 3 6 +Loop time of 0.225038 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 65000 484.45338 -3198.1013 0.27900382 648.98038 0.19944752 85 87 6.0069324 0.17955385 0.00072307692 2.332667 5.5485401 267611.45 3 6 + 65053 484.45338 -3217.9192 0.27900382 648.98038 0.19944752 85 87 6.0069324 0.17940756 0.00072248782 2.332667 5.5485401 267611.45 3 6 +Loop time of 0.0248089 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 65000 484.45338 -3198.1013 0.27900382 648.98038 0.19944752 85 87 6.0069324 0.17955385 0.00072307692 2.332667 5.5485401 267611.45 3 6 + 66000 497.23553 -3199.036 0.25525209 373.95984 0.20989193 412 411 6.0069324 0.17804545 0.00071212121 2.332667 5.5485401 274383.49 3 6 +Loop time of 0.233376 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 66000 497.23553 -3199.036 0.25525209 373.95984 0.20989193 412 411 6.0069324 0.17804545 0.00071212121 2.332667 5.5485401 274383.49 3 6 + 66058 497.23553 -3217.9192 0.25525209 373.95984 0.20989193 412 411 6.0069324 0.17788913 0.00071149596 2.332667 5.5485401 274383.49 3 6 +Loop time of 0.0279601 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 66000 497.23553 -3199.036 0.25525209 373.95984 0.20989193 412 411 6.0069324 0.17804545 0.00071212121 2.332667 5.5485401 274383.49 3 6 + 67000 488.34684 -3198.7152 0.27967841 659.2212 0.19914288 264 275 6.0069324 0.17935821 0.00070149254 2.332667 5.5485401 274635.62 3 6 +Loop time of 0.237521 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 67000 488.34684 -3198.7152 0.27967841 659.2212 0.19914288 264 275 6.0069324 0.17935821 0.00070149254 2.332667 5.5485401 274635.62 3 6 + 67055 488.34684 -3217.9192 0.27967841 659.2212 0.19914288 264 275 6.0069324 0.1792111 0.00070091716 2.332667 5.5485401 274635.62 3 6 +Loop time of 0.0262208 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 67000 488.34684 -3198.7152 0.27967841 659.2212 0.19914288 264 275 6.0069324 0.17935821 0.00070149254 2.332667 5.5485401 274635.62 3 6 + 68000 547.06201 -3198.7151 0.11427629 14.185774 0.26349624 261 263 6.0069324 0.17882353 0.00069117647 2.332667 5.5485401 277575.99 3 6 +Loop time of 0.224043 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 68000 547.06201 -3198.7151 0.11427629 14.185774 0.26349624 261 263 6.0069324 0.17882353 0.00069117647 2.332667 5.5485401 277575.99 3 6 + 68060 547.06201 -3217.9192 0.11427629 14.185774 0.26349624 261 263 6.0069324 0.17866588 0.00069056715 2.332667 5.5485401 277575.99 3 6 +Loop time of 0.0288572 on 4 procs for 60 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 68000 547.06201 -3198.7151 0.11427629 14.185774 0.26349624 261 263 6.0069324 0.17882353 0.00069117647 2.332667 5.5485401 277575.99 3 6 + 69000 508.94771 -3198.9475 0.10069537 10.350552 0.26809482 264 275 6.0069324 0.18095652 0.00068115942 2.332667 5.5485401 279847.52 3 6 +Loop time of 0.227692 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 69000 508.94771 -3198.9475 0.10069537 10.350552 0.26809482 264 275 6.0069324 0.18095652 0.00068115942 2.332667 5.5485401 279847.52 3 6 + 69056 508.94771 -3217.9192 0.10069537 10.350552 0.26809482 264 275 6.0069324 0.18080978 0.00068060704 2.332667 5.5485401 279847.52 3 6 +Loop time of 0.0247979 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 69000 508.94771 -3198.9475 0.10069537 10.350552 0.26809482 264 275 6.0069324 0.18095652 0.00068115942 2.332667 5.5485401 279847.52 3 6 + 70000 499.92534 -3198.5636 0.3528879 3605.3669 0.16272731 283 288 6.0069324 0.18142857 0.00072857143 2.332667 5.5485401 281504.52 3 6 +Loop time of 0.232204 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 70000 499.92534 -3198.5636 0.3528879 3605.3669 0.16272731 283 288 6.0069324 0.18142857 0.00072857143 2.332667 5.5485401 281504.52 3 6 + 70054 499.92534 -3217.9192 0.3528879 3605.3669 0.16272731 283 288 6.0069324 0.18128872 0.00072800982 2.332667 5.5485401 281504.52 3 6 +Loop time of 0.0249009 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 70000 499.92534 -3198.5636 0.3528879 3605.3669 0.16272731 283 288 6.0069324 0.18142857 0.00072857143 2.332667 5.5485401 281504.52 3 6 + 71000 506.70688 -3197.313 0.082678879 6.813425 0.27407627 541 543 6.0069324 0.18050704 0.00071830986 2.332667 5.5485401 286003.61 3 6 +Loop time of 0.229025 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 71000 506.70688 -3197.313 0.082678879 6.813425 0.27407627 541 543 6.0069324 0.18050704 0.00071830986 2.332667 5.5485401 286003.61 3 6 + 71059 506.70688 -3217.9192 0.082678879 6.813425 0.27407627 541 543 6.0069324 0.18035717 0.00071771345 2.332667 5.5485401 286003.61 3 6 +Loop time of 0.0265949 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 71000 506.70688 -3197.313 0.082678879 6.813425 0.27407627 541 543 6.0069324 0.18050704 0.00071830986 2.332667 5.5485401 286003.61 3 6 + 72000 464.23294 -3197.7357 0 1 0.31542276 275 577 6.0069324 0.18266667 0.00070833333 2.332667 5.5485401 286734.83 3 6 +Loop time of 0.228346 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 72000 464.23294 -3197.7357 0 1 0.31542276 275 577 6.0069324 0.18266667 0.00070833333 2.332667 5.5485401 286734.83 3 6 + 72053 464.23294 -3217.9192 0 1 0.31542276 275 577 6.0069324 0.1825323 0.0007078123 2.332667 5.5485401 286734.83 3 6 +Loop time of 0.026114 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 72000 464.23294 -3197.7357 0 1 0.31542276 275 577 6.0069324 0.18266667 0.00070833333 2.332667 5.5485401 286734.83 3 6 + 73000 529.30216 -3198.1231 0.1005148 10.307265 0.26815543 411 416 6.0069324 0.18394521 0.00069863014 2.332667 5.5485401 287872.93 3 6 +Loop time of 0.229123 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 73000 529.30216 -3198.1231 0.1005148 10.307265 0.26815543 411 416 6.0069324 0.18394521 0.00069863014 2.332667 5.5485401 287872.93 3 6 + 73054 529.30216 -3217.9192 0.1005148 10.307265 0.26815543 411 416 6.0069324 0.18380924 0.00069811372 2.332667 5.5485401 287872.93 3 6 +Loop time of 0.0243089 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 73000 529.30216 -3198.1231 0.1005148 10.307265 0.26815543 411 416 6.0069324 0.18394521 0.00069863014 2.332667 5.5485401 287872.93 3 6 + 74000 490.65557 -3199.6766 0.14904687 31.792497 0.25133954 111 116 6.0069324 0.18322973 0.00068918919 2.332667 5.5485401 294766.16 3 6 +Loop time of 0.236133 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 74000 490.65557 -3199.6766 0.14904687 31.792497 0.25133954 111 116 6.0069324 0.18322973 0.00068918919 2.332667 5.5485401 294766.16 3 6 + 74055 490.65557 -3217.9192 0.14904687 31.792497 0.25133954 111 116 6.0069324 0.18309365 0.00068867733 2.332667 5.5485401 294766.16 3 6 +Loop time of 0.0264881 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 74000 490.65557 -3199.6766 0.14904687 31.792497 0.25133954 111 116 6.0069324 0.18322973 0.00068918919 2.332667 5.5485401 294766.16 3 6 + 75000 475.22638 -3198.1558 0.37341486 5805.6632 0.15094809 563 564 6.0069324 0.18212 0.00073333333 2.332667 5.5485401 302150.54 3 6 +Loop time of 0.228974 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 75000 475.22638 -3198.1558 0.37341486 5805.6632 0.15094809 563 564 6.0069324 0.18212 0.00073333333 2.332667 5.5485401 302150.54 3 6 + 75053 475.22638 -3217.9192 0.37341486 5805.6632 0.15094809 563 564 6.0069324 0.18199139 0.00073281548 2.332667 5.5485401 302150.54 3 6 +Loop time of 0.0246332 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 75000 475.22638 -3198.1558 0.37341486 5805.6632 0.15094809 563 564 6.0069324 0.18212 0.00073333333 2.332667 5.5485401 302150.54 3 6 + 76000 523.91803 -3198.8966 0.038679316 2.4539737 0.28816267 263 264 6.0069324 0.18286842 0.00072368421 2.332667 5.5485401 304160.3 3 6 +Loop time of 0.223991 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 76000 523.91803 -3198.8966 0.038679316 2.4539737 0.28816267 263 264 6.0069324 0.18286842 0.00072368421 2.332667 5.5485401 304160.3 3 6 + 76058 523.91803 -3217.9192 0.038679316 2.4539737 0.28816267 263 264 6.0069324 0.18272897 0.00072313235 2.332667 5.5485401 304160.3 3 6 +Loop time of 0.0268497 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 76000 523.91803 -3198.8966 0.038679316 2.4539737 0.28816267 263 264 6.0069324 0.18286842 0.00072368421 2.332667 5.5485401 304160.3 3 6 + 77000 511.16512 -3199.1926 0 1 0.31251901 264 275 6.0069324 0.18790909 0.00071428571 2.332667 5.5485401 304174.43 3 6 +Loop time of 0.226324 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 77000 511.16512 -3199.1926 0 1 0.31251901 264 275 6.0069324 0.18790909 0.00071428571 2.332667 5.5485401 304174.43 3 6 + 77059 511.16512 -3217.9192 0 1 0.31251901 264 275 6.0069324 0.18776522 0.00071373882 2.332667 5.5485401 304174.43 3 6 +Loop time of 0.026314 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 77000 511.16512 -3199.1926 0 1 0.31251901 264 275 6.0069324 0.18790909 0.00071428571 2.332667 5.5485401 304174.43 3 6 + 78000 554.58169 -3199.0107 0.022175428 1.6730858 0.29327193 263 264 6.0069324 0.19037179 0.00094871795 2.332667 5.5485401 304438.98 3 6 +Loop time of 0.234504 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 78000 554.58169 -3199.0107 0.022175428 1.6730858 0.29327193 263 264 6.0069324 0.19037179 0.00094871795 2.332667 5.5485401 304438.98 3 6 + 78062 554.58169 -3217.9192 0.022175428 1.6730858 0.29327193 263 264 6.0069324 0.19022059 0.00094796444 2.332667 5.5485401 304438.98 3 6 +Loop time of 0.0297351 on 4 procs for 62 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 78000 554.58169 -3199.0107 0.022175428 1.6730858 0.29327193 263 264 6.0069324 0.19037179 0.00094871795 2.332667 5.5485401 304438.98 3 6 + 79000 523.97176 -3198.2366 0.1672356 48.490735 0.24473985 556 567 6.0069324 0.19017722 0.00093670886 2.332667 5.5485401 306076.23 3 6 +Loop time of 0.228044 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 79000 523.97176 -3198.2366 0.1672356 48.490735 0.24473985 556 567 6.0069324 0.19017722 0.00093670886 2.332667 5.5485401 306076.23 3 6 + 79057 523.97176 -3217.9192 0.1672356 48.490735 0.24473985 556 567 6.0069324 0.1900401 0.00093603349 2.332667 5.5485401 306076.23 3 6 +Loop time of 0.026444 on 4 procs for 57 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 79000 523.97176 -3198.2366 0.1672356 48.490735 0.24473985 556 567 6.0069324 0.19017722 0.00093670886 2.332667 5.5485401 306076.23 3 6 + 80000 479.09781 -3197.6134 0 1 0.30854872 263 577 6.0069324 0.1902125 0.000925 2.332667 5.5485401 308522.09 3 6 +Loop time of 0.224854 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 80000 479.09781 -3197.6134 0 1 0.30854872 263 577 6.0069324 0.1902125 0.000925 2.332667 5.5485401 308522.09 3 6 + 80059 479.09781 -3217.9192 0 1 0.30854872 263 577 6.0069324 0.19007232 0.00092431832 2.332667 5.5485401 308522.09 3 6 +Loop time of 0.0272751 on 4 procs for 59 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 80000 479.09781 -3197.6134 0 1 0.30854872 263 577 6.0069324 0.1902125 0.000925 2.332667 5.5485401 308522.09 3 6 + 81000 517.52613 -3198.2236 0.29863857 1023.6251 0.19038135 254 256 6.0069324 0.18996296 0.00091358025 2.332667 5.5485401 311171.12 3 6 +Loop time of 0.226269 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 81000 517.52613 -3198.2236 0.29863857 1023.6251 0.19038135 254 256 6.0069324 0.18996296 0.00091358025 2.332667 5.5485401 311171.12 3 6 + 81056 517.52613 -3217.9192 0.29863857 1023.6251 0.19038135 254 256 6.0069324 0.18983172 0.00091294907 2.332667 5.5485401 311171.12 3 6 +Loop time of 0.0258186 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 81000 517.52613 -3198.2236 0.29863857 1023.6251 0.19038135 254 256 6.0069324 0.18996296 0.00091358025 2.332667 5.5485401 311171.12 3 6 + 82000 503.95678 -3197.7481 0.091495497 8.3605139 0.27116565 263 264 6.0069324 0.18862195 0.0010365854 2.332667 5.5485401 315319.38 3 6 +Loop time of 0.235559 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 82000 503.95678 -3197.7481 0.091495497 8.3605139 0.27116565 263 264 6.0069324 0.18862195 0.0010365854 2.332667 5.5485401 315319.38 3 6 + 82055 503.95678 -3217.9192 0.091495497 8.3605139 0.27116565 263 264 6.0069324 0.18849552 0.0010358906 2.332667 5.5485401 315319.38 3 6 +Loop time of 0.0261242 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 82000 503.95678 -3197.7481 0.091495497 8.3605139 0.27116565 263 264 6.0069324 0.18862195 0.0010365854 2.332667 5.5485401 315319.38 3 6 + 83000 537.67639 -3197.6886 0 1 0.32414276 263 264 6.0069324 0.1896988 0.0010240964 2.332667 5.5485401 316613.84 3 6 +Loop time of 0.227873 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 83000 537.67639 -3197.6886 0 1 0.32414276 263 264 6.0069324 0.1896988 0.0010240964 2.332667 5.5485401 316613.84 3 6 + 83064 537.67639 -3217.9192 0 1 0.32414276 263 264 6.0069324 0.18955263 0.0010233073 2.332667 5.5485401 316613.84 3 6 +Loop time of 0.0301323 on 4 procs for 64 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 83000 537.67639 -3197.6886 0 1 0.32414276 263 264 6.0069324 0.1896988 0.0010240964 2.332667 5.5485401 316613.84 3 6 + 84000 510.26841 -3199.5428 0.23554832 236.71181 0.21817723 142 424 6.0069324 0.19 0.0010119048 2.332667 5.5485401 318598.08 3 6 +Loop time of 0.228573 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 84000 510.26841 -3199.5428 0.23554832 236.71181 0.21817723 142 424 6.0069324 0.19 0.0010119048 2.332667 5.5485401 318598.08 3 6 + 84052 510.26841 -3217.9192 0.23554832 236.71181 0.21817723 142 424 6.0069324 0.18988245 0.0010112787 2.332667 5.5485401 318598.08 3 6 +Loop time of 0.0254717 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 84000 510.26841 -3199.5428 0.23554832 236.71181 0.21817723 142 424 6.0069324 0.19 0.0010119048 2.332667 5.5485401 318598.08 3 6 + 85000 472.16876 -3197.5248 0 1 0.34247044 264 275 6.0069324 0.18970588 0.001 2.332667 5.5485401 323882.61 3 6 +Loop time of 0.231174 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 85000 472.16876 -3197.5248 0 1 0.34247044 264 275 6.0069324 0.18970588 0.001 2.332667 5.5485401 323882.61 3 6 + 85055 472.16876 -3217.9192 0 1 0.34247044 264 275 6.0069324 0.18958321 0.00099935336 2.332667 5.5485401 323882.61 3 6 +Loop time of 0.0253472 on 4 procs for 55 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 85000 472.16876 -3197.5248 0 1 0.34247044 264 275 6.0069324 0.18970588 0.001 2.332667 5.5485401 323882.61 3 6 + 86000 509.30024 -3198.3226 0.20619306 119.76563 0.22996793 275 276 6.0069324 0.19110465 0.00098837209 2.332667 5.5485401 325788.44 3 6 +Loop time of 0.241364 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 86000 509.30024 -3198.3226 0.20619306 119.76563 0.22996793 275 276 6.0069324 0.19110465 0.00098837209 2.332667 5.5485401 325788.44 3 6 + 86053 509.30024 -3217.9192 0.20619306 119.76563 0.22996793 275 276 6.0069324 0.19098695 0.00098776336 2.332667 5.5485401 325788.44 3 6 +Loop time of 0.0262635 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 86000 509.30024 -3198.3226 0.20619306 119.76563 0.22996793 275 276 6.0069324 0.19110465 0.00098837209 2.332667 5.5485401 325788.44 3 6 + 87000 478.57944 -3199.3497 0.19192384 86.001287 0.23548611 260 271 6.0069324 0.1897931 0.00097701149 2.332667 5.5485401 330047.59 3 6 +Loop time of 0.230381 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 87000 478.57944 -3199.3497 0.19192384 86.001287 0.23548611 260 271 6.0069324 0.1897931 0.00097701149 2.332667 5.5485401 330047.59 3 6 + 87058 478.57944 -3217.9192 0.19192384 86.001287 0.23548611 260 271 6.0069324 0.18966666 0.00097636059 2.332667 5.5485401 330047.59 3 6 +Loop time of 0.0275965 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 87000 478.57944 -3199.3497 0.19192384 86.001287 0.23548611 260 271 6.0069324 0.1897931 0.00097701149 2.332667 5.5485401 330047.59 3 6 + 88000 515.63138 -3198.9629 0.35491784 3779.2911 0.16160071 543 577 6.0069324 0.18827273 0.00096590909 2.332667 5.5485401 337304.34 3 6 +Loop time of 0.229339 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 88000 515.63138 -3198.9629 0.35491784 3779.2911 0.16160071 543 577 6.0069324 0.18827273 0.00096590909 2.332667 5.5485401 337304.34 3 6 + 88050 515.63138 -3217.9192 0.35491784 3779.2911 0.16160071 543 577 6.0069324 0.18816581 0.00096536059 2.332667 5.5485401 337304.34 3 6 +Loop time of 0.0253522 on 4 procs for 50 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 88000 515.63138 -3198.9629 0.35491784 3779.2911 0.16160071 543 577 6.0069324 0.18827273 0.00096590909 2.332667 5.5485401 337304.34 3 6 + 89000 520.37063 -3197.8234 0 1 0.92013924 262 275 6.0069324 0.19148315 0.0011123596 2.332667 5.5485401 339909.57 3 6 +Loop time of 0.234048 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 89000 520.37063 -3197.8234 0 1 0.92013924 262 275 6.0069324 0.19148315 0.0011123596 2.332667 5.5485401 339909.57 3 6 + 89052 520.37063 -3217.9192 0 1 0.92013924 262 275 6.0069324 0.19137133 0.00111171 2.332667 5.5485401 339909.57 3 6 +Loop time of 0.0242915 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 89000 520.37063 -3197.8234 0.34652166 3110.1454 0.16621101 111 112 6.0069324 0.19148315 0.0011123596 2.332667 5.5485401 339909.57 4 8 + 90000 455.69218 -3197.8262 0.30521336 1192.3721 0.18724742 416 415 6.0069324 0.1905 0.0011 2.332667 5.5485401 345606.41 4 8 +Loop time of 0.239736 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 90000 455.69218 -3197.8262 0.30521336 1192.3721 0.18724742 416 415 6.0069324 0.1905 0.0011 2.332667 5.5485401 345606.41 4 8 + 90058 455.69218 -3217.9192 0.30521336 1192.3721 0.18724742 416 415 6.0069324 0.19037731 0.0010992916 2.332667 5.5485401 345606.41 4 8 +Loop time of 0.027481 on 4 procs for 58 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 90000 455.69218 -3197.8262 0.30521336 1192.3721 0.18724742 416 415 6.0069324 0.1905 0.0011 2.332667 5.5485401 345606.41 4 8 + 91000 506.17768 -3197.1344 0.035696451 2.2898339 0.28909279 547 548 6.0069324 0.18983516 0.0010879121 2.332667 5.5485401 350825.27 4 8 +Loop time of 0.23396 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 91000 506.17768 -3197.1344 0.035696451 2.2898339 0.28909279 547 548 6.0069324 0.18983516 0.0010879121 2.332667 5.5485401 350825.27 4 8 + 91051 506.17768 -3217.9192 0.035696451 2.2898339 0.28909279 547 548 6.0069324 0.18972883 0.0010873027 2.332667 5.5485401 350825.27 4 8 +Loop time of 0.0249534 on 4 procs for 51 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 91000 506.17768 -3197.1344 0.035696451 2.2898339 0.28909279 547 548 6.0069324 0.18983516 0.0010879121 2.332667 5.5485401 350825.27 4 8 + 92000 478.3025 -3197.9483 0 1 0.30393958 544 556 6.0069324 0.19196739 0.001076087 2.332667 5.5485401 352816.62 4 8 +Loop time of 0.233376 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 92000 478.3025 -3197.9483 0 1 0.30393958 544 556 6.0069324 0.19196739 0.001076087 2.332667 5.5485401 352816.62 4 8 + 92060 478.3025 -3217.9192 0 1 0.30393958 544 556 6.0069324 0.19184228 0.0010753856 2.332667 5.5485401 352816.62 4 8 +Loop time of 0.0286014 on 4 procs for 60 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 92000 478.3025 -3197.9483 0 1 0.30393958 544 556 6.0069324 0.19196739 0.001076087 2.332667 5.5485401 352816.62 4 8 + 93000 485.23153 -3199.9299 0.16699022 48.215364 0.24483006 544 556 6.0069324 0.1942043 0.0010645161 2.332667 5.5485401 354391.05 4 8 +Loop time of 0.234626 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 93000 485.23153 -3199.9299 0.16699022 48.215364 0.24483006 544 556 6.0069324 0.1942043 0.0010645161 2.332667 5.5485401 354391.05 4 8 + 93056 485.23153 -3217.9192 0.16699022 48.215364 0.24483006 544 556 6.0069324 0.19408743 0.0010638755 2.332667 5.5485401 354391.05 4 8 +Loop time of 0.0261769 on 4 procs for 56 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 93000 485.23153 -3199.9299 0.16699022 48.215364 0.24483006 544 556 6.0069324 0.1942043 0.0010645161 2.332667 5.5485401 354391.05 4 8 + 94000 499.72991 -3199.3195 0 1 0.30394408 544 556 6.0069324 0.19443617 0.0010531915 2.332667 5.5485401 360147.54 4 8 +Loop time of 0.229448 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 94000 499.72991 -3199.3195 0 1 0.30394408 544 556 6.0069324 0.19443617 0.0010531915 2.332667 5.5485401 360147.54 4 8 + 94061 499.72991 -3217.9192 0 1 0.30394408 544 556 6.0069324 0.19431008 0.0010525085 2.332667 5.5485401 360147.54 4 8 +Loop time of 0.0281783 on 4 procs for 61 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 94000 499.72991 -3199.3195 0 1 0.30394408 544 556 6.0069324 0.19443617 0.0010531915 2.332667 5.5485401 360147.54 4 8 + 95000 509.83941 -3199.0903 0.078854869 6.234781 0.27532912 555 556 6.0069324 0.19681053 0.0010421053 2.332667 5.5485401 360599.28 4 8 +Loop time of 0.224206 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 95000 509.83941 -3199.0903 0.078854869 6.234781 0.27532912 555 556 6.0069324 0.19681053 0.0010421053 2.332667 5.5485401 360599.28 4 8 + 95060 509.83941 -3217.9192 0.078854869 6.234781 0.27532912 555 556 6.0069324 0.1966863 0.0010414475 2.332667 5.5485401 360599.28 4 8 +Loop time of 0.027992 on 4 procs for 60 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 95000 509.83941 -3199.0903 0.078854869 6.234781 0.27532912 555 556 6.0069324 0.19681053 0.0010421053 2.332667 5.5485401 360599.28 4 8 + 96000 486.83779 -3197.2106 0.31070799 1354.5503 0.18458755 136 431 6.0069324 0.19620833 0.00103125 2.332667 5.5485401 365489.89 4 8 +Loop time of 0.228167 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 96000 486.83779 -3197.2106 0.31070799 1354.5503 0.18458755 136 431 6.0069324 0.19620833 0.00103125 2.332667 5.5485401 365489.89 4 8 + 96053 486.83779 -3217.9192 0.31070799 1354.5503 0.18458755 136 431 6.0069324 0.19610007 0.001030681 2.332667 5.5485401 365489.89 4 8 +Loop time of 0.024569 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 96000 486.83779 -3197.2106 0.31070799 1354.5503 0.18458755 136 431 6.0069324 0.19620833 0.00103125 2.332667 5.5485401 365489.89 4 8 + 97000 499.91835 -3199.2446 0.2280334 198.82589 0.22125548 280 111 6.0069324 0.19491753 0.0010206186 2.332667 5.5485401 372336.45 4 8 +Loop time of 0.23889 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 97000 499.91835 -3199.2446 0.2280334 198.82589 0.22125548 280 111 6.0069324 0.19491753 0.0010206186 2.332667 5.5485401 372336.45 4 8 + 97052 499.91835 -3217.9192 0.2280334 198.82589 0.22125548 280 111 6.0069324 0.19481309 0.0010200717 2.332667 5.5485401 372336.45 4 8 +Loop time of 0.0262206 on 4 procs for 52 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 97000 499.91835 -3199.2446 0.2280334 198.82589 0.22125548 280 111 6.0069324 0.19491753 0.0010206186 2.332667 5.5485401 372336.45 4 8 + 98000 547.56456 -3197.2191 0.27848637 641.23302 0.19968088 430 136 6.0069324 0.1957449 0.0010102041 2.332667 5.5485401 377711.41 4 8 +Loop time of 0.239305 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 98000 547.56456 -3197.2191 0.27848637 641.23302 0.19968088 430 136 6.0069324 0.1957449 0.0010102041 2.332667 5.5485401 377711.41 4 8 + 98054 547.56456 -3217.9192 0.27848637 641.23302 0.19968088 430 136 6.0069324 0.1956371 0.0010096477 2.332667 5.5485401 377711.41 4 8 +Loop time of 0.0272166 on 4 procs for 54 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 98000 547.56456 -3197.2191 0.27848637 641.23302 0.19968088 430 136 6.0069324 0.1957449 0.0010102041 2.332667 5.5485401 377711.41 4 8 + 99000 504.19627 -3196.6567 0 1 0.33814873 287 276 6.0069324 0.19517172 0.001 2.332667 5.5485401 381676.19 4 8 +Loop time of 0.235176 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 99000 504.19627 -3196.6567 0 1 0.33814873 287 276 6.0069324 0.19517172 0.001 2.332667 5.5485401 381676.19 4 8 + 99053 504.19627 -3217.9192 0 1 0.33814873 287 276 6.0069324 0.19506729 0.00099946493 2.332667 5.5485401 381676.19 4 8 +Loop time of 0.0249114 on 4 procs for 53 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 99000 504.19627 -3196.6567 0 1 0.33814873 287 276 6.0069324 0.19517172 0.001 2.332667 5.5485401 381676.19 4 8 + 100000 542.04702 -3198.2211 0.37630331 6208.2061 0.14921597 563 564 6.0069324 0.19442 0.00099 2.332667 5.5485401 385211.4 4 8 +Loop time of 0.226452 on 4 procs for 1000 steps with 577 atoms + +Step Temp PotEng f_HG f_HG[1] f_HG[2] f_HG[3] f_HG[4] f_HG[5] f_HG[6] f_HG[7] f_HG[8] f_HG[9] f_HG[10] f_HG[11] f_HG[12] + 100000 542.04702 -3198.2211 0.37630331 6208.2061 0.14921597 563 564 6.0069324 0.19442 0.00099 2.332667 5.5485401 385211.4 4 8 + 100060 542.04702 -3217.9192 0.37630331 6208.2061 0.14921597 563 564 6.0069324 0.19430342 0.00098940636 2.332667 5.5485401 385211.4 4 8 +Loop time of 0.0303354 on 4 procs for 60 steps with 577 atoms + +Final hyper stats ... + +Cummulative quantities for fix hyper: + hyper time = 385211 + time boost factor = 770.423 + event timesteps = 4 + # of atoms in events = 8 +Quantities for this hyper run: + event timesteps = 4 + # of atoms in events = 8 + max length of any bond = 5.54854 + max drift distance of any atom = 2.33267 + fraction of biased bonds with zero bias = 0.19442 + fraction of biased bonds with negative strain = 0.00099 +Current quantities: + ave bonds/atom = 6.00693 + +Loop time of 26.6054 on 4 procs for 100000 steps with 577 atoms + +Performance: 1623.732 ns/day, 0.015 hours/ns, 3758.639 timesteps/s +100.6% CPU use with 4 MPI tasks x no OpenMP threads + +Hyper stats: + Dynamics time (%) = 23.5897 (88.665) + Quench time (%) = 2.6357 (9.90664) + Other time (%) = 0.875172 (3.28945) + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 18.942 | 19.435 | 20.026 | 10.1 | 73.05 +Neigh | 1.3021 | 1.3833 | 1.4611 | 6.2 | 5.20 +Comm | 2.1376 | 2.1725 | 2.2239 | 2.2 | 8.17 +Output | 0.0033467 | 0.0034443 | 0.0037186 | 0.3 | 0.01 +Modify | 2.0693 | 2.7356 | 3.2627 | 30.2 | 10.28 +Other | | 0.8752 | | | 3.29 + +Nlocal: 144.25 ave 152 max 139 min +Histogram: 1 1 0 0 1 0 0 0 0 1 +Nghost: 533.25 ave 538 max 526 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Neighs: 3368.25 ave 3528 max 3240 min +Histogram: 1 1 0 0 0 0 1 0 0 1 + +Total # of neighbors = 13473 +Ave neighs/atom = 23.3501 +Neighbor list builds = 10072 +Dangerous builds = 0 +Total wall time: 0:00:27 diff --git a/examples/hyper/log.25Mar19.hyper.local.g++.16 b/examples/hyper/log.25Mar19.hyper.local.g++.16 new file mode 100644 index 0000000000..b56406f963 --- /dev/null +++ b/examples/hyper/log.25Mar19.hyper.local.g++.16 @@ -0,0 +1,1002 @@ +LAMMPS (28 Feb 2019) +# 3d EAM surface for local HD + +# nearest neighbor distance = a * sqrt(2)/2 = 2.77 Angs for Pt with a = 3.92 +# hop event on (100) surface is same distance +# exchange event is 2 atoms moving same distance + +variable Tequil index 400.0 +variable Vmax index 0.4 +variable qfactor index 0.3 +variable cutbond index 3.2 +variable Dcut index 10.0 +variable cutevent index 1.1 +variable alpha index 200.0 +variable boost index 4000.0 +variable ghostcut index 12.0 +variable steps index 1500 +variable nevent index 100 +variable nx index 8 +variable ny index 8 +variable zoom index 1.8 +variable seed index 826626413 +variable tol index 1.0e-15 +variable add index 37K + +units metal +atom_style atomic +atom_modify map array +boundary p p p +comm_modify cutoff ${ghostcut} +comm_modify cutoff 12.0 + +lattice fcc 3.92 +Lattice spacing in x,y,z = 3.92 3.92 3.92 +region box block 0 6 0 6 0 4 +create_box 2 box +Created orthogonal box = (0 0 0) to (23.52 23.52 15.68) + 2 by 4 by 2 MPI processor grid +create_atoms 1 box +Created 576 atoms + Time spent = 0.00110102 secs + +mass * 1.0 + +change_box all z final -0.1 5.0 boundary p p f + orthogonal box = (0 0 -0.392) to (23.52 23.52 19.6) + +# replicate in xy + +replicate ${nx} ${ny} 1 +replicate 8 ${ny} 1 +replicate 8 8 1 + orthogonal box = (0 0 -0.392) to (188.16 188.16 19.6) + 4 by 4 by 1 MPI processor grid + 36864 atoms + Time spent = 0.00289989 secs + +# add adatoms + +include adatoms.list.${add} +include adatoms.list.37K +create_atoms 1 single 27.5 9.5 4 +Created 1 atoms + Time spent = 0.000200033 secs +create_atoms 1 single 16 9 4 +Created 1 atoms + Time spent = 0.000183105 secs +create_atoms 1 single 10 12 4 +Created 1 atoms + Time spent = 0.000180006 secs +create_atoms 1 single 31 44 4 +Created 1 atoms + Time spent = 0.000190973 secs +create_atoms 1 single 13 17 4 +Created 1 atoms + Time spent = 0.000185013 secs +create_atoms 1 single 8.5 28.5 4 +Created 1 atoms + Time spent = 0.00018692 secs +create_atoms 1 single 23 26 4 +Created 1 atoms + Time spent = 0.000179052 secs +create_atoms 1 single 38 27 4 +Created 1 atoms + Time spent = 0.000191927 secs +create_atoms 1 single 37.5 4.5 4 +Created 1 atoms + Time spent = 0.000238895 secs +create_atoms 1 single 41.5 47.5 4 +Created 1 atoms + Time spent = 0.000191927 secs +create_atoms 1 single 20.5 37.5 4 +Created 1 atoms + Time spent = 0.000185966 secs +create_atoms 1 single 5 8 4 +Created 1 atoms + Time spent = 0.000170946 secs +create_atoms 1 single 2.5 16.5 4 +Created 1 atoms + Time spent = 0.000174046 secs +create_atoms 1 single 38.5 45.5 4 +Created 1 atoms + Time spent = 0.000172853 secs +create_atoms 1 single 9 0 4 +Created 1 atoms + Time spent = 0.000187159 secs +create_atoms 1 single 39 32 4 +Created 1 atoms + Time spent = 0.000180006 secs +create_atoms 1 single 45.5 11.5 4 +Created 1 atoms + Time spent = 0.000189066 secs +create_atoms 1 single 40 0 4 +Created 1 atoms + Time spent = 0.000170946 secs +create_atoms 1 single 44.5 2.5 4 +Created 1 atoms + Time spent = 0.000191927 secs +create_atoms 1 single 4.5 44.5 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 24.5 13.5 4 +Created 1 atoms + Time spent = 0.000166893 secs +create_atoms 1 single 47.5 23.5 4 +Created 1 atoms + Time spent = 0.000181913 secs +create_atoms 1 single 1 20 4 +Created 1 atoms + Time spent = 0.000167131 secs +create_atoms 1 single 38.5 31.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 12.5 12.5 4 +Created 1 atoms + Time spent = 0.000165939 secs +create_atoms 1 single 2 27 4 +Created 1 atoms + Time spent = 0.000170231 secs +create_atoms 1 single 21 5 4 +Created 1 atoms + Time spent = 0.00018096 secs +create_atoms 1 single 47 12 4 +Created 1 atoms + Time spent = 0.000166178 secs +create_atoms 1 single 32.5 46.5 4 +Created 1 atoms + Time spent = 0.000166893 secs +create_atoms 1 single 9.5 40.5 4 +Created 1 atoms + Time spent = 0.000165939 secs +create_atoms 1 single 8.5 2.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 41.5 22.5 4 +Created 1 atoms + Time spent = 0.000175953 secs +create_atoms 1 single 29 11 4 +Created 1 atoms + Time spent = 0.000165939 secs +create_atoms 1 single 3.5 3.5 4 +Created 1 atoms + Time spent = 0.000174999 secs +create_atoms 1 single 5 21 4 +Created 1 atoms + Time spent = 0.0001719 secs +create_atoms 1 single 46.5 31.5 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 35 46 4 +Created 1 atoms + Time spent = 0.000178099 secs +create_atoms 1 single 40.5 41.5 4 +Created 1 atoms + Time spent = 0.000168085 secs +create_atoms 1 single 10 22 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 43.5 14.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 42 42 4 +Created 1 atoms + Time spent = 0.000184059 secs +create_atoms 1 single 4 26 4 +Created 1 atoms + Time spent = 0.000178814 secs +create_atoms 1 single 19 34 4 +Created 1 atoms + Time spent = 0.0001688 secs +create_atoms 1 single 33 9 4 +Created 1 atoms + Time spent = 0.000168085 secs +create_atoms 1 single 0.5 45.5 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 30.5 32.5 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 25.5 5.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 47.5 39.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 15 13 4 +Created 1 atoms + Time spent = 0.000174046 secs +create_atoms 1 single 21 21 4 +Created 1 atoms + Time spent = 0.000166893 secs +create_atoms 1 single 14 28 4 +Created 1 atoms + Time spent = 0.000170946 secs +create_atoms 1 single 9 34 4 +Created 1 atoms + Time spent = 0.000174999 secs +create_atoms 1 single 7 38 4 +Created 1 atoms + Time spent = 0.000167847 secs +create_atoms 1 single 11 35 4 +Created 1 atoms + Time spent = 0.000168085 secs +create_atoms 1 single 20.5 45.5 4 +Created 1 atoms + Time spent = 0.000177145 secs +create_atoms 1 single 30.5 31.5 4 +Created 1 atoms + Time spent = 0.000167131 secs +create_atoms 1 single 32.5 2.5 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 21.5 3.5 4 +Created 1 atoms + Time spent = 0.000166893 secs +create_atoms 1 single 23 12 4 +Created 1 atoms + Time spent = 0.000169039 secs +create_atoms 1 single 4.5 33.5 4 +Created 1 atoms + Time spent = 0.000178099 secs +create_atoms 1 single 46 43 4 +Created 1 atoms + Time spent = 0.000175953 secs +create_atoms 1 single 42.5 45.5 4 +Created 1 atoms + Time spent = 0.000169992 secs +create_atoms 1 single 4.5 10.5 4 +Created 1 atoms + Time spent = 0.000175953 secs +create_atoms 1 single 33.5 15.5 4 +Created 1 atoms + Time spent = 0.000158787 secs +create_atoms 1 single 24 5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 13 16 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 16.5 23.5 4 +Created 1 atoms + Time spent = 0.000160933 secs +create_atoms 1 single 45.5 28.5 4 +Created 1 atoms + Time spent = 0.000159025 secs +create_atoms 1 single 44.5 5.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 27.5 46.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 44.5 12.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 12 41 4 +Created 1 atoms + Time spent = 0.000166893 secs +create_atoms 1 single 6 4 4 +Created 1 atoms + Time spent = 0.0001688 secs +create_atoms 1 single 31.5 10.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 1 44 4 +Created 1 atoms + Time spent = 0.000157833 secs +create_atoms 1 single 31 4 4 +Created 1 atoms + Time spent = 0.000156879 secs +create_atoms 1 single 21 33 4 +Created 1 atoms + Time spent = 0.000172138 secs +create_atoms 1 single 3 33 4 +Created 1 atoms + Time spent = 0.000156879 secs +create_atoms 1 single 15 10 4 +Created 1 atoms + Time spent = 0.000156879 secs +create_atoms 1 single 28.5 22.5 4 +Created 1 atoms + Time spent = 0.000161886 secs +create_atoms 1 single 43 1 4 +Created 1 atoms + Time spent = 0.000166178 secs +create_atoms 1 single 3.5 0.5 4 +Created 1 atoms + Time spent = 0.000164986 secs +create_atoms 1 single 41 37 4 +Created 1 atoms + Time spent = 0.000160933 secs +create_atoms 1 single 18.5 43.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 17 27 4 +Created 1 atoms + Time spent = 0.000159025 secs +create_atoms 1 single 3 5 4 +Created 1 atoms + Time spent = 0.000161171 secs +create_atoms 1 single 18.5 23.5 4 +Created 1 atoms + Time spent = 0.000164986 secs +create_atoms 1 single 31.5 14.5 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 41 31 4 +Created 1 atoms + Time spent = 0.000159979 secs +create_atoms 1 single 22 3 4 +Created 1 atoms + Time spent = 0.000158787 secs +create_atoms 1 single 14.5 40.5 4 +Created 1 atoms + Time spent = 0.000156879 secs +create_atoms 1 single 9 38 4 +Created 1 atoms + Time spent = 0.000155926 secs +create_atoms 1 single 36 42 4 +Created 1 atoms + Time spent = 0.000170231 secs +create_atoms 1 single 33 22 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 15.5 47.5 4 +Created 1 atoms + Time spent = 0.000162125 secs +create_atoms 1 single 3 0 4 +Created 1 atoms + Time spent = 0.000157118 secs +create_atoms 1 single 25.5 27.5 4 +Created 1 atoms + Time spent = 0.000159025 secs +create_atoms 1 single 2.5 28.5 4 +Created 1 atoms + Time spent = 0.000166178 secs +create_atoms 1 single 29.5 28.5 4 +Created 1 atoms + Time spent = 0.000160933 secs +create_atoms 1 single 44.5 18.5 4 +Created 1 atoms + Time spent = 0.000155926 secs +create_atoms 1 single 26 40 4 +Created 1 atoms + Time spent = 0.000157833 secs +create_atoms 1 single 41 27 4 +Created 1 atoms + Time spent = 0.000156879 secs +create_atoms 1 single 39.5 5.5 4 +Created 1 atoms + Time spent = 0.000167847 secs +create_atoms 1 single 3 38 4 +Created 1 atoms + Time spent = 0.000156164 secs +create_atoms 1 single 35 29 4 +Created 1 atoms + Time spent = 0.000154018 secs +create_atoms 1 single 11 19 4 +Created 1 atoms + Time spent = 0.000164032 secs +create_atoms 1 single 18 1 4 +Created 1 atoms + Time spent = 0.000154972 secs +create_atoms 1 single 39.5 40.5 4 +Created 1 atoms + Time spent = 0.000157118 secs +create_atoms 1 single 46 17 4 +Created 1 atoms + Time spent = 0.000164986 secs +create_atoms 1 single 1.5 23.5 4 +Created 1 atoms + Time spent = 0.00015521 secs +create_atoms 1 single 28.5 23.5 4 +Created 1 atoms + Time spent = 0.000153065 secs +create_atoms 1 single 10 28 4 +Created 1 atoms + Time spent = 0.000154018 secs +create_atoms 1 single 19 47 4 +Created 1 atoms + Time spent = 0.000159979 secs +create_atoms 1 single 10.5 16.5 4 +Created 1 atoms + Time spent = 0.000163078 secs +create_atoms 1 single 38 45 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 42.5 41.5 4 +Created 1 atoms + Time spent = 0.000159025 secs +create_atoms 1 single 47.5 42.5 4 +Created 1 atoms + Time spent = 0.000155926 secs +create_atoms 1 single 38 7 4 +Created 1 atoms + Time spent = 0.000154018 secs +create_atoms 1 single 10 44 4 +Created 1 atoms + Time spent = 0.000158072 secs +create_atoms 1 single 29.5 27.5 4 +Created 1 atoms + Time spent = 0.000159025 secs +create_atoms 1 single 45 30 4 +Created 1 atoms + Time spent = 0.000172138 secs +create_atoms 1 single 3 9 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 8.5 35.5 4 +Created 1 atoms + Time spent = 0.000148058 secs +create_atoms 1 single 24 44 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 47 4 4 +Created 1 atoms + Time spent = 0.000155926 secs +create_atoms 1 single 7.5 8.5 4 +Created 1 atoms + Time spent = 0.000146866 secs +create_atoms 1 single 32.5 41.5 4 +Created 1 atoms + Time spent = 0.000146151 secs +create_atoms 1 single 0.5 34.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 11 8 4 +Created 1 atoms + Time spent = 0.000146866 secs +create_atoms 1 single 2 40 4 +Created 1 atoms + Time spent = 0.000148058 secs +create_atoms 1 single 25 24 4 +Created 1 atoms + Time spent = 0.000154018 secs +create_atoms 1 single 47.5 6.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 39.5 28.5 4 +Created 1 atoms + Time spent = 0.000147104 secs +create_atoms 1 single 17 21 4 +Created 1 atoms + Time spent = 0.000150919 secs +create_atoms 1 single 32 43 4 +Created 1 atoms + Time spent = 0.000149012 secs +create_atoms 1 single 16.5 29.5 4 +Created 1 atoms + Time spent = 0.000154972 secs +create_atoms 1 single 34 34 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 11.5 3.5 4 +Created 1 atoms + Time spent = 0.000148058 secs +create_atoms 1 single 39 22 4 +Created 1 atoms + Time spent = 0.000148058 secs +create_atoms 1 single 24.5 36.5 4 +Created 1 atoms + Time spent = 0.000146151 secs +create_atoms 1 single 33 31 4 +Created 1 atoms + Time spent = 0.000149965 secs +create_atoms 1 single 35.5 35.5 4 +Created 1 atoms + Time spent = 0.000185966 secs +create_atoms 1 single 14.5 34.5 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 34 28 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 37 41 4 +Created 1 atoms + Time spent = 0.000146866 secs +create_atoms 1 single 33 46 4 +Created 1 atoms + Time spent = 0.000149965 secs +create_atoms 1 single 27.5 28.5 4 +Created 1 atoms + Time spent = 0.000149965 secs +create_atoms 1 single 40.5 22.5 4 +Created 1 atoms + Time spent = 0.000148773 secs +create_atoms 1 single 27.5 1.5 4 +Created 1 atoms + Time spent = 0.00014782 secs +create_atoms 1 single 12 2 4 +Created 1 atoms + Time spent = 0.000146151 secs +create_atoms 1 single 36 43 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 28.5 9.5 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 20.5 25.5 4 +Created 1 atoms + Time spent = 0.000154972 secs +create_atoms 1 single 3 3 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 38 33 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 3 20 4 +Created 1 atoms + Time spent = 0.000149012 secs +create_atoms 1 single 35 11 4 +Created 1 atoms + Time spent = 0.000154018 secs +create_atoms 1 single 5 25 4 +Created 1 atoms + Time spent = 0.00014782 secs +create_atoms 1 single 36.5 6.5 4 +Created 1 atoms + Time spent = 0.000152111 secs +create_atoms 1 single 19.5 24.5 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 27 41 4 +Created 1 atoms + Time spent = 0.000147104 secs +create_atoms 1 single 39.5 11.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 21.5 2.5 4 +Created 1 atoms + Time spent = 0.000152111 secs +create_atoms 1 single 46.5 15.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 13 24 4 +Created 1 atoms + Time spent = 0.000153065 secs +create_atoms 1 single 11 37 4 +Created 1 atoms + Time spent = 0.000146866 secs +create_atoms 1 single 11.5 31.5 4 +Created 1 atoms + Time spent = 0.000158787 secs +create_atoms 1 single 47 0 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 25.5 17.5 4 +Created 1 atoms + Time spent = 0.000144005 secs +create_atoms 1 single 32 11 4 +Created 1 atoms + Time spent = 0.000149012 secs +create_atoms 1 single 8 17 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 27.5 12.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 25 7 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 25.5 37.5 4 +Created 1 atoms + Time spent = 0.000161886 secs +create_atoms 1 single 12 15 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 1 7 4 +Created 1 atoms + Time spent = 0.000154972 secs +create_atoms 1 single 18.5 47.5 4 +Created 1 atoms + Time spent = 0.000162125 secs +create_atoms 1 single 5 38 4 +Created 1 atoms + Time spent = 0.000145197 secs +create_atoms 1 single 42 19 4 +Created 1 atoms + Time spent = 0.000147104 secs +create_atoms 1 single 30.5 7.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 42.5 7.5 4 +Created 1 atoms + Time spent = 0.000145912 secs +create_atoms 1 single 26.5 18.5 4 +Created 1 atoms + Time spent = 0.000150919 secs +create_atoms 1 single 18.5 1.5 4 +Created 1 atoms + Time spent = 0.000144958 secs +create_atoms 1 single 41.5 10.5 4 +Created 1 atoms + Time spent = 0.000151873 secs + +# define frozen substrate and mobile atoms + +region base block INF INF INF INF 0 1.8 +set region base type 2 + 18432 settings made for type +group base type 2 +18432 atoms in group base +group mobile type 1 +18616 atoms in group mobile + +# pair style + +pair_style eam/alloy +pair_coeff * * ptvoterlammps.eam Pt Pt + +neighbor 0.5 bin +neigh_modify every 1 delay 5 check yes + +fix 1 mobile nve +fix 2 mobile langevin ${Tequil} ${Tequil} 1.0 ${seed} zero yes +fix 2 mobile langevin 400.0 ${Tequil} 1.0 ${seed} zero yes +fix 2 mobile langevin 400.0 400.0 1.0 ${seed} zero yes +fix 2 mobile langevin 400.0 400.0 1.0 826626413 zero yes + +timestep 0.005 + +compute tmobile mobile temp + +thermo 100 +thermo_modify temp tmobile +WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:487) + +# thermal equilibration + +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.07583 + ghost atom cutoff = 12 + binsize = 3.03792, bins = 62 62 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.359 | 3.359 | 3.36 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -206220.22 0 -206220.22 -52155.664 + 100 188.18127 -206044.43 0 -205591.63 -25068.83 + 200 274.34464 -205860.78 0 -205200.66 -40191.797 + 300 325.66286 -205750.01 0 -204966.4 -31510.222 + 400 352.48242 -205675.42 0 -204827.28 -35058.064 + 500 370.88571 -205619.66 0 -204727.25 -32735.022 + 600 388.62129 -205592.87 0 -204657.78 -33904.556 + 700 389.54874 -205579.73 0 -204642.4 -32769.852 + 800 395.56074 -205576.82 0 -204625.03 -33755.948 + 900 398.03458 -205564.48 0 -204606.74 -32777.103 + 1000 401.24089 -205562.85 0 -204597.4 -33785.341 +Loop time of 4.22555 on 16 procs for 1000 steps with 37048 atoms + +Performance: 102.235 ns/day, 0.235 hours/ns, 236.655 timesteps/s +98.5% CPU use with 16 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.2988 | 3.3283 | 3.3788 | 1.5 | 78.77 +Neigh | 0.22391 | 0.23756 | 0.28119 | 2.7 | 5.62 +Comm | 0.31341 | 0.3888 | 0.49372 | 8.0 | 9.20 +Output | 0.00041842 | 0.00042947 | 0.00048399 | 0.0 | 0.01 +Modify | 0.17166 | 0.2512 | 0.35242 | 9.5 | 5.94 +Other | | 0.0193 | | | 0.46 + +Nlocal: 2315.5 ave 2332 max 2297 min +Histogram: 2 0 0 3 4 0 2 1 2 2 +Nghost: 3186.31 ave 3205 max 3170 min +Histogram: 2 1 3 0 2 3 2 1 0 2 +Neighs: 55590.9 ave 56174 max 55103 min +Histogram: 2 2 1 1 4 1 3 0 0 2 + +Total # of neighbors = 889454 +Ave neighs/atom = 24.0082 +Neighbor list builds = 105 +Dangerous builds = 0 +reset_timestep 0 + +# pin base so will not move during quenches + +fix freeze base setforce 0.0 0.0 0.0 + +# event detection + +compute event all event/displace ${cutevent} +compute event all event/displace 1.1 + +# hyper/local + +fix HL mobile hyper/local ${cutbond} ${qfactor} ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} +fix HL mobile hyper/local 3.2 ${qfactor} ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} +fix HL mobile hyper/local 3.2 0.3 ${Vmax} ${Tequil} ${Dcut} ${alpha} ${boost} +fix HL mobile hyper/local 3.2 0.3 0.4 ${Tequil} ${Dcut} ${alpha} ${boost} +fix HL mobile hyper/local 3.2 0.3 0.4 400.0 ${Dcut} ${alpha} ${boost} +fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 ${alpha} ${boost} +fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 200.0 ${boost} +fix HL mobile hyper/local 3.2 0.3 0.4 400.0 10.0 200.0 4000.0 + +# thermo output + +thermo_style custom step temp pe f_HL f_HL[*] +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:705) + +thermo_modify lost ignore +thermo_modify temp tmobile +WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:487) + +thermo ${nevent} +thermo 100 + +# dump + +region substrate block INF INF INF INF 1.8 3.8 +region adatoms block INF INF INF INF 3.8 INF +variable acolor atom rmask(base)+2*rmask(substrate)+3*rmask(adatoms) + +dump 1 all image 10000000 local.*.jpg v_acolor type size 1024 1024 zoom ${zoom} adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 +dump 1 all image 10000000 local.*.jpg v_acolor type size 1024 1024 zoom 1.8 adiam 2.5 view 0.0 0.0 up 0 1 0 axes yes 0.9 0.01 +dump_modify 1 pad 6 amap 1 3 sa 1 3 blue red green + +# test of histogramming and dump output of bias coeffs + +#fix histo all ave/histo 10 100 1000 0.9 1.1 100 f_HL # mode vector kind local file tmp.histo +#dump 2 all local 1000 tmp.local f_HL + +# run + +hyper ${steps} ${nevent} HL event min ${tol} ${tol} 1000 1000 dump 1 +hyper 1500 ${nevent} HL event min ${tol} ${tol} 1000 1000 dump 1 +hyper 1500 100 HL event min ${tol} ${tol} 1000 1000 dump 1 +hyper 1500 100 HL event min 1.0e-15 ${tol} 1000 1000 dump 1 +hyper 1500 100 HL event min 1.0e-15 1.0e-15 1000 1000 dump 1 +WARNING: Resetting reneighboring criteria during hyper (../hyper.cpp:133) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.07583 + ghost atom cutoff = 12 + binsize = 3.03792, bins = 62 62 7 + 3 neighbor lists, perpetual/occasional/extra = 1 2 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix hyper/local, occasional + attributes: full, newton on, cut 10 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (3) fix hyper/local, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 6.941 | 6.942 | 6.942 Mbytes +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 0 401.24089 -205562.85 0 0 0 1 0 0 0 0 0 0 0 1e+20 0 0 0 0 0 0 0 0 0 0 + 77 401.24089 -206534.96 0 0 0 1 0 0 0 0 0 0 0 1e+20 0 0 0 0 0 0 1540 0 0 0 +Loop time of 0.51152 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 0 401.24089 -205562.85 24.755808 79 0.18753621 0 6.0138739 705.15041 3.5350432 0 0 0 0 1e+20 0 0 0 0 0 0 0 0 0 0 + 100 400.6027 -205547.79 21.854739 92 0.43709939 0.99825259 6.0138739 705.15041 4.230764 92.74 0.03245633 0.0067931852 0.99890138 0.98969319 1.0024404 0 0 0 0 0 2000 0 0 0 +Loop time of 0.453073 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 100 400.6027 -205547.79 21.854739 92 0.43709939 0.99825259 6.0138739 705.15041 4.230764 92.74 0.03245633 0.0067931852 0.99890138 0.98969319 1.0024404 0 0 0 0 0 2000 0 0 0 + 177 400.6027 -206534.96 21.854739 92 0.43709939 0.99825259 6.0138739 705.15041 4.230764 52.39548 0.03245633 0.0067931852 0.56435106 0.98969319 1.0024404 0 0 0 0 0 3540 0 0 0 +Loop time of 0.494676 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 100 400.6027 -205547.79 21.854339 92 0.43709939 0.99825259 6.0138739 705.15041 4.230764 92.74 0.03245633 0.0067931852 0.99890138 0.98969319 1.0024404 0 0 0 0 0 2000 0 0 0 + 200 400.46944 -205544.7 23.349576 97 0.33740983 0.99723256 6.0138739 705.15041 4.230764 92.525 0.040097271 0.0058362605 0.99830632 0.98259113 1.0048777 0 0 0 0 0 4000 0 0 0 +Loop time of 0.450918 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 200 400.46944 -205544.7 23.349576 97 0.33740983 0.99723256 6.0138739 705.15041 4.230764 92.525 0.040097271 0.0058362605 0.99830632 0.98259113 1.0048777 0 0 0 0 0 4000 0 0 0 + 273 400.46944 -206534.96 23.349576 97 0.33740983 0.99723256 6.0138739 705.15041 4.230764 67.783883 0.040097271 0.0058362605 0.73135994 0.98259113 1.0048777 0 0 0 0 0 5460 0 0 0 +Loop time of 0.488918 on 16 procs for 73 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 200 400.46944 -205544.7 23.349184 97 0.33740983 0.99723256 6.0138739 705.15041 4.230764 92.525 0.040097271 0.0058362605 0.99830632 0.98259113 1.0048777 0 0 0 0 0 4000 0 0 0 + 300 396.89568 -205540.38 19.394419 94 0.35022551 0.99673595 6.0138739 705.15041 4.230764 93.376667 0.047799236 0.0063898904 0.99785232 0.97756247 1.0073497 0 0 0 0 0 6000 0 0 0 +Loop time of 0.45579 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 300 396.89568 -205540.38 19.394419 94 0.35022551 0.99673595 6.0138739 705.15041 4.230764 93.376667 0.047799236 0.0063898904 0.99785232 0.97756247 1.0073497 0 0 0 0 0 6000 0 0 0 + 373 396.89568 -206534.96 19.394419 94 0.35022551 0.99673595 6.0138739 705.15041 4.230764 75.101877 0.047799236 0.0063898904 0.80256219 0.97756247 1.0073497 0 0 0 0 0 7460 0 0 0 +Loop time of 0.49254 on 16 procs for 73 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 300 396.89568 -205540.38 19.394206 94 0.35022551 0.99673595 6.0138739 705.15041 4.230764 93.376667 0.047799236 0.0063898904 0.99785232 0.97756247 1.0073497 0 0 0 0 0 6000 0 0 0 + 400 399.1218 -205541.68 18.990804 94 0.3505205 0.99638391 6.0138739 705.15041 4.230764 93.3775 0.055982437 0.0068271264 0.99752641 0.97044214 1.0098482 0 0 0 0 0 8000 0 0 0 +Loop time of 0.452751 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 400 399.1218 -205541.68 18.990804 94 0.3505205 0.99638391 6.0138739 705.15041 4.230764 93.3775 0.055982437 0.0068271264 0.99752641 0.97044214 1.0098482 0 0 0 0 0 8000 0 0 0 + 475 399.1218 -206534.96 18.990804 94 0.3505205 0.99638391 6.0138739 705.15041 4.230764 78.633684 0.055982437 0.0068271264 0.84002224 0.97044214 1.0098482 0 0 0 0 0 9500 0 0 0 +Loop time of 0.4963 on 16 procs for 75 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 400 399.1218 -205541.68 18.990689 94 0.3505205 0.99638391 6.0138739 705.15041 4.230764 93.3775 0.055982437 0.0068271264 0.99752641 0.97044214 1.0098482 0 0 0 0 0 8000 0 0 0 + 500 399.61667 -205539.79 19.794362 99 0.33740217 0.99633812 6.0138739 705.15041 4.230764 93.222 0.063096694 0.0076591363 0.99729174 0.96745199 1.0123163 0 0 0 0 0 10000 0 0 0 +Loop time of 0.45226 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 500 399.61667 -205539.79 19.794362 99 0.33740217 0.99633812 6.0138739 705.15041 4.230764 93.222 0.063096694 0.0076591363 0.99729174 0.96745199 1.0123163 0 0 0 0 0 10000 0 0 0 + 577 399.61667 -206534.96 19.794362 99 0.33740217 0.99633812 6.0138739 705.15041 4.230764 80.781629 0.063096694 0.0076591363 0.86420428 0.96745199 1.0123163 0 0 0 0 0 11540 0 0 0 +Loop time of 0.518479 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 500 399.61667 -205539.79 19.79402 99 0.33740217 0.99633812 6.0138739 705.15041 4.230764 93.222 0.063096694 0.0076591363 0.99729174 0.96745199 1.0123163 0 0 0 0 0 10000 0 0 0 + 600 397.41676 -205529.51 20.336863 99 0.35185916 0.99625666 6.0138739 705.15041 4.230764 93.621667 0.066686842 0.0091859078 0.99712746 0.96713729 1.0148143 0 0 0 0 0 12000 0 0 0 +Loop time of 0.452059 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 600 397.41676 -205529.51 20.336863 99 0.35185916 0.99625666 6.0138739 705.15041 4.230764 93.621667 0.066686842 0.0091859078 0.99712746 0.96713729 1.0148143 0 0 0 0 0 12000 0 0 0 + 677 397.41676 -206534.96 20.336863 99 0.35185916 0.99625666 6.0138739 705.15041 4.230764 82.973412 0.066686842 0.0091859078 0.8837171 0.96713729 1.0148143 0 0 0 0 0 13540 0 0 0 +Loop time of 0.5171 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 600 397.41676 -205529.51 20.336526 99 0.35185916 0.99625666 6.0138739 705.15041 4.230764 93.621667 0.066686842 0.0091859078 0.99712746 0.96713729 1.0148143 0 0 0 0 0 12000 0 0 0 + 700 403.33442 -205550.89 18.955866 93 0.42542334 0.99592297 6.0138739 705.15041 4.230764 94.135714 0.068078003 0.0094089081 0.99698101 0.9641519 1.0173022 0 0 0 0 0 14000 0 0 0 +Loop time of 0.450117 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 700 403.33442 -205550.89 18.955866 93 0.42542334 0.99592297 6.0138739 705.15041 4.230764 94.135714 0.068078003 0.0094089081 0.99698101 0.9641519 1.0173022 0 0 0 0 0 14000 0 0 0 + 783 403.33442 -206534.96 18.955866 93 0.42542334 0.99592297 6.0138739 705.15041 4.230764 84.157088 0.068078003 0.0094089081 0.89129847 0.9641519 1.0173022 0 0 0 0 0 15660 0 0 0 +Loop time of 0.541959 on 16 procs for 83 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 700 403.33442 -205550.89 18.955589 93 0.42542334 0.99592297 6.0138739 705.15041 4.230764 94.135714 0.068078003 0.0094089081 0.99698101 0.9641519 1.0173022 0 0 0 0 0 14000 0 0 0 + 800 397.5897 -205530.58 19.298375 97 0.42432974 0.99573055 6.0138739 705.15041 4.2562861 94.69125 0.070492258 0.0098477948 0.99683461 0.96199283 1.0198015 0 0 0 0 0 16000 0 0 0 +Loop time of 0.454322 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 800 397.5897 -205530.58 19.298375 97 0.42432974 0.99573055 6.0138739 705.15041 4.2562861 94.69125 0.070492258 0.0098477948 0.99683461 0.96199283 1.0198015 0 0 0 0 0 16000 0 0 0 + 877 397.5897 -206534.96 19.298375 97 0.42432974 0.99573055 6.0138739 705.15041 4.2562861 86.377423 0.070492258 0.0098477948 0.90931322 0.96199283 1.0198015 0 0 0 0 0 17540 0 0 0 +Loop time of 0.502899 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 800 397.5897 -205530.58 19.29822 97 0.42432974 0.99573055 6.0138739 705.15041 4.2562861 94.69125 0.070492258 0.0098477948 0.99683461 0.96199283 1.0198015 0 0 0 0 0 16000 0 0 0 + 900 402.04231 -205545.55 18.434766 91 0.34927854 0.99563819 6.0138739 705.15041 4.2562861 94.956667 0.072594517 0.0091737752 0.99670822 0.95723843 1.0223007 0 0 0 0 0 18000 0 0 0 +Loop time of 0.451618 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 900 402.04231 -205545.55 18.434766 91 0.34927854 0.99563819 6.0138739 705.15041 4.2562861 94.956667 0.072594517 0.0091737752 0.99670822 0.95723843 1.0223007 0 0 0 0 0 18000 0 0 0 + 976 402.04231 -206534.96 18.434766 91 0.34927854 0.99563819 6.0138739 705.15041 4.2562861 87.5625 0.072594517 0.0091737752 0.91909569 0.95723843 1.0223007 0 0 0 0 0 19520 0 0 0 +Loop time of 0.493429 on 16 procs for 76 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 900 402.04231 -205545.55 18.434576 91 0.34927854 0.99563819 6.0138739 705.15041 4.2562861 94.956667 0.072594517 0.0091737752 0.99670822 0.95723843 1.0223007 0 0 0 0 0 18000 0 0 0 + 1000 403.13682 -205538.62 20.371378 100 0.36854432 0.99555559 6.0138739 705.15041 4.2562861 94.973 0.075589904 0.0088025018 0.99659567 0.95567008 1.0247999 0 0 0 0 0 20000 0 0 0 +Loop time of 0.452482 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1000 403.13682 -205538.62 20.371378 100 0.36854432 0.99555559 6.0138739 705.15041 4.2562861 94.973 0.075589904 0.0088025018 0.99659567 0.95567008 1.0247999 0 0 0 0 0 20000 0 0 0 + 1081 403.13682 -206534.96 20.371378 100 0.36854432 0.99555559 6.0138739 705.15041 4.2562861 87.856614 0.075589904 0.0088025018 0.92192014 0.95567008 1.0247999 0 0 0 0 0 21620 0 0 0 +Loop time of 0.521678 on 16 procs for 81 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1000 403.13682 -205538.62 20.371013 100 0.36854432 0.99555559 6.0138739 705.15041 4.2562861 94.973 0.075589904 0.0088025018 0.99659567 0.95567008 1.0247999 0 0 0 0 0 20000 0 0 0 + 1100 401.64961 -205531.15 16.838899 93 0.37998317 0.99541314 6.0138739 705.15041 4.2562861 95.323636 0.077697032 0.0088979171 0.99649521 0.95206312 1.0272987 0 0 0 0 0 22000 0 0 0 +Loop time of 0.452415 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1100 401.64961 -205531.15 16.838899 93 0.37998317 0.99541314 6.0138739 705.15041 4.2562861 95.323636 0.077697032 0.0088979171 0.99649521 0.95206312 1.0272987 0 0 0 0 0 22000 0 0 0 + 1179 401.64961 -206534.96 16.838899 93 0.37998317 0.99541314 6.0138739 705.15041 4.2562861 88.936387 0.077697032 0.0088979171 0.92972412 0.95206312 1.0272987 0 0 0 0 0 23580 0 0 0 +Loop time of 0.50337 on 16 procs for 79 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1100 401.64961 -205531.15 16.838708 93 0.37998317 0.99541314 6.0138739 705.15041 4.2562861 95.323636 0.077697032 0.0088979171 0.99649521 0.95206312 1.0272987 0 0 0 0 0 22000 0 0 0 + 1200 400.40964 -205539.37 19.135216 99 0.67128843 0.99558682 6.0138739 705.15041 4.6317552 95.505 0.080458266 0.0085684868 0.99641317 0.95050066 1.029798 0 0 0 0 0 24000 0 0 0 +Loop time of 0.44891 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1200 400.40964 -205539.37 19.135216 99 0.67128843 0.99558682 6.0138739 705.15041 4.6317552 95.505 0.080458266 0.0085684868 0.99641317 0.95050066 1.029798 0 0 0 0 0 24000 0 0 0 + 1276 400.40964 -206534.97 19.135216 99 0.67128843 0.99558682 6.0138739 705.15041 4.6317552 89.816614 0.080458266 0.0085684868 0.93706567 0.95050066 1.029798 0 0 0 0 0 25520 0 0 0 +Loop time of 0.508519 on 16 procs for 76 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1200 400.40964 -205539.37 19.448471 100 0.41040038 0.99558682 6.0138739 705.141 4.6317552 95.505 0.080458266 0.0085684868 0.99641317 0.95050066 1.029798 2.2953088 0 0 0 0 24000 1 2 6 + 1300 401.71843 -205549 19.86411 94 0.31328255 0.99531422 6.0138739 705.141 4.6317552 95.636923 0.080786307 0.0080834567 0.99634504 0.95016182 1.0314365 2.2953088 0 0 0 0 26000 1 2 6 +Loop time of 0.453256 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1300 401.71843 -205549 19.86411 94 0.31328255 0.99531422 6.0138739 705.141 4.6317552 95.636923 0.080786307 0.0080834567 0.99634504 0.95016182 1.0314365 2.2953088 0 0 0 0 26000 1 2 6 + 1376 401.71843 -206534.97 19.86411 94 0.31328255 0.99531422 6.0138739 705.141 4.6317552 90.354651 0.080786307 0.0080834567 0.94131435 0.95016182 1.0314365 2.2953088 0 0 0 0 27520 1 2 6 +Loop time of 0.502886 on 16 procs for 76 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1300 401.71843 -205549 19.863856 94 0.31328255 0.99531422 6.0138739 705.141 4.6317552 95.636923 0.080786307 0.0080834567 0.99634504 0.95016182 1.0314365 2.2953088 0 0 0 0 26000 1 2 6 + 1400 397.79762 -205534.95 19.064761 90 0.33635396 0.99488167 6.0138739 705.141 4.6317552 95.55 0.080145025 0.0081557898 0.99625782 0.94925079 1.0339117 2.2953088 0 0 0 0 28000 1 2 6 +Loop time of 0.453094 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1400 397.79762 -205534.95 19.064761 90 0.33635396 0.99488167 6.0138739 705.141 4.6317552 95.55 0.080145025 0.0081557898 0.99625782 0.94925079 1.0339117 2.2953088 0 0 0 0 28000 1 2 6 + 1477 397.79762 -206534.97 19.064761 90 0.33635396 0.99488167 6.0138739 705.141 4.6317552 90.56872 0.080145025 0.0081557898 0.94432021 0.94925079 1.0339117 2.2953088 0 0 0 0 29540 1 2 6 +Loop time of 0.515217 on 16 procs for 77 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1400 397.79762 -205534.95 19.064345 90 0.33635396 0.99488167 6.0138739 705.141 4.6317552 95.55 0.080145025 0.0081557898 0.99625782 0.94925079 1.0339117 2.2953088 0 0 0 0 28000 1 2 6 + 1500 400.56079 -205539.86 18.860257 93 0.35488977 0.99467946 6.0138739 705.141 4.6317552 95.578667 0.080575861 0.0083561185 0.99615829 0.94636637 1.0355154 2.2953088 0 0 0 0 30000 1 2 6 +Loop time of 0.450111 on 16 procs for 100 steps with 37048 atoms + +Step Temp PotEng f_HL f_HL[1] f_HL[2] f_HL[3] f_HL[4] f_HL[5] f_HL[6] f_HL[7] f_HL[8] f_HL[9] f_HL[10] f_HL[11] f_HL[12] f_HL[13] f_HL[14] f_HL[15] f_HL[16] f_HL[17] f_HL[18] f_HL[19] f_HL[20] f_HL[21] + 1500 400.56079 -205539.86 18.860257 93 0.35488977 0.99467946 6.0138739 705.141 4.6317552 95.578667 0.080575861 0.0083561185 0.99615829 0.94636637 1.0355154 2.2953088 0 0 0 0 30000 1 2 6 + 1584 400.56079 -206534.97 18.860257 93 0.35488977 0.99467946 6.0138739 705.141 4.6317552 90.510101 0.080575861 0.0083561185 0.94333171 0.94636637 1.0355154 2.2953088 0 0 0 0 31680 1 2 6 +Loop time of 0.566455 on 16 procs for 84 steps with 37048 atoms + +Final hyper stats ... + +Cummulative quantities for fix hyper: + hyper time = 30000 + time boost factor = 4000 + event timesteps = 1 + # of atoms in events = 2 +Quantities for this hyper run: + event timesteps = 1 + # of atoms in events = 2 + max length of any bond = 4.63176 + max drift distance of any atom = 2.29531 + fraction of biased bonds with zero bias = 0.0805759 + fraction of biased bonds with negative strain = 0.00835612 +Current quantities: + ave bonds/atom = 6.01387 +Cummulative quantities specific to fix hyper/local: + # of new bonds formed = 6 + max bonds/atom = 13 +Quantities for this hyper run specific to fix hyper/local: + ave biased bonds/step = 95.5787 + ave bias coeff of all bonds = 0.996158 + min bias coeff of any bond = 0.946366 + max bias coeff of any bond = 1.03552 + max dist from my subbox of any non-maxstrain bond ghost atom = 0 + max dist from my box of any bond ghost atom = 0 + count of bond ghost neighbors not found on reneighbor steps = 0 + bias overlaps = 0 + CPU time for bond builds = 0.0147002 +Current quantities specific to fix hyper/local: + neighbor bonds/bond = 705.141 + ave boost coeff for all bonds = 0.994679 + +Loop time of 14.9193 on 16 procs for 1500 steps with 37048 atoms + +Performance: 43.434 ns/day, 0.553 hours/ns, 100.541 timesteps/s +128.3% CPU use with 16 MPI tasks x no OpenMP threads + +Hyper stats: + Dynamics time (%) = 6.78318 (45.4657) + Quench time (%) = 7.66443 (51.3725) + Other time (%) = 0.189889 (1.27277) + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 11.726 | 11.881 | 12.051 | 2.6 | 79.64 +Neigh | 0.49995 | 0.52243 | 0.54427 | 1.9 | 3.50 +Comm | 0.34477 | 0.51495 | 0.62326 | 10.4 | 3.45 +Output | 0.0017493 | 0.0017652 | 0.0018535 | 0.1 | 0.01 +Modify | 1.7669 | 1.8088 | 1.8523 | 1.7 | 12.12 +Other | | 0.1899 | | | 1.27 + +Nlocal: 2315.5 ave 2353 max 2275 min +Histogram: 1 1 1 3 0 2 5 2 0 1 +Nghost: 3187.62 ave 3228 max 3148 min +Histogram: 1 0 2 4 2 2 1 3 0 1 +Neighs: 54002.8 ave 54567 max 53263 min +Histogram: 1 0 2 1 3 2 2 1 1 3 +FullNghs: 542996 ave 554820 max 527895 min +Histogram: 1 0 0 4 1 3 3 2 0 2 + +Total # of neighbors = 8687932 +Ave neighs/atom = 234.505 +Neighbor list builds = 166 +Dangerous builds = 0 +Total wall time: 0:00:19 From 5554deda39f57649d32648523df2f55a6f4f6997 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 10:07:07 -0600 Subject: [PATCH 124/243] fixed 2 spelling errors --- doc/src/fix_ave_histo.txt | 2 +- doc/src/fix_hyper_local.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_ave_histo.txt b/doc/src/fix_ave_histo.txt index 6f99685682..0a17813d21 100644 --- a/doc/src/fix_ave_histo.txt +++ b/doc/src/fix_ave_histo.txt @@ -94,7 +94,7 @@ different kinds (e.g. global and per-atom) cannot be mixed. Atom attributes are per-atom vector values. See the doc page for individual "compute" and "fix" commands to see what kinds of quantities they generate. See the optional {kind} keyword below for -how to force the fix ave/histo command to dis-ambiguate if necessary. +how to force the fix ave/histo command to disambiguate if necessary. Note that the output of this command is a single histogram for all input values combined together, not one histogram per input value. diff --git a/doc/src/fix_hyper_local.txt b/doc/src/fix_hyper_local.txt index 7f12e37999..185fa8f20b 100644 --- a/doc/src/fix_hyper_local.txt +++ b/doc/src/fix_hyper_local.txt @@ -280,7 +280,7 @@ bias. The output of these stats are the vector values 14 and 15, described below. If this keyword is not enabled, the output of the stats will be zero. -The {check/bias} keyword turns on extra computation and communcation +The {check/bias} keyword turns on extra computation and communication to check if any biased bonds are closer than {Dcut} to each other, which should not be the case if LHD is operating correctly. Thus it is a debugging check. The {Nevery} setting determines how often the From e04ab5197032679d563d3f15cc7931bdf5b98960 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 10:20:32 -0600 Subject: [PATCH 125/243] bug fix for new fix shake redezvous comm --- src/RIGID/fix_shake.h | 2 +- src/comm.cpp | 41 ++++++++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index 2baea90a4a..b99a35f958 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -159,8 +159,8 @@ class FixShake : public Fix { struct ShakeInfo { tagint atomID; + tagint shake_atom[4]; int shake_flag; - int shake_atom[4]; int shake_type[3]; }; diff --git a/src/comm.cpp b/src/comm.cpp index e8a796036c..729f96581a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -810,7 +810,12 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd comm stage + if (flag == 0) { + if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + irregular1_bytes); + return 0; // all nout_rvous are 0, no 2nd comm stage + } // irregular comm of outbuf from rendezvous decomp back to caller decomp // caller will free outbuf @@ -952,9 +957,17 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(recvcount); memory->destroy(sdispls); memory->destroy(rdispls); + if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + 4*nprocs*sizeof(int) + all2all1_bytes); return 0; // all nout_rvous are 0, no 2nd irregular } + + + + + // create procs and outbuf for All2all if necesary if (!outorder) { @@ -1102,10 +1115,15 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, fprintf(screen," input data (MB): %g %g %g %g\n", 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_out_all/outsize,1.0*size_out_all/nprocs/outsize, - size_out_max/outsize,size_out_min/outsize); + if (outsize) + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + else + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + 0,0.0,0,0); fprintf(screen," output data (MB): %g %g %g %g\n", 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); @@ -1116,10 +1134,15 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, fprintf(screen," input rvous data (MB): %g %g %g %g\n", 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, - size_outrvous_max/outsize,size_outrvous_min/outsize); + if (outsize) + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + else + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + 0,0.0,0,0); fprintf(screen," output rvous data (MB): %g %g %g %g\n", 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); From a20d58312daf5679e386f7c0a5d4f07e23558732 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 12:25:50 -0400 Subject: [PATCH 126/243] add missing convesion to fractional coordinates and back for enforced PBC dumps of triclinic cells --- src/dump.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dump.cpp b/src/dump.cpp index 7cd80dcf71..8fa07a9cb2 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -423,7 +423,12 @@ void Dump::write() atom->x = xpbc; atom->v = vpbc; atom->image = imagepbc; + + // for triclinic, PBC is applied in lamda coordinates + + if (domain->triclinic) domain->x2lamda(nlocal); domain->pbc(); + if (domain->triclinic) domain->lamda2x(nlocal); } // pack my data into buf From ab748ffe488ddefdb34f4ebc2f988f36df3c42eb Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 10:29:06 -0600 Subject: [PATCH 127/243] turn off diagnostic output for rendezvous op --- src/RIGID/fix_rigid_small.cpp | 2 +- src/RIGID/fix_shake.cpp | 8 ++++---- src/special.cpp | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index bee5570316..9a30fdf911 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1592,7 +1592,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) int nreturn = comm->rendezvous(RVOUS,ncount,(char *) inbuf,sizeof(InRvous), 0,proclist, rendezvous_body,0,buf,sizeof(OutRvous), - (void *) this,1); + (void *) this); OutRvous *outbuf = (OutRvous *) buf; memory->destroy(proclist); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 2d3244885d..dcdb190d45 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1072,7 +1072,7 @@ void FixShake::atom_owners() char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, - rendezvous_ids,0,buf,0,(void *) this,1); + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -1180,7 +1180,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), - (void *) this,1); + (void *) this); PartnerInfo *outbuf = (PartnerInfo *) buf; memory->destroy(proclist); @@ -1268,7 +1268,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), - (void *) this,1); + (void *) this); NShakeInfo *outbuf = (NShakeInfo *) buf; memory->destroy(proclist); @@ -1361,7 +1361,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), - (void *) this,1); + (void *) this); ShakeInfo *outbuf = (ShakeInfo *) buf; memory->destroy(proclist); diff --git a/src/special.cpp b/src/special.cpp index a0739d6ccc..b9287df472 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -188,7 +188,7 @@ void Special::atom_owners() char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, - rendezvous_ids,0,buf,0,(void *) this,1); + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -246,7 +246,7 @@ void Special::onetwo_build_newton() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -381,7 +381,7 @@ void Special::onethree_build() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -486,7 +486,7 @@ void Special::onefour_build() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -909,7 +909,7 @@ void Special::angle_trim() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1128,7 +1128,7 @@ void Special::dihedral_trim() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); From 3e8c1c801bc50822dff13447dd1b902495638510 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 14:03:29 -0400 Subject: [PATCH 128/243] add some degree of endian detection to hashlittle.cpp --- src/hashlittle.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index be930217a1..f1d4e61142 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -2,10 +2,26 @@ // from lookup3.c, by Bob Jenkins, May 2006, Public Domain // bob_jenkins@burtleburtle.net -#include "stddef.h" -#include "stdint.h" +#include +#include +#include -#define HASH_LITTLE_ENDIAN 1 // Intel and AMD are little endian +// if the system defines the __BYTE_ORDER__ define, +// we use it instead of guessing the platform + +#if defined(__BYTE_ORDER__) +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define HASH_LITTLE_ENDIAN 1 +# else +# define HASH_LITTLE_ENDIAN 0 +# endif +#else // heuristic platform guess +# if defined(__bg__) +# define HASH_LITTLE_ENDIAN 0 // IBM BlueGene is big endian +# else +# define HASH_LITTLE_ENDIAN 1 // Intel and AMD x86 are little endian +# endif +#endif #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) From a726362888c430734faf9d499ccb03ca3b383146 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 25 Mar 2019 12:57:42 -0600 Subject: [PATCH 129/243] Commit JT 032519 - adding all min files into new branch - preparing branch for pull request of spin minimizer --- doc/src/min_modify.txt | 19 +- doc/src/min_spin.txt | 63 +++++ doc/src/min_style.txt | 7 +- doc/src/minimize.txt | 7 + examples/SPIN/spinmin/in.spinmin.bfo | 57 +++++ examples/SPIN/spinmin/in.spinmin.iron | 57 +++++ src/SPIN/fix_precession_spin.cpp | 9 +- src/SPIN/fix_precession_spin.h | 1 + src/SPIN/min_spin.cpp | 339 ++++++++++++++++++++++++++ src/SPIN/min_spin.h | 59 +++++ src/min.cpp | 6 +- src/min.h | 1 + 12 files changed, 620 insertions(+), 5 deletions(-) create mode 100644 doc/src/min_spin.txt create mode 100644 examples/SPIN/spinmin/in.spinmin.bfo create mode 100644 examples/SPIN/spinmin/in.spinmin.iron create mode 100644 src/SPIN/min_spin.cpp create mode 100644 src/SPIN/min_spin.h diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 9408eea167..525d6716d8 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -13,11 +13,15 @@ min_modify command :h3 min_modify keyword values ... :pre one or more keyword/value pairs may be listed :ulb,l -keyword = {dmax} or {line} +keyword = {dmax} or {line} or {alpha_damp} or {discret_factor} {dmax} value = max max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} - backtrack,quadratic,forcezero = style of linesearch to use :pre + backtrack,quadratic,forcezero = style of linesearch to use + {alpha_damp} value = damping + damping = fictitious Gilbert damping for spin minimization (adim) + {discret_factor} value = factor + factor = discretization factor for adaptive spin timestep (adim) :pre :ule [Examples:] @@ -65,6 +69,17 @@ difference of two large values (energy before and energy after) and that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. +Keywords {alpha_damp} and {discret_factor} only make sense when +a "min_spin"_min_spin.html command is declared. +Keyword {alpha_damp} defines an analog of a magnetic Gilbert +damping. It defines a relaxation rate toward an equilibrium for +a given magnetic system. +Keyword {discret_factor} defines a discretization factor for the +adaptive timestep used in the {spin} minimization. +See "min_spin"_min_spin.html for more information about those +quantities. +Default values are alpha_damp = 1.0 and discret_factor = 10.0. + [Restrictions:] none [Related commands:] diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt new file mode 100644 index 0000000000..468cde0fec --- /dev/null +++ b/doc/src/min_spin.txt @@ -0,0 +1,63 @@ +"LAMMPS WWW Page"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands_all.html) + +:line + +min_style spin command :h3 + +[Syntax:] + +min_style spin :pre + +[Examples:] + +min_style spin +min_modify alpha_damp 1.0 discret_factor 10.0 :pre + +[Description:] + +Apply a minimization algorithm to use when a "minimize"_minimize.html +command is performed. + +Style {spin} defines a damped spin dynamics with an adaptive +timestep, according to: + +:c,image(Eqs/min_spin_damping.jpg) + +with lambda a damping coefficient (similar to a Gilbert damping) +Lambda can be defined by setting the {alpha_damp} keyword with the +"min_modify"_min_modify.html command. + +The minimization procedure solves this equation using an +adaptive timestep. The value of this timestep is conditionned +by the largest precession frequency that has to be solved in the +system: + +:c,image(Eqs/min_spin_timestep.jpg) + +with |omega|_{max} the norm of the largest precession frequency +in the system (across all processes, and across all replicas if a +spin/neb calculation is performed). + +Kappa defines a discretization factor {discret_factor} for the +definition of this timestep. +{discret_factor} can be defined with the "min_modify"_min_modify.html +command. + +NOTE: The {spin} style replaces the force tolerance by a torque +tolerance. See "minimize"_minimize.html for more explanation. + +[Restrictions:] none + +[Related commands:] + +"min_style"_min_style.html, "minimize"_minimize.html, +"min_modify"_min_modify.html + +[Default:] + +The option defaults are alpha_damp = 1.0 and discret_factor = +10.0. diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index 4948a34864..c46c1492b4 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -11,11 +11,12 @@ min_style command :h3 min_style style :pre -style = {cg} or {hftn} or {sd} or {quickmin} or {fire} :ul +style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} :ul [Examples:] min_style cg +min_style spin min_style fire :pre [Description:] @@ -61,6 +62,10 @@ the velocity non-parallel to the current force vector. The velocity of each atom is initialized to 0.0 by this style, at the beginning of a minimization. +Style {spin} is a damped spin dynamics with an adaptive +timestep. +See the "min/spin"_min_spin.html doc page for more information. + Either the {quickmin} and {fire} styles are useful in the context of nudged elastic band (NEB) calculations via the "neb"_neb.html command. diff --git a/doc/src/minimize.txt b/doc/src/minimize.txt index 00de86c5f5..ecf1ad0fcf 100644 --- a/doc/src/minimize.txt +++ b/doc/src/minimize.txt @@ -103,6 +103,13 @@ the line search fails because the step distance backtracks to 0.0 the number of outer iterations or timesteps exceeds {maxiter} the number of total force evaluations exceeds {maxeval} :ul +NOTE: the "minimization style"_min_style.html {spin} replaces +the force tolerance {ftol} by a torque tolerance. +The minimization procedure stops if the 2-norm (length) of the +global torque vector (defined as the cross product between the +spins and their precession vectors omega) is less than {ftol}, +or if any of the other criteria are met. + NOTE: You can also use the "fix halt"_fix_halt.html command to specify a general criterion for exiting a minimization, that is a calculation performed on the state of the current system, as defined by an diff --git a/examples/SPIN/spinmin/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo new file mode 100644 index 0000000000..5b678c8a4d --- /dev/null +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -0,0 +1,57 @@ +# bfo in a 3d periodic box + +units metal +dimension 3 +boundary p p f +atom_style spin + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice sc 3.96 +region box block 0.0 34.0 0.0 34.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 1.0 +set group all spin/random 11 2.50 + +pair_style hybrid/overlay spin/exchange 6.0 spin/magelec 4.5 spin/dmi 4.5 +pair_coeff * * spin/exchange exchange 6.0 -0.01575 0.0 1.965 +#pair_coeff * * spin/magelec magelec 4.5 0.000109 1.0 1.0 1.0 +pair_coeff * * spin/magelec magelec 4.5 0.00109 1.0 1.0 1.0 +pair_coeff * * spin/dmi dmi 4.5 0.00005 1.0 1.0 1.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#fix 1 all precession/spin zeeman 0.001 0.0 0.0 1.0 anisotropy 0.01 1.0 0.0 0.0 +fix 1 all precession/spin anisotropy 0.0000033 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.1 21 +fix 3 all nve/spin lattice no + +timestep 0.0001 + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo 50 +thermo_style custom step time v_magnorm v_emag v_tmag temp etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] + +min_style spin +min_modify alpha_damp 1.0 discret_factor 10.0 +minimize 0.0 0.0 10000 1000 diff --git a/examples/SPIN/spinmin/in.spinmin.iron b/examples/SPIN/spinmin/in.spinmin.iron new file mode 100644 index 0000000000..b87a811cc7 --- /dev/null +++ b/examples/SPIN/spinmin/in.spinmin.iron @@ -0,0 +1,57 @@ +# bcc iron in a 3d periodic box + +units metal +dimension 3 +boundary p p f +atom_style spin + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 4.0 0.0 4.0 0.0 4.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin/random 31 2.2 +#set group all spin 2.2 1.0 1.0 -1.0 + +pair_style spin/exchange 3.5 +pair_coeff * * exchange 3.4 0.02726 0.2171 1.841 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#fix 1 all precession/spin zeeman 0.001 0.0 0.0 1.0 anisotropy 0.01 1.0 0.0 0.0 +fix 1 all precession/spin anisotropy 0.0001 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.1 21 +fix 3 all nve/spin lattice no + +timestep 0.0001 + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magx equal c_out_mag[1] +variable magy equal c_out_mag[2] +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo 100 +thermo_style custom step time v_magx v_magz v_magnorm v_tmag etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 100 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] + +min_style spin +min_modify alpha_damp 1.0 discret_factor 10.0 +minimize 1.0e-10 1.0e-10 100000 1000 diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 6ccb692033..d065f38d16 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -170,7 +170,14 @@ void FixPrecessionSpin::setup(int vflag) /* ---------------------------------------------------------------------- */ -void FixPrecessionSpin::post_force(int /*vflag*/) +void FixPrecessionSpin::min_setup(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixPrecessionSpin::post_force(int vflag) { // update mag field with time (potential improvement) diff --git a/src/SPIN/fix_precession_spin.h b/src/SPIN/fix_precession_spin.h index 2fe6b5a673..1db4d32ae9 100644 --- a/src/SPIN/fix_precession_spin.h +++ b/src/SPIN/fix_precession_spin.h @@ -33,6 +33,7 @@ class FixPrecessionSpin : public Fix { int setmask(); void init(); void setup(int); + void min_setup(int); void post_force(int); void post_force_respa(int, int, int); void min_post_force(int); diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp new file mode 100644 index 0000000000..99aa4ac3b7 --- /dev/null +++ b/src/SPIN/min_spin.cpp @@ -0,0 +1,339 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + + Please cite the related publication: +------------------------------------------------------------------------- */ + +#include +#include +#include "min_spin.h" +#include "universe.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "output.h" +#include "timer.h" +#include "error.h" +#include +#include +#include "modify.h" +#include "math_special.h" +#include "math_const.h" +#include "fix_neb_spin.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +// EPS_ENERGY = minimum normalization for energy tolerance + +#define EPS_ENERGY 1.0e-8 + +#define DELAYSTEP 5 + +/* ---------------------------------------------------------------------- */ + +MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) {} + +/* ---------------------------------------------------------------------- */ + +void MinSpin::init() +{ + alpha_damp = 1.0; + discret_factor = 10.0; + + Min::init(); + + dts = dt = update->dt; + last_negative = update->ntimestep; +} + +/* ---------------------------------------------------------------------- */ + +void MinSpin::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + // check if the atom/spin style is defined + + if (!atom->sp_flag) + error->all(FLERR,"min/spin requires atom/spin style"); + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int MinSpin::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"alpha_damp") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + alpha_damp = force->numeric(FLERR,arg[1]); + return 2; + } + if (strcmp(arg[0],"discret_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + discret_factor = force->numeric(FLERR,arg[1]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpin::reset_vectors() +{ + // atomic dof + + // size sp is 4N vector + nvec = 4 * atom->nlocal; + if (nvec) spvec = atom->sp[0]; + + nvec = 3 * atom->nlocal; + if (nvec) fmvec = atom->fm[0]; + + if (nvec) xvec = atom->x[0]; + if (nvec) fvec = atom->f[0]; +} + +/* ---------------------------------------------------------------------- + minimization via damped spin dynamics +------------------------------------------------------------------------- */ + +int MinSpin::iterate(int maxiter) +{ + bigint ntimestep; + double fmdotfm,fmdotfmall; + int flag,flagall; + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + // need a force calculation for timestep optimization + + energy_force(0); + dts = evaluate_dt(); + + // apply damped precessional dynamics to the spins + + advance_spins(dts); + + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + + //// energy tolerance criterion + //// only check after DELAYSTEP elapsed since velocties reset to 0 + //// sync across replicas if running multi-replica minimization + + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { + if (update->multireplica == 0) { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + return ETOL; + } else { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return ETOL; + } + } + + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization + + if (update->ftol > 0.0) { + fmdotfm = fmnorm_sqr(); + if (update->multireplica == 0) { + if (fmdotfm < update->ftol*update->ftol) return FTOL; + } else { + if (fmdotfm < update->ftol*update->ftol) flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return FTOL; + } + } + + // output for thermo, dump, restart files + + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } + } + + return MAXITER; +} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double MinSpin::evaluate_dt() +{ + double dtmax; + double fmsq; + double fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + int *mask = atom->mask; + double **fm = atom->fm; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); + + // define max timestep by dividing by the + // inverse of max frequency by discret_factor + + dtmax = MY_2PI/(discret_factor*sqrt(fmaxsqall)); + + return dtmax; +} + +/* ---------------------------------------------------------------------- + geometric damped advance of spins +---------------------------------------------------------------------- */ + +void MinSpin::advance_spins(double dts) +{ + int nlocal = atom->nlocal; + int *mask = atom->mask; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx,tdampy,tdampz; + double msq,scale,fm2,energy,dts2; + double cp[3],g[3]; + + dts2 = dts*dts; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + // apply advance algorithm (geometric, norm preserving) + + fm2 = (tdampx*tdampx+tdampy*tdampy+tdampz*tdampz); + energy = (sp[i][0]*tdampx)+(sp[i][1]*tdampy)+(sp[i][2]*tdampz); + + cp[0] = tdampy*sp[i][2]-tdampz*sp[i][1]; + cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; + cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; + + g[0] = sp[i][0]+cp[0]*dts; + g[1] = sp[i][1]+cp[1]*dts; + g[2] = sp[i][2]+cp[2]*dts; + + g[0] += (tdampx*energy-0.5*sp[i][0]*fm2)*0.5*dts2; + g[1] += (tdampy*energy-0.5*sp[i][1]*fm2)*0.5*dts2; + g[2] += (tdampz*energy-0.5*sp[i][2]*fm2)*0.5*dts2; + + g[0] /= (1+0.25*fm2*dts2); + g[1] /= (1+0.25*fm2*dts2); + g[2] /= (1+0.25*fm2*dts2); + + sp[i][0] = g[0]; + sp[i][1] = g[1]; + sp[i][2] = g[2]; + + // renormalization (check if necessary) + + msq = g[0]*g[0] + g[1]*g[1] + g[2]*g[2]; + scale = 1.0/sqrt(msq); + sp[i][0] *= scale; + sp[i][1] *= scale; + sp[i][2] *= scale; + + // no comm. to atoms with same tag + // because no need for simplecticity + } +} + +/* ---------------------------------------------------------------------- + compute and return ||mag. torque||_2^2 +------------------------------------------------------------------------- */ + +double MinSpin::fmnorm_sqr() +{ + int i,n; + double *fmatom; + + int nlocal = atom->nlocal; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + // calc. magnetic torques + + double local_norm2_sqr = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + local_norm2_sqr += tx*tx + ty*ty + tz*tz; + } + + // no extra atom calc. for spins + + if (nextra_atom) + error->all(FLERR,"extra atom option not available yet"); + + double norm2_sqr = 0.0; + MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); + + return norm2_sqr; +} + diff --git a/src/SPIN/min_spin.h b/src/SPIN/min_spin.h new file mode 100644 index 0000000000..569bcbaab2 --- /dev/null +++ b/src/SPIN/min_spin.h @@ -0,0 +1,59 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin,MinSpin) + +#else + +#ifndef LMP_MIN_SPIN_H +#define LMP_MIN_SPIN_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpin : public Min { + public: + MinSpin(class LAMMPS *); + ~MinSpin() {} + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(double); + double fmnorm_sqr(); + + private: + + // global and spin timesteps + + double dt; + double dts; + + double alpha_damp; // damping for spin minimization + double discret_factor; // factor for spin timestep evaluation + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + bigint last_negative; +}; + +} + +#endif +#endif diff --git a/src/min.cpp b/src/min.cpp index cd9253f8d3..2a42a444a0 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -655,7 +655,11 @@ void Min::modify_params(int narg, char **arg) else if (strcmp(arg[iarg+1],"forcezero") == 0) linestyle = 2; else error->all(FLERR,"Illegal min_modify command"); iarg += 2; - } else error->all(FLERR,"Illegal min_modify command"); + } else { + int n = modify_param(narg-iarg,&arg[iarg]); + if (n == 0) error->all(FLERR,"Illegal fix_modify command"); + iarg += n; + } } } diff --git a/src/min.h b/src/min.h index 92da97c664..a63254231c 100644 --- a/src/min.h +++ b/src/min.h @@ -38,6 +38,7 @@ class Min : protected Pointers { int request(class Pair *, int, double); virtual bigint memory_usage() {return 0;} void modify_params(int, char **); + virtual int modify_param(int, char **) {return 0;} double fnorm_sqr(); double fnorm_inf(); From 7a00997a14687f049cd3f9a3124d4143a8010d5b Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 25 Mar 2019 14:03:28 -0600 Subject: [PATCH 130/243] Commit2 JT 032519 - added equations for documentation - updated examples (not calling fix nve/spin) - replaced error message by warning in all pair/spin --- doc/src/Eqs/min_spin_damping.jpg | Bin 0 -> 7035 bytes doc/src/Eqs/min_spin_damping.tex | 13 +++++++++++++ doc/src/Eqs/min_spin_timestep.jpg | Bin 0 -> 5984 bytes doc/src/Eqs/min_spin_timestep.tex | 14 ++++++++++++++ doc/src/min_spin.txt | 8 ++++++-- examples/SPIN/spinmin/in.spinmin.bfo | 2 -- examples/SPIN/spinmin/in.spinmin.iron | 2 -- src/SPIN/min_spin.cpp | 1 - src/SPIN/pair_spin_dmi.cpp | 2 +- src/SPIN/pair_spin_exchange.cpp | 2 +- src/SPIN/pair_spin_magelec.cpp | 2 +- src/SPIN/pair_spin_neel.cpp | 2 +- 12 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 doc/src/Eqs/min_spin_damping.jpg create mode 100644 doc/src/Eqs/min_spin_damping.tex create mode 100644 doc/src/Eqs/min_spin_timestep.jpg create mode 100644 doc/src/Eqs/min_spin_timestep.tex diff --git a/doc/src/Eqs/min_spin_damping.jpg b/doc/src/Eqs/min_spin_damping.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c700cc67863762a99f9b9e3df0cb945612a2e38 GIT binary patch literal 7035 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 B|8W2S literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/min_spin_damping.tex b/doc/src/Eqs/min_spin_damping.tex new file mode 100644 index 0000000000..88b05447d3 --- /dev/null +++ b/doc/src/Eqs/min_spin_damping.tex @@ -0,0 +1,13 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \frac{d \vec{s}_{i}}{dt} = \lambda\, \vec{s}_{i} \times\left( \vec{\omega}_{i} \times\vec{s}_{i} \right) + \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/Eqs/min_spin_timestep.jpg b/doc/src/Eqs/min_spin_timestep.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d8f8d07f9ff6ef23a0b8a136b05bf36a1952bb6 GIT binary patch literal 5984 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 QPIn^d(7|c_7&spP7aqDz-T(jq literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/min_spin_timestep.tex b/doc/src/Eqs/min_spin_timestep.tex new file mode 100644 index 0000000000..b0f6e68e4d --- /dev/null +++ b/doc/src/Eqs/min_spin_timestep.tex @@ -0,0 +1,14 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + {\Delta t}_{\rm max} = \frac{2\pi}{\kappa + \left|\vec{\omega}_{\rm max} \right|} + \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 468cde0fec..de25100102 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -27,7 +27,8 @@ timestep, according to: :c,image(Eqs/min_spin_damping.jpg) -with lambda a damping coefficient (similar to a Gilbert damping) +with lambda a damping coefficient (similar to a Gilbert +damping). Lambda can be defined by setting the {alpha_damp} keyword with the "min_modify"_min_modify.html command. @@ -50,7 +51,10 @@ command. NOTE: The {spin} style replaces the force tolerance by a torque tolerance. See "minimize"_minimize.html for more explanation. -[Restrictions:] none +[Restrictions:] + +This minimization procedure is only applied to spin degrees of +fredom for a frozen lattice configuration. [Related commands:] diff --git a/examples/SPIN/spinmin/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo index 5b678c8a4d..511fa26b20 100644 --- a/examples/SPIN/spinmin/in.spinmin.bfo +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -30,8 +30,6 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 0.001 0.0 0.0 1.0 anisotropy 0.01 1.0 0.0 0.0 fix 1 all precession/spin anisotropy 0.0000033 0.0 0.0 1.0 fix_modify 1 energy yes -fix 2 all langevin/spin 0.0 0.1 21 -fix 3 all nve/spin lattice no timestep 0.0001 diff --git a/examples/SPIN/spinmin/in.spinmin.iron b/examples/SPIN/spinmin/in.spinmin.iron index b87a811cc7..1f84d4fc9b 100644 --- a/examples/SPIN/spinmin/in.spinmin.iron +++ b/examples/SPIN/spinmin/in.spinmin.iron @@ -28,8 +28,6 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 0.001 0.0 0.0 1.0 anisotropy 0.01 1.0 0.0 0.0 fix 1 all precession/spin anisotropy 0.0001 0.0 0.0 1.0 fix_modify 1 energy yes -fix 2 all langevin/spin 0.0 0.1 21 -fix 3 all nve/spin lattice no timestep 0.0001 diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 99aa4ac3b7..61a61cd6bf 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -32,7 +32,6 @@ #include "modify.h" #include "math_special.h" #include "math_const.h" -#include "fix_neb_spin.h" using namespace LAMMPS_NS; using namespace MathConst; diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 200cafb999..e9e6691a88 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -174,7 +174,7 @@ void PairSpinDmi::init_style() ifix++; } if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 5b8ec60cd6..aecbbeb97d 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -161,7 +161,7 @@ void PairSpinExchange::init_style() ifix++; } if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 95c29b233d..be1cbcd6c4 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -167,7 +167,7 @@ void PairSpinMagelec::init_style() ifix++; } if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 64fca23b7a..58173892d9 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -174,7 +174,7 @@ void PairSpinNeel::init_style() ifix++; } if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin From 30be5e94d9c7990a3e97ba6bda5cbaed953881a3 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 25 Mar 2019 14:22:16 -0600 Subject: [PATCH 131/243] Commit3 JT 032519 - updated the README file - updated examples/SPIN/spinmin/ --- examples/SPIN/spinmin/in.spinmin.bfo | 2 +- src/SPIN/README | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/SPIN/spinmin/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo index 511fa26b20..95a1a0f29f 100644 --- a/examples/SPIN/spinmin/in.spinmin.bfo +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -52,4 +52,4 @@ dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3 min_style spin min_modify alpha_damp 1.0 discret_factor 10.0 -minimize 0.0 0.0 10000 1000 +minimize 1.0e-10 0.0 1000 100 diff --git a/src/SPIN/README b/src/SPIN/README index e371e39767..53e456bacb 100644 --- a/src/SPIN/README +++ b/src/SPIN/README @@ -9,6 +9,7 @@ atom in the system * implementing magnetic pair interactions and magnetic forces * thermostating and applying a transverse damping to the magnetic spins * computing and outputing magnetic quantities +* minimizing the energy or total torque of a magnetic system The different options provided by this package are explained in the LAMMPS documentation. From b0a741fc58023ff1cb6303030fb1e39bf63cdce1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 16:51:35 -0400 Subject: [PATCH 132/243] add support for --prefix to python module installer --- python/install.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/python/install.py b/python/install.py index ab54adee56..613b3e4c84 100644 --- a/python/install.py +++ b/python/install.py @@ -22,8 +22,12 @@ parser.add_argument("-l", "--lib", required=True, help="path to the compiled LAMMPS shared library") parser.add_argument("-v", "--version", required=True, help="path to the LAMMPS version.h header file") -parser.add_argument("-d","--dir", - help="custom installation folder for module and library") + +pgroup = parser.add_mutually_exclusive_group() +pgroup.add_argument("-d","--dir", + help="Legacy custom installation folder for module and library") +pgroup.add_argument("-p","--prefix", + help="Installation prefix for module and library") args = parser.parse_args() @@ -61,6 +65,14 @@ if args.dir: else: args.dir = os.path.abspath(args.dir) +if args.prefix: + if not os.path.isdir(args.prefix): + print( "ERROR: Installation prefix folder %s does not exist" % args.prefix) + parser.print_help() + sys.exit(1) + else: + args.prefix = os.path.abspath(args.prefix) + # if a custom directory is given, we copy the files directly # without any special processing or additional steps to that folder @@ -78,7 +90,7 @@ if args.dir: pass # fail silently sys.exit() - + # extract version string from header fp = open(args.version,'r') txt=fp.read().split('"')[1].split() @@ -96,15 +108,18 @@ import site tryuser=False try: - sys.argv = ["setup.py","install"] # as if had run "python setup.py install" + if args.prefix: + sys.argv = ["setup.py","install","--prefix=%s" % args.prefix] # as if had run "python setup.py install --prefix=XXX" + else: + sys.argv = ["setup.py","install"] # as if had run "python setup.py install" setup(name = "lammps", version = verstr, author = "Steve Plimpton", author_email = "sjplimp@sandia.gov", - url = "http://lammps.sandia.gov", + url = "https://lammps.sandia.gov", description = "LAMMPS Molecular Dynamics Python module", py_modules = ["lammps"], - data_files = [(get_python_lib(), [args.lib])]) + data_files = [(get_python_lib(prefix=args.prefix), [args.lib])]) except: tryuser=True print ("Installation into global site-packages folder failed.\nTrying user folder %s now." % site.USER_SITE) @@ -116,12 +131,11 @@ if tryuser: version = verstr, author = "Steve Plimpton", author_email = "sjplimp@sandia.gov", - url = "http://lammps.sandia.gov", + url = "https://lammps.sandia.gov", description = "LAMMPS Molecular Dynamics Python module", py_modules = ["lammps"], data_files = [(site.USER_SITE, [args.lib])]) - except: + except: print("Installation into user site package folder failed.") - From 0edb82eb5e685b68859a1d960ea0ce656e053711 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 17:14:58 -0400 Subject: [PATCH 133/243] update format --- python/install.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/python/install.py b/python/install.py index 613b3e4c84..9f23e5a896 100644 --- a/python/install.py +++ b/python/install.py @@ -118,6 +118,7 @@ try: author_email = "sjplimp@sandia.gov", url = "https://lammps.sandia.gov", description = "LAMMPS Molecular Dynamics Python module", + license = "GPL", py_modules = ["lammps"], data_files = [(get_python_lib(prefix=args.prefix), [args.lib])]) except: @@ -128,14 +129,13 @@ if tryuser: try: sys.argv = ["setup.py","install","--user"] # as if had run "python setup.py install --user" setup(name = "lammps", - version = verstr, - author = "Steve Plimpton", - author_email = "sjplimp@sandia.gov", - url = "https://lammps.sandia.gov", - description = "LAMMPS Molecular Dynamics Python module", - py_modules = ["lammps"], - data_files = [(site.USER_SITE, [args.lib])]) + version = verstr, + author = "Steve Plimpton", + author_email = "sjplimp@sandia.gov", + url = "https://lammps.sandia.gov", + description = "LAMMPS Molecular Dynamics Python module", + license = "GPL", + py_modules = ["lammps"], + data_files = [(site.USER_SITE, [args.lib])]) except: print("Installation into user site package folder failed.") - - From 81a4d293dbc1703eb6f3f5f0a51c3f7d9ba6670f Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 25 Mar 2019 15:43:58 -0600 Subject: [PATCH 134/243] Commit4 JT 032519 - corrected documentation (errors in min_spin.txt and min_modify.txt) - changed the code accordingly --- doc/src/lammps.book | 1 + doc/src/min_modify.txt | 10 +++++----- doc/src/min_spin.txt | 16 +++++++--------- examples/SPIN/spinmin/in.spinmin.bfo | 2 +- examples/SPIN/spinmin/in.spinmin.iron | 2 +- src/SPIN/min_spin.cpp | 10 +++++----- src/SPIN/min_spin.h | 2 +- 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 6b220ed241..eb8aa16968 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -175,6 +175,7 @@ mass.html message.html min_modify.html min_style.html +min_spin.html minimize.html molecule.html neb.html diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 525d6716d8..d342e8bf01 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -13,14 +13,14 @@ min_modify command :h3 min_modify keyword values ... :pre one or more keyword/value pairs may be listed :ulb,l -keyword = {dmax} or {line} or {alpha_damp} or {discret_factor} +keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} {dmax} value = max max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} backtrack,quadratic,forcezero = style of linesearch to use {alpha_damp} value = damping damping = fictitious Gilbert damping for spin minimization (adim) - {discret_factor} value = factor + {discrete_factor} value = factor factor = discretization factor for adaptive spin timestep (adim) :pre :ule @@ -69,16 +69,16 @@ difference of two large values (energy before and energy after) and that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. -Keywords {alpha_damp} and {discret_factor} only make sense when +Keywords {alpha_damp} and {discrete_factor} only make sense when a "min_spin"_min_spin.html command is declared. Keyword {alpha_damp} defines an analog of a magnetic Gilbert damping. It defines a relaxation rate toward an equilibrium for a given magnetic system. -Keyword {discret_factor} defines a discretization factor for the +Keyword {discrete_factor} defines a discretization factor for the adaptive timestep used in the {spin} minimization. See "min_spin"_min_spin.html for more information about those quantities. -Default values are alpha_damp = 1.0 and discret_factor = 10.0. +Default values are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. [Restrictions:] none diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index de25100102..890e324aca 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -3,7 +3,6 @@ :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Commands_all.html) - :line min_style spin command :h3 @@ -14,8 +13,7 @@ min_style spin :pre [Examples:] -min_style spin -min_modify alpha_damp 1.0 discret_factor 10.0 :pre +min_style spin :pre [Description:] @@ -33,19 +31,19 @@ Lambda can be defined by setting the {alpha_damp} keyword with the "min_modify"_min_modify.html command. The minimization procedure solves this equation using an -adaptive timestep. The value of this timestep is conditionned +adaptive timestep. The value of this timestep is defined by the largest precession frequency that has to be solved in the system: :c,image(Eqs/min_spin_timestep.jpg) -with |omega|_{max} the norm of the largest precession frequency +with {|omega|_{max}} the norm of the largest precession frequency in the system (across all processes, and across all replicas if a spin/neb calculation is performed). -Kappa defines a discretization factor {discret_factor} for the +Kappa defines a discretization factor {discrete_factor} for the definition of this timestep. -{discret_factor} can be defined with the "min_modify"_min_modify.html +{discrete_factor} can be defined with the "min_modify"_min_modify.html command. NOTE: The {spin} style replaces the force tolerance by a torque @@ -54,7 +52,7 @@ tolerance. See "minimize"_minimize.html for more explanation. [Restrictions:] This minimization procedure is only applied to spin degrees of -fredom for a frozen lattice configuration. +freedom for a frozen lattice configuration. [Related commands:] @@ -63,5 +61,5 @@ fredom for a frozen lattice configuration. [Default:] -The option defaults are alpha_damp = 1.0 and discret_factor = +The option defaults are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. diff --git a/examples/SPIN/spinmin/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo index 95a1a0f29f..5ebc9e0afe 100644 --- a/examples/SPIN/spinmin/in.spinmin.bfo +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -51,5 +51,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] min_style spin -min_modify alpha_damp 1.0 discret_factor 10.0 +min_modify alpha_damp 1.0 discrete_factor 10.0 minimize 1.0e-10 0.0 1000 100 diff --git a/examples/SPIN/spinmin/in.spinmin.iron b/examples/SPIN/spinmin/in.spinmin.iron index 1f84d4fc9b..ebbd229b89 100644 --- a/examples/SPIN/spinmin/in.spinmin.iron +++ b/examples/SPIN/spinmin/in.spinmin.iron @@ -51,5 +51,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 100 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] min_style spin -min_modify alpha_damp 1.0 discret_factor 10.0 +min_modify alpha_damp 1.0 discrete_factor 10.0 minimize 1.0e-10 1.0e-10 100000 1000 diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 61a61cd6bf..97aebdd25c 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -51,7 +51,7 @@ MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) {} void MinSpin::init() { alpha_damp = 1.0; - discret_factor = 10.0; + discrete_factor = 10.0; Min::init(); @@ -84,9 +84,9 @@ int MinSpin::modify_param(int narg, char **arg) alpha_damp = force->numeric(FLERR,arg[1]); return 2; } - if (strcmp(arg[0],"discret_factor") == 0) { + if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - discret_factor = force->numeric(FLERR,arg[1]); + discrete_factor = force->numeric(FLERR,arg[1]); return 2; } return 0; @@ -229,9 +229,9 @@ double MinSpin::evaluate_dt() error->all(FLERR,"Incorrect fmaxsqall calculation"); // define max timestep by dividing by the - // inverse of max frequency by discret_factor + // inverse of max frequency by discrete_factor - dtmax = MY_2PI/(discret_factor*sqrt(fmaxsqall)); + dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); return dtmax; } diff --git a/src/SPIN/min_spin.h b/src/SPIN/min_spin.h index 569bcbaab2..224d205000 100644 --- a/src/SPIN/min_spin.h +++ b/src/SPIN/min_spin.h @@ -45,7 +45,7 @@ class MinSpin : public Min { double dts; double alpha_damp; // damping for spin minimization - double discret_factor; // factor for spin timestep evaluation + double discrete_factor; // factor for spin timestep evaluation double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector From b8c4e09b2755bd95624f7171f6317646403ef040 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 25 Mar 2019 19:14:08 -0500 Subject: [PATCH 135/243] Put #ifdef around #include "curl/curl.h" in kim_query.cpp --- src/KIM/kim_query.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index 2e1f752dc1..7480703ce8 100644 --- a/src/KIM/kim_query.cpp +++ b/src/KIM/kim_query.cpp @@ -64,8 +64,10 @@ #include "input.h" #include "variable.h" +#if defined(LMP_KIM_CURL) #include #include +#endif using namespace LAMMPS_NS; From 36b645d2384da4c4da855c26f3805d033aa04964 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 20:46:42 -0400 Subject: [PATCH 136/243] add min_spin page to toclist --- doc/src/commands_list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/commands_list.txt b/doc/src/commands_list.txt index 61221b26d8..6f90d9c93a 100644 --- a/doc/src/commands_list.txt +++ b/doc/src/commands_list.txt @@ -62,6 +62,7 @@ Commands :h1 mass message min_modify + min_spin min_style minimize molecule From 7b3f95299002b2e0800a66e92fff8625af6318c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 20:47:17 -0400 Subject: [PATCH 137/243] whitespace cleanup and dead code removal --- src/SPIN/compute_spin.cpp | 16 +++---- src/SPIN/fix_langevin_spin.cpp | 6 +-- src/SPIN/fix_nve_spin.cpp | 82 ++++++++++++++++---------------- src/SPIN/fix_precession_spin.cpp | 2 +- src/SPIN/min_spin.cpp | 69 +++++++++++++-------------- src/SPIN/pair_spin_dmi.cpp | 48 +++++++++---------- src/SPIN/pair_spin_exchange.cpp | 42 ++++++++-------- src/SPIN/pair_spin_magelec.cpp | 28 +++++------ src/SPIN/pair_spin_neel.cpp | 12 ++--- 9 files changed, 150 insertions(+), 155 deletions(-) diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index dc16190c98..0a881e1de6 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -84,7 +84,7 @@ void ComputeSpin::compute_vector() invoked_vector = update->ntimestep; - countsp = countsptot = 0.0; + countsp = countsptot = 0.0; mag[0] = mag[1] = mag[2] = mag[3] = 0.0; magtot[0] = magtot[1] = magtot[2] = magtot[3] = 0.0; magenergy = magenergytot = 0.0; @@ -96,7 +96,7 @@ void ComputeSpin::compute_vector() double **sp = atom->sp; double **fm = atom->fm; double tx,ty,tz; - + int nlocal = atom->nlocal; // compute total magnetization and magnetic energy @@ -105,16 +105,16 @@ void ComputeSpin::compute_vector() for (i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (atom->sp_flag) { - mag[0] += sp[i][0]; - mag[1] += sp[i][1]; - mag[2] += sp[i][2]; - magenergy -= (sp[i][0]*fm[i][0] + sp[i][1]*fm[i][1] + sp[i][2]*fm[i][2]); + mag[0] += sp[i][0]; + mag[1] += sp[i][1]; + mag[2] += sp[i][2]; + magenergy -= (sp[i][0]*fm[i][0] + sp[i][1]*fm[i][1] + sp[i][2]*fm[i][2]); tx = sp[i][1]*fm[i][2]-sp[i][2]*fm[i][1]; ty = sp[i][2]*fm[i][0]-sp[i][0]*fm[i][2]; tz = sp[i][0]*fm[i][1]-sp[i][1]*fm[i][0]; tempnum += tx*tx+ty*ty+tz*tz; - tempdenom += sp[i][0]*fm[i][0]+fm[i][1]*sp[i][1]+sp[i][2]*fm[i][2]; - countsp++; + tempdenom += sp[i][0]*fm[i][0]+fm[i][1]*sp[i][1]+sp[i][2]*fm[i][2]; + countsp++; } } else error->all(FLERR,"Compute compute/spin requires atom/spin style"); diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index 55b4d8dfec..ec6f719a77 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -131,8 +131,8 @@ void FixLangevinSpin::init() gil_factor = 1.0/(1.0+(alpha_t)*(alpha_t)); dts = update->dt; - double hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - double kb = force->boltz; // eV/K + double hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + double kb = force->boltz; // eV/K D = (MY_2PI*alpha_t*gil_factor*kb*temp); D /= (hbar*dts); sigma = sqrt(2.0*D); @@ -158,7 +158,7 @@ void FixLangevinSpin::add_tdamping(double spi[3], double fmi[3]) double cpx = fmi[1]*spi[2] - fmi[2]*spi[1]; double cpy = fmi[2]*spi[0] - fmi[0]*spi[2]; double cpz = fmi[0]*spi[1] - fmi[1]*spi[0]; - + // adding the transverse damping fmi[0] -= alpha_t*cpx; diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 7d96aca6d4..8d549ed64a 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -183,7 +183,7 @@ void FixNVESpin::init() npairs = pair->instance_total; for (int i = 0; ipair_match("spin",0,i)) { - npairspin ++; + npairspin ++; } } } @@ -203,8 +203,8 @@ void FixNVESpin::init() } else if (npairspin > 1) { for (int i = 0; ipair_match("spin",0,i)) { - spin_pairs[count] = (PairSpin *) force->pair_match("spin",0,i); - count++; + spin_pairs[count] = (PairSpin *) force->pair_match("spin",0,i); + count++; } } } @@ -264,8 +264,8 @@ void FixNVESpin::init() void FixNVESpin::initial_integrate(int /*vflag*/) { double dtfm; - - double **x = atom->x; + + double **x = atom->x; double **v = atom->v; double **f = atom->f; double *rmass = atom->rmass; @@ -291,32 +291,32 @@ void FixNVESpin::initial_integrate(int /*vflag*/) // update half s for all atoms - if (sector_flag) { // sectoring seq. update - for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal + if (sector_flag) { // sectoring seq. update + for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal comm->forward_comm(); int i = stack_foot[j]; while (i >= 0) { ComputeInteractionsSpin(i); - AdvanceSingleSpin(i); - i = forward_stacks[i]; + AdvanceSingleSpin(i); + i = forward_stacks[i]; } } - for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal + for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal comm->forward_comm(); int i = stack_head[j]; while (i >= 0) { ComputeInteractionsSpin(i); - AdvanceSingleSpin(i); - i = backward_stacks[i]; + AdvanceSingleSpin(i); + i = backward_stacks[i]; } } - } else if (sector_flag == 0) { // serial seq. update - comm->forward_comm(); // comm. positions of ghost atoms - for (int i = 0; i < nlocal; i++){ // advance quarter s for nlocal + } else if (sector_flag == 0) { // serial seq. update + comm->forward_comm(); // comm. positions of ghost atoms + for (int i = 0; i < nlocal; i++){ // advance quarter s for nlocal ComputeInteractionsSpin(i); AdvanceSingleSpin(i); } - for (int i = nlocal-1; i >= 0; i--){ // advance quarter s for nlocal + for (int i = nlocal-1; i >= 0; i--){ // advance quarter s for nlocal ComputeInteractionsSpin(i); AdvanceSingleSpin(i); } @@ -336,32 +336,32 @@ void FixNVESpin::initial_integrate(int /*vflag*/) // update half s for all particles - if (sector_flag) { // sectoring seq. update - for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal + if (sector_flag) { // sectoring seq. update + for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal comm->forward_comm(); int i = stack_foot[j]; while (i >= 0) { ComputeInteractionsSpin(i); - AdvanceSingleSpin(i); - i = forward_stacks[i]; + AdvanceSingleSpin(i); + i = forward_stacks[i]; } } - for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal + for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal comm->forward_comm(); int i = stack_head[j]; while (i >= 0) { ComputeInteractionsSpin(i); - AdvanceSingleSpin(i); - i = backward_stacks[i]; + AdvanceSingleSpin(i); + i = backward_stacks[i]; } } - } else if (sector_flag == 0) { // serial seq. update - comm->forward_comm(); // comm. positions of ghost atoms - for (int i = 0; i < nlocal; i++){ // advance quarter s for nlocal-1 + } else if (sector_flag == 0) { // serial seq. update + comm->forward_comm(); // comm. positions of ghost atoms + for (int i = 0; i < nlocal; i++){ // advance quarter s for nlocal-1 ComputeInteractionsSpin(i); AdvanceSingleSpin(i); } - for (int i = nlocal-1; i >= 0; i--){ // advance quarter s for nlocal-1 + for (int i = nlocal-1; i >= 0; i--){ // advance quarter s for nlocal-1 ComputeInteractionsSpin(i); AdvanceSingleSpin(i); } @@ -384,10 +384,10 @@ void FixNVESpin::setup_pre_neighbor() void FixNVESpin::pre_neighbor() { - double **x = atom->x; + double **x = atom->x; int nlocal = atom->nlocal; - if (nlocal_max < nlocal) { // grow linked lists if necessary + if (nlocal_max < nlocal) { // grow linked lists if necessary nlocal_max = nlocal; backward_stacks = memory->grow(backward_stacks,nlocal_max,"NVE/spin:backward_stacks"); forward_stacks = memory->grow(forward_stacks,nlocal_max,"NVE/spin:forward_stacks"); @@ -399,7 +399,7 @@ void FixNVESpin::pre_neighbor() } int nseci; - for (int j = 0; j < nsectors; j++) { // stacking backward order + for (int j = 0; j < nsectors; j++) { // stacking backward order for (int i = 0; i < nlocal; i++) { nseci = coords2sector(x[i]); if (j != nseci) continue; @@ -407,7 +407,7 @@ void FixNVESpin::pre_neighbor() stack_head[j] = i; } } - for (int j = nsectors-1; j >= 0; j--) { // stacking forward order + for (int j = nsectors-1; j >= 0; j--) { // stacking forward order for (int i = nlocal-1; i >= 0; i--) { nseci = coords2sector(x[i]); if (j != nseci) continue; @@ -453,11 +453,11 @@ void FixNVESpin::ComputeInteractionsSpin(int i) // update langevin damping and random force - if (maglangevin_flag) { // mag. langevin - if (tdamp_flag) { // transverse damping + if (maglangevin_flag) { // mag. langevin + if (tdamp_flag) { // transverse damping locklangevinspin->add_tdamping(spi,fmi); } - if (temp_flag) { // spin temperature + if (temp_flag) { // spin temperature locklangevinspin->add_temperature(fmi); } } @@ -567,7 +567,7 @@ void FixNVESpin::AdvanceSingleSpin(int i) g[0] = g[1] = g[2] = 0.0; fm2 = (fm[i][0]*fm[i][0])+(fm[i][1]*fm[i][1])+(fm[i][2]*fm[i][2]); energy = (sp[i][0]*fm[i][0])+(sp[i][1]*fm[i][1])+(sp[i][2]*fm[i][2]); - dts2 = dts*dts; + dts2 = dts*dts; cp[0] = fm[i][1]*sp[i][2]-fm[i][2]*sp[i][1]; cp[1] = fm[i][2]*sp[i][0]-fm[i][0]*sp[i][2]; @@ -576,18 +576,18 @@ void FixNVESpin::AdvanceSingleSpin(int i) g[0] = sp[i][0]+cp[0]*dts; g[1] = sp[i][1]+cp[1]*dts; g[2] = sp[i][2]+cp[2]*dts; - + g[0] += (fm[i][0]*energy-0.5*sp[i][0]*fm2)*0.5*dts2; g[1] += (fm[i][1]*energy-0.5*sp[i][1]*fm2)*0.5*dts2; g[2] += (fm[i][2]*energy-0.5*sp[i][2]*fm2)*0.5*dts2; - + g[0] /= (1+0.25*fm2*dts2); g[1] /= (1+0.25*fm2*dts2); g[2] /= (1+0.25*fm2*dts2); - + sp[i][0] = g[0]; sp[i][1] = g[1]; - sp[i][2] = g[2]; + sp[i][2] = g[2]; // renormalization (check if necessary) @@ -616,9 +616,9 @@ void FixNVESpin::AdvanceSingleSpin(int i) /* ---------------------------------------------------------------------- */ void FixNVESpin::final_integrate() -{ +{ double dtfm; - + double **v = atom->v; double **f = atom->f; double *rmass = atom->rmass; diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index d065f38d16..9ee691c227 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -177,7 +177,7 @@ void FixPrecessionSpin::min_setup(int vflag) /* ---------------------------------------------------------------------- */ -void FixPrecessionSpin::post_force(int vflag) +void FixPrecessionSpin::post_force(int /* vflag */) { // update mag field with time (potential improvement) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 97aebdd25c..2bddc110e7 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -19,6 +19,8 @@ #include #include +#include +#include #include "min_spin.h" #include "universe.h" #include "atom.h" @@ -27,8 +29,6 @@ #include "output.h" #include "timer.h" #include "error.h" -#include -#include #include "modify.h" #include "math_special.h" #include "math_const.h" @@ -104,10 +104,10 @@ void MinSpin::reset_vectors() // size sp is 4N vector nvec = 4 * atom->nlocal; if (nvec) spvec = atom->sp[0]; - + nvec = 3 * atom->nlocal; if (nvec) fmvec = atom->fm[0]; - + if (nvec) xvec = atom->x[0]; if (nvec) fvec = atom->f[0]; } @@ -119,7 +119,7 @@ void MinSpin::reset_vectors() int MinSpin::iterate(int maxiter) { bigint ntimestep; - double fmdotfm,fmdotfmall; + double fmdotfm; int flag,flagall; for (int iter = 0; iter < maxiter; iter++) { @@ -132,12 +132,12 @@ int MinSpin::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - + energy_force(0); dts = evaluate_dt(); - + // apply damped precessional dynamics to the spins - + advance_spins(dts); eprevious = ecurrent; @@ -200,11 +200,10 @@ double MinSpin::evaluate_dt() double fmsq; double fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; - int *mask = atom->mask; double **fm = atom->fm; - // finding max fm on this proc. - + // finding max fm on this proc. + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; for (int i = 0; i < nlocal; i++) { fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; @@ -212,10 +211,10 @@ double MinSpin::evaluate_dt() } // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + // finding max fm over all replicas, if necessary // this communicator would be invalid for multiprocess replicas @@ -228,7 +227,7 @@ double MinSpin::evaluate_dt() if (fmaxsqall == 0.0) error->all(FLERR,"Incorrect fmaxsqall calculation"); - // define max timestep by dividing by the + // define max timestep by dividing by the // inverse of max frequency by discrete_factor dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); @@ -243,58 +242,57 @@ double MinSpin::evaluate_dt() void MinSpin::advance_spins(double dts) { int nlocal = atom->nlocal; - int *mask = atom->mask; double **sp = atom->sp; double **fm = atom->fm; double tdampx,tdampy,tdampz; double msq,scale,fm2,energy,dts2; double cp[3],g[3]; - dts2 = dts*dts; + dts2 = dts*dts; // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - + // calc. damping torque - + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - + // apply advance algorithm (geometric, norm preserving) - + fm2 = (tdampx*tdampx+tdampy*tdampy+tdampz*tdampz); energy = (sp[i][0]*tdampx)+(sp[i][1]*tdampy)+(sp[i][2]*tdampz); - + cp[0] = tdampy*sp[i][2]-tdampz*sp[i][1]; cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; - + g[0] = sp[i][0]+cp[0]*dts; g[1] = sp[i][1]+cp[1]*dts; g[2] = sp[i][2]+cp[2]*dts; - + g[0] += (tdampx*energy-0.5*sp[i][0]*fm2)*0.5*dts2; g[1] += (tdampy*energy-0.5*sp[i][1]*fm2)*0.5*dts2; g[2] += (tdampz*energy-0.5*sp[i][2]*fm2)*0.5*dts2; - + g[0] /= (1+0.25*fm2*dts2); g[1] /= (1+0.25*fm2*dts2); g[2] /= (1+0.25*fm2*dts2); sp[i][0] = g[0]; sp[i][1] = g[1]; - sp[i][2] = g[2]; - + sp[i][2] = g[2]; + // renormalization (check if necessary) - + msq = g[0]*g[0] + g[1]*g[1] + g[2]*g[2]; scale = 1.0/sqrt(msq); sp[i][0] *= scale; sp[i][1] *= scale; sp[i][2] *= scale; - + // no comm. to atoms with same tag // because no need for simplecticity } @@ -306,16 +304,13 @@ void MinSpin::advance_spins(double dts) double MinSpin::fmnorm_sqr() { - int i,n; - double *fmatom; - int nlocal = atom->nlocal; double tx,ty,tz; double **sp = atom->sp; double **fm = atom->fm; // calc. magnetic torques - + double local_norm2_sqr = 0.0; for (int i = 0; i < nlocal; i++) { tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); @@ -324,11 +319,11 @@ double MinSpin::fmnorm_sqr() local_norm2_sqr += tx*tx + ty*ty + tz*tz; } - - // no extra atom calc. for spins + + // no extra atom calc. for spins if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); + error->all(FLERR,"extra atom option not available yet"); double norm2_sqr = 0.0; MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index e9e6691a88..d26f5e917e 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -238,7 +238,7 @@ void PairSpinDmi::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **sp = atom->sp; + double **sp = atom->sp; int *type = atom->type; int nlocal = atom->nlocal; int newton_pair = force->newton_pair; @@ -295,32 +295,32 @@ void PairSpinDmi::compute(int eflag, int vflag) // compute dmi interaction if (rsq <= local_cut2) { - compute_dmi(i,j,eij,fmi,spj); - if (lattice_flag) { - compute_dmi_mech(i,j,rsq,eij,fi,spi,spj); - } + compute_dmi(i,j,eij,fmi,spj); + if (lattice_flag) { + compute_dmi_mech(i,j,rsq,eij,fi,spi,spj); + } } - f[i][0] += fi[0]; - f[i][1] += fi[1]; + f[i][0] += fi[0]; + f[i][1] += fi[1]; f[i][2] += fi[2]; - fm[i][0] += fmi[0]; - fm[i][1] += fmi[1]; + fm[i][0] += fmi[0]; + fm[i][1] += fmi[1]; fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; f[j][2] -= fi[2]; } if (eflag) { - evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; + evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); + evdwl *= hbar; } else evdwl = 0.0; if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fi[0],fi[1],fi[2],delx,dely,delz); + evdwl,ecoul,fi[0],fi[1],fi[2],delx,dely,delz); } } @@ -342,7 +342,7 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype,ntypes; + int j,jnum,itype,jtype,ntypes; int k,locflag; int *jlist,*numneigh,**firstneigh; @@ -350,7 +350,7 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) numneigh = list->numneigh; firstneigh = list->firstneigh; - + // check if interaction applies to type of ii itype = type[ii]; @@ -360,20 +360,20 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) while (k <= ntypes) { if (k <= itype) { if (setflag[k][itype] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else if (k > itype) { if (setflag[itype][k] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else error->all(FLERR,"Wrong type number"); } - // if interaction applies to type ii, + // if interaction applies to type ii, // locflag = 1 and compute pair interaction //i = ilist[ii]; @@ -422,7 +422,7 @@ void PairSpinDmi::compute_dmi(int i, int j, double eij[3], double fmi[3], double { int *type = atom->type; int itype, jtype; - double dmix, dmiy, dmiz; + double dmix, dmiy, dmiz; itype = type[i]; jtype = type[j]; @@ -444,7 +444,7 @@ void PairSpinDmi::compute_dmi_mech(int i, int j, double rsq, double /*eij*/[3], { int *type = atom->type; int itype, jtype; - double dmix,dmiy,dmiz; + double dmix,dmiy,dmiz; itype = type[i]; jtype = type[j]; double csx,csy,csz,cdmx,cdmy,cdmz,irij; @@ -509,7 +509,7 @@ void PairSpinDmi::write_restart(FILE *fp) for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&DM[i][j],sizeof(double),1,fp); + fwrite(&DM[i][j],sizeof(double),1,fp); fwrite(&v_dmx[i][j],sizeof(double),1,fp); fwrite(&v_dmy[i][j],sizeof(double),1,fp); fwrite(&v_dmz[i][j],sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index aecbbeb97d..7edd6cec0c 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -223,7 +223,7 @@ void PairSpinExchange::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **sp = atom->sp; + double **sp = atom->sp; int *type = atom->type; int nlocal = atom->nlocal; int newton_pair = force->newton_pair; @@ -278,32 +278,32 @@ void PairSpinExchange::compute(int eflag, int vflag) // compute exchange interaction if (rsq <= local_cut2) { - compute_exchange(i,j,rsq,fmi,spj); + compute_exchange(i,j,rsq,fmi,spj); if (lattice_flag) { - compute_exchange_mech(i,j,rsq,eij,fi,spi,spj); - } + compute_exchange_mech(i,j,rsq,eij,fi,spi,spj); + } } - f[i][0] += fi[0]; - f[i][1] += fi[1]; + f[i][0] += fi[0]; + f[i][1] += fi[1]; f[i][2] += fi[2]; - fm[i][0] += fmi[0]; - fm[i][1] += fmi[1]; + fm[i][0] += fmi[0]; + fm[i][1] += fmi[1]; fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; f[j][2] -= fi[2]; } if (eflag) { - evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; + evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); + evdwl *= hbar; } else evdwl = 0.0; if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fi[0],fi[1],fi[2],delx,dely,delz); + evdwl,ecoul,fi[0],fi[1],fi[2],delx,dely,delz); } } @@ -325,7 +325,7 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype,ntypes; + int j,jnum,itype,jtype,ntypes; int k,locflag; int *jlist,*numneigh,**firstneigh; @@ -343,24 +343,24 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) while (k <= ntypes) { if (k <= itype) { if (setflag[k][itype] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else if (k > itype) { if (setflag[itype][k] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else error->all(FLERR,"Wrong type number"); } - // if interaction applies to type ii, + // if interaction applies to type ii, // locflag = 1 and compute pair interaction if (locflag == 1) { - + xi[0] = x[ii][0]; xi[1] = x[ii][1]; xi[2] = x[ii][2]; @@ -388,7 +388,7 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) compute_exchange(ii,j,rsq,fmi,spj); } } - } + } } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index be1cbcd6c4..5c0abe894d 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -332,7 +332,7 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) double delx,dely,delz; double spj[3]; - int i,j,jnum,itype,jtype,ntypes; + int j,jnum,itype,jtype,ntypes; int k,locflag; int *jlist,*numneigh,**firstneigh; @@ -340,7 +340,7 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) numneigh = list->numneigh; firstneigh = list->firstneigh; - + // check if interaction applies to type of ii itype = type[ii]; @@ -350,42 +350,42 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) while (k <= ntypes) { if (k <= itype) { if (setflag[k][itype] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else if (k > itype) { if (setflag[itype][k] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else error->all(FLERR,"Wrong type number"); } - // if interaction applies to type ii, + // if interaction applies to type ii, // locflag = 1 and compute pair interaction if (locflag == 1) { - + xi[0] = x[ii][0]; xi[1] = x[ii][1]; xi[2] = x[ii][2]; - + jlist = firstneigh[ii]; jnum = numneigh[ii]; - + for (int jj = 0; jj < jnum; jj++) { - + j = jlist[jj]; j &= NEIGHMASK; jtype = type[j]; local_cut2 = cut_spin_magelec[itype][jtype]*cut_spin_magelec[itype][jtype]; - + spj[0] = sp[j][0]; spj[1] = sp[j][1]; spj[2] = sp[j][2]; - + delx = xi[0] - x[j][0]; dely = xi[1] - x[j][1]; delz = xi[2] - x[j][2]; @@ -394,7 +394,7 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) eij[0] = -inorm*delx; eij[1] = -inorm*dely; eij[2] = -inorm*delz; - + if (rsq <= local_cut2) { compute_magelec(ii,j,eij,fmi,spj); } diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 58173892d9..1eea62d02c 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -351,7 +351,7 @@ void PairSpinNeel::compute_single_pair(int ii, double fmi[3]) numneigh = list->numneigh; firstneigh = list->firstneigh; - + // check if interaction applies to type of ii itype = type[ii]; @@ -361,20 +361,20 @@ void PairSpinNeel::compute_single_pair(int ii, double fmi[3]) while (k <= ntypes) { if (k <= itype) { if (setflag[k][itype] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else if (k > itype) { if (setflag[itype][k] == 1) { - locflag =1; - break; + locflag =1; + break; } k++; } else error->all(FLERR,"Wrong type number"); } - // if interaction applies to type ii, + // if interaction applies to type ii, // locflag = 1 and compute pair interaction if (locflag == 1) { From 82d646cede4ffa447de256b5ec77754d3e4ff711 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 20:58:13 -0400 Subject: [PATCH 138/243] print warning about missing fix nve/spin only on MPI rank 0 --- src/SPIN/pair_spin_dmi.cpp | 2 +- src/SPIN/pair_spin_exchange.cpp | 2 +- src/SPIN/pair_spin_magelec.cpp | 2 +- src/SPIN/pair_spin_neel.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index d26f5e917e..d0506e972d 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -173,7 +173,7 @@ void PairSpinDmi::init_style() if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) + if ((ifix == modify->nfix) && (comm->me == 0)) error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 7edd6cec0c..cb3242c711 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -160,7 +160,7 @@ void PairSpinExchange::init_style() if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) + if ((ifix == modify->nfix) && (comm->me == 0)) error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 5c0abe894d..6ff003521d 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -166,7 +166,7 @@ void PairSpinMagelec::init_style() if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) + if ((ifix == modify->nfix) && (comm->me == 0)) error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 1eea62d02c..a39d6f3461 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -173,7 +173,7 @@ void PairSpinNeel::init_style() if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) + if ((ifix == modify->nfix) && (comm->me == 0)) error->warning(FLERR,"Using pair/spin style without nve/spin"); // get the lattice_flag from nve/spin @@ -343,7 +343,7 @@ void PairSpinNeel::compute_single_pair(int ii, double fmi[3]) double xi[3], rij[3], eij[3]; double spi[3], spj[3]; - int i,j,jnum,itype,jtype,ntypes; + int j,jnum,itype,jtype,ntypes; int k,locflag; int *jlist,*numneigh,**firstneigh; From 19d25203ade0e71f690db427f9ed720f3582c6de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 21:05:13 -0400 Subject: [PATCH 139/243] add min_style spin to commands overview --- doc/src/Commands_all.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/Commands_all.txt b/doc/src/Commands_all.txt index ddb8e121cb..66c348ee30 100644 --- a/doc/src/Commands_all.txt +++ b/doc/src/Commands_all.txt @@ -79,6 +79,7 @@ An alphabetic list of all general LAMMPS commands. "minimize"_minimize.html, "min_modify"_min_modify.html, "min_style"_min_style.html, +"min_style spin"_min_spin.html, "molecule"_molecule.html, "ndx2group"_group2ndx.html, "neb"_neb.html, From b0a07f189c96dcee7ecbda115f6a7ecca615ef22 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 14:58:02 -0400 Subject: [PATCH 140/243] must use top-level dir to get the correct modified status --- cmake/Modules/generate_lmpgitversion.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/generate_lmpgitversion.cmake b/cmake/Modules/generate_lmpgitversion.cmake index 8aead88f5f..a4aa59b262 100644 --- a/cmake/Modules/generate_lmpgitversion.cmake +++ b/cmake/Modules/generate_lmpgitversion.cmake @@ -5,15 +5,15 @@ set(temp_git_describe "(unknown)") set(temp_git_info "false") if(GIT_FOUND AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../.git) set(temp_git_info "true") - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse HEAD + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/.. rev-parse HEAD OUTPUT_VARIABLE temp_git_commit ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git rev-parse --abbrev-ref HEAD + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/.. rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE temp_git_branch ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../.git describe --dirty=-modified + execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}/.. describe --dirty=-modified OUTPUT_VARIABLE temp_git_describe ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) From 4e74ccbbbeb61f81683c494d375d343eaeac554d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 21:18:06 -0400 Subject: [PATCH 141/243] restore building developer pdf before manual pdf --- doc/Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 044e358bd5..5c679440b8 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -116,6 +116,13 @@ mobi: epub @echo "Conversion finished. The MOBI manual file is created." pdf: $(OBJECTS) $(ANCHORCHECK) + @(\ + cd src/Developer; \ + pdflatex developer; \ + pdflatex developer; \ + mv developer.pdf ../../Developer.pdf; \ + cd ../../; \ + ) @(\ . $(VENV)/bin/activate ;\ cp -r src/* $(RSTDIR)/ ;\ @@ -135,14 +142,7 @@ pdf: $(OBJECTS) $(ANCHORCHECK) make && \ make && \ mv LAMMPS.pdf ../Manual.pdf && \ - cd ../; - @(\ - cd src/Developer; \ - pdflatex developer; \ - pdflatex developer; \ - mv developer.pdf ../../Developer.pdf; \ - cd ../../; \ - ) + cd ../; @rm -rf latex/_sources @rm -rf latex/PDF @rm -rf latex/USER From d7a2949d1ab0237c20b1e0cf21d9dea2f0bf8b65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 21:30:48 -0400 Subject: [PATCH 142/243] Revert "Rendezvous" --- src/RIGID/fix_rigid_small.cpp | 512 ++++++------ src/RIGID/fix_rigid_small.h | 26 +- src/RIGID/fix_shake.cpp | 804 ++++++------------- src/RIGID/fix_shake.h | 43 +- src/comm.cpp | 428 ---------- src/comm.h | 13 - src/create_atoms.cpp | 37 +- src/hashlittle.cpp | 349 -------- src/hashlittle.h | 5 - src/irregular.cpp | 203 +---- src/irregular.h | 2 - src/read_data.cpp | 15 - src/read_restart.cpp | 15 - src/replicate.cpp | 8 +- src/special.cpp | 1416 ++++++++++++++------------------- src/special.h | 38 +- 16 files changed, 1207 insertions(+), 2707 deletions(-) delete mode 100644 src/hashlittle.cpp delete mode 100644 src/hashlittle.h diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index d74dd0fc3b..fb185d7702 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -28,14 +28,12 @@ #include "modify.h" #include "group.h" #include "comm.h" -#include "neighbor.h" #include "force.h" #include "input.h" #include "output.h" #include "variable.h" #include "random_mars.h" #include "math_const.h" -#include "hashlittle.h" #include "memory.h" #include "error.h" @@ -45,8 +43,6 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -#define RVOUS 1 // 0 for irregular, 1 for all2all - #define MAXLINE 1024 #define CHUNK 1024 #define ATTRIBUTE_PERBODY 20 @@ -74,7 +70,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : xcmimage(NULL), displace(NULL), eflags(NULL), orient(NULL), dorient(NULL), avec_ellipsoid(NULL), avec_line(NULL), avec_tri(NULL), counts(NULL), itensor(NULL), mass_body(NULL), langextra(NULL), random(NULL), - id_dilate(NULL), onemols(NULL) + id_dilate(NULL), onemols(NULL), hash(NULL), bbox(NULL), ctr(NULL), + idclose(NULL), rsqclose(NULL) { int i; @@ -110,18 +107,18 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // parse args for rigid body specification int *mask = atom->mask; - tagint *bodyID = NULL; + tagint *bodyid = NULL; int nlocal = atom->nlocal; if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); if (strcmp(arg[3],"molecule") == 0) { if (atom->molecule_flag == 0) error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); - bodyID = atom->molecule; + bodyid = atom->molecule; } else if (strcmp(arg[3],"custom") == 0) { if (narg < 5) error->all(FLERR,"Illegal fix rigid/small command"); - bodyID = new tagint[nlocal]; + bodyid = new tagint[nlocal]; customflag = 1; // determine whether atom-style variable or atom property is used. @@ -129,11 +126,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : int is_double=0; int custom_index = atom->find_custom(arg[4]+2,is_double); if (custom_index == -1) - error->all(FLERR,"Fix rigid/small custom requires " - "previously defined property/atom"); + error->all(FLERR,"Fix rigid/small custom requires previously defined property/atom"); else if (is_double) - error->all(FLERR,"Fix rigid/small custom requires " - "integer-valued property/atom"); + error->all(FLERR,"Fix rigid/small custom requires integer-valued property/atom"); int minval = INT_MAX; int *value = atom->ivector[custom_index]; @@ -144,17 +139,15 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyID[i] = (tagint)(value[i] - minval + 1); - else bodyID[i] = 0; + bodyid[i] = (tagint)(value[i] - minval + 1); + else bodyid[i] = 0; } else if (strstr(arg[4],"v_") == arg[4]) { int ivariable = input->variable->find(arg[4]+2); if (ivariable < 0) - error->all(FLERR,"Variable name for fix rigid/small custom " - "does not exist"); + error->all(FLERR,"Variable name for fix rigid/small custom does not exist"); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR,"Fix rigid/small custom variable is not " - "atom-style variable"); + error->all(FLERR,"Fix rigid/small custom variable is no atom-style variable"); double *value = new double[nlocal]; input->variable->compute_atom(ivariable,0,value,1,0); int minval = INT_MAX; @@ -165,8 +158,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyID[i] = (tagint)((tagint)value[i] - minval + 1); - else bodyID[0] = 0; + bodyid[i] = (tagint)((tagint)value[i] - minval + 1); + else bodyid[0] = 0; delete[] value; } else error->all(FLERR,"Unsupported fix rigid custom property"); } else error->all(FLERR,"Illegal fix rigid/small command"); @@ -174,11 +167,10 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (atom->map_style == 0) error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify"); - // maxmol = largest bodyID # - + // maxmol = largest bodyid # maxmol = -1; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyID[i]); + if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyid[i]); tagint itmp; MPI_Allreduce(&maxmol,&itmp,1,MPI_LMP_TAGINT,MPI_MAX,world); @@ -408,19 +400,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // sets bodytag for owned atoms // body attributes are computed later by setup_bodies() - double time1 = MPI_Wtime(); - - create_bodies(bodyID); - if (customflag) delete [] bodyID; - - double time2 = MPI_Wtime(); - - if (comm->me == 0) { - if (screen) - fprintf(screen," create bodies CPU = %g secs\n",time2-time1); - if (logfile) - fprintf(logfile," create bodies CPU = %g secs\n",time2-time1); - } + create_bodies(bodyid); + if (customflag) delete [] bodyid; // set nlocal_body and allocate bodies I own @@ -588,22 +569,12 @@ void FixRigidSmall::init() if (rflag && (modify->fmask[i] & POST_FORCE) && !modify->fix[i]->rigid_flag) { char str[128]; - snprintf(str,128,"Fix %s alters forces after fix rigid", - modify->fix[i]->id); + snprintf(str,128,"Fix %s alters forces after fix rigid",modify->fix[i]->id); error->warning(FLERR,str); } } } - // error if maxextent > comm->cutghost - // NOTE: could just warn if an override flag set - // NOTE: this could fail for comm multi mode if user sets a wrong cutoff - // for atom types in rigid bodies - need a more careful test - - double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); - if (maxextent > cutghost) - error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); - // error if npt,nph fix comes before rigid fix for (i = 0; i < modify->nfix; i++) { @@ -1543,72 +1514,175 @@ void FixRigidSmall::set_v() set bodytag for all owned atoms ------------------------------------------------------------------------- */ -void FixRigidSmall::create_bodies(tagint *bodyID) +void FixRigidSmall::create_bodies(tagint *bodyid) { - int i,m; + int i,m,n; + double unwrap[3]; - // allocate buffer for input to rendezvous comm - // ncount = # of my atoms in bodies - + // error check on image flags of atoms in rigid bodies + + imageint *image = atom->image; int *mask = atom->mask; int nlocal = atom->nlocal; + int *periodicity = domain->periodicity; + int xbox,ybox,zbox; + + int flag = 0; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + xbox = (image[i] & IMGMASK) - IMGMAX; + ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; + zbox = (image[i] >> IMG2BITS) - IMGMAX; + if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) || + (zbox && !periodicity[2])) flag = 1; + } + + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + if (flagall) error->all(FLERR,"Fix rigid/small atom has non-zero image flag " + "in a non-periodic dimension"); + + // allocate buffer for passing messages around ring of procs + // percount = max number of values to put in buffer for each of ncount + int ncount = 0; for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) ncount++; - int *proclist; - memory->create(proclist,ncount,"rigid/small:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc(ncount*sizeof(InRvous),"rigid/small:inbuf"); + int percount = 5; + double *buf; + memory->create(buf,ncount*percount,"rigid/small:buf"); - // setup buf to pass to rendezvous comm - // one BodyMsg datum for each constituent atom - // datum = me, local index of atom, atomID, bodyID, unwrapped coords - // owning proc for each datum = random hash of bodyID + // create map hash for storing unique body IDs of my atoms + // key = body ID + // value = index into per-body data structure + // n = # of entries in hash + + hash = new std::map(); + hash->clear(); + + // setup hash + // key = body ID + // value = index into N-length data structure + // n = count of unique bodies my atoms are part of + + n = 0; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + if (hash->find(bodyid[i]) == hash->end()) (*hash)[bodyid[i]] = n++; + } + + // bbox = bounding box of each rigid body my atoms are part of + + memory->create(bbox,n,6,"rigid/small:bbox"); + + for (i = 0; i < n; i++) { + bbox[i][0] = bbox[i][2] = bbox[i][4] = BIG; + bbox[i][1] = bbox[i][3] = bbox[i][5] = -BIG; + } + + // pack my atoms into buffer as body ID, unwrapped coords double **x = atom->x; - tagint *tag = atom->tag; - imageint *image = atom->image; m = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; - proclist[m] = hashlittle(&bodyID[i],sizeof(tagint),0) % nprocs; - inbuf[m].me = me; - inbuf[m].ilocal = i; - inbuf[m].atomID = tag[i]; - inbuf[m].bodyID = bodyID[i]; - domain->unmap(x[i],image[i],inbuf[m].x); - m++; + domain->unmap(x[i],image[i],unwrap); + buf[m++] = bodyid[i]; + buf[m++] = unwrap[0]; + buf[m++] = unwrap[1]; + buf[m++] = unwrap[2]; } - // perform rendezvous operation - // each proc owns random subset of bodies - // receives all atoms in those bodies - // func = compute bbox of each body, find atom closest to geometric center + // pass buffer around ring of procs + // func = update bbox with atom coords from every proc + // when done, have full bbox for every rigid body my atoms are part of - char *buf; - int nreturn = comm->rendezvous(RVOUS,ncount,(char *) inbuf,sizeof(InRvous), - 0,proclist, - rendezvous_body,0,buf,sizeof(OutRvous), - (void *) this); - OutRvous *outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); + comm->ring(m,sizeof(double),buf,1,ring_bbox,NULL,(void *)this); - // set bodytag of all owned atoms based on outbuf info for constituent atoms + // check if any bbox is size 0.0, meaning rigid body is a single particle - for (i = 0; i < nlocal; i++) - if (!(mask[i] & groupbit)) bodytag[i] = 0; + flag = 0; + for (i = 0; i < n; i++) + if (bbox[i][0] == bbox[i][1] && bbox[i][2] == bbox[i][3] && + bbox[i][4] == bbox[i][5]) flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + if (flagall) + error->all(FLERR,"One or more rigid bodies are a single particle"); - for (m = 0; m < nreturn; m++) - bodytag[outbuf[m].ilocal] = outbuf[m].atomID; + // ctr = center pt of each rigid body my atoms are part of - memory->sfree(outbuf); + memory->create(ctr,n,6,"rigid/small:bbox"); - // maxextent = max of rsqfar across all procs + for (i = 0; i < n; i++) { + ctr[i][0] = 0.5 * (bbox[i][0] + bbox[i][1]); + ctr[i][1] = 0.5 * (bbox[i][2] + bbox[i][3]); + ctr[i][2] = 0.5 * (bbox[i][4] + bbox[i][5]); + } + + // idclose = ID of atom in body closest to center pt (smaller ID if tied) + // rsqclose = distance squared from idclose to center pt + + memory->create(idclose,n,"rigid/small:idclose"); + memory->create(rsqclose,n,"rigid/small:rsqclose"); + + for (i = 0; i < n; i++) rsqclose[i] = BIG; + + // pack my atoms into buffer as body ID, atom ID, unwrapped coords + + tagint *tag = atom->tag; + + m = 0; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + domain->unmap(x[i],image[i],unwrap); + buf[m++] = bodyid[i]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = unwrap[0]; + buf[m++] = unwrap[1]; + buf[m++] = unwrap[2]; + } + + // pass buffer around ring of procs + // func = update idclose,rsqclose with atom IDs from every proc + // when done, have idclose for every rigid body my atoms are part of + + comm->ring(m,sizeof(double),buf,2,ring_nearest,NULL,(void *)this); + + // set bodytag of all owned atoms, based on idclose + // find max value of rsqclose across all procs + + double rsqmax = 0.0; + for (i = 0; i < nlocal; i++) { + bodytag[i] = 0; + if (!(mask[i] & groupbit)) continue; + m = hash->find(bodyid[i])->second; + bodytag[i] = idclose[m]; + rsqmax = MAX(rsqmax,rsqclose[m]); + } + + // pack my atoms into buffer as bodytag of owning atom, unwrapped coords + + m = 0; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + domain->unmap(x[i],image[i],unwrap); + buf[m++] = ubuf(bodytag[i]).d; + buf[m++] = unwrap[0]; + buf[m++] = unwrap[1]; + buf[m++] = unwrap[2]; + } + + // pass buffer around ring of procs + // func = update rsqfar for atoms belonging to bodies I own + // when done, have rsqfar for all atoms in bodies I own + + rsqfar = 0.0; + comm->ring(m,sizeof(double),buf,3,ring_farthest,NULL,(void *)this); + + // find maxextent of rsqfar across all procs // if defined, include molecule->maxextent MPI_Allreduce(&rsqfar,&maxextent,1,MPI_DOUBLE,MPI_MAX,world); @@ -1617,156 +1691,125 @@ void FixRigidSmall::create_bodies(tagint *bodyID) for (int i = 0; i < nmol; i++) maxextent = MAX(maxextent,onemols[i]->maxextent); } -} - -/* ---------------------------------------------------------------------- - process rigid bodies assigned to me - buf = list of N BodyMsg datums -------------------------------------------------------------------------- */ - -int FixRigidSmall::rendezvous_body(int n, char *inbuf, - int &rflag, int *&proclist, char *&outbuf, - void *ptr) -{ - int i,j,m; - double delx,dely,delz,rsq; - int *iclose; - tagint *idclose; - double *x,*xown,*rsqclose; - double **bbox,**ctr; - - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - Memory *memory = frsptr->memory; - Error *error = frsptr->error; - MPI_Comm world = frsptr->world; - - // setup hash - // use STL map instead of atom->map - // b/c know nothing about body ID values specified by user - // ncount = number of bodies assigned to me - // key = body ID - // value = index into Ncount-length data structure - - InRvous *in = (InRvous *) inbuf; - std::map hash; - tagint id; - - int ncount = 0; - for (i = 0; i < n; i++) { - id = in[i].bodyID; - if (hash.find(id) == hash.end()) hash[id] = ncount++; - } - - // bbox = bounding box of each rigid body - - memory->create(bbox,ncount,6,"rigid/small:bbox"); - - for (m = 0; m < ncount; m++) { - bbox[m][0] = bbox[m][2] = bbox[m][4] = BIG; - bbox[m][1] = bbox[m][3] = bbox[m][5] = -BIG; - } - - for (i = 0; i < n; i++) { - m = hash.find(in[i].bodyID)->second; - x = in[i].x; - bbox[m][0] = MIN(bbox[m][0],x[0]); - bbox[m][1] = MAX(bbox[m][1],x[0]); - bbox[m][2] = MIN(bbox[m][2],x[1]); - bbox[m][3] = MAX(bbox[m][3],x[1]); - bbox[m][4] = MIN(bbox[m][4],x[2]); - bbox[m][5] = MAX(bbox[m][5],x[2]); - } - - // check if any bbox is size 0.0, meaning rigid body is a single particle - - int flag = 0; - for (m = 0; m < ncount; m++) - if (bbox[m][0] == bbox[m][1] && bbox[m][2] == bbox[m][3] && - bbox[m][4] == bbox[m][5]) flag = 1; - int flagall; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); // sync here? - if (flagall) - error->all(FLERR,"One or more rigid bodies are a single particle"); - - // ctr = geometric center pt of each rigid body - - memory->create(ctr,ncount,3,"rigid/small:bbox"); - - for (m = 0; m < ncount; m++) { - ctr[m][0] = 0.5 * (bbox[m][0] + bbox[m][1]); - ctr[m][1] = 0.5 * (bbox[m][2] + bbox[m][3]); - ctr[m][2] = 0.5 * (bbox[m][4] + bbox[m][5]); - } - - // idclose = atomID closest to center point of each body - - memory->create(idclose,ncount,"rigid/small:idclose"); - memory->create(iclose,ncount,"rigid/small:iclose"); - memory->create(rsqclose,ncount,"rigid/small:rsqclose"); - for (m = 0; m < ncount; m++) rsqclose[m] = BIG; - - for (i = 0; i < n; i++) { - m = hash.find(in[i].bodyID)->second; - x = in[i].x; - delx = x[0] - ctr[m][0]; - dely = x[1] - ctr[m][1]; - delz = x[2] - ctr[m][2]; - rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= rsqclose[m]) { - if (rsq == rsqclose[m] && in[i].atomID > idclose[m]) continue; - iclose[m] = i; - idclose[m] = in[i].atomID; - rsqclose[m] = rsq; - } - } - - // compute rsqfar for all bodies I own - // set rsqfar back in caller - - double rsqfar = 0.0; - - for (int i = 0; i < n; i++) { - m = hash.find(in[i].bodyID)->second; - xown = in[iclose[m]].x; - x = in[i].x; - delx = x[0] - xown[0]; - dely = x[1] - xown[1]; - delz = x[2] - xown[2]; - rsq = delx*delx + dely*dely + delz*delz; - rsqfar = MAX(rsqfar,rsq); - } - - frsptr->rsqfar = rsqfar; - - // pass list of OutRvous datums back to comm->rendezvous - - int nout = n; - memory->create(proclist,nout,"rigid/small:proclist"); - OutRvous *out = (OutRvous *) - memory->smalloc(nout*sizeof(OutRvous),"rigid/small:out"); - - for (int i = 0; i < nout; i++) { - proclist[i] = in[i].me; - out[i].ilocal = in[i].ilocal; - m = hash.find(in[i].bodyID)->second; - out[i].atomID = idclose[m]; - } - - outbuf = (char *) out; // clean up - // Comm::rendezvous will delete proclist and out (outbuf) + delete hash; + memory->destroy(buf); memory->destroy(bbox); memory->destroy(ctr); memory->destroy(idclose); - memory->destroy(iclose); memory->destroy(rsqclose); +} - // flag = 2: new outbuf +/* ---------------------------------------------------------------------- + process rigid body atoms from another proc + update bounding box for rigid bodies my atoms are part of +------------------------------------------------------------------------- */ - rflag = 2; - return nout; +void FixRigidSmall::ring_bbox(int n, char *cbuf, void *ptr) +{ + FixRigidSmall *frsptr = (FixRigidSmall *) ptr; + std::map *hash = frsptr->hash; + double **bbox = frsptr->bbox; + + double *buf = (double *) cbuf; + int ndatums = n/4; + + int j,imol; + double *x; + + int m = 0; + for (int i = 0; i < ndatums; i++, m += 4) { + imol = static_cast (buf[m]); + if (hash->find(imol) != hash->end()) { + j = hash->find(imol)->second; + x = &buf[m+1]; + bbox[j][0] = MIN(bbox[j][0],x[0]); + bbox[j][1] = MAX(bbox[j][1],x[0]); + bbox[j][2] = MIN(bbox[j][2],x[1]); + bbox[j][3] = MAX(bbox[j][3],x[1]); + bbox[j][4] = MIN(bbox[j][4],x[2]); + bbox[j][5] = MAX(bbox[j][5],x[2]); + } + } +} + +/* ---------------------------------------------------------------------- + process rigid body atoms from another proc + update nearest atom to body center for rigid bodies my atoms are part of +------------------------------------------------------------------------- */ + +void FixRigidSmall::ring_nearest(int n, char *cbuf, void *ptr) +{ + FixRigidSmall *frsptr = (FixRigidSmall *) ptr; + std::map *hash = frsptr->hash; + double **ctr = frsptr->ctr; + tagint *idclose = frsptr->idclose; + double *rsqclose = frsptr->rsqclose; + + double *buf = (double *) cbuf; + int ndatums = n/5; + + int j,imol; + tagint tag; + double delx,dely,delz,rsq; + double *x; + + int m = 0; + for (int i = 0; i < ndatums; i++, m += 5) { + imol = static_cast (buf[m]); + if (hash->find(imol) != hash->end()) { + j = hash->find(imol)->second; + tag = (tagint) ubuf(buf[m+1]).i; + x = &buf[m+2]; + delx = x[0] - ctr[j][0]; + dely = x[1] - ctr[j][1]; + delz = x[2] - ctr[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq <= rsqclose[j]) { + if (rsq == rsqclose[j] && tag > idclose[j]) continue; + idclose[j] = tag; + rsqclose[j] = rsq; + } + } + } +} + +/* ---------------------------------------------------------------------- + process rigid body atoms from another proc + update rsqfar = distance from owning atom to other atom +------------------------------------------------------------------------- */ + +void FixRigidSmall::ring_farthest(int n, char *cbuf, void *ptr) +{ + FixRigidSmall *frsptr = (FixRigidSmall *) ptr; + double **x = frsptr->atom->x; + imageint *image = frsptr->atom->image; + int nlocal = frsptr->atom->nlocal; + + double *buf = (double *) cbuf; + int ndatums = n/4; + + int iowner; + tagint tag; + double delx,dely,delz,rsq; + double *xx; + double unwrap[3]; + + int m = 0; + for (int i = 0; i < ndatums; i++, m += 4) { + tag = (tagint) ubuf(buf[m]).i; + iowner = frsptr->atom->map(tag); + if (iowner < 0 || iowner >= nlocal) continue; + frsptr->domain->unmap(x[iowner],image[iowner],unwrap); + xx = &buf[m+1]; + delx = xx[0] - unwrap[0]; + dely = xx[1] - unwrap[1]; + delz = xx[2] - unwrap[2]; + rsq = delx*delx + dely*dely + delz*delz; + frsptr->rsqfar = MAX(frsptr->rsqfar,rsq); + } } /* ---------------------------------------------------------------------- @@ -2429,9 +2472,9 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) int nlocal = atom->nlocal; - std::map hash; + hash = new std::map(); for (i = 0; i < nlocal; i++) - if (bodyown[i] >= 0) hash[atom->molecule[i]] = bodyown[i]; + if (bodyown[i] >= 0) (*hash)[atom->molecule[i]] = bodyown[i]; // open file and read header @@ -2490,11 +2533,11 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) id = ATOTAGINT(values[0]); if (id <= 0 || id > maxmol) error->all(FLERR,"Invalid rigid body ID in fix rigid/small file"); - if (hash.find(id) == hash.end()) { + if (hash->find(id) == hash->end()) { buf = next + 1; continue; } - m = hash[id]; + m = (*hash)[id]; inbody[m] = 1; if (which == 0) { @@ -2533,6 +2576,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) delete [] buffer; delete [] values; + delete hash; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index f6ad1b7206..3f6826f9bb 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -23,7 +23,7 @@ FixStyle(rigid/small,FixRigidSmall) #include "fix.h" // replace this later -//#include +#include namespace LAMMPS_NS { @@ -180,21 +180,13 @@ class FixRigidSmall : public Fix { // class data used by ring communication callbacks + std::map *hash; + double **bbox; + double **ctr; + tagint *idclose; + double *rsqclose; double rsqfar; - struct InRvous { - int me,ilocal; - tagint atomID,bodyID; - double x[3]; - }; - - struct OutRvous { - int ilocal; - tagint atomID; - }; - - // local methods - void image_shift(); void set_xv(); void set_v(); @@ -207,9 +199,11 @@ class FixRigidSmall : public Fix { void grow_body(); void reset_atom2body(); - // callback function for rendezvous communication + // callback functions for ring communication - static int rendezvous_body(int, char *, int &, int *&, char *&, void *); + static void ring_bbox(int, char *, void *); + static void ring_nearest(int, char *, void *); + static void ring_farthest(int, char *, void *); // debug diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index dcdb190d45..e0d1bf132b 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -39,8 +39,6 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -#define RVOUS 1 // 0 for irregular, 1 for all2all - #define BIG 1.0e20 #define MASSDELTA 0.1 @@ -221,19 +219,8 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : // identify all SHAKE clusters - double time1 = MPI_Wtime(); - find_clusters(); - double time2 = MPI_Wtime(); - - if (comm->me == 0) { - if (screen) - fprintf(screen," find clusters CPU = %g secs\n",time2-time1); - if (logfile) - fprintf(logfile," find clusters CPU = %g secs\n",time2-time1); - } - // initialize list of SHAKE clusters to constrain maxlist = 0; @@ -720,6 +707,13 @@ void FixShake::find_clusters() int nlocal = atom->nlocal; int angles_allow = atom->avec->angles_allow; + // setup ring of procs + + int next = me + 1; + int prev = me -1; + if (next == nprocs) next = 0; + if (prev < 0) prev = nprocs - 1; + // ----------------------------------------------------- // allocate arrays for self (1d) and bond partners (2d) // max = max # of bond partners for owned atoms = 2nd dim of partner arrays @@ -761,10 +755,6 @@ void FixShake::find_clusters() memory->create(partner_shake,nlocal,max,"shake:partner_shake"); memory->create(partner_nshake,nlocal,max,"shake:partner_nshake"); - // setup atomIDs and procowner vectors in rendezvous decomposition - - atom_owners(); - // ----------------------------------------------------- // set npartner and partner_tag from special arrays // ----------------------------------------------------- @@ -788,13 +778,86 @@ void FixShake::find_clusters() } // ----------------------------------------------------- - // set partner_mask, partner_type, partner_massflag, - // partner_bondtype for all my bonded partners - // requires rendezvous communication for off-proc partners + // set partner_mask, partner_type, partner_massflag, partner_bondtype + // for bonded partners + // requires communication for off-proc partners // ----------------------------------------------------- - partner_info(npartner,partner_tag,partner_mask,partner_type, - partner_massflag,partner_bondtype); + // fill in mask, type, massflag, bondtype if own bond partner + // info to store in buf for each off-proc bond = nper = 6 + // 2 atoms IDs in bond, space for mask, type, massflag, bondtype + // nbufmax = largest buffer needed to hold info from any proc + + int nper = 6; + + nbuf = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + partner_mask[i][j] = 0; + partner_type[i][j] = 0; + partner_massflag[i][j] = 0; + partner_bondtype[i][j] = 0; + + m = atom->map(partner_tag[i][j]); + if (m >= 0 && m < nlocal) { + partner_mask[i][j] = mask[m]; + partner_type[i][j] = type[m]; + if (nmass) { + if (rmass) massone = rmass[m]; + else massone = mass[type[m]]; + partner_massflag[i][j] = masscheck(massone); + } + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + else { + n = bondtype_findset(m,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + } + } else nbuf += nper; + } + } + + memory->create(buf,nbuf,"shake:buf"); + + // fill buffer with info + + size = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) { + buf[size] = tag[i]; + buf[size+1] = partner_tag[i][j]; + buf[size+2] = 0; + buf[size+3] = 0; + buf[size+4] = 0; + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) buf[size+5] = n; + else buf[size+5] = 0; + size += nper; + } + } + } + + // cycle buffer around ring of procs back to self + + comm->ring(size,sizeof(tagint),buf,1,ring_bonds,buf,(void *)this); + + // store partner info returned to me + + m = 0; + while (m < size) { + i = atom->map(buf[m]); + for (j = 0; j < npartner[i]; j++) + if (buf[m+1] == partner_tag[i][j]) break; + partner_mask[i][j] = buf[m+2]; + partner_type[i][j] = buf[m+3]; + partner_massflag[i][j] = buf[m+4]; + partner_bondtype[i][j] = buf[m+5]; + m += nper; + } + + memory->destroy(buf); // error check for unfilled partner info // if partner_type not set, is an error @@ -805,18 +868,17 @@ void FixShake::find_clusters() // else it's an error flag = 0; - int flag2 = 0; for (i = 0; i < nlocal; i++) for (j = 0; j < npartner[i]; j++) { - if (partner_type[i][j] == 0) flag++; + if (partner_type[i][j] == 0) flag = 1; if (!(mask[i] & groupbit)) continue; if (!(partner_mask[i][j] & groupbit)) continue; - if (partner_bondtype[i][j] == 0) flag2++; + if (partner_bondtype[i][j] == 0) flag = 1; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Did not find fix shake partner info"); - + // ----------------------------------------------------- // identify SHAKEable bonds // set nshake[i] = # of SHAKE bonds attached to atom i @@ -869,11 +931,56 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set partner_nshake for bonded partners - // requires rendezvous communication for off-proc partners + // requires communication for off-proc partners // ----------------------------------------------------- - nshake_info(npartner,partner_tag,partner_nshake); - + // fill in partner_nshake if own bond partner + // info to store in buf for each off-proc bond = + // 2 atoms IDs in bond, space for nshake value + // nbufmax = largest buffer needed to hold info from any proc + + nbuf = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m >= 0 && m < nlocal) partner_nshake[i][j] = nshake[m]; + else nbuf += 3; + } + } + + memory->create(buf,nbuf,"shake:buf"); + + // fill buffer with info + + size = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) { + buf[size] = tag[i]; + buf[size+1] = partner_tag[i][j]; + size += 3; + } + } + } + + // cycle buffer around ring of procs back to self + + comm->ring(size,sizeof(tagint),buf,2,ring_nshake,buf,(void *)this); + + // store partner info returned to me + + m = 0; + while (m < size) { + i = atom->map(buf[m]); + for (j = 0; j < npartner[i]; j++) + if (buf[m+1] == partner_tag[i][j]) break; + partner_nshake[i][j] = buf[m+2]; + m += 3; + } + + memory->destroy(buf); + // ----------------------------------------------------- // error checks // no atom with nshake > 3 @@ -881,7 +988,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- flag = 0; - for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag++; + for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag = 1; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake cluster of more than 4 atoms"); @@ -889,7 +996,7 @@ void FixShake::find_clusters() for (i = 0; i < nlocal; i++) { if (nshake[i] <= 1) continue; for (j = 0; j < npartner[i]; j++) - if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag++; + if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag = 1; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake clusters are connected"); @@ -957,18 +1064,68 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set shake_flag,shake_atom,shake_type for non-central atoms - // requires rendezvous communication for off-proc atoms + // requires communication for off-proc atoms // ----------------------------------------------------- - shake_info(npartner,partner_tag,partner_shake); + // fill in shake arrays for each bond partner I own + // info to store in buf for each off-proc bond = + // all values from shake_flag, shake_atom, shake_type + // nbufmax = largest buffer needed to hold info from any proc + + nbuf = 0; + for (i = 0; i < nlocal; i++) { + if (shake_flag[i] == 0) continue; + for (j = 0; j < npartner[i]; j++) { + if (partner_shake[i][j] == 0) continue; + m = atom->map(partner_tag[i][j]); + if (m >= 0 && m < nlocal) { + shake_flag[m] = shake_flag[i]; + shake_atom[m][0] = shake_atom[i][0]; + shake_atom[m][1] = shake_atom[i][1]; + shake_atom[m][2] = shake_atom[i][2]; + shake_atom[m][3] = shake_atom[i][3]; + shake_type[m][0] = shake_type[i][0]; + shake_type[m][1] = shake_type[i][1]; + shake_type[m][2] = shake_type[i][2]; + } else nbuf += 9; + } + } + + memory->create(buf,nbuf,"shake:buf"); + + // fill buffer with info + + size = 0; + for (i = 0; i < nlocal; i++) { + if (shake_flag[i] == 0) continue; + for (j = 0; j < npartner[i]; j++) { + if (partner_shake[i][j] == 0) continue; + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) { + buf[size] = partner_tag[i][j]; + buf[size+1] = shake_flag[i]; + buf[size+2] = shake_atom[i][0]; + buf[size+3] = shake_atom[i][1]; + buf[size+4] = shake_atom[i][2]; + buf[size+5] = shake_atom[i][3]; + buf[size+6] = shake_type[i][0]; + buf[size+7] = shake_type[i][1]; + buf[size+8] = shake_type[i][2]; + size += 9; + } + } + } + + // cycle buffer around ring of procs back to self + + comm->ring(size,sizeof(tagint),buf,3,ring_shake,NULL,(void *)this); + + memory->destroy(buf); // ----------------------------------------------------- // free local memory // ----------------------------------------------------- - memory->destroy(atomIDs); - memory->destroy(procowner); - memory->destroy(npartner); memory->destroy(nshake); memory->destroy(partner_tag); @@ -1042,551 +1199,98 @@ void FixShake::find_clusters() } /* ---------------------------------------------------------------------- - setup atomIDs and procowner + when receive buffer, scan bond partner IDs for atoms I own + if I own partner: + fill in mask and type and massflag + search for bond with 1st atom and fill in bondtype ------------------------------------------------------------------------- */ -void FixShake::atom_owners() +void FixShake::ring_bonds(int ndatum, char *cbuf, void *ptr) { - tagint *tag = atom->tag; - int nlocal = atom->nlocal; - - int *proclist; - memory->create(proclist,nlocal,"shake:proclist"); - IDRvous *idbuf = (IDRvous *) - memory->smalloc((bigint) nlocal*sizeof(IDRvous),"shake:idbuf"); - - // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - - for (int i = 0; i < nlocal; i++) { - proclist[i] = tag[i] % nprocs; - idbuf[i].me = me; - idbuf[i].atomID = tag[i]; - } - - // perform rendezvous operation - // each proc assigned every 1/Pth atom - - char *buf; - comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), - 0,proclist, - rendezvous_ids,0,buf,0,(void *) this); - - memory->destroy(proclist); - memory->sfree(idbuf); -} - -/* ---------------------------------------------------------------------- - setup partner_mask, partner_type, partner_massflag, partner_bondtype -------------------------------------------------------------------------- */ - -void FixShake::partner_info(int *npartner, tagint **partner_tag, - int **partner_mask, int **partner_type, - int **partner_massflag, int **partner_bondtype) -{ - int i,j,m,n; - int nlocal = atom->nlocal; - - // nsend = # of my datums to send - // one datum for every off-processor partner - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PartnerInfo *inbuf = (PartnerInfo *) - memory->smalloc((bigint) nsend*sizeof(PartnerInfo),"special:inbuf"); - - // set values in 4 partner arrays for all partner atoms I own - // also setup input buf to rendezvous comm - // input datums = pair of bonded atoms where I do not own partner - // owning proc for each datum = partner_tag % nprocs - // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) - // 4 values for my owned atom - + FixShake *fsptr = (FixShake *)ptr; + Atom *atom = fsptr->atom; double *rmass = atom->rmass; double *mass = atom->mass; - int *type = atom->type; int *mask = atom->mask; - tagint *tag = atom->tag; - - double massone; - - nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - partner_mask[i][j] = 0; - partner_type[i][j] = 0; - partner_massflag[i][j] = 0; - partner_bondtype[i][j] = 0; - - m = atom->map(partner_tag[i][j]); - - if (m >= 0 && m < nlocal) { - partner_mask[i][j] = mask[m]; - partner_type[i][j] = type[m]; - if (nmass) { - if (rmass) massone = rmass[m]; - else massone = mass[type[m]]; - partner_massflag[i][j] = masscheck(massone); - } - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - else { - n = bondtype_findset(m,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - } - - } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; - inbuf[nsend].partnerID = tag[i]; - inbuf[nsend].mask = mask[i]; - inbuf[nsend].type = type[i]; - if (nmass) { - if (rmass) massone = rmass[i]; - else massone = mass[type[i]]; - inbuf[nsend].massflag = masscheck(massone); - } else inbuf[nsend].massflag = 0; - - // my atom may own bond, in which case set partner_bondtype - // else receiver of this datum will own the bond and return the value - - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) { - partner_bondtype[i][j] = n; - inbuf[nsend].bondtype = n; - } else inbuf[nsend].bondtype = 0; - - nsend++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all data needed to populate un-owned partner 4 values - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PartnerInfo), - 0,proclist, - rendezvous_partners_info, - 0,buf,sizeof(PartnerInfo), - (void *) this); - PartnerInfo *outbuf = (PartnerInfo *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set partner 4 values for un-onwed partners based on output info - // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - for (j = 0; j < npartner[i]; j++) - if (partner_tag[i][j] == outbuf[m].partnerID) break; - partner_mask[i][j] = outbuf[m].mask; - partner_type[i][j] = outbuf[m].type; - partner_massflag[i][j] = outbuf[m].massflag; - - // only set partner_bondtype if my atom did not set it - // when setting up rendezvous - // if this proc set it, then sender of this datum set outbuf.bondtype = 0 - - if (partner_bondtype[i][j] == 0) - partner_bondtype[i][j] = outbuf[m].bondtype; - } - - memory->sfree(outbuf); -} - -/* ---------------------------------------------------------------------- - setup partner_nshake -------------------------------------------------------------------------- */ - -void FixShake::nshake_info(int *npartner, tagint **partner_tag, - int **partner_nshake) -{ - int i,j,m,n; + int *type = atom->type; int nlocal = atom->nlocal; - - // nsend = # of my datums to send - // one datum for every off-processor partner - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - NShakeInfo *inbuf = (NShakeInfo *) - memory->smalloc((bigint) nsend*sizeof(NShakeInfo),"special:inbuf"); - - // set partner_nshake for all partner atoms I own - // also setup input buf to rendezvous comm - // input datums = pair of bonded atoms where I do not own partner - // owning proc for each datum = partner_tag % nprocs - // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) - // nshake value for my owned atom - - tagint *tag = atom->tag; - - nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - partner_nshake[i][j] = 0; - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) { - partner_nshake[i][j] = nshake[m]; - } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; - inbuf[nsend].partnerID = tag[i]; - inbuf[nsend].nshake = nshake[i]; - nsend++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all data needed to populate un-owned partner nshake - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(NShakeInfo), - 0,proclist, - rendezvous_nshake,0,buf,sizeof(NShakeInfo), - (void *) this); - NShakeInfo *outbuf = (NShakeInfo *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set partner nshake for un-onwed partners based on output info - // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - for (j = 0; j < npartner[i]; j++) - if (partner_tag[i][j] == outbuf[m].partnerID) break; - partner_nshake[i][j] = outbuf[m].nshake; - } - - memory->sfree(outbuf); -} - -/* ---------------------------------------------------------------------- - setup shake_flag, shake_atom, shake_type -------------------------------------------------------------------------- */ - -void FixShake::shake_info(int *npartner, tagint **partner_tag, - int **partner_shake) -{ - int i,j,m,n; - int nlocal = atom->nlocal; - - // nsend = # of my datums to send - // one datum for every off-processor partner - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - ShakeInfo *inbuf = (ShakeInfo *) - memory->smalloc((bigint) nsend*sizeof(ShakeInfo),"special:inbuf"); - - // set 3 shake arrays for all partner atoms I own - // also setup input buf to rendezvous comm - // input datums = partner atom where I do not own partner - // owning proc for each datum = partner_tag % nprocs - // datum: atomID = partner_tag (off-proc) - // values in 3 shake arrays - - nsend = 0; - for (i = 0; i < nlocal; i++) { - if (shake_flag[i] == 0) continue; - for (j = 0; j < npartner[i]; j++) { - if (partner_shake[i][j] == 0) continue; - m = atom->map(partner_tag[i][j]); - - if (m >= 0 && m < nlocal) { - shake_flag[m] = shake_flag[i]; - shake_atom[m][0] = shake_atom[i][0]; - shake_atom[m][1] = shake_atom[i][1]; - shake_atom[m][2] = shake_atom[i][2]; - shake_atom[m][3] = shake_atom[i][3]; - shake_type[m][0] = shake_type[i][0]; - shake_type[m][1] = shake_type[i][1]; - shake_type[m][2] = shake_type[i][2]; - - } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; - inbuf[nsend].shake_flag = shake_flag[i]; - inbuf[nsend].shake_atom[0] = shake_atom[i][0]; - inbuf[nsend].shake_atom[1] = shake_atom[i][1]; - inbuf[nsend].shake_atom[2] = shake_atom[i][2]; - inbuf[nsend].shake_atom[3] = shake_atom[i][3]; - inbuf[nsend].shake_type[0] = shake_type[i][0]; - inbuf[nsend].shake_type[1] = shake_type[i][1]; - inbuf[nsend].shake_type[2] = shake_type[i][2]; - nsend++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all data needed to populate un-owned shake info - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(ShakeInfo), - 0,proclist, - rendezvous_shake,0,buf,sizeof(ShakeInfo), - (void *) this); - ShakeInfo *outbuf = (ShakeInfo *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set shake info for un-onwed partners based on output info - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - shake_flag[i] = outbuf[m].shake_flag; - shake_atom[i][0] = outbuf[m].shake_atom[0]; - shake_atom[i][1] = outbuf[m].shake_atom[1]; - shake_atom[i][2] = outbuf[m].shake_atom[2]; - shake_atom[i][3] = outbuf[m].shake_atom[3]; - shake_type[i][0] = outbuf[m].shake_type[0]; - shake_type[i][1] = outbuf[m].shake_type[1]; - shake_type[i][2] = outbuf[m].shake_type[2]; - } - - memory->sfree(outbuf); -} - -/* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N IDRvous datums - no outbuf -------------------------------------------------------------------------- */ - -int FixShake::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) -{ - FixShake *fsptr = (FixShake *) ptr; - Memory *memory = fsptr->memory; - - tagint *atomIDs; - int *procowner; - - memory->create(atomIDs,n,"special:atomIDs"); - memory->create(procowner,n,"special:procowner"); - - IDRvous *in = (IDRvous *) inbuf; - - for (int i = 0; i < n; i++) { - atomIDs[i] = in[i].atomID; - procowner[i] = in[i].me; - } - - // store rendezvous data in FixShake class - - fsptr->nrvous = n; - fsptr->atomIDs = atomIDs; - fsptr->procowner = procowner; - - // flag = 0: no second comm needed in rendezvous - - flag = 0; - return 0; -} - -/* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - outbuf = same list of N PairRvous datums, routed to different procs -------------------------------------------------------------------------- */ - -int FixShake::rendezvous_partners_info(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) -{ - int i,m; - - FixShake *fsptr = (FixShake *) ptr; - Atom *atom = fsptr->atom; - Memory *memory = fsptr->memory; - - // clear atom map so it can be here as a hash table - // faster than an STL map for large atom counts - - atom->map_clear(); - - // hash atom IDs stored in rendezvous decomposition - - int nrvous = fsptr->nrvous; - tagint *atomIDs = fsptr->atomIDs; - - for (i = 0; i < nrvous; i++) - atom->map_one(atomIDs[i],i); - - // proclist = owner of atomID in caller decomposition - // outbuf = info about owned atomID = 4 values - - PartnerInfo *in = (PartnerInfo *) inbuf; - int *procowner = fsptr->procowner; - memory->create(proclist,n,"shake:proclist"); - - double massone; int nmass = fsptr->nmass; - for (i = 0; i < n; i++) { - m = atom->map(in[i].atomID); - proclist[i] = procowner[m]; + tagint *buf = (tagint *) cbuf; + int m,n; + double massone; + + for (int i = 0; i < ndatum; i += 6) { + m = atom->map(buf[i+1]); + if (m >= 0 && m < nlocal) { + buf[i+2] = mask[m]; + buf[i+3] = type[m]; + if (nmass) { + if (rmass) massone = rmass[m]; + else massone = mass[type[m]]; + buf[i+4] = fsptr->masscheck(massone); + } + if (buf[i+5] == 0) { + n = fsptr->bondtype_findset(m,buf[i],buf[i+1],0); + if (n) buf[i+5] = n; + } + } } - - outbuf = inbuf; - - // re-create atom map - - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); - - // flag = 1: outbuf = inbuf - - flag = 1; - return n; } /* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N NShakeInfo datums - outbuf = same list of N NShakeInfo datums, routed to different procs + when receive buffer, scan bond partner IDs for atoms I own + if I own partner, fill in nshake value ------------------------------------------------------------------------- */ -int FixShake::rendezvous_nshake(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) +void FixShake::ring_nshake(int ndatum, char *cbuf, void *ptr) { - int i,j,m; - - FixShake *fsptr = (FixShake *) ptr; + FixShake *fsptr = (FixShake *)ptr; Atom *atom = fsptr->atom; - Memory *memory = fsptr->memory; + int nlocal = atom->nlocal; - // clear atom map so it can be here as a hash table - // faster than an STL map for large atom counts + int *nshake = fsptr->nshake; - atom->map_clear(); + tagint *buf = (tagint *) cbuf; + int m; - // hash atom IDs stored in rendezvous decomposition - - int nrvous = fsptr->nrvous; - tagint *atomIDs = fsptr->atomIDs; - - for (i = 0; i < nrvous; i++) - atom->map_one(atomIDs[i],i); - - // proclist = owner of atomID in caller decomposition - // outbuf = info about owned atomID - - NShakeInfo *in = (NShakeInfo *) inbuf; - int *procowner = fsptr->procowner; - memory->create(proclist,n,"shake:proclist"); - - for (i = 0; i < n; i++) { - m = atom->map(in[i].atomID); - proclist[i] = procowner[m]; + for (int i = 0; i < ndatum; i += 3) { + m = atom->map(buf[i+1]); + if (m >= 0 && m < nlocal) buf[i+2] = nshake[m]; } - - outbuf = inbuf; - - // re-create atom map - - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); - - // flag = 1: outbuf = inbuf - - flag = 1; - return n; } + /* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - outbuf = same list of N PairRvous datums, routed to different procs + when receive buffer, scan bond partner IDs for atoms I own + if I own partner, fill in nshake value ------------------------------------------------------------------------- */ -int FixShake::rendezvous_shake(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) +void FixShake::ring_shake(int ndatum, char *cbuf, void *ptr) { - int i,j,m; - - FixShake *fsptr = (FixShake *) ptr; + FixShake *fsptr = (FixShake *)ptr; Atom *atom = fsptr->atom; - Memory *memory = fsptr->memory; + int nlocal = atom->nlocal; - // clear atom map so it can be here as a hash table - // faster than an STL map for large atom counts + int *shake_flag = fsptr->shake_flag; + tagint **shake_atom = fsptr->shake_atom; + int **shake_type = fsptr->shake_type; - atom->map_clear(); + tagint *buf = (tagint *) cbuf; + int m; - // hash atom IDs stored in rendezvous decomposition - - int nrvous = fsptr->nrvous; - tagint *atomIDs = fsptr->atomIDs; - - for (i = 0; i < nrvous; i++) - atom->map_one(atomIDs[i],i); - - // proclist = owner of atomID in caller decomposition - // outbuf = info about owned atomID - - ShakeInfo *in = (ShakeInfo *) inbuf; - int *procowner = fsptr->procowner; - memory->create(proclist,n,"shake:proclist"); - - for (i = 0; i < n; i++) { - m = atom->map(in[i].atomID); - proclist[i] = procowner[m]; + for (int i = 0; i < ndatum; i += 9) { + m = atom->map(buf[i]); + if (m >= 0 && m < nlocal) { + shake_flag[m] = buf[i+1]; + shake_atom[m][0] = buf[i+2]; + shake_atom[m][1] = buf[i+3]; + shake_atom[m][2] = buf[i+4]; + shake_atom[m][3] = buf[i+5]; + shake_type[m][0] = buf[i+6]; + shake_type[m][1] = buf[i+7]; + shake_type[m][2] = buf[i+8]; + } } - - outbuf = inbuf; - - // re-create atom map - - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); - - // flag = 1: outbuf = inbuf; - - flag = 1; - return n; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index b99a35f958..d4e7b85ec4 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -120,11 +120,6 @@ class FixShake : public Fix { int nmol; void find_clusters(); - void atom_owners(); - void partner_info(int *, tagint **, int **, int **, int **, int **); - void nshake_info(int *, tagint **, int **); - void shake_info(int *, tagint **, int **); - int masscheck(double); void unconstrained_update(); void unconstrained_update_respa(int); @@ -136,40 +131,12 @@ class FixShake : public Fix { int bondtype_findset(int, tagint, tagint, int); int angletype_findset(int, tagint, tagint, int); - // data used by rendezvous callback methods + // static variable for ring communication callback to access class data + // callback functions for ring communication - int nrvous; - tagint *atomIDs; - int *procowner; - - struct IDRvous { - int me; - tagint atomID; - }; - - struct PartnerInfo { - tagint atomID,partnerID; - int mask,type,massflag,bondtype; - }; - - struct NShakeInfo { - tagint atomID,partnerID; - int nshake; - }; - - struct ShakeInfo { - tagint atomID; - tagint shake_atom[4]; - int shake_flag; - int shake_type[3]; - }; - - // callback functions for rendezvous communication - - static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); - static int rendezvous_partners_info(int, char *, int &, int *&, char *&, void *); - static int rendezvous_nshake(int, char *, int &, int *&, char *&, void *); - static int rendezvous_shake(int, char *, int &, int *&, char *&, void *); + static void ring_bonds(int, char *, void *); + static void ring_nshake(int, char *, void *); + static void ring_shake(int, char *, void *); }; } diff --git a/src/comm.cpp b/src/comm.cpp index 729f96581a..f355a562fc 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -28,7 +28,6 @@ #include "dump.h" #include "group.h" #include "procmap.h" -#include "irregular.h" #include "accelerator_kokkos.h" #include "memory.h" #include "error.h" @@ -726,433 +725,6 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, memory->destroy(bufcopy); } -/* ---------------------------------------------------------------------- - rendezvous communication operation - three stages: - first comm sends inbuf from caller decomp to rvous decomp - callback operates on data in rendevous decomp - second comm sends outbuf from rvous decomp back to caller decomp - inputs: - which = perform (0) irregular or (1) MPI_All2allv communication - n = # of datums in inbuf - inbuf = vector of input datums - insize = byte size of each input datum - inorder = 0 for inbuf in random proc order, 1 for datums ordered by proc - procs: inorder 0 = proc to send each datum to, 1 = # of datums/proc, - callback = caller function to invoke in rendezvous decomposition - takes input datums, returns output datums - outorder = same as inorder, but for datums returned by callback() - ptr = pointer to caller class, passed to callback() - outputs: - nout = # of output datums (function return) - outbuf = vector of output datums - outsize = byte size of each output datum - callback inputs: - nrvous = # of rvous decomp datums in inbuf_rvous - inbuf_rvous = vector of rvous decomp input datums - ptr = pointer to caller class - callback outputs: - nrvous_out = # of rvous decomp output datums (function return) - flag = 0 for no second comm, 1 for outbuf_rvous = inbuf_rvous, - 2 for second comm with new outbuf_rvous - procs_rvous = outorder 0 = proc to send each datum to, 1 = # of datums/proc - allocated - outbuf_rvous = vector of rvous decomp output datums - NOTE: could use MPI_INT or MPI_DOUBLE insead of MPI_CHAR - to avoid checked-for overflow in MPI_Alltoallv? -------------------------------------------------------------------------- */ - -int Comm:: -rendezvous(int which, int n, char *inbuf, int insize, - int inorder, int *procs, - int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr, int statflag) -{ - if (which == 0) - return rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr,statflag); - else - return rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr,statflag); -} - -/* ---------------------------------------------------------------------- */ - -int Comm:: -rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, - int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, - int outsize, void *ptr, int statflag) -{ - // irregular comm of inbuf from caller decomp to rendezvous decomp - - Irregular *irregular = new Irregular(lmp); - - int nrvous; - if (inorder) nrvous = irregular->create_data_grouped(n,procs); - else nrvous = irregular->create_data(n,procs); - - char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, - "rendezvous:inbuf"); - irregular->exchange_data(inbuf,insize,inbuf_rvous); - - bigint irregular1_bytes = irregular->memory_usage(); - irregular->destroy_data(); - delete irregular; - - // peform rendezvous computation via callback() - // callback() allocates/populates proclist_rvous and outbuf_rvous - - int flag; - int *procs_rvous; - char *outbuf_rvous; - int nrvous_out = callback(nrvous,inbuf_rvous,flag, - procs_rvous,outbuf_rvous,ptr); - - if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) { - if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + - irregular1_bytes); - return 0; // all nout_rvous are 0, no 2nd comm stage - } - - // irregular comm of outbuf from rendezvous decomp back to caller decomp - // caller will free outbuf - - irregular = new Irregular(lmp); - - int nout; - if (outorder) - nout = irregular->create_data_grouped(nrvous_out,procs_rvous); - else nout = irregular->create_data(nrvous_out,procs_rvous); - - outbuf = (char *) memory->smalloc((bigint) nout*outsize, - "rendezvous:outbuf"); - irregular->exchange_data(outbuf_rvous,outsize,outbuf); - - bigint irregular2_bytes = irregular->memory_usage(); - irregular->destroy_data(); - delete irregular; - - memory->destroy(procs_rvous); - memory->sfree(outbuf_rvous); - - // return number of output datums - // last arg to stats() = memory for procs_rvous + irregular comm - - if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + - MAX(irregular1_bytes,irregular2_bytes)); - return nout; -} - -/* ---------------------------------------------------------------------- */ - -int Comm:: -rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, - int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr, - int statflag) -{ - int iproc; - bigint all2all1_bytes,all2all2_bytes; - int *sendcount,*sdispls,*recvcount,*rdispls; - int *procs_a2a; - bigint *offsets; - char *inbuf_a2a,*outbuf_a2a; - - // create procs and inbuf for All2all if necesary - - if (!inorder) { - memory->create(procs_a2a,nprocs,"rendezvous:procs"); - inbuf_a2a = (char *) memory->smalloc((bigint) n*insize, - "rendezvous:inbuf"); - memory->create(offsets,nprocs,"rendezvous:offsets"); - - for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; - for (int i = 0; i < n; i++) procs_a2a[procs[i]]++; - - offsets[0] = 0; - for (int i = 1; i < nprocs; i++) - offsets[i] = offsets[i-1] + insize*procs_a2a[i-1]; - - bigint offset = 0; - for (int i = 0; i < n; i++) { - iproc = procs[i]; - memcpy(&inbuf_a2a[offsets[iproc]],&inbuf[offset],insize); - offsets[iproc] += insize; - offset += insize; - } - - all2all1_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + n*insize; - - } else { - procs_a2a = procs; - inbuf_a2a = inbuf; - all2all1_bytes = 0; - } - - // create args for MPI_Alltoallv() on input data - - memory->create(sendcount,nprocs,"rendezvous:sendcount"); - memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); - - memory->create(recvcount,nprocs,"rendezvous:recvcount"); - MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); - - memory->create(sdispls,nprocs,"rendezvous:sdispls"); - memory->create(rdispls,nprocs,"rendezvous:rdispls"); - sdispls[0] = rdispls[0] = 0; - for (int i = 1; i < nprocs; i++) { - sdispls[i] = sdispls[i-1] + sendcount[i-1]; - rdispls[i] = rdispls[i-1] + recvcount[i-1]; - } - int nrvous = rdispls[nprocs-1] + recvcount[nprocs-1]; - - // test for overflow of input data due to imbalance or insize - // means that individual sdispls or rdispls values overflow - - int overflow = 0; - if ((bigint) n*insize > MAXSMALLINT) overflow = 1; - if ((bigint) nrvous*insize > MAXSMALLINT) overflow = 1; - int overflowall; - MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); - if (overflowall) error->all(FLERR,"Overflow input size in rendezvous_a2a"); - - for (int i = 0; i < nprocs; i++) { - sendcount[i] *= insize; - sdispls[i] *= insize; - recvcount[i] *= insize; - rdispls[i] *= insize; - } - - // all2all comm of inbuf from caller decomp to rendezvous decomp - - char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, - "rendezvous:inbuf"); - - MPI_Alltoallv(inbuf_a2a,sendcount,sdispls,MPI_CHAR, - inbuf_rvous,recvcount,rdispls,MPI_CHAR,world); - - if (!inorder) { - memory->destroy(procs_a2a); - memory->sfree(inbuf_a2a); - memory->destroy(offsets); - } - - // peform rendezvous computation via callback() - // callback() allocates/populates proclist_rvous and outbuf_rvous - - int flag; - int *procs_rvous; - char *outbuf_rvous; - - int nrvous_out = callback(nrvous,inbuf_rvous,flag, - procs_rvous,outbuf_rvous,ptr); - - if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) { - memory->destroy(sendcount); - memory->destroy(recvcount); - memory->destroy(sdispls); - memory->destroy(rdispls); - if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + - 4*nprocs*sizeof(int) + all2all1_bytes); - return 0; // all nout_rvous are 0, no 2nd irregular - } - - - - - - - // create procs and outbuf for All2all if necesary - - if (!outorder) { - memory->create(procs_a2a,nprocs,"rendezvous_a2a:procs"); - - outbuf_a2a = (char *) memory->smalloc((bigint) nrvous_out*outsize, - "rendezvous:outbuf"); - memory->create(offsets,nprocs,"rendezvous:offsets"); - - for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; - for (int i = 0; i < nrvous_out; i++) procs_a2a[procs_rvous[i]]++; - - offsets[0] = 0; - for (int i = 1; i < nprocs; i++) - offsets[i] = offsets[i-1] + outsize*procs_a2a[i-1]; - - bigint offset = 0; - for (int i = 0; i < nrvous_out; i++) { - iproc = procs_rvous[i]; - memcpy(&outbuf_a2a[offsets[iproc]],&outbuf_rvous[offset],outsize); - offsets[iproc] += outsize; - offset += outsize; - } - - all2all2_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + - nrvous_out*outsize; - - } else { - procs_a2a = procs_rvous; - outbuf_a2a = outbuf_rvous; - all2all2_bytes = 0; - } - - // comm outbuf from rendezvous decomposition back to caller - - memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); - - MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); - - sdispls[0] = rdispls[0] = 0; - for (int i = 1; i < nprocs; i++) { - sdispls[i] = sdispls[i-1] + sendcount[i-1]; - rdispls[i] = rdispls[i-1] + recvcount[i-1]; - } - int nout = rdispls[nprocs-1] + recvcount[nprocs-1]; - - // test for overflow of outbuf due to imbalance or outsize - // means that individual sdispls or rdispls values overflow - - overflow = 0; - if ((bigint) nrvous*outsize > MAXSMALLINT) overflow = 1; - if ((bigint) nout*outsize > MAXSMALLINT) overflow = 1; - MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); - if (overflowall) error->all(FLERR,"Overflow output in rendezvous_a2a"); - - for (int i = 0; i < nprocs; i++) { - sendcount[i] *= outsize; - sdispls[i] *= outsize; - recvcount[i] *= outsize; - rdispls[i] *= outsize; - } - - // all2all comm of outbuf from rendezvous decomp back to caller decomp - // caller will free outbuf - - outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); - - MPI_Alltoallv(outbuf_a2a,sendcount,sdispls,MPI_CHAR, - outbuf,recvcount,rdispls,MPI_CHAR,world); - - memory->destroy(procs_rvous); - memory->sfree(outbuf_rvous); - - if (!outorder) { - memory->destroy(procs_a2a); - memory->sfree(outbuf_a2a); - memory->destroy(offsets); - } - - // clean up - - memory->destroy(sendcount); - memory->destroy(recvcount); - memory->destroy(sdispls); - memory->destroy(rdispls); - - // return number of output datums - // last arg to stats() = mem for procs_rvous + per-proc vecs + reordering ops - - if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + - 4*nprocs*sizeof(int) + - MAX(all2all1_bytes,all2all2_bytes)); - return nout; -} - -/* ---------------------------------------------------------------------- - print balance and memory info for rendezvous operation - useful for debugging -------------------------------------------------------------------------- */ - -void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, - int insize, int outsize, bigint commsize) -{ - bigint size_in_all,size_in_max,size_in_min; - bigint size_out_all,size_out_max,size_out_min; - bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; - bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; - bigint size_comm_all,size_comm_max,size_comm_min; - - bigint size = (bigint) n*insize; - MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nout*outsize; - MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous*insize; - MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous_out*insize; - MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = commsize; - MPI_Allreduce(&size,&size_comm_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_comm_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_comm_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - int mbytes = 1024*1024; - - if (me == 0) { - if (screen) { - fprintf(screen,"Rendezvous balance and memory info: (tot,ave,max,min) \n"); - fprintf(screen," input datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_in_all/insize,1.0*size_in_all/nprocs/insize, - size_in_max/insize,size_in_min/insize); - fprintf(screen," input data (MB): %g %g %g %g\n", - 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, - 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - if (outsize) - fprintf(screen," output datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_out_all/outsize,1.0*size_out_all/nprocs/outsize, - size_out_max/outsize,size_out_min/outsize); - else - fprintf(screen," output datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - 0,0.0,0,0); - fprintf(screen," output data (MB): %g %g %g %g\n", - 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, - 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); - fprintf(screen," input rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, - size_inrvous_max/insize,size_inrvous_min/insize); - fprintf(screen," input rvous data (MB): %g %g %g %g\n", - 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, - 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - if (outsize) - fprintf(screen," output rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, - size_outrvous_max/outsize,size_outrvous_min/outsize); - else - fprintf(screen," output rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - 0,0.0,0,0); - fprintf(screen," output rvous data (MB): %g %g %g %g\n", - 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, - 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); - fprintf(screen," rvous comm (MB): %g %g %g %g\n", - 1.0*size_comm_all/mbytes,1.0*size_comm_all/nprocs/mbytes, - 1.0*size_comm_max/mbytes,1.0*size_comm_min/mbytes); - } - } -} - /* ---------------------------------------------------------------------- proc 0 reads Nlines from file into buf and bcasts buf to all procs caller allocates buf to max size needed diff --git a/src/comm.h b/src/comm.h index 9c0112b4c4..2579f9b283 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,10 +109,6 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); - int rendezvous(int, int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *, int statflag=0); - int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); @@ -146,15 +142,6 @@ class Comm : protected Pointers { int ncores; // # of cores per node int coregrid[3]; // 3d grid of cores within a node int user_coregrid[3]; // user request for cores in each dim - - int rendezvous_irregular(int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *, int); - int rendezvous_all2all(int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *, int); - void rendezvous_stats(int, int, int, int, int, int, bigint); - public: enum{MULTIPLE}; }; diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 52e4256fca..cb0da42970 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -514,6 +514,9 @@ void CreateAtoms::command(int narg, char **arg) if (domain->triclinic) domain->lamda2x(atom->nlocal); } + MPI_Barrier(world); + double time2 = MPI_Wtime(); + // clean up delete ranmol; @@ -523,6 +526,21 @@ void CreateAtoms::command(int narg, char **arg) delete [] ystr; delete [] zstr; + // print status + + if (comm->me == 0) { + if (screen) { + fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(screen," Time spent = %g secs\n",time2-time1); + } + if (logfile) { + fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(logfile," Time spent = %g secs\n",time2-time1); + } + } + // for MOLECULE mode: // create special bond lists for molecular systems, // but not for atom style template @@ -532,25 +550,6 @@ void CreateAtoms::command(int narg, char **arg) if (atom->molecular == 1 && onemol->bondflag && !onemol->specialflag) { Special special(lmp); special.build(); - - } - } - - // print status - - MPI_Barrier(world); - double time2 = MPI_Wtime(); - - if (comm->me == 0) { - if (screen) { - fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(screen," create_atoms CPU = %g secs\n",time2-time1); - } - if (logfile) { - fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(logfile," create_atoms CPU = %g secs\n",time2-time1); } } } diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp deleted file mode 100644 index f1d4e61142..0000000000 --- a/src/hashlittle.cpp +++ /dev/null @@ -1,349 +0,0 @@ -// Hash function hashlittle() -// from lookup3.c, by Bob Jenkins, May 2006, Public Domain -// bob_jenkins@burtleburtle.net - -#include -#include -#include - -// if the system defines the __BYTE_ORDER__ define, -// we use it instead of guessing the platform - -#if defined(__BYTE_ORDER__) -# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define HASH_LITTLE_ENDIAN 1 -# else -# define HASH_LITTLE_ENDIAN 0 -# endif -#else // heuristic platform guess -# if defined(__bg__) -# define HASH_LITTLE_ENDIAN 0 // IBM BlueGene is big endian -# else -# define HASH_LITTLE_ENDIAN 1 // Intel and AMD x86 are little endian -# endif -#endif - -#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) - -/* -------------------------------------------------------------------------------- -mix -- mix 3 32-bit values reversibly. - -This is reversible, so any information in (a,b,c) before mix() is -still in (a,b,c) after mix(). - -If four pairs of (a,b,c) inputs are run through mix(), or through -mix() in reverse, there are at least 32 bits of the output that -are sometimes the same for one pair and different for another pair. -This was tested for: -* pairs that differed by one bit, by two bits, in any combination - of top bits of (a,b,c), or in any combination of bottom bits of - (a,b,c). -* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed - the output delta to a Gray code (a^(a>>1)) so a string of 1's (as - is commonly produced by subtraction) look like a single 1-bit - difference. -* the base values were pseudorandom, all zero but one bit set, or - all zero plus a counter that starts at zero. - -Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that -satisfy this are - 4 6 8 16 19 4 - 9 15 3 18 27 15 - 14 9 3 7 17 3 -Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing -for "differ" defined as + with a one-bit base and a two-bit delta. I -used http://burtleburtle.net/bob/hash/avalanche.html to choose -the operations, constants, and arrangements of the variables. - -This does not achieve avalanche. There are input bits of (a,b,c) -that fail to affect some output bits of (a,b,c), especially of a. The -most thoroughly mixed value is c, but it doesn't really even achieve -avalanche in c. - -This allows some parallelism. Read-after-writes are good at doubling -the number of bits affected, so the goal of mixing pulls in the opposite -direction as the goal of parallelism. I did what I could. Rotates -seem to cost as much as shifts on every machine I could lay my hands -on, and rotates are much kinder to the top and bottom bits, so I used -rotates. -------------------------------------------------------------------------------- -*/ -#define mix(a,b,c) \ -{ \ - a -= c; a ^= rot(c, 4); c += b; \ - b -= a; b ^= rot(a, 6); a += c; \ - c -= b; c ^= rot(b, 8); b += a; \ - a -= c; a ^= rot(c,16); c += b; \ - b -= a; b ^= rot(a,19); a += c; \ - c -= b; c ^= rot(b, 4); b += a; \ -} - -/* -------------------------------------------------------------------------------- -final -- final mixing of 3 32-bit values (a,b,c) into c - -Pairs of (a,b,c) values differing in only a few bits will usually -produce values of c that look totally different. This was tested for -* pairs that differed by one bit, by two bits, in any combination - of top bits of (a,b,c), or in any combination of bottom bits of - (a,b,c). -* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed - the output delta to a Gray code (a^(a>>1)) so a string of 1's (as - is commonly produced by subtraction) look like a single 1-bit - difference. -* the base values were pseudorandom, all zero but one bit set, or - all zero plus a counter that starts at zero. - -These constants passed: - 14 11 25 16 4 14 24 - 12 14 25 16 4 14 24 -and these came close: - 4 8 15 26 3 22 24 - 10 8 15 26 3 22 24 - 11 8 15 26 3 22 24 -------------------------------------------------------------------------------- -*/ -#define final(a,b,c) \ -{ \ - c ^= b; c -= rot(b,14); \ - a ^= c; a -= rot(c,11); \ - b ^= a; b -= rot(a,25); \ - c ^= b; c -= rot(b,16); \ - a ^= c; a -= rot(c,4); \ - b ^= a; b -= rot(a,14); \ - c ^= b; c -= rot(b,24); \ -} - -/* -------------------------------------------------------------------------------- -hashlittle() -- hash a variable-length key into a 32-bit value - k : the key (the unaligned variable-length array of bytes) - length : the length of the key, counting by bytes - initval : can be any 4-byte value -Returns a 32-bit value. Every bit of the key affects every bit of -the return value. Two keys differing by one or two bits will have -totally different hash values. - -The best hash table sizes are powers of 2. There is no need to do -mod a prime (mod is sooo slow!). If you need less than 32 bits, -use a bitmask. For example, if you need only 10 bits, do - h = (h & hashmask(10)); -In which case, the hash table should have hashsize(10) elements. - -If you are hashing n strings (uint8_t **)k, do it like this: - for (i=0, h=0; i 12) - { - a += k[0]; - b += k[1]; - c += k[2]; - mix(a,b,c); - length -= 12; - k += 3; - } - - /*----------------------------- handle the last (probably partial) block */ - /* - * "k[2]&0xffffff" actually reads beyond the end of the string, but - * then masks off the part it's not allowed to read. Because the - * string is aligned, the masked-off tail is in the same word as the - * rest of the string. Every machine with memory protection I've seen - * does it on word boundaries, so is OK with this. But VALGRIND will - * still catch it and complain. The masking trick does make the hash - * noticably faster for short strings (like English words). - */ -#ifndef VALGRIND - - switch(length) - { - case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; - case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; - case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; - case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; - case 8 : b+=k[1]; a+=k[0]; break; - case 7 : b+=k[1]&0xffffff; a+=k[0]; break; - case 6 : b+=k[1]&0xffff; a+=k[0]; break; - case 5 : b+=k[1]&0xff; a+=k[0]; break; - case 4 : a+=k[0]; break; - case 3 : a+=k[0]&0xffffff; break; - case 2 : a+=k[0]&0xffff; break; - case 1 : a+=k[0]&0xff; break; - case 0 : return c; /* zero length strings require no mixing */ - } - -#else /* make valgrind happy */ - - k8 = (const uint8_t *)k; - switch(length) - { - case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; - case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ - case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ - case 9 : c+=k8[8]; /* fall through */ - case 8 : b+=k[1]; a+=k[0]; break; - case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ - case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ - case 5 : b+=k8[4]; /* fall through */ - case 4 : a+=k[0]; break; - case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ - case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ - case 1 : a+=k8[0]; break; - case 0 : return c; - } - -#endif /* !valgrind */ - - } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { - const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ - const uint8_t *k8; - - /*--------------- all but last block: aligned reads and different mixing */ - while (length > 12) - { - a += k[0] + (((uint32_t)k[1])<<16); - b += k[2] + (((uint32_t)k[3])<<16); - c += k[4] + (((uint32_t)k[5])<<16); - mix(a,b,c); - length -= 12; - k += 6; - } - - /*----------------------------- handle the last (probably partial) block */ - k8 = (const uint8_t *)k; - switch(length) - { - case 12: c+=k[4]+(((uint32_t)k[5])<<16); - b+=k[2]+(((uint32_t)k[3])<<16); - a+=k[0]+(((uint32_t)k[1])<<16); - break; - case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ - case 10: c+=k[4]; - b+=k[2]+(((uint32_t)k[3])<<16); - a+=k[0]+(((uint32_t)k[1])<<16); - break; - case 9 : c+=k8[8]; /* fall through */ - case 8 : b+=k[2]+(((uint32_t)k[3])<<16); - a+=k[0]+(((uint32_t)k[1])<<16); - break; - case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ - case 6 : b+=k[2]; - a+=k[0]+(((uint32_t)k[1])<<16); - break; - case 5 : b+=k8[4]; /* fall through */ - case 4 : a+=k[0]+(((uint32_t)k[1])<<16); - break; - case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ - case 2 : a+=k[0]; - break; - case 1 : a+=k8[0]; - break; - case 0 : return c; /* zero length requires no mixing */ - } - - } else { /* need to read the key one byte at a time */ - const uint8_t *k = (const uint8_t *)key; - - /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ - while (length > 12) - { - a += k[0]; - a += ((uint32_t)k[1])<<8; - a += ((uint32_t)k[2])<<16; - a += ((uint32_t)k[3])<<24; - b += k[4]; - b += ((uint32_t)k[5])<<8; - b += ((uint32_t)k[6])<<16; - b += ((uint32_t)k[7])<<24; - c += k[8]; - c += ((uint32_t)k[9])<<8; - c += ((uint32_t)k[10])<<16; - c += ((uint32_t)k[11])<<24; - mix(a,b,c); - length -= 12; - k += 12; - } - - /*-------------------------------- last block: affect all 32 bits of (c) */ - switch(length) /* all the case statements fall through */ - { - case 12: c+=((uint32_t)k[11])<<24; - case 11: c+=((uint32_t)k[10])<<16; - case 10: c+=((uint32_t)k[9])<<8; - case 9 : c+=k[8]; - case 8 : b+=((uint32_t)k[7])<<24; - case 7 : b+=((uint32_t)k[6])<<16; - case 6 : b+=((uint32_t)k[5])<<8; - case 5 : b+=k[4]; - case 4 : a+=((uint32_t)k[3])<<24; - case 3 : a+=((uint32_t)k[2])<<16; - case 2 : a+=((uint32_t)k[1])<<8; - case 1 : a+=k[0]; - break; - case 0 : return c; - } - } - - final(a,b,c); - return c; - -#else /* PURIFY_HATES_HASHLITTLE */ -/* I don't know what it is about Jenkins' hashlittle function, but - * it drives purify insane, even with VALGRIND defined. It makes - * purify unusable!! The code execution doesn't even make sense. - * Below is a (probably) weaker hash function that at least allows - * testing with purify. - */ -#define MAXINT_DIV_PHI 11400714819323198485U - - uint32_t h, rest, *p, bytes, num_bytes; - char *byteptr; - - num_bytes = length; - - /* First hash the uint32_t-sized portions of the key */ - h = 0; - for (p = (uint32_t *)key, bytes=num_bytes; - bytes >= (uint32_t) sizeof(uint32_t); - bytes-=sizeof(uint32_t), p++){ - h = (h^(*p))*MAXINT_DIV_PHI; - } - - /* Then take care of the remaining bytes, if any */ - rest = 0; - for (byteptr = (char *)p; bytes > 0; bytes--, byteptr++){ - rest = (rest<<8) | (*byteptr); - } - - /* If extra bytes, merge the two parts */ - if (rest) - h = (h^rest)*MAXINT_DIV_PHI; - - return h; -#endif /* PURIFY_HATES_HASHLITTLE */ -} diff --git a/src/hashlittle.h b/src/hashlittle.h deleted file mode 100644 index 7b57a35c80..0000000000 --- a/src/hashlittle.h +++ /dev/null @@ -1,5 +0,0 @@ -// Hash function hashlittle() -// from lookup3.c, by Bob Jenkins, May 2006, Public Domain -// bob_jenkins@burtleburtle.net - -uint32_t hashlittle(const void *key, size_t length, uint32_t); diff --git a/src/irregular.cpp b/src/irregular.cpp index c27a8c8e18..9c15f135d0 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -501,8 +501,7 @@ int compare_standalone(const int i, const int j, void *ptr) void Irregular::exchange_atom(double *sendbuf, int *sizes, double *recvbuf) { - int i,m,n,count; - bigint offset; + int i,m,n,offset,count; // post all receives @@ -622,7 +621,6 @@ int Irregular::create_data(int n, int *proclist, int sortflag) num_send = new int[nsend_proc]; index_send = new int[n-work1[me]]; index_self = new int[work1[me]]; - maxindex = n; // proc_send = procs I send to // num_send = # of datums I send to each proc @@ -680,182 +678,8 @@ int Irregular::create_data(int n, int *proclist, int sortflag) // receive incoming messages // proc_recv = procs I recv from - // num_recv = # of datums each proc sends me - // nrecvdatum = total # of datums I recv - - int nrecvdatum = 0; - for (i = 0; i < nrecv_proc; i++) { - MPI_Recv(&num_recv[i],1,MPI_INT,MPI_ANY_SOURCE,0,world,status); - proc_recv[i] = status->MPI_SOURCE; - nrecvdatum += num_recv[i]; - } - nrecvdatum += num_self; - - // sort proc_recv and num_recv by proc ID if requested - // useful for debugging to insure reproducible ordering of received datums - - if (sortflag) { - int *order = new int[nrecv_proc]; - int *proc_recv_ordered = new int[nrecv_proc]; - int *num_recv_ordered = new int[nrecv_proc]; - - for (i = 0; i < nrecv_proc; i++) order[i] = i; - -#if defined(LMP_QSORT) - proc_recv_copy = proc_recv; - qsort(order,nrecv_proc,sizeof(int),compare_standalone); -#else - merge_sort(order,nrecv_proc,(void *)proc_recv,compare_standalone); -#endif - - int j; - for (i = 0; i < nrecv_proc; i++) { - j = order[i]; - proc_recv_ordered[i] = proc_recv[j]; - num_recv_ordered[i] = num_recv[j]; - } - - memcpy(proc_recv,proc_recv_ordered,nrecv_proc*sizeof(int)); - memcpy(num_recv,num_recv_ordered,nrecv_proc*sizeof(int)); - delete [] order; - delete [] proc_recv_ordered; - delete [] num_recv_ordered; - } - - // barrier to insure all MPI_ANY_SOURCE messages are received - // else another proc could proceed to exchange_data() and send to me - - MPI_Barrier(world); - - // return # of datums I will receive - - return nrecvdatum; -} - -/* ---------------------------------------------------------------------- - create communication plan based on list of datums of uniform size - n = # of datums to send - procs = how many datums to send to each proc, must include self - sort = flag for sorting order of received messages by proc ID - return total # of datums I will recv, including any to self -------------------------------------------------------------------------- */ - -int Irregular::create_data_grouped(int n, int *procs, int sortflag) -{ - int i,j,k,m; - - // setup for collective comm - // work1 = # of datums I send to each proc, set self to 0 - // work2 = 1 for all procs, used for ReduceScatter - - for (i = 0; i < nprocs; i++) { - work1[i] = procs[i]; - work2[i] = 1; - } - work1[me] = 0; - - // nrecv_proc = # of procs I receive messages from, not including self - // options for performing ReduceScatter operation - // some are more efficient on some machines at big sizes - -#ifdef LAMMPS_RS_ALLREDUCE_INPLACE - MPI_Allreduce(MPI_IN_PLACE,work1,nprocs,MPI_INT,MPI_SUM,world); - nrecv_proc = work1[me]; -#else -#ifdef LAMMPS_RS_ALLREDUCE - MPI_Allreduce(work1,work2,nprocs,MPI_INT,MPI_SUM,world); - nrecv_proc = work2[me]; -#else - MPI_Reduce_scatter(work1,&nrecv_proc,work2,MPI_INT,MPI_SUM,world); -#endif -#endif - - // allocate receive arrays - - proc_recv = new int[nrecv_proc]; - num_recv = new int[nrecv_proc]; - request = new MPI_Request[nrecv_proc]; - status = new MPI_Status[nrecv_proc]; - - // work1 = # of datums I send to each proc, including self - // nsend_proc = # of procs I send messages to, not including self - - for (i = 0; i < nprocs; i++) work1[i] = procs[i]; - - nsend_proc = 0; - for (i = 0; i < nprocs; i++) - if (work1[i]) nsend_proc++; - if (work1[me]) nsend_proc--; - - // allocate send and self arrays - - proc_send = new int[nsend_proc]; - num_send = new int[nsend_proc]; - index_send = new int[n-work1[me]]; - index_self = new int[work1[me]]; - maxindex = n; - - // proc_send = procs I send to - // num_send = # of datums I send to each proc - // num_self = # of datums I copy to self - // to balance pattern of send messages: - // each proc begins with iproc > me, continues until iproc = me - // reset work1 to store which send message each proc corresponds to - - int iproc = me; - int isend = 0; - for (i = 0; i < nprocs; i++) { - iproc++; - if (iproc == nprocs) iproc = 0; - if (iproc == me) { - num_self = work1[iproc]; - work1[iproc] = 0; - } else if (work1[iproc] > 0) { - proc_send[isend] = iproc; - num_send[isend] = work1[iproc]; - work1[iproc] = isend; - isend++; - } - } - - // work2 = offsets into index_send for each proc I send to - // m = ptr into index_self - // index_send = list of which datums to send to each proc - // 1st N1 values are datum indices for 1st proc, - // next N2 values are datum indices for 2nd proc, etc - // index_self = list of which datums to copy to self - - work2[0] = 0; - for (i = 1; i < nsend_proc; i++) work2[i] = work2[i-1] + num_send[i-1]; - - m = 0; - i = 0; - for (iproc = 0; iproc < nprocs; iproc++) { - k = procs[iproc]; - for (j = 0; j < k; j++) { - if (iproc == me) index_self[m++] = i++; - else { - isend = work1[iproc]; - index_send[work2[isend]++] = i++; - } - } - } - - // tell receivers how much data I send - // sendmax_proc = largest # of datums I send in a single message - - sendmax_proc = 0; - for (i = 0; i < nsend_proc; i++) { - MPI_Request tmpReq; // Use non-blocking send to avoid possible deadlock - MPI_Isend(&num_send[i],1,MPI_INT,proc_send[i],0,world,&tmpReq); - MPI_Request_free(&tmpReq); // the MPI_Barrier below marks completion - sendmax_proc = MAX(sendmax_proc,num_send[i]); - } - - // receive incoming messages - // proc_recv = procs I recv from - // num_recv = # of datums each proc sends me - // nrecvdatum = total # of datums I recv + // num_recv = total size of message each proc sends me + // nrecvdatum = total size of data I recv int nrecvdatum = 0; for (i = 0; i < nrecv_proc; i++) { @@ -915,13 +739,11 @@ int Irregular::create_data_grouped(int n, int *procs, int sortflag) void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) { - int i,n,count; - bigint m; // these 2 lines enable send/recv buf to be larger than 2 GB - char *dest; + int i,m,n,offset,count; // post all receives, starting after self copies - bigint offset = num_self*nbytes; + offset = num_self*nbytes; for (int irecv = 0; irecv < nrecv_proc; irecv++) { MPI_Irecv(&recvbuf[offset],num_recv[irecv]*nbytes,MPI_CHAR, proc_recv[irecv],0,world,&request[irecv]); @@ -943,34 +765,23 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) n = 0; for (int isend = 0; isend < nsend_proc; isend++) { count = num_send[isend]; - dest = buf; for (i = 0; i < count; i++) { m = index_send[n++]; - memcpy(dest,&sendbuf[m*nbytes],nbytes); - dest += nbytes; + memcpy(&buf[i*nbytes],&sendbuf[m*nbytes],nbytes); } MPI_Send(buf,count*nbytes,MPI_CHAR,proc_send[isend],0,world); } // copy datums to self, put at beginning of recvbuf - dest = recvbuf; for (i = 0; i < num_self; i++) { m = index_self[i]; - memcpy(dest,&sendbuf[m*nbytes],nbytes); - dest += nbytes; + memcpy(&recvbuf[i*nbytes],&sendbuf[m*nbytes],nbytes); } // wait on all incoming messages if (nrecv_proc) MPI_Waitall(nrecv_proc,request,status); - - // approximate memory tally - // DEBUG lines - - //bigint irregular_bytes = 2*nprocs*sizeof(int); - //irregular_bytes += maxindex*sizeof(int); - //irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- diff --git a/src/irregular.h b/src/irregular.h index d56bcb253d..1f74fe801b 100644 --- a/src/irregular.h +++ b/src/irregular.h @@ -33,7 +33,6 @@ class Irregular : protected Pointers { int *procassign = NULL); int migrate_check(); int create_data(int, int *, int sortflag = 0); - int create_data_grouped(int, int *, int sortflag = 0); void exchange_data(char *, int, char *); void destroy_data(); bigint memory_usage(); @@ -49,7 +48,6 @@ class Irregular : protected Pointers { double *dbuf; // double buf for largest single atom send int maxbuf; // size of char buf in bytes char *buf; // char buf for largest single data send - int maxindex; // combined size of index_send + index_self int *mproclist,*msizes; // persistent vectors in migrate_atoms int maxlocal; // allocated size of mproclist and msizes diff --git a/src/read_data.cpp b/src/read_data.cpp index e2efbaaefa..2f4484010b 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -120,9 +120,6 @@ void ReadData::command(int narg, char **arg) { if (narg < 1) error->all(FLERR,"Illegal read_data command"); - MPI_Barrier(world); - double time1 = MPI_Wtime(); - // optional args addflag = NONE; @@ -909,18 +906,6 @@ void ReadData::command(int narg, char **arg) force->kspace = saved_kspace; } - - // total time - - MPI_Barrier(world); - double time2 = MPI_Wtime(); - - if (comm->me == 0) { - if (screen) - fprintf(screen," read_data CPU = %g secs\n",time2-time1); - if (logfile) - fprintf(logfile," read_data CPU = %g secs\n",time2-time1); - } } /* ---------------------------------------------------------------------- diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 5aa4622a67..73dc37f4cb 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -81,9 +81,6 @@ void ReadRestart::command(int narg, char **arg) if (domain->box_exist) error->all(FLERR,"Cannot read_restart after simulation box is defined"); - MPI_Barrier(world); - double time1 = MPI_Wtime(); - MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -565,18 +562,6 @@ void ReadRestart::command(int narg, char **arg) Special special(lmp); special.build(); } - - // total time - - MPI_Barrier(world); - double time2 = MPI_Wtime(); - - if (comm->me == 0) { - if (screen) - fprintf(screen," read_restart CPU = %g secs\n",time2-time1); - if (logfile) - fprintf(logfile," read_restart CPU = %g secs\n",time2-time1); - } } /* ---------------------------------------------------------------------- diff --git a/src/replicate.cpp b/src/replicate.cpp index 3c8f4a8aee..cdadf1fd1f 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -76,7 +76,7 @@ void Replicate::command(int narg, char **arg) if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store) error->all(FLERR,"Cannot replicate with fixes that store atom quantities"); - // record wall time for atom replication + // Record wall time for atom replication MPI_Barrier(world); double time1 = MPI_Wtime(); @@ -762,15 +762,15 @@ void Replicate::command(int narg, char **arg) special.build(); } - // total time + // Wall time MPI_Barrier(world); double time2 = MPI_Wtime(); if (me == 0) { if (screen) - fprintf(screen," replicate CPU = %g secs\n",time2-time1); + fprintf(screen," Time spent = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," replicate CPU = %g secs\n",time2-time1); + fprintf(logfile," Time spent = %g secs\n",time2-time1); } } diff --git a/src/special.cpp b/src/special.cpp index b9287df472..fccc930353 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -21,14 +21,12 @@ #include "modify.h" #include "fix.h" #include "accelerator_kokkos.h" -#include "atom_masks.h" #include "memory.h" #include "error.h" +#include "atom_masks.h" using namespace LAMMPS_NS; -#define RVOUS 1 // 0 for irregular, 1 for all2all - /* ---------------------------------------------------------------------- */ Special::Special(LAMMPS *lmp) : Pointers(lmp) @@ -56,8 +54,18 @@ Special::~Special() void Special::build() { + int i,j,k,size; + int max,maxall,nbuf; + tagint *buf; + MPI_Barrier(world); - double time1 = MPI_Wtime(); + + int nlocal = atom->nlocal; + + tagint *tag = atom->tag; + int *num_bond = atom->num_bond; + tagint **bond_atom = atom->bond_atom; + int **nspecial = atom->nspecial; if (me == 0 && screen) { const double * const special_lj = force->special_lj; @@ -71,57 +79,224 @@ void Special::build() // initialize nspecial counters to 0 - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { + for (i = 0; i < nlocal; i++) { nspecial[i][0] = 0; nspecial[i][1] = 0; nspecial[i][2] = 0; } - // setup atomIDs and procowner vectors in rendezvous decomposition + // ----------------------------------------------------- + // compute nspecial[i][0] = # of 1-2 neighbors of atom i + // ----------------------------------------------------- - atom_owners(); + // bond partners stored by atom itself - // tally nspecial[i][0] = # of 1-2 neighbors of atom i + for (i = 0; i < nlocal; i++) nspecial[i][0] = num_bond[i]; + + // if newton_bond off, then done + // else only counted 1/2 of all bonds, so count other half + + if (force->newton_bond) { + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = global tag of 2nd atom in each bond + + nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += num_bond[i]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with global tags of bond partners of my atoms + + size = 0; + for (i = 0; i < nlocal; i++) + for (j = 0; j < num_bond[i]; j++) + buf[size++] = bond_atom[i][j]; + + // cycle buffer around ring of procs back to self + // when receive buffer, scan tags for atoms I own + // when find one, increment nspecial count for that atom + + comm->ring(size,sizeof(tagint),buf,1,ring_one,NULL,(void *)this); + + memory->destroy(buf); + } + + // ---------------------------------------------------- // create onetwo[i] = list of 1-2 neighbors for atom i + // ---------------------------------------------------- - if (force->newton_bond) onetwo_build_newton(); - else onetwo_build_newton_off(); + max = 0; + for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][0]); - // print max # of 1-2 neighbors + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-2 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-2 neighbors\n",maxall); } + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + // count = accumulating counter + + memory->create(count,nlocal,"special:count"); + for (i = 0; i < nlocal; i++) count[i] = 0; + + // add bond partners stored by atom to onetwo list + + for (i = 0; i < nlocal; i++) + for (j = 0; j < num_bond[i]; j++) + onetwo[i][count[i]++] = bond_atom[i][j]; + + // if newton_bond off, then done + // else only stored 1/2 of all bonds, so store other half + + if (force->newton_bond) { + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = 2 global tags in each bond + + nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += 2*num_bond[i]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with global tags of both atoms in bond + + size = 0; + for (i = 0; i < nlocal; i++) + for (j = 0; j < num_bond[i]; j++) { + buf[size++] = tag[i]; + buf[size++] = bond_atom[i][j]; + } + + // cycle buffer around ring of procs back to self + // when receive buffer, scan 2nd-atom tags for atoms I own + // when find one, add 1st-atom tag to onetwo list for 2nd atom + + comm->ring(size,sizeof(tagint),buf,2,ring_two,NULL,(void *)this); + + memory->destroy(buf); + } + + memory->destroy(count); + + // ----------------------------------------------------- // done if special_bond weights for 1-3, 1-4 are set to 1.0 + // ----------------------------------------------------- if (force->special_lj[2] == 1.0 && force->special_coul[2] == 1.0 && force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { dedup(); combine(); fix_alteration(); - memory->destroy(procowner); - memory->destroy(atomIDs); - timer_output(time1); return; } - // tally nspecial[i][1] = # of 1-3 neighbors of atom i + // ----------------------------------------------------- + // compute nspecial[i][1] = # of 1-3 neighbors of atom i + // ----------------------------------------------------- + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = 2 scalars + list of 1-2 neighbors + + nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][0]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with: + // (1) = counter for 1-3 neighbors, initialized to 0 + // (2) = # of 1-2 neighbors + // (3:N) = list of 1-2 neighbors + + size = 0; + for (i = 0; i < nlocal; i++) { + buf[size++] = 0; + buf[size++] = nspecial[i][0]; + for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; + } + + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1-2 neighbors for atoms I own + // when find one, increment 1-3 count by # of 1-2 neighbors of my atom, + // subtracting one since my list will contain original atom + + comm->ring(size,sizeof(tagint),buf,3,ring_three,buf,(void *)this); + + // extract count from buffer that has cycled back to me + // nspecial[i][1] = # of 1-3 neighbors of atom i + + j = 0; + for (i = 0; i < nlocal; i++) { + nspecial[i][1] = buf[j]; + j += 2 + nspecial[i][0]; + } + + memory->destroy(buf); + + // ---------------------------------------------------- // create onethree[i] = list of 1-3 neighbors for atom i + // ---------------------------------------------------- - onethree_build(); - - // print max # of 1-3 neighbors + max = 0; + for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][1]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-3 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-3 neighbors\n",maxall); } + memory->create(onethree,nlocal,maxall,"special:onethree"); + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = 4 scalars + list of 1-2 neighs + list of 1-3 neighs + + nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += 4 + nspecial[i][0] + nspecial[i][1]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with: + // (1) = global tag of original atom + // (2) = # of 1-2 neighbors + // (3) = # of 1-3 neighbors + // (4) = counter for 1-3 neighbors, initialized to 0 + // (5:N) = list of 1-2 neighbors + // (N+1:2N) space for list of 1-3 neighbors + + size = 0; + for (i = 0; i < nlocal; i++) { + buf[size++] = tag[i]; + buf[size++] = nspecial[i][0]; + buf[size++] = nspecial[i][1]; + buf[size++] = 0; + for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; + size += nspecial[i][1]; + } + + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1-2 neighbors for atoms I own + // when find one, add its neighbors to 1-3 list + // increment the count in buf(i+4) + // exclude the atom whose tag = original + // this process may include duplicates but they will be culled later + + comm->ring(size,sizeof(tagint),buf,4,ring_four,buf,(void *)this); + + // fill onethree with buffer values that have been returned to me + // sanity check: accumulated buf[i+3] count should equal + // nspecial[i][1] for each atom + + j = 0; + for (i = 0; i < nlocal; i++) { + if (buf[j+3] != nspecial[i][1]) + error->one(FLERR,"1-3 bond count is inconsistent"); + j += 4 + nspecial[i][0]; + for (k = 0; k < nspecial[i][1]; k++) + onethree[i][k] = buf[j++]; + } + + memory->destroy(buf); + // done if special_bond weights for 1-4 are set to 1.0 if (force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { @@ -129,410 +304,117 @@ void Special::build() if (force->special_angle) angle_trim(); combine(); fix_alteration(); - memory->destroy(procowner); - memory->destroy(atomIDs); - timer_output(time1); return; } - // tally nspecial[i][2] = # of 1-4 neighbors of atom i + // ----------------------------------------------------- + // compute nspecial[i][2] = # of 1-4 neighbors of atom i + // ----------------------------------------------------- + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = 2 scalars + list of 1-3 neighbors + + nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][1]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with: + // (1) = counter for 1-4 neighbors, initialized to 0 + // (2) = # of 1-3 neighbors + // (3:N) = list of 1-3 neighbors + + size = 0; + for (i = 0; i < nlocal; i++) { + buf[size++] = 0; + buf[size++] = nspecial[i][1]; + for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; + } + + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1-3 neighbors for atoms I own + // when find one, increment 1-4 count by # of 1-2 neighbors of my atom + // may include duplicates and original atom but they will be culled later + + comm->ring(size,sizeof(tagint),buf,5,ring_five,buf,(void *)this); + + // extract count from buffer that has cycled back to me + // nspecial[i][2] = # of 1-4 neighbors of atom i + + j = 0; + for (i = 0; i < nlocal; i++) { + nspecial[i][2] = buf[j]; + j += 2 + nspecial[i][1]; + } + + memory->destroy(buf); + + // ---------------------------------------------------- // create onefour[i] = list of 1-4 neighbors for atom i + // ---------------------------------------------------- - onefour_build(); - - // print max # of 1-4 neighbors + max = 0; + for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][2]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-4 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-4 neighbors\n",maxall); } - // finish processing the onetwo, onethree, onefour lists + memory->create(onefour,nlocal,maxall,"special:onefour"); + + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = 3 scalars + list of 1-3 neighs + list of 1-4 neighs + + nbuf = 0; + for (i = 0; i < nlocal; i++) + nbuf += 3 + nspecial[i][1] + nspecial[i][2]; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with: + // (1) = # of 1-3 neighbors + // (2) = # of 1-4 neighbors + // (3) = counter for 1-4 neighbors, initialized to 0 + // (4:N) = list of 1-3 neighbors + // (N+1:2N) space for list of 1-4 neighbors + + size = 0; + for (i = 0; i < nlocal; i++) { + buf[size++] = nspecial[i][1]; + buf[size++] = nspecial[i][2]; + buf[size++] = 0; + for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; + size += nspecial[i][2]; + } + + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1-3 neighbors for atoms I own + // when find one, add its neighbors to 1-4 list + // incrementing the count in buf(i+4) + // this process may include duplicates but they will be culled later + + comm->ring(size,sizeof(tagint),buf,6,ring_six,buf,(void *)this); + + // fill onefour with buffer values that have been returned to me + // sanity check: accumulated buf[i+2] count should equal + // nspecial[i][2] for each atom + + j = 0; + for (i = 0; i < nlocal; i++) { + if (buf[j+2] != nspecial[i][2]) + error->one(FLERR,"1-4 bond count is inconsistent"); + j += 3 + nspecial[i][1]; + for (k = 0; k < nspecial[i][2]; k++) + onefour[i][k] = buf[j++]; + } + + memory->destroy(buf); dedup(); if (force->special_angle) angle_trim(); if (force->special_dihedral) dihedral_trim(); combine(); fix_alteration(); - memory->destroy(procowner); - memory->destroy(atomIDs); - - timer_output(time1); -} - -/* ---------------------------------------------------------------------- - setup atomIDs and procowner -------------------------------------------------------------------------- */ - -void Special::atom_owners() -{ - tagint *tag = atom->tag; - int nlocal = atom->nlocal; - - int *proclist; - memory->create(proclist,nlocal,"special:proclist"); - IDRvous *idbuf = (IDRvous *) - memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); - - // setup input buf for rendezvous comm - // one datum for each owned atom: datum = owning proc, atomID - // each proc assigned every 1/Pth atom - - for (int i = 0; i < nlocal; i++) { - proclist[i] = tag[i] % nprocs; - idbuf[i].me = me; - idbuf[i].atomID = tag[i]; - } - - // perform rendezvous operation - - char *buf; - comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, - rendezvous_ids,0,buf,0,(void *) this); - - memory->destroy(proclist); - memory->sfree(idbuf); -} - -/* ---------------------------------------------------------------------- - onetwo build when newton_bond flag on - uses rendezvous comm -------------------------------------------------------------------------- */ - -void Special::onetwo_build_newton() -{ - int i,j,m; - - tagint *tag = atom->tag; - int *num_bond = atom->num_bond; - tagint **bond_atom = atom->bond_atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - // nsend = # of my datums to send - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_bond[i]; j++) { - m = atom->map(bond_atom[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // one datum for each unowned bond partner: bond partner ID, atomID - // owning proc for each datum = bond partner ID % nprocs - - nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_bond[i]; j++) { - m = atom->map(bond_atom[i][j]); - if (m >= 0 && m < nlocal) continue; - proclist[nsend] = bond_atom[i][j] % nprocs; - inbuf[nsend].atomID = bond_atom[i][j]; - inbuf[nsend].partnerID = tag[i]; - nsend++; - } - } - - // perform rendezvous operation - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); - PairRvous *outbuf = (PairRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[0] and onetwo for all owned atoms - // based on owned info plus rendezvous output info - // output datums = pairs of atoms that are 1-2 neighbors - - for (i = 0; i < nlocal; i++) { - nspecial[i][0] = num_bond[i]; - for (j = 0; j < num_bond[i]; j++) { - m = atom->map(bond_atom[i][j]); - if (m >= 0 && m < nlocal) nspecial[m][0]++; - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - nspecial[i][0]++; - } - - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,nspecial[i][0]); - - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_bond[i]; j++) { - onetwo[i][nspecial[i][0]++] = bond_atom[i][j]; - m = atom->map(bond_atom[i][j]); - if (m >= 0 && m < nlocal) onetwo[m][nspecial[m][0]++] = tag[i]; - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; - } - - memory->sfree(outbuf); -} - -/* ---------------------------------------------------------------------- - onetwo build with newton_bond flag off - no need for rendezvous comm -------------------------------------------------------------------------- */ - -void Special::onetwo_build_newton_off() -{ - int i,j; - - int *num_bond = atom->num_bond; - tagint **bond_atom = atom->bond_atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,num_bond[i]); - - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - // nsend = # of my datums to send - // include nlocal datums with owner of each atom - - for (i = 0; i < nlocal; i++) { - nspecial[i][0] = num_bond[i]; - for (j = 0; j < num_bond[i]; j++) - onetwo[i][j] = bond_atom[i][j]; - } -} - -/* ---------------------------------------------------------------------- - onethree build - uses rendezvous comm -------------------------------------------------------------------------- */ - -void Special::onethree_build() -{ - int i,j,k,m,proc; - - tagint *tag = atom->tag; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - // nsend = # of my datums to send - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][0]; j++) { - m = atom->map(onetwo[i][j]); - if (m < 0 || m >= nlocal) nsend += nspecial[i][0]-1; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // datums = pairs of onetwo partners where either is unknown - // these pairs are onethree neighbors - // datum = onetwo ID, onetwo ID - // owning proc for each datum = onetwo ID % nprocs - - nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][0]; j++) { - m = atom->map(onetwo[i][j]); - if (m >= 0 && m < nlocal) continue; - proc = onetwo[i][j] % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - if (j == k) continue; - proclist[nsend] = proc; - inbuf[nsend].atomID = onetwo[i][j]; - inbuf[nsend].partnerID = onetwo[i][k]; - nsend++; - } - } - } - - // perform rendezvous operation - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); - PairRvous *outbuf = (PairRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[1] and onethree for all owned atoms - // based on owned info plus rendezvous output info - // output datums = pairs of atoms that are 1-3 neighbors - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][0]; j++) { - m = atom->map(onetwo[i][j]); - if (m >= 0 && m < nlocal) nspecial[m][1] += nspecial[i][0]-1; - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - nspecial[i][1]++; - } - - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,nspecial[i][1]); - - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onethree,nlocal,maxall,"special:onethree"); - - for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][0]; j++) { - m = atom->map(onetwo[i][j]); - if (m < 0 || m >= nlocal) continue; - for (k = 0; k < nspecial[i][0]; k++) { - if (j == k) continue; - onethree[m][nspecial[m][1]++] = onetwo[i][k]; - } - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; - } - - memory->sfree(outbuf); -} - -/* ---------------------------------------------------------------------- - onefour build - uses rendezvous comm -------------------------------------------------------------------------- */ - -void Special::onefour_build() -{ - int i,j,k,m,proc; - - tagint *tag = atom->tag; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - // nsend = # of my datums to send - - int nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - m = atom->map(onethree[i][j]); - if (m < 0 || m >= nlocal) nsend += nspecial[i][0]; - } - } - - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // datums = pairs of onethree and onetwo partners where onethree is unknown - // these pairs are onefour neighbors - // datum = onetwo ID, onetwo ID - // owning proc for each datum = onethree ID % nprocs - - nsend = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - m = atom->map(onethree[i][j]); - if (m >= 0 && m < nlocal) continue; - proc = onethree[i][j] % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - proclist[nsend] = proc; - inbuf[nsend].atomID = onethree[i][j]; - inbuf[nsend].partnerID = onetwo[i][k]; - nsend++; - } - } - } - - // perform rendezvous operation - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); - PairRvous *outbuf = (PairRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[2] and onefour for all owned atoms - // based on owned info plus rendezvous output info - // output datums = pairs of atoms that are 1-4 neighbors - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - m = atom->map(onethree[i][j]); - if (m >= 0 && m < nlocal) nspecial[m][2] += nspecial[i][0]; - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - nspecial[i][2]++; - } - - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,nspecial[i][2]); - - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onefour,nlocal,maxall,"special:onefour"); - - for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - m = atom->map(onethree[i][j]); - if (m < 0 || m >= nlocal) continue; - for (k = 0; k < nspecial[i][0]; k++) { - onefour[m][nspecial[m][2]++] = onetwo[i][k]; - } - } - } - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; - } - - memory->sfree(outbuf); } /* ---------------------------------------------------------------------- @@ -777,24 +659,21 @@ void Special::combine() trim list of 1-3 neighbors by checking defined angles delete a 1-3 neigh if they are not end atoms of a defined angle and if they are not 1,3 or 2,4 atoms of a defined dihedral - uses rendezvous comm ------------------------------------------------------------------------- */ void Special::angle_trim() { - int i,j,k,m;; + int i,j,m,n; int *num_angle = atom->num_angle; int *num_dihedral = atom->num_dihedral; tagint **angle_atom1 = atom->angle_atom1; - tagint **angle_atom2 = atom->angle_atom2; tagint **angle_atom3 = atom->angle_atom3; tagint **dihedral_atom1 = atom->dihedral_atom1; tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom3 = atom->dihedral_atom3; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; - tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-3 neighbor counts @@ -813,206 +692,73 @@ void Special::angle_trim() " %g = # of 1-3 neighbors before angle trim\n",allcount); } - // if angles or dihedrals are defined - // rendezvous angle 1-3 and dihedral 1-3,2-4 pairs + // if angles or dihedrals are defined, + // flag each 1-3 neigh if it appears in an angle or dihedral if ((num_angle && atom->nangles) || (num_dihedral && atom->ndihedrals)) { - // nsend = # of my datums to send - // latter is only for angles or dihedrlas where I own atom2 (newton bond off) + // dflag = flag for 1-3 neighs of all owned atoms + + int maxcount = 0; + for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][1]); + memory->create(dflag,nlocal,maxcount,"special::dflag"); - int nsend = 0; for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; - m = atom->map(angle_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(angle_atom3[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } - for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom3[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } + n = nspecial[i][1]; + for (j = 0; j < n; j++) dflag[i][j] = 0; } - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = list of 1,3 atoms in each angle stored by atom + // and list of 1,3 and 2,4 atoms in each dihedral stored by atom - // setup input buf to rendezvous comm - // datums = pairs of onetwo partners where either is unknown - // these pairs are onethree neighbors - // datum = onetwo ID, onetwo ID - // owning proc for each datum = onetwo ID % nprocs - - nsend = 0; + int nbuf = 0; for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; - - m = atom->map(angle_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = angle_atom1[i][j] % nprocs; - inbuf[nsend].atomID = angle_atom1[i][j]; - inbuf[nsend].partnerID = angle_atom3[i][j]; - nsend++; - } - - m = atom->map(angle_atom3[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = angle_atom3[i][j] % nprocs; - inbuf[nsend].atomID = angle_atom3[i][j]; - inbuf[nsend].partnerID = angle_atom1[i][j]; - nsend++; - } - } - - for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom1[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom1[i][j]; - inbuf[nsend].partnerID = dihedral_atom3[i][j]; - nsend++; - } - - m = atom->map(dihedral_atom3[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom3[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom3[i][j]; - inbuf[nsend].partnerID = dihedral_atom1[i][j]; - nsend++; - } - - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom4[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom4[i][j]; - inbuf[nsend].partnerID = dihedral_atom2[i][j]; - nsend++; - } - } + if (num_angle && atom->nangles) nbuf += 2*num_angle[i]; + if (num_dihedral && atom->ndihedrals) nbuf += 2*2*num_dihedral[i]; } + int *buf; + memory->create(buf,nbuf,"special:buf"); - // perform rendezvous operation - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); - PairRvous *outbuf = (PairRvous *) buf; + // fill buffer with list of 1,3 atoms in each angle + // and with list of 1,3 and 2,4 atoms in each dihedral - memory->destroy(proclist); - memory->sfree(inbuf); + int size = 0; + if (num_angle && atom->nangles) + for (i = 0; i < nlocal; i++) + for (j = 0; j < num_angle[i]; j++) { + buf[size++] = angle_atom1[i][j]; + buf[size++] = angle_atom3[i][j]; + } - // flag all onethree atoms to keep + if (num_dihedral && atom->ndihedrals) + for (i = 0; i < nlocal; i++) + for (j = 0; j < num_dihedral[i]; j++) { + buf[size++] = dihedral_atom1[i][j]; + buf[size++] = dihedral_atom3[i][j]; + buf[size++] = dihedral_atom2[i][j]; + buf[size++] = dihedral_atom4[i][j]; + } - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,nspecial[i][1]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - - int **flag; - memory->create(flag,nlocal,maxall,"special:flag"); + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1,3 atoms looking for atoms I own + // when find one, scan its 1-3 neigh list and mark I,J as in an angle - for (i = 0; i < nlocal; i++) + comm->ring(size,sizeof(tagint),buf,7,ring_seven,NULL,(void *)this); + + // delete 1-3 neighbors if they are not flagged in dflag + + for (i = 0; i < nlocal; i++) { + m = 0; for (j = 0; j < nspecial[i][1]; j++) - flag[i][j] = 0; - - // reset nspecial[1] and onethree for all owned atoms based on output info - // based on owned info plus rendezvous output info - // output datums = pairs of atoms that are 1-3 neighbors - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; - - m = atom->map(angle_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == angle_atom3[i][j]) { - flag[m][k] = 1; - break; - } - } - - m = atom->map(angle_atom3[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == angle_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } - } - - for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - - m = atom->map(dihedral_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom3[i][j]) { - flag[m][k] = 1; - break; - } - } - - m = atom->map(dihedral_atom3[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } - - m = atom->map(dihedral_atom4[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom2[i][j]) { - flag[m][k] = 1; - break; - } - } - } + if (dflag[i][j]) onethree[i][m++] = onethree[i][j]; + nspecial[i][1] = m; } - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - for (k = 0; k < nspecial[i][1]; k++) - if (onethree[i][k] == outbuf[m].partnerID) { - flag[i][k] = 1; - break; - } - } - - memory->destroy(outbuf); + // clean up - // use flag values to compress onefour list for each atom - - for (i = 0; i < nlocal; i++) { - j = 0; - while (j < nspecial[i][1]) { - if (flag[i][j] == 0) { - onethree[i][j] = onethree[i][nspecial[i][1]-1]; - flag[i][j] = flag[i][nspecial[i][1]-1]; - nspecial[i][1]--; - } else j++; - } - } - - memory->destroy(flag); + memory->destroy(dflag); + memory->destroy(buf); // if no angles or dihedrals are defined, delete all 1-3 neighs @@ -1037,21 +783,18 @@ void Special::angle_trim() } /* ---------------------------------------------------------------------- - trim list of 1-4 neighbors by checking all defined dihedrals + trim list of 1-4 neighbors by checking defined dihedrals delete a 1-4 neigh if they are not end atoms of a defined dihedral - uses rendezvous comm ------------------------------------------------------------------------- */ void Special::dihedral_trim() { - int i,j,k,m; + int i,j,m,n; int *num_dihedral = atom->num_dihedral; tagint **dihedral_atom1 = atom->dihedral_atom1; - tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; - tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-4 neighbor counts @@ -1070,134 +813,58 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, rendezvous the dihedral 1-4 pairs + // if dihedrals are defined, flag each 1-4 neigh if it appears in a dihedral if (num_dihedral && atom->ndihedrals) { - // nsend = # of my datums to send + // dflag = flag for 1-4 neighs of all owned atoms + + int maxcount = 0; + for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][2]); + memory->create(dflag,nlocal,maxcount,"special::dflag"); - int nsend = 0; for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) nsend++; - } + n = nspecial[i][2]; + for (j = 0; j < n; j++) dflag[i][j] = 0; } - int *proclist; - memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // datums = pairs of onefour atom IDs in a dihedral defined for my atoms - // only dihedrals where I own atom2 (in case newton_bond off) - // datum = atom1 ID and atom4 ID - // send the datum twice, to owner of atom1 ID and atom4 ID - // owning procs for each datum = atom1 or atom4 ID % nprocs + // nbufmax = largest buffer needed to hold info from any proc + // info for each atom = list of 1,4 atoms in each dihedral stored by atom - nsend = 0; - for (i = 0; i < nlocal; i++) { + int nbuf = 0; + for (i = 0; i < nlocal; i++) nbuf += 2*num_dihedral[i]; + int *buf; + memory->create(buf,nbuf,"special:buf"); + + // fill buffer with list of 1,4 atoms in each dihedral + + int size = 0; + for (i = 0; i < nlocal; i++) for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom1[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom1[i][j]; - inbuf[nsend].partnerID = dihedral_atom4[i][j]; - nsend++; - } - - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom4[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom4[i][j]; - inbuf[nsend].partnerID = dihedral_atom1[i][j]; - nsend++; - } + buf[size++] = dihedral_atom1[i][j]; + buf[size++] = dihedral_atom4[i][j]; } - } - // perform rendezvous operation - - char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); - PairRvous *outbuf = (PairRvous *) buf; + // cycle buffer around ring of procs back to self + // when receive buffer, scan list of 1,4 atoms looking for atoms I own + // when find one, scan its 1-4 neigh list and mark I,J as in a dihedral - memory->destroy(proclist); - memory->sfree(inbuf); + comm->ring(size,sizeof(tagint),buf,8,ring_eight,NULL,(void *)this); - // flag all of my onefour IDs to keep + // delete 1-4 neighbors if they are not flagged in dflag - int max = 0; - for (i = 0; i < nlocal; i++) - max = MAX(max,nspecial[i][2]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - - int **flag; - memory->create(flag,nlocal,maxall,"special:flag"); - - for (i = 0; i < nlocal; i++) + for (i = 0; i < nlocal; i++) { + m = 0; for (j = 0; j < nspecial[i][2]; j++) - flag[i][j] = 0; - - for (i = 0; i < nlocal; i++) { - for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - - m = atom->map(dihedral_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][2]; k++) - if (onefour[m][k] == dihedral_atom4[i][j]) { - flag[m][k] = 1; - break; - } - } - - m = atom->map(dihedral_atom4[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][2]; k++) - if (onefour[m][k] == dihedral_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } - } + if (dflag[i][j]) onefour[i][m++] = onefour[i][j]; + nspecial[i][2] = m; } - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - for (k = 0; k < nspecial[i][2]; k++) - if (onefour[i][k] == outbuf[m].partnerID) { - flag[i][k] = 1; - break; - } - } + // clean up - memory->destroy(outbuf); + memory->destroy(dflag); + memory->destroy(buf); - // use flag values to compress onefour list for each atom - - for (i = 0; i < nlocal; i++) { - j = 0; - while (j < nspecial[i][2]) { - if (flag[i][j] == 0) { - onefour[i][j] = onefour[i][nspecial[i][2]-1]; - flag[i][j] = flag[i][nspecial[i][2]-1]; - nspecial[i][2]--; - } else j++; - } - } - - memory->destroy(flag); - // if no dihedrals are defined, delete all 1-4 neighs } else { @@ -1221,95 +888,262 @@ void Special::dihedral_trim() } /* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N IDRvous datums - no outbuf + when receive buffer, scan tags for atoms I own + when find one, increment nspecial count for that atom ------------------------------------------------------------------------- */ -int Special::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) -{ - Special *sptr = (Special *) ptr; - Memory *memory = sptr->memory; - - int *procowner; - tagint *atomIDs; - - memory->create(procowner,n,"special:procowner"); - memory->create(atomIDs,n,"special:atomIDs"); - - IDRvous *in = (IDRvous *) inbuf; - - for (int i = 0; i < n; i++) { - procowner[i] = in[i].me; - atomIDs[i] = in[i].atomID; - } - - // store rendezvous data in Special class - - sptr->nrvous = n; - sptr->procowner = procowner; - sptr->atomIDs = atomIDs; - - // flag = 0: no second comm needed in rendezvous - - flag = 0; - return 0; -} - - -/* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - outbuf = same list of N PairRvous datums, routed to different procs -------------------------------------------------------------------------- */ - -int Special::rendezvous_pairs(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) +void Special::ring_one(int ndatum, char *cbuf, void *ptr) { Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; - Memory *memory = sptr->memory; - - // clear atom map so it can be used here as a hash table - // faster than an STL map for large atom counts - - atom->map_clear(); - - // hash atom IDs stored in rendezvous decomposition - - int nrvous = sptr->nrvous; - tagint *atomIDs = sptr->atomIDs; - - for (int i = 0; i < nrvous; i++) - atom->map_one(atomIDs[i],i); - - // proclist = owner of atomID in caller decomposition - - PairRvous *in = (PairRvous *) inbuf; - int *procowner = sptr->procowner; - memory->create(proclist,n,"special:proclist"); + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + tagint *buf = (tagint *) cbuf; int m; - for (int i = 0; i < n; i++) { - m = atom->map(in[i].atomID); - proclist[i] = procowner[m]; + + for (int i = 0; i < ndatum; i++) { + m = atom->map(buf[i]); + if (m >= 0 && m < nlocal) nspecial[m][0]++; } +} - outbuf = inbuf; - - // re-create atom map +/* ---------------------------------------------------------------------- + when receive buffer, scan 2nd-atom tags for atoms I own + when find one, add 1st-atom tag to onetwo list for 2nd atom +------------------------------------------------------------------------- */ - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); +void Special::ring_two(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int nlocal = atom->nlocal; - // flag = 1: outbuf = inbuf - - flag = 1; - return n; + tagint **onetwo = sptr->onetwo; + int *count = sptr->count; + + tagint *buf = (tagint *) cbuf; + int m; + + for (int i = 1; i < ndatum; i += 2) { + m = atom->map(buf[i]); + if (m >= 0 && m < nlocal) onetwo[m][count[m]++] = buf[i-1]; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1-2 neighbors for atoms I own + when find one, increment 1-3 count by # of 1-2 neighbors of my atom, + subtracting one since my list will contain original atom +------------------------------------------------------------------------- */ + +void Special::ring_three(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint *buf = (tagint *) cbuf; + int i,j,m,n,num12; + + i = 0; + while (i < ndatum) { + n = buf[i]; + num12 = buf[i+1]; + for (j = 0; j < num12; j++) { + m = atom->map(buf[i+2+j]); + if (m >= 0 && m < nlocal) + n += nspecial[m][0] - 1; + } + buf[i] = n; + i += 2 + num12; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1-2 neighbors for atoms I own + when find one, add its neighbors to 1-3 list + increment the count in buf(i+4) + exclude the atom whose tag = original + this process may include duplicates but they will be culled later +------------------------------------------------------------------------- */ + +void Special::ring_four(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint **onetwo = sptr->onetwo; + + tagint *buf = (tagint *) cbuf; + tagint original; + int i,j,k,m,n,num12,num13; + + i = 0; + while (i < ndatum) { + original = buf[i]; + num12 = buf[i+1]; + num13 = buf[i+2]; + n = buf[i+3]; + for (j = 0; j < num12; j++) { + m = atom->map(buf[i+4+j]); + if (m >= 0 && m < nlocal) + for (k = 0; k < nspecial[m][0]; k++) + if (onetwo[m][k] != original) + buf[i+4+num12+(n++)] = onetwo[m][k]; + } + buf[i+3] = n; + i += 4 + num12 + num13; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1-3 neighbors for atoms I own + when find one, increment 1-4 count by # of 1-2 neighbors of my atom + may include duplicates and original atom but they will be culled later +------------------------------------------------------------------------- */ + +void Special::ring_five(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint *buf = (tagint *) cbuf; + int i,j,m,n,num13; + + i = 0; + while (i < ndatum) { + n = buf[i]; + num13 = buf[i+1]; + for (j = 0; j < num13; j++) { + m = atom->map(buf[i+2+j]); + if (m >= 0 && m < nlocal) n += nspecial[m][0]; + } + buf[i] = n; + i += 2 + num13; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1-3 neighbors for atoms I own + when find one, add its neighbors to 1-4 list + incrementing the count in buf(i+4) + this process may include duplicates but they will be culled later +------------------------------------------------------------------------- */ + +void Special::ring_six(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint **onetwo = sptr->onetwo; + + tagint *buf = (tagint *) cbuf; + int i,j,k,m,n,num13,num14; + + i = 0; + while (i < ndatum) { + num13 = buf[i]; + num14 = buf[i+1]; + n = buf[i+2]; + for (j = 0; j < num13; j++) { + m = atom->map(buf[i+3+j]); + if (m >= 0 && m < nlocal) + for (k = 0; k < nspecial[m][0]; k++) + buf[i+3+num13+(n++)] = onetwo[m][k]; + } + buf[i+2] = n; + i += 3 + num13 + num14; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1,3 atoms looking for atoms I own + when find one, scan its 1-3 neigh list and mark I,J as in an angle +------------------------------------------------------------------------- */ + +void Special::ring_seven(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint **onethree = sptr->onethree; + int **dflag = sptr->dflag; + + tagint *buf = (tagint *) cbuf; + tagint iglobal,jglobal; + int i,m,ilocal,jlocal; + + i = 0; + while (i < ndatum) { + iglobal = buf[i]; + jglobal = buf[i+1]; + ilocal = atom->map(iglobal); + jlocal = atom->map(jglobal); + if (ilocal >= 0 && ilocal < nlocal) + for (m = 0; m < nspecial[ilocal][1]; m++) + if (jglobal == onethree[ilocal][m]) { + dflag[ilocal][m] = 1; + break; + } + if (jlocal >= 0 && jlocal < nlocal) + for (m = 0; m < nspecial[jlocal][1]; m++) + if (iglobal == onethree[jlocal][m]) { + dflag[jlocal][m] = 1; + break; + } + i += 2; + } +} + +/* ---------------------------------------------------------------------- + when receive buffer, scan list of 1,4 atoms looking for atoms I own + when find one, scan its 1-4 neigh list and mark I,J as in a dihedral +------------------------------------------------------------------------- */ + +void Special::ring_eight(int ndatum, char *cbuf, void *ptr) +{ + Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + tagint **onefour = sptr->onefour; + int **dflag = sptr->dflag; + + tagint *buf = (tagint *) cbuf; + tagint iglobal,jglobal; + int i,m,ilocal,jlocal; + + i = 0; + while (i < ndatum) { + iglobal = buf[i]; + jglobal = buf[i+1]; + ilocal = atom->map(iglobal); + jlocal = atom->map(jglobal); + if (ilocal >= 0 && ilocal < nlocal) + for (m = 0; m < nspecial[ilocal][2]; m++) + if (jglobal == onefour[ilocal][m]) { + dflag[ilocal][m] = 1; + break; + } + if (jlocal >= 0 && jlocal < nlocal) + for (m = 0; m < nspecial[jlocal][2]; m++) + if (iglobal == onefour[jlocal][m]) { + dflag[jlocal][m] = 1; + break; + } + i += 2; + } } /* ---------------------------------------------------------------------- @@ -1325,15 +1159,3 @@ void Special::fix_alteration() modify->fix[ifix]->rebuild_special(); } -/* ---------------------------------------------------------------------- - print timing output -------------------------------------------------------------------------- */ - -void Special::timer_output(double time1) -{ - double time2 = MPI_Wtime(); - if (comm->me == 0) { - if (screen) fprintf(screen," special bonds CPU = %g secs\n",time2-time1); - if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",time2-time1); - } -} diff --git a/src/special.h b/src/special.h index d02a8522f6..9f25200336 100644 --- a/src/special.h +++ b/src/special.h @@ -26,43 +26,29 @@ class Special : protected Pointers { private: int me,nprocs; - int maxall; tagint **onetwo,**onethree,**onefour; - // data used by rendezvous callback methods + // data used by ring callback methods - int nrvous; - tagint *atomIDs; - int *procowner; - - struct IDRvous { - int me; - tagint atomID; - }; - - struct PairRvous { - tagint atomID,partnerID; - }; - - // private methods - - void atom_owners(); - void onetwo_build_newton(); - void onetwo_build_newton_off(); - void onethree_build(); - void onefour_build(); + int *count; + int **dflag; void dedup(); void angle_trim(); void dihedral_trim(); void combine(); void fix_alteration(); - void timer_output(double); - // callback functions for rendezvous communication + // callback functions for ring communication - static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); - static int rendezvous_pairs(int, char *, int &, int *&, char *&, void *); + static void ring_one(int, char *, void *); + static void ring_two(int, char *, void *); + static void ring_three(int, char *, void *); + static void ring_four(int, char *, void *); + static void ring_five(int, char *, void *); + static void ring_six(int, char *, void *); + static void ring_seven(int, char *, void *); + static void ring_eight(int, char *, void *); }; } From 9912c444135a7476d9ae4b88f209e6a4f585a210 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 11:54:48 -0700 Subject: [PATCH 143/243] rendevous comm option for special bonds and fix rigid/small --- src/RIGID/fix_rigid_small.cpp | 491 +++++++-------- src/RIGID/fix_rigid_small.h | 26 +- src/comm.cpp | 51 ++ src/comm.h | 4 + src/create_atoms.cpp | 37 +- src/hashlittle.cpp | 333 ++++++++++ src/hashlittle.h | 5 + src/irregular.cpp | 17 +- src/read_data.cpp | 15 + src/read_restart.cpp | 15 + src/replicate.cpp | 8 +- src/special.cpp | 1095 ++++++++++++++++----------------- src/special.h | 27 +- 13 files changed, 1249 insertions(+), 875 deletions(-) create mode 100644 src/hashlittle.cpp create mode 100644 src/hashlittle.h diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index fb185d7702..a48395be04 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -34,6 +34,7 @@ #include "variable.h" #include "random_mars.h" #include "math_const.h" +#include "hashlittle.h" #include "memory.h" #include "error.h" @@ -70,8 +71,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : xcmimage(NULL), displace(NULL), eflags(NULL), orient(NULL), dorient(NULL), avec_ellipsoid(NULL), avec_line(NULL), avec_tri(NULL), counts(NULL), itensor(NULL), mass_body(NULL), langextra(NULL), random(NULL), - id_dilate(NULL), onemols(NULL), hash(NULL), bbox(NULL), ctr(NULL), - idclose(NULL), rsqclose(NULL) + id_dilate(NULL), onemols(NULL) { int i; @@ -107,18 +107,18 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // parse args for rigid body specification int *mask = atom->mask; - tagint *bodyid = NULL; + tagint *bodyID = NULL; int nlocal = atom->nlocal; if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); if (strcmp(arg[3],"molecule") == 0) { if (atom->molecule_flag == 0) error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); - bodyid = atom->molecule; + bodyID = atom->molecule; } else if (strcmp(arg[3],"custom") == 0) { if (narg < 5) error->all(FLERR,"Illegal fix rigid/small command"); - bodyid = new tagint[nlocal]; + bodyID = new tagint[nlocal]; customflag = 1; // determine whether atom-style variable or atom property is used. @@ -126,9 +126,11 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : int is_double=0; int custom_index = atom->find_custom(arg[4]+2,is_double); if (custom_index == -1) - error->all(FLERR,"Fix rigid/small custom requires previously defined property/atom"); + error->all(FLERR,"Fix rigid/small custom requires " + "previously defined property/atom"); else if (is_double) - error->all(FLERR,"Fix rigid/small custom requires integer-valued property/atom"); + error->all(FLERR,"Fix rigid/small custom requires " + "integer-valued property/atom"); int minval = INT_MAX; int *value = atom->ivector[custom_index]; @@ -139,15 +141,17 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyid[i] = (tagint)(value[i] - minval + 1); - else bodyid[i] = 0; + bodyID[i] = (tagint)(value[i] - minval + 1); + else bodyID[i] = 0; } else if (strstr(arg[4],"v_") == arg[4]) { int ivariable = input->variable->find(arg[4]+2); if (ivariable < 0) - error->all(FLERR,"Variable name for fix rigid/small custom does not exist"); + error->all(FLERR,"Variable name for fix rigid/small custom " + "does not exist"); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR,"Fix rigid/small custom variable is no atom-style variable"); + error->all(FLERR,"Fix rigid/small custom variable is not " + "atom-style variable"); double *value = new double[nlocal]; input->variable->compute_atom(ivariable,0,value,1,0); int minval = INT_MAX; @@ -158,8 +162,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - bodyid[i] = (tagint)((tagint)value[i] - minval + 1); - else bodyid[0] = 0; + bodyID[i] = (tagint)((tagint)value[i] - minval + 1); + else bodyID[0] = 0; delete[] value; } else error->all(FLERR,"Unsupported fix rigid custom property"); } else error->all(FLERR,"Illegal fix rigid/small command"); @@ -167,10 +171,11 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (atom->map_style == 0) error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify"); - // maxmol = largest bodyid # + // maxmol = largest bodyID # + maxmol = -1; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyid[i]); + if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyID[i]); tagint itmp; MPI_Allreduce(&maxmol,&itmp,1,MPI_LMP_TAGINT,MPI_MAX,world); @@ -400,8 +405,19 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // sets bodytag for owned atoms // body attributes are computed later by setup_bodies() - create_bodies(bodyid); - if (customflag) delete [] bodyid; + double time1 = MPI_Wtime(); + + create_bodies(bodyID); + if (customflag) delete [] bodyID; + + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) + fprintf(screen," create_bodies CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," create_bodies CPU = %g secs\n",time2-time1); + } // set nlocal_body and allocate bodies I own @@ -1514,175 +1530,71 @@ void FixRigidSmall::set_v() set bodytag for all owned atoms ------------------------------------------------------------------------- */ -void FixRigidSmall::create_bodies(tagint *bodyid) +void FixRigidSmall::create_bodies(tagint *bodyID) { - int i,m,n; - double unwrap[3]; + int i,m; - // error check on image flags of atoms in rigid bodies - - imageint *image = atom->image; + // allocate buffer for input to rendezvous comm + // ncount = # of my atoms in bodies + int *mask = atom->mask; int nlocal = atom->nlocal; - int *periodicity = domain->periodicity; - int xbox,ybox,zbox; - - int flag = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - xbox = (image[i] & IMGMASK) - IMGMAX; - ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; - zbox = (image[i] >> IMG2BITS) - IMGMAX; - if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) || - (zbox && !periodicity[2])) flag = 1; - } - - int flagall; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) error->all(FLERR,"Fix rigid/small atom has non-zero image flag " - "in a non-periodic dimension"); - - // allocate buffer for passing messages around ring of procs - // percount = max number of values to put in buffer for each of ncount - int ncount = 0; for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) ncount++; - int percount = 5; - double *buf; - memory->create(buf,ncount*percount,"rigid/small:buf"); + int *proclist; + memory->create(proclist,ncount,"rigid/small:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc(ncount*sizeof(InRvous),"rigid/small:inbuf"); - // create map hash for storing unique body IDs of my atoms - // key = body ID - // value = index into per-body data structure - // n = # of entries in hash - - hash = new std::map(); - hash->clear(); - - // setup hash - // key = body ID - // value = index into N-length data structure - // n = count of unique bodies my atoms are part of - - n = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - if (hash->find(bodyid[i]) == hash->end()) (*hash)[bodyid[i]] = n++; - } - - // bbox = bounding box of each rigid body my atoms are part of - - memory->create(bbox,n,6,"rigid/small:bbox"); - - for (i = 0; i < n; i++) { - bbox[i][0] = bbox[i][2] = bbox[i][4] = BIG; - bbox[i][1] = bbox[i][3] = bbox[i][5] = -BIG; - } - - // pack my atoms into buffer as body ID, unwrapped coords + // setup buf to pass to rendezvous comm + // one BodyMsg datum for each constituent atom + // datum = me, local index of atom, atomID, bodyID, unwrapped coords + // owning proc for each datum = random hash of bodyID double **x = atom->x; - - m = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = bodyid[i]; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; - } - - // pass buffer around ring of procs - // func = update bbox with atom coords from every proc - // when done, have full bbox for every rigid body my atoms are part of - - comm->ring(m,sizeof(double),buf,1,ring_bbox,NULL,(void *)this); - - // check if any bbox is size 0.0, meaning rigid body is a single particle - - flag = 0; - for (i = 0; i < n; i++) - if (bbox[i][0] == bbox[i][1] && bbox[i][2] == bbox[i][3] && - bbox[i][4] == bbox[i][5]) flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) - error->all(FLERR,"One or more rigid bodies are a single particle"); - - // ctr = center pt of each rigid body my atoms are part of - - memory->create(ctr,n,6,"rigid/small:bbox"); - - for (i = 0; i < n; i++) { - ctr[i][0] = 0.5 * (bbox[i][0] + bbox[i][1]); - ctr[i][1] = 0.5 * (bbox[i][2] + bbox[i][3]); - ctr[i][2] = 0.5 * (bbox[i][4] + bbox[i][5]); - } - - // idclose = ID of atom in body closest to center pt (smaller ID if tied) - // rsqclose = distance squared from idclose to center pt - - memory->create(idclose,n,"rigid/small:idclose"); - memory->create(rsqclose,n,"rigid/small:rsqclose"); - - for (i = 0; i < n; i++) rsqclose[i] = BIG; - - // pack my atoms into buffer as body ID, atom ID, unwrapped coords - tagint *tag = atom->tag; + imageint *image = atom->image; m = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = bodyid[i]; - buf[m++] = ubuf(tag[i]).d; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; + proclist[m] = hashlittle(&bodyID[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].ilocal = i; + inbuf[m].atomID = tag[i]; + inbuf[m].bodyID = bodyID[i]; + domain->unmap(x[i],image[i],inbuf[m].x); + m++; } - // pass buffer around ring of procs - // func = update idclose,rsqclose with atom IDs from every proc - // when done, have idclose for every rigid body my atoms are part of + // perform rendezvous operation + // each proc owns random subset of bodies, receives all atoms in the bodies + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body - comm->ring(m,sizeof(double),buf,2,ring_nearest,NULL,(void *)this); + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_body,buf,sizeof(OutRvous), + (void *) this); + OutRvous *outbuf = (OutRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); - // set bodytag of all owned atoms, based on idclose - // find max value of rsqclose across all procs + // set bodytag of all owned atoms based on outbuf info for constituent atoms - double rsqmax = 0.0; - for (i = 0; i < nlocal; i++) { - bodytag[i] = 0; - if (!(mask[i] & groupbit)) continue; - m = hash->find(bodyid[i])->second; - bodytag[i] = idclose[m]; - rsqmax = MAX(rsqmax,rsqclose[m]); - } + for (i = 0; i < nlocal; i++) + if (!(mask[i] & groupbit)) bodytag[i] = 0; - // pack my atoms into buffer as bodytag of owning atom, unwrapped coords + for (m = 0; m < nreturn; m++) + bodytag[outbuf[m].ilocal] = outbuf[m].atomID; - m = 0; - for (i = 0; i < nlocal; i++) { - if (!(mask[i] & groupbit)) continue; - domain->unmap(x[i],image[i],unwrap); - buf[m++] = ubuf(bodytag[i]).d; - buf[m++] = unwrap[0]; - buf[m++] = unwrap[1]; - buf[m++] = unwrap[2]; - } + memory->sfree(outbuf); - // pass buffer around ring of procs - // func = update rsqfar for atoms belonging to bodies I own - // when done, have rsqfar for all atoms in bodies I own - - rsqfar = 0.0; - comm->ring(m,sizeof(double),buf,3,ring_farthest,NULL,(void *)this); - - // find maxextent of rsqfar across all procs + // maxextent = max of rsqfar across all procs // if defined, include molecule->maxextent MPI_Allreduce(&rsqfar,&maxextent,1,MPI_DOUBLE,MPI_MAX,world); @@ -1691,125 +1603,151 @@ void FixRigidSmall::create_bodies(tagint *bodyid) for (int i = 0; i < nmol; i++) maxextent = MAX(maxextent,onemols[i]->maxextent); } +} + +/* ---------------------------------------------------------------------- + process rigid bodies assigned to me + buf = list of N BodyMsg datums +------------------------------------------------------------------------- */ + +int FixRigidSmall::rendezvous_body(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) +{ + int i,j,m; + double delx,dely,delz,rsq; + int *iclose; + tagint *idclose; + double *x,*xown,*rsqclose; + double **bbox,**ctr; + + FixRigidSmall *frsptr = (FixRigidSmall *) ptr; + Memory *memory = frsptr->memory; + Error *error = frsptr->error; + MPI_Comm world = frsptr->world; + + // setup hash + // ncount = number of bodies assigned to me + // key = body ID + // value = index into Ncount-length data structure + + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) { + id = in[i].bodyID; + if (hash.find(id) == hash.end()) hash[id] = ncount++; + } + + // bbox = bounding box of each rigid body + + memory->create(bbox,ncount,6,"rigid/small:bbox"); + + for (m = 0; m < ncount; m++) { + bbox[m][0] = bbox[m][2] = bbox[m][4] = BIG; + bbox[m][1] = bbox[m][3] = bbox[m][5] = -BIG; + } + + for (i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + x = in[i].x; + bbox[m][0] = MIN(bbox[m][0],x[0]); + bbox[m][1] = MAX(bbox[m][1],x[0]); + bbox[m][2] = MIN(bbox[m][2],x[1]); + bbox[m][3] = MAX(bbox[m][3],x[1]); + bbox[m][4] = MIN(bbox[m][4],x[2]); + bbox[m][5] = MAX(bbox[m][5],x[2]); + } + + // check if any bbox is size 0.0, meaning rigid body is a single particle + + int flag = 0; + for (m = 0; m < ncount; m++) + if (bbox[m][0] == bbox[m][1] && bbox[m][2] == bbox[m][3] && + bbox[m][4] == bbox[m][5]) flag = 1; + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); // sync here? + if (flagall) + error->all(FLERR,"One or more rigid bodies are a single particle"); + + // ctr = geometric center pt of each rigid body + + memory->create(ctr,ncount,3,"rigid/small:bbox"); + + for (m = 0; m < ncount; m++) { + ctr[m][0] = 0.5 * (bbox[m][0] + bbox[m][1]); + ctr[m][1] = 0.5 * (bbox[m][2] + bbox[m][3]); + ctr[m][2] = 0.5 * (bbox[m][4] + bbox[m][5]); + } + + // idclose = atomID closest to center point of each body + + memory->create(idclose,ncount,"rigid/small:idclose"); + memory->create(iclose,ncount,"rigid/small:iclose"); + memory->create(rsqclose,ncount,"rigid/small:rsqclose"); + for (m = 0; m < ncount; m++) rsqclose[m] = BIG; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + x = in[i].x; + delx = x[0] - ctr[m][0]; + dely = x[1] - ctr[m][1]; + delz = x[2] - ctr[m][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq <= rsqclose[m]) { + if (rsq == rsqclose[m] && in[i].atomID > idclose[m]) continue; + iclose[m] = i; + idclose[m] = in[i].atomID; + rsqclose[m] = rsq; + } + } + + // compute rsqfar for all bodies I own + // set rsqfar back in caller + + double rsqfar = 0.0; + + for (int i = 0; i < n; i++) { + m = hash.find(in[i].bodyID)->second; + xown = in[iclose[m]].x; + x = in[i].x; + delx = x[0] - xown[0]; + dely = x[1] - xown[1]; + delz = x[2] - xown[2]; + rsq = delx*delx + dely*dely + delz*delz; + rsqfar = MAX(rsqfar,rsq); + } + + frsptr->rsqfar = rsqfar; + + // pass list of OutRvous datums back to comm->rendezvous + + int nout = n; + memory->create(proclist,nout,"rigid/small:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc(nout*sizeof(OutRvous),"rigid/small:out"); + + for (int i = 0; i < nout; i++) { + proclist[i] = in[i].me; + out[i].ilocal = in[i].ilocal; + m = hash.find(in[i].bodyID)->second; + out[i].atomID = idclose[m]; + } + + outbuf = (char *) out; // clean up + // Comm::rendezvous will delete proclist and out (outbuf) - delete hash; - memory->destroy(buf); memory->destroy(bbox); memory->destroy(ctr); memory->destroy(idclose); + memory->destroy(iclose); memory->destroy(rsqclose); -} -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update bounding box for rigid bodies my atoms are part of -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_bbox(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - std::map *hash = frsptr->hash; - double **bbox = frsptr->bbox; - - double *buf = (double *) cbuf; - int ndatums = n/4; - - int j,imol; - double *x; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 4) { - imol = static_cast (buf[m]); - if (hash->find(imol) != hash->end()) { - j = hash->find(imol)->second; - x = &buf[m+1]; - bbox[j][0] = MIN(bbox[j][0],x[0]); - bbox[j][1] = MAX(bbox[j][1],x[0]); - bbox[j][2] = MIN(bbox[j][2],x[1]); - bbox[j][3] = MAX(bbox[j][3],x[1]); - bbox[j][4] = MIN(bbox[j][4],x[2]); - bbox[j][5] = MAX(bbox[j][5],x[2]); - } - } -} - -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update nearest atom to body center for rigid bodies my atoms are part of -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_nearest(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - std::map *hash = frsptr->hash; - double **ctr = frsptr->ctr; - tagint *idclose = frsptr->idclose; - double *rsqclose = frsptr->rsqclose; - - double *buf = (double *) cbuf; - int ndatums = n/5; - - int j,imol; - tagint tag; - double delx,dely,delz,rsq; - double *x; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 5) { - imol = static_cast (buf[m]); - if (hash->find(imol) != hash->end()) { - j = hash->find(imol)->second; - tag = (tagint) ubuf(buf[m+1]).i; - x = &buf[m+2]; - delx = x[0] - ctr[j][0]; - dely = x[1] - ctr[j][1]; - delz = x[2] - ctr[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= rsqclose[j]) { - if (rsq == rsqclose[j] && tag > idclose[j]) continue; - idclose[j] = tag; - rsqclose[j] = rsq; - } - } - } -} - -/* ---------------------------------------------------------------------- - process rigid body atoms from another proc - update rsqfar = distance from owning atom to other atom -------------------------------------------------------------------------- */ - -void FixRigidSmall::ring_farthest(int n, char *cbuf, void *ptr) -{ - FixRigidSmall *frsptr = (FixRigidSmall *) ptr; - double **x = frsptr->atom->x; - imageint *image = frsptr->atom->image; - int nlocal = frsptr->atom->nlocal; - - double *buf = (double *) cbuf; - int ndatums = n/4; - - int iowner; - tagint tag; - double delx,dely,delz,rsq; - double *xx; - double unwrap[3]; - - int m = 0; - for (int i = 0; i < ndatums; i++, m += 4) { - tag = (tagint) ubuf(buf[m]).i; - iowner = frsptr->atom->map(tag); - if (iowner < 0 || iowner >= nlocal) continue; - frsptr->domain->unmap(x[iowner],image[iowner],unwrap); - xx = &buf[m+1]; - delx = xx[0] - unwrap[0]; - dely = xx[1] - unwrap[1]; - delz = xx[2] - unwrap[2]; - rsq = delx*delx + dely*dely + delz*delz; - frsptr->rsqfar = MAX(frsptr->rsqfar,rsq); - } + return nout; } /* ---------------------------------------------------------------------- @@ -2472,9 +2410,9 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) int nlocal = atom->nlocal; - hash = new std::map(); + std::map hash; for (i = 0; i < nlocal; i++) - if (bodyown[i] >= 0) (*hash)[atom->molecule[i]] = bodyown[i]; + if (bodyown[i] >= 0) hash[atom->molecule[i]] = bodyown[i]; // open file and read header @@ -2533,11 +2471,11 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) id = ATOTAGINT(values[0]); if (id <= 0 || id > maxmol) error->all(FLERR,"Invalid rigid body ID in fix rigid/small file"); - if (hash->find(id) == hash->end()) { + if (hash.find(id) == hash.end()) { buf = next + 1; continue; } - m = (*hash)[id]; + m = hash[id]; inbody[m] = 1; if (which == 0) { @@ -2576,7 +2514,6 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) delete [] buffer; delete [] values; - delete hash; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index 3f6826f9bb..a820efcdea 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -23,7 +23,7 @@ FixStyle(rigid/small,FixRigidSmall) #include "fix.h" // replace this later -#include +//#include namespace LAMMPS_NS { @@ -180,13 +180,21 @@ class FixRigidSmall : public Fix { // class data used by ring communication callbacks - std::map *hash; - double **bbox; - double **ctr; - tagint *idclose; - double *rsqclose; double rsqfar; + struct InRvous { + int me,ilocal; + tagint atomID,bodyID; + double x[3]; + }; + + struct OutRvous { + int ilocal; + tagint atomID; + }; + + // local methods + void image_shift(); void set_xv(); void set_v(); @@ -199,11 +207,9 @@ class FixRigidSmall : public Fix { void grow_body(); void reset_atom2body(); - // callback functions for ring communication + // callback function for rendezvous communication - static void ring_bbox(int, char *, void *); - static void ring_nearest(int, char *, void *); - static void ring_farthest(int, char *, void *); + static int rendezvous_body(int, char *, int *&, char *&, void *); // debug diff --git a/src/comm.cpp b/src/comm.cpp index f355a562fc..5fcfa141d0 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -28,6 +28,7 @@ #include "dump.h" #include "group.h" #include "procmap.h" +#include "irregular.h" #include "accelerator_kokkos.h" #include "memory.h" #include "error.h" @@ -725,6 +726,56 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, memory->destroy(bufcopy); } +/* ---------------------------------------------------------------------- + rendezvous communication operation +------------------------------------------------------------------------- */ + +int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, + int (*callback)(int, char *, int *&, char *&, void *), + char *&outbuf, int outsize, void *ptr) +{ + // comm data from caller decomposition to rendezvous decomposition + + Irregular *irregular = new Irregular(lmp); + + int n_rvous = irregular->create_data(n,proclist); // add sort + char *inbuf_rvous = (char *) memory->smalloc((bigint) n_rvous*insize, + "rendezvous:inbuf_rvous"); + irregular->exchange_data(inbuf,insize,inbuf_rvous); + + irregular->destroy_data(); + delete irregular; + + // peform rendezvous computation via callback() + // callback() allocates proclist_rvous and outbuf_rvous + + int *proclist_rvous; + char *outbuf_rvous; + + int nout_rvous = + callback(n_rvous,inbuf_rvous,proclist_rvous,outbuf_rvous,ptr); + + memory->sfree(inbuf_rvous); + + // comm data from rendezvous decomposition back to caller + // caller will free outbuf + + irregular = new Irregular(lmp); + + int nout = irregular->create_data(nout_rvous,proclist_rvous); + outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + irregular->exchange_data(outbuf_rvous,outsize,outbuf); + + irregular->destroy_data(); + delete irregular; + memory->destroy(proclist_rvous); + memory->sfree(outbuf_rvous); + + // return number of datums + + return nout; +} + /* ---------------------------------------------------------------------- proc 0 reads Nlines from file into buf and bcasts buf to all procs caller allocates buf to max size needed diff --git a/src/comm.h b/src/comm.h index 2579f9b283..8bb057a0c1 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,6 +109,10 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); + int rendezvous(int, int *, char *, int, + int (*)(int, char *, int *&, char *&, void *), + char *&, int, void *); + int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index cb0da42970..52e4256fca 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -514,9 +514,6 @@ void CreateAtoms::command(int narg, char **arg) if (domain->triclinic) domain->lamda2x(atom->nlocal); } - MPI_Barrier(world); - double time2 = MPI_Wtime(); - // clean up delete ranmol; @@ -526,21 +523,6 @@ void CreateAtoms::command(int narg, char **arg) delete [] ystr; delete [] zstr; - // print status - - if (comm->me == 0) { - if (screen) { - fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(screen," Time spent = %g secs\n",time2-time1); - } - if (logfile) { - fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", - atom->natoms-natoms_previous); - fprintf(logfile," Time spent = %g secs\n",time2-time1); - } - } - // for MOLECULE mode: // create special bond lists for molecular systems, // but not for atom style template @@ -550,6 +532,25 @@ void CreateAtoms::command(int narg, char **arg) if (atom->molecular == 1 && onemol->bondflag && !onemol->specialflag) { Special special(lmp); special.build(); + + } + } + + // print status + + MPI_Barrier(world); + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) { + fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(screen," create_atoms CPU = %g secs\n",time2-time1); + } + if (logfile) { + fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", + atom->natoms-natoms_previous); + fprintf(logfile," create_atoms CPU = %g secs\n",time2-time1); } } } diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp new file mode 100644 index 0000000000..be930217a1 --- /dev/null +++ b/src/hashlittle.cpp @@ -0,0 +1,333 @@ +// Hash function hashlittle() +// from lookup3.c, by Bob Jenkins, May 2006, Public Domain +// bob_jenkins@burtleburtle.net + +#include "stddef.h" +#include "stdint.h" + +#define HASH_LITTLE_ENDIAN 1 // Intel and AMD are little endian + +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) + +/* +------------------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. + +This is reversible, so any information in (a,b,c) before mix() is +still in (a,b,c) after mix(). + +If four pairs of (a,b,c) inputs are run through mix(), or through +mix() in reverse, there are at least 32 bits of the output that +are sometimes the same for one pair and different for another pair. +This was tested for: +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that +satisfy this are + 4 6 8 16 19 4 + 9 15 3 18 27 15 + 14 9 3 7 17 3 +Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing +for "differ" defined as + with a one-bit base and a two-bit delta. I +used http://burtleburtle.net/bob/hash/avalanche.html to choose +the operations, constants, and arrangements of the variables. + +This does not achieve avalanche. There are input bits of (a,b,c) +that fail to affect some output bits of (a,b,c), especially of a. The +most thoroughly mixed value is c, but it doesn't really even achieve +avalanche in c. + +This allows some parallelism. Read-after-writes are good at doubling +the number of bits affected, so the goal of mixing pulls in the opposite +direction as the goal of parallelism. I did what I could. Rotates +seem to cost as much as shifts on every machine I could lay my hands +on, and rotates are much kinder to the top and bottom bits, so I used +rotates. +------------------------------------------------------------------------------- +*/ +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} + +/* +------------------------------------------------------------------------------- +final -- final mixing of 3 32-bit values (a,b,c) into c + +Pairs of (a,b,c) values differing in only a few bits will usually +produce values of c that look totally different. This was tested for +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +These constants passed: + 14 11 25 16 4 14 24 + 12 14 25 16 4 14 24 +and these came close: + 4 8 15 26 3 22 24 + 10 8 15 26 3 22 24 + 11 8 15 26 3 22 24 +------------------------------------------------------------------------------- +*/ +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + +/* +------------------------------------------------------------------------------- +hashlittle() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + length : the length of the key, counting by bytes + initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Two keys differing by one or two bits will have +totally different hash values. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8_t **)k, do it like this: + for (i=0, h=0; i 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]&0xffffff" actually reads beyond the end of the string, but + * then masks off the part it's not allowed to read. Because the + * string is aligned, the masked-off tail is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff; a+=k[0]; break; + case 6 : b+=k[1]&0xffff; a+=k[0]; break; + case 5 : b+=k[1]&0xff; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff; break; + case 2 : a+=k[0]&0xffff; break; + case 1 : a+=k[0]&0xff; break; + case 0 : return c; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ + case 1 : a+=k8[0]; break; + case 0 : return c; + } + +#endif /* !valgrind */ + + } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { + const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ + const uint8_t *k8; + + /*--------------- all but last block: aligned reads and different mixing */ + while (length > 12) + { + a += k[0] + (((uint32_t)k[1])<<16); + b += k[2] + (((uint32_t)k[3])<<16); + c += k[4] + (((uint32_t)k[5])<<16); + mix(a,b,c); + length -= 12; + k += 6; + } + + /*----------------------------- handle the last (probably partial) block */ + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[4]+(((uint32_t)k[5])<<16); + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=k[4]; + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=k[2]; + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=k[0]; + break; + case 1 : a+=k8[0]; + break; + case 0 : return c; /* zero length requires no mixing */ + } + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : return c; + } + } + + final(a,b,c); + return c; + +#else /* PURIFY_HATES_HASHLITTLE */ +/* I don't know what it is about Jenkins' hashlittle function, but + * it drives purify insane, even with VALGRIND defined. It makes + * purify unusable!! The code execution doesn't even make sense. + * Below is a (probably) weaker hash function that at least allows + * testing with purify. + */ +#define MAXINT_DIV_PHI 11400714819323198485U + + uint32_t h, rest, *p, bytes, num_bytes; + char *byteptr; + + num_bytes = length; + + /* First hash the uint32_t-sized portions of the key */ + h = 0; + for (p = (uint32_t *)key, bytes=num_bytes; + bytes >= (uint32_t) sizeof(uint32_t); + bytes-=sizeof(uint32_t), p++){ + h = (h^(*p))*MAXINT_DIV_PHI; + } + + /* Then take care of the remaining bytes, if any */ + rest = 0; + for (byteptr = (char *)p; bytes > 0; bytes--, byteptr++){ + rest = (rest<<8) | (*byteptr); + } + + /* If extra bytes, merge the two parts */ + if (rest) + h = (h^rest)*MAXINT_DIV_PHI; + + return h; +#endif /* PURIFY_HATES_HASHLITTLE */ +} diff --git a/src/hashlittle.h b/src/hashlittle.h new file mode 100644 index 0000000000..7b57a35c80 --- /dev/null +++ b/src/hashlittle.h @@ -0,0 +1,5 @@ +// Hash function hashlittle() +// from lookup3.c, by Bob Jenkins, May 2006, Public Domain +// bob_jenkins@burtleburtle.net + +uint32_t hashlittle(const void *key, size_t length, uint32_t); diff --git a/src/irregular.cpp b/src/irregular.cpp index 9c15f135d0..60025249cf 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -501,7 +501,8 @@ int compare_standalone(const int i, const int j, void *ptr) void Irregular::exchange_atom(double *sendbuf, int *sizes, double *recvbuf) { - int i,m,n,offset,count; + int i,m,n,count; + bigint offset; // post all receives @@ -739,11 +740,13 @@ int Irregular::create_data(int n, int *proclist, int sortflag) void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) { - int i,m,n,offset,count; + int i,n,count; + bigint m; // these 2 lines enable send/recv buf to be larger than 2 GB + char *dest; // post all receives, starting after self copies - offset = num_self*nbytes; + bigint offset = num_self*nbytes; for (int irecv = 0; irecv < nrecv_proc; irecv++) { MPI_Irecv(&recvbuf[offset],num_recv[irecv]*nbytes,MPI_CHAR, proc_recv[irecv],0,world,&request[irecv]); @@ -765,18 +768,22 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) n = 0; for (int isend = 0; isend < nsend_proc; isend++) { count = num_send[isend]; + dest = buf; for (i = 0; i < count; i++) { m = index_send[n++]; - memcpy(&buf[i*nbytes],&sendbuf[m*nbytes],nbytes); + memcpy(dest,&sendbuf[m*nbytes],nbytes); + dest += nbytes; } MPI_Send(buf,count*nbytes,MPI_CHAR,proc_send[isend],0,world); } // copy datums to self, put at beginning of recvbuf + dest = recvbuf; for (i = 0; i < num_self; i++) { m = index_self[i]; - memcpy(&recvbuf[i*nbytes],&sendbuf[m*nbytes],nbytes); + memcpy(dest,&sendbuf[m*nbytes],nbytes); + dest += nbytes; } // wait on all incoming messages diff --git a/src/read_data.cpp b/src/read_data.cpp index 2f4484010b..08a57a3aac 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -120,6 +120,9 @@ void ReadData::command(int narg, char **arg) { if (narg < 1) error->all(FLERR,"Illegal read_data command"); + MPI_Barrier(world); + double time1 = MPI_Wtime; + // optional args addflag = NONE; @@ -906,6 +909,18 @@ void ReadData::command(int narg, char **arg) force->kspace = saved_kspace; } + + // total time + + MPI_Barrier(world); + double time2 = MPI_Wtime; + + if (comm->me == 0) { + if (screen) + fprintf(screen," read_atoms CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," read_atoms CPU = %g secs\n",time2-time1); + } } /* ---------------------------------------------------------------------- diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 73dc37f4cb..2eca9b58c4 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -81,6 +81,9 @@ void ReadRestart::command(int narg, char **arg) if (domain->box_exist) error->all(FLERR,"Cannot read_restart after simulation box is defined"); + MPI_Barrier(world); + double time1 = MPI_Wtime; + MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -562,6 +565,18 @@ void ReadRestart::command(int narg, char **arg) Special special(lmp); special.build(); } + + // total time + + MPI_Barrier(world); + double time2 = MPI_Wtime; + + if (comm->me == 0) { + if (screen) + fprintf(screen," read_restart CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," read_restart CPU = %g secs\n",time2-time1); + } } /* ---------------------------------------------------------------------- diff --git a/src/replicate.cpp b/src/replicate.cpp index cdadf1fd1f..3c8f4a8aee 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -76,7 +76,7 @@ void Replicate::command(int narg, char **arg) if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store) error->all(FLERR,"Cannot replicate with fixes that store atom quantities"); - // Record wall time for atom replication + // record wall time for atom replication MPI_Barrier(world); double time1 = MPI_Wtime(); @@ -762,15 +762,15 @@ void Replicate::command(int narg, char **arg) special.build(); } - // Wall time + // total time MPI_Barrier(world); double time2 = MPI_Wtime(); if (me == 0) { if (screen) - fprintf(screen," Time spent = %g secs\n",time2-time1); + fprintf(screen," replicate CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," Time spent = %g secs\n",time2-time1); + fprintf(logfile," replicate CPU = %g secs\n",time2-time1); } } diff --git a/src/special.cpp b/src/special.cpp index fccc930353..a18c597765 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -21,9 +21,10 @@ #include "modify.h" #include "fix.h" #include "accelerator_kokkos.h" +#include "hashlittle.h" +#include "atom_masks.h" #include "memory.h" #include "error.h" -#include "atom_masks.h" using namespace LAMMPS_NS; @@ -54,11 +55,12 @@ Special::~Special() void Special::build() { - int i,j,k,size; - int max,maxall,nbuf; - tagint *buf; + int i,j,k,m,n,size,proc; + int max,maxall; + char *buf; MPI_Barrier(world); + double time1 = MPI_Wtime(); int nlocal = atom->nlocal; @@ -87,99 +89,88 @@ void Special::build() // ----------------------------------------------------- // compute nspecial[i][0] = # of 1-2 neighbors of atom i + // create onetwo[i] = list of 1-2 neighbors for atom i // ----------------------------------------------------- - // bond partners stored by atom itself + // ncount = # of my datums to send (newton or newton off) + // include nlocal datums with owner of each atom - for (i = 0; i < nlocal; i++) nspecial[i][0] = num_bond[i]; + int newton_bond = force->newton_bond; - // if newton_bond off, then done - // else only counted 1/2 of all bonds, so count other half + int ncount = 0; + for (i = 0; i < nlocal; i++) ncount += num_bond[i]; + if (newton_bond) ncount *= 2; + ncount += nlocal; - if (force->newton_bond) { + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = global tag of 2nd atom in each bond + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += num_bond[i]; - memory->create(buf,nbuf,"special:buf"); + m = 0; + for (i = 0; i < nlocal; i++) { + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - // fill buffer with global tags of bond partners of my atoms - - size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) - buf[size++] = bond_atom[i][j]; - - // cycle buffer around ring of procs back to self - // when receive buffer, scan tags for atoms I own - // when find one, increment nspecial count for that atom - - comm->ring(size,sizeof(tagint),buf,1,ring_one,NULL,(void *)this); - - memory->destroy(buf); + for (j = 0; j < num_bond[i]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = bond_atom[i][j]; + m++; + } + if (newton_bond) { + for (j = 0; j < num_bond[i]; j++) { + proclist[m] = hashlittle(&bond_atom[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -1; + inbuf[m].atomID = bond_atom[i][j]; + inbuf[m].partnerID = tag[i]; + m++; + } + } } - // ---------------------------------------------------- - // create onetwo[i] = list of 1-2 neighbors for atom i - // ---------------------------------------------------- + // perform rendezvous operation + // each proc owns random subset of atoms, receives all their bond partners - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][0]); + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[0] and onetwo for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); + + // compute and print max # of 1-2 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-2 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-2 neighbors\n",maxall); } - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - // count = accumulating counter - - memory->create(count,nlocal,"special:count"); - for (i = 0; i < nlocal; i++) count[i] = 0; - - // add bond partners stored by atom to onetwo list - - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) - onetwo[i][count[i]++] = bond_atom[i][j]; - - // if newton_bond off, then done - // else only stored 1/2 of all bonds, so store other half - - if (force->newton_bond) { - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 global tags in each bond - - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2*num_bond[i]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with global tags of both atoms in bond - - size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_bond[i]; j++) { - buf[size++] = tag[i]; - buf[size++] = bond_atom[i][j]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan 2nd-atom tags for atoms I own - // when find one, add 1st-atom tag to onetwo list for 2nd atom - - comm->ring(size,sizeof(tagint),buf,2,ring_two,NULL,(void *)this); - - memory->destroy(buf); - } - - memory->destroy(count); - // ----------------------------------------------------- // done if special_bond weights for 1-3, 1-4 are set to 1.0 // ----------------------------------------------------- @@ -189,114 +180,83 @@ void Special::build() dedup(); combine(); fix_alteration(); + timer_output(time1); return; } // ----------------------------------------------------- // compute nspecial[i][1] = # of 1-3 neighbors of atom i + // create onethree[i] = list of 1-3 neighbors for atom i // ----------------------------------------------------- - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 scalars + list of 1-2 neighbors + // ncount = # of my datums to send + // include nlocal datums with owner of each atom - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][0]; - memory->create(buf,nbuf,"special:buf"); + ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][0]*(nspecial[i][0]-1); - // fill buffer with: - // (1) = counter for 1-3 neighbors, initialized to 0 - // (2) = # of 1-2 neighbors - // (3:N) = list of 1-2 neighbors + memory->create(proclist,ncount,"special:proclist"); + inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - size = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - buf[size++] = 0; - buf[size++] = nspecial[i][0]; - for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; + proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; + + for (j = 0; j < nspecial[i][0]; j++) { + proc = hashlittle(&onetwo[i][j],sizeof(tagint),0) % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = onetwo[i][j]; + inbuf[m].partnerID = onetwo[i][k]; + m++; + } + } } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-2 neighbors for atoms I own - // when find one, increment 1-3 count by # of 1-2 neighbors of my atom, - // subtracting one since my list will contain original atom + // perform rendezvous operation + // each proc owns random subset of atoms, receives all their bond partners - comm->ring(size,sizeof(tagint),buf,3,ring_three,buf,(void *)this); + nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + outbuf = (OutRvous *) buf; - // extract count from buffer that has cycled back to me - // nspecial[i][1] = # of 1-3 neighbors of atom i + memory->destroy(proclist); + memory->sfree(inbuf); - j = 0; - for (i = 0; i < nlocal; i++) { - nspecial[i][1] = buf[j]; - j += 2 + nspecial[i][0]; + // set nspecial[1] and onethree for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onethree,nlocal,maxall,"special:onethree"); + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; } - memory->destroy(buf); + memory->destroy(outbuf); - // ---------------------------------------------------- - // create onethree[i] = list of 1-3 neighbors for atom i - // ---------------------------------------------------- - - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][1]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + // compute and print max # of 1-3 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-3 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-3 neighbors\n",maxall); } - memory->create(onethree,nlocal,maxall,"special:onethree"); - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 4 scalars + list of 1-2 neighs + list of 1-3 neighs - - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 4 + nspecial[i][0] + nspecial[i][1]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with: - // (1) = global tag of original atom - // (2) = # of 1-2 neighbors - // (3) = # of 1-3 neighbors - // (4) = counter for 1-3 neighbors, initialized to 0 - // (5:N) = list of 1-2 neighbors - // (N+1:2N) space for list of 1-3 neighbors - - size = 0; - for (i = 0; i < nlocal; i++) { - buf[size++] = tag[i]; - buf[size++] = nspecial[i][0]; - buf[size++] = nspecial[i][1]; - buf[size++] = 0; - for (j = 0; j < nspecial[i][0]; j++) buf[size++] = onetwo[i][j]; - size += nspecial[i][1]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-2 neighbors for atoms I own - // when find one, add its neighbors to 1-3 list - // increment the count in buf(i+4) - // exclude the atom whose tag = original - // this process may include duplicates but they will be culled later - - comm->ring(size,sizeof(tagint),buf,4,ring_four,buf,(void *)this); - - // fill onethree with buffer values that have been returned to me - // sanity check: accumulated buf[i+3] count should equal - // nspecial[i][1] for each atom - - j = 0; - for (i = 0; i < nlocal; i++) { - if (buf[j+3] != nspecial[i][1]) - error->one(FLERR,"1-3 bond count is inconsistent"); - j += 4 + nspecial[i][0]; - for (k = 0; k < nspecial[i][1]; k++) - onethree[i][k] = buf[j++]; - } - - memory->destroy(buf); - // done if special_bond weights for 1-4 are set to 1.0 if (force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { @@ -304,117 +264,92 @@ void Special::build() if (force->special_angle) angle_trim(); combine(); fix_alteration(); + timer_output(time1); return; } // ----------------------------------------------------- // compute nspecial[i][2] = # of 1-4 neighbors of atom i + // create onefour[i] = list of 1-4 neighbors for atom i // ----------------------------------------------------- - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 2 scalars + list of 1-3 neighbors + // ncount = # of my datums to send + // include nlocal datums with owner of each atom - nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2 + nspecial[i][1]; - memory->create(buf,nbuf,"special:buf"); + ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]*nspecial[i][0]; - // fill buffer with: - // (1) = counter for 1-4 neighbors, initialized to 0 - // (2) = # of 1-3 neighbors - // (3:N) = list of 1-3 neighbors + memory->create(proclist,ncount,"special:proclist"); + inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - size = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // one datum for each partner: datum = atomID, bond partner ID + // owning proc for each datum = random hash of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - buf[size++] = 0; - buf[size++] = nspecial[i][1]; - for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; + proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; + + for (j = 0; j < nspecial[i][1]; j++) { + proc = hashlittle(&onethree[i][j],sizeof(tagint),0) % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = onethree[i][j]; + inbuf[m].partnerID = onetwo[i][k]; + m++; + } + } } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-3 neighbors for atoms I own - // when find one, increment 1-4 count by # of 1-2 neighbors of my atom - // may include duplicates and original atom but they will be culled later + // perform rendezvous operation + // each proc owns random subset of bodies, receives all atoms in the bodies + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body - comm->ring(size,sizeof(tagint),buf,5,ring_five,buf,(void *)this); + nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_1234, + buf,sizeof(OutRvous),(void *) this); + outbuf = (OutRvous *) buf; - // extract count from buffer that has cycled back to me - // nspecial[i][2] = # of 1-4 neighbors of atom i + memory->destroy(proclist); + memory->sfree(inbuf); - j = 0; - for (i = 0; i < nlocal; i++) { - nspecial[i][2] = buf[j]; - j += 2 + nspecial[i][1]; + // set nspecial[2] and onefour for all owned atoms based on output info + + MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onefour,nlocal,maxall,"special:onefour"); + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; } - memory->destroy(buf); + memory->destroy(outbuf); - // ---------------------------------------------------- - // create onefour[i] = list of 1-4 neighbors for atom i - // ---------------------------------------------------- - - max = 0; - for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][2]); - MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + // compute and print max # of 1-4 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-4 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-4 neighbors\n",maxall); } - memory->create(onefour,nlocal,maxall,"special:onefour"); - - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = 3 scalars + list of 1-3 neighs + list of 1-4 neighs - - nbuf = 0; - for (i = 0; i < nlocal; i++) - nbuf += 3 + nspecial[i][1] + nspecial[i][2]; - memory->create(buf,nbuf,"special:buf"); - - // fill buffer with: - // (1) = # of 1-3 neighbors - // (2) = # of 1-4 neighbors - // (3) = counter for 1-4 neighbors, initialized to 0 - // (4:N) = list of 1-3 neighbors - // (N+1:2N) space for list of 1-4 neighbors - - size = 0; - for (i = 0; i < nlocal; i++) { - buf[size++] = nspecial[i][1]; - buf[size++] = nspecial[i][2]; - buf[size++] = 0; - for (j = 0; j < nspecial[i][1]; j++) buf[size++] = onethree[i][j]; - size += nspecial[i][2]; - } - - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1-3 neighbors for atoms I own - // when find one, add its neighbors to 1-4 list - // incrementing the count in buf(i+4) - // this process may include duplicates but they will be culled later - - comm->ring(size,sizeof(tagint),buf,6,ring_six,buf,(void *)this); - - // fill onefour with buffer values that have been returned to me - // sanity check: accumulated buf[i+2] count should equal - // nspecial[i][2] for each atom - - j = 0; - for (i = 0; i < nlocal; i++) { - if (buf[j+2] != nspecial[i][2]) - error->one(FLERR,"1-4 bond count is inconsistent"); - j += 3 + nspecial[i][1]; - for (k = 0; k < nspecial[i][2]; k++) - onefour[i][k] = buf[j++]; - } - - memory->destroy(buf); + // finish processing the onetwo, onethree, onefour lists dedup(); if (force->special_angle) angle_trim(); if (force->special_dihedral) dihedral_trim(); combine(); fix_alteration(); + timer_output(time1); } /* ---------------------------------------------------------------------- @@ -663,17 +598,19 @@ void Special::combine() void Special::angle_trim() { - int i,j,m,n; + int i,j,m,n,proc,index; int *num_angle = atom->num_angle; int *num_dihedral = atom->num_dihedral; tagint **angle_atom1 = atom->angle_atom1; + tagint **angle_atom2 = atom->angle_atom2; tagint **angle_atom3 = atom->angle_atom3; tagint **dihedral_atom1 = atom->dihedral_atom1; tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom3 = atom->dihedral_atom3; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; + tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-3 neighbor counts @@ -697,68 +634,125 @@ void Special::angle_trim() if ((num_angle && atom->nangles) || (num_dihedral && atom->ndihedrals)) { - // dflag = flag for 1-3 neighs of all owned atoms - - int maxcount = 0; - for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][1]); - memory->create(dflag,nlocal,maxcount,"special::dflag"); + // ncount = # of my datums to send in 3 parts for each owned atom + // proc owner, onethree list, angle end points + // angle end points are from angle list and 1-3 and 2-4 pairs in dihedrals + // latter is only for angles or dihedrlas where I own atom2 + int ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]; for (i = 0; i < nlocal; i++) { - n = nspecial[i][1]; - for (j = 0; j < n; j++) dflag[i][j] = 0; + for (j = 0; j < num_angle[i]; j++) { + index = atom->map(angle_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 2; + } + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 4; + } } - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = list of 1,3 atoms in each angle stored by atom - // and list of 1,3 and 2,4 atoms in each dihedral stored by atom + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - int nbuf = 0; + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // sent to owner of atomID + // one datum for each 1-4 partner: datum = atomID, ID + // sent to owner of atomID + // two datums for each dihedral 1-4 endatoms : datum = atomID, ID + // sent to owner of atomID + + m = 0; for (i = 0; i < nlocal; i++) { - if (num_angle && atom->nangles) nbuf += 2*num_angle[i]; - if (num_dihedral && atom->ndihedrals) nbuf += 2*2*num_dihedral[i]; - } - int *buf; - memory->create(buf,nbuf,"special:buf"); + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - // fill buffer with list of 1,3 atoms in each angle - // and with list of 1,3 and 2,4 atoms in each dihedral + for (j = 0; j < nspecial[i][1]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = onethree[i][j]; + m++; + } - int size = 0; - if (num_angle && atom->nangles) - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_angle[i]; j++) { - buf[size++] = angle_atom1[i][j]; - buf[size++] = angle_atom3[i][j]; - } + for (j = 0; j < num_angle[i]; j++) { + index = atom->map(angle_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - if (num_dihedral && atom->ndihedrals) - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_dihedral[i]; j++) { - buf[size++] = dihedral_atom1[i][j]; - buf[size++] = dihedral_atom3[i][j]; - buf[size++] = dihedral_atom2[i][j]; - buf[size++] = dihedral_atom4[i][j]; - } + proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = angle_atom1[i][j]; + inbuf[m].partnerID = angle_atom3[i][j]; + m++; - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1,3 atoms looking for atoms I own - // when find one, scan its 1-3 neigh list and mark I,J as in an angle + proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = angle_atom3[i][j]; + inbuf[m].partnerID = angle_atom1[i][j]; + m++; + } - comm->ring(size,sizeof(tagint),buf,7,ring_seven,NULL,(void *)this); + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - // delete 1-3 neighbors if they are not flagged in dflag + proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom1[i][j]; + inbuf[m].partnerID = dihedral_atom3[i][j]; + m++; - for (i = 0; i < nlocal; i++) { - m = 0; - for (j = 0; j < nspecial[i][1]; j++) - if (dflag[i][j]) onethree[i][m++] = onethree[i][j]; - nspecial[i][1] = m; + proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom2[i][j]; + inbuf[m].partnerID = dihedral_atom4[i][j]; + m++; + + proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom3[i][j]; + inbuf[m].partnerID = dihedral_atom1[i][j]; + m++; + + proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom4[i][j]; + inbuf[m].partnerID = dihedral_atom2[i][j]; + m++; + } } - // clean up + // perform rendezvous operation + // each proc owns random subset of atoms + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_trim, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - memory->destroy(dflag); - memory->destroy(buf); + memory->destroy(proclist); + memory->sfree(inbuf); + + // reset nspecial[1] and onethree for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + } + + memory->destroy(outbuf); // if no angles or dihedrals are defined, delete all 1-3 neighs @@ -789,12 +783,14 @@ void Special::angle_trim() void Special::dihedral_trim() { - int i,j,m,n; + int i,j,m,n,proc,index; int *num_dihedral = atom->num_dihedral; tagint **dihedral_atom1 = atom->dihedral_atom1; + tagint **dihedral_atom2 = atom->dihedral_atom2; tagint **dihedral_atom4 = atom->dihedral_atom4; int **nspecial = atom->nspecial; + tagint *tag = atom->tag; int nlocal = atom->nlocal; // stats on old 1-4 neighbor counts @@ -813,57 +809,95 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, flag each 1-4 neigh if it appears in a dihedral + // if dihedrals are defined, rendezvous onefour list with dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { - // dflag = flag for 1-4 neighs of all owned atoms - - int maxcount = 0; - for (i = 0; i < nlocal; i++) maxcount = MAX(maxcount,nspecial[i][2]); - memory->create(dflag,nlocal,maxcount,"special::dflag"); + // ncount = # of my datums to send in 3 parts for each owned atom + // onefour list, proc owner, dihedral end points + // latter is only for dihedrals where I own atom2 + int ncount = nlocal; + for (i = 0; i < nlocal; i++) ncount += nspecial[i][2]; for (i = 0; i < nlocal; i++) { - n = nspecial[i][2]; - for (j = 0; j < n; j++) dflag[i][j] = 0; + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index >= 0 && index < nlocal) ncount += 2; + } } - // nbufmax = largest buffer needed to hold info from any proc - // info for each atom = list of 1,4 atoms in each dihedral stored by atom + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + InRvous *inbuf = (InRvous *) + memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - int nbuf = 0; - for (i = 0; i < nlocal; i++) nbuf += 2*num_dihedral[i]; - int *buf; - memory->create(buf,nbuf,"special:buf"); + // setup input buf to rendezvous comm + // one datum for each owned atom: datum = proc, atomID + // sent to owner of atomID + // one datum for each 1-4 partner: datum = atomID, ID + // sent to owner of atomID + // two datums for each dihedral 1-4 endatoms : datum = atomID, ID + // sent to owner of atomID - // fill buffer with list of 1,4 atoms in each dihedral + m = 0; + for (i = 0; i < nlocal; i++) { + proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[m] = proc; + inbuf[m].me = me; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = 0; + m++; - int size = 0; - for (i = 0; i < nlocal; i++) - for (j = 0; j < num_dihedral[i]; j++) { - buf[size++] = dihedral_atom1[i][j]; - buf[size++] = dihedral_atom4[i][j]; + for (j = 0; j < nspecial[i][2]; j++) { + proclist[m] = proc; + inbuf[m].me = -1; + inbuf[m].atomID = tag[i]; + inbuf[m].partnerID = onefour[i][j]; + m++; } - // cycle buffer around ring of procs back to self - // when receive buffer, scan list of 1,4 atoms looking for atoms I own - // when find one, scan its 1-4 neigh list and mark I,J as in a dihedral + for (j = 0; j < num_dihedral[i]; j++) { + index = atom->map(dihedral_atom2[i][j]); + if (index < 0 || index >= nlocal) continue; - comm->ring(size,sizeof(tagint),buf,8,ring_eight,NULL,(void *)this); + proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom1[i][j]; + inbuf[m].partnerID = dihedral_atom4[i][j]; + m++; - // delete 1-4 neighbors if they are not flagged in dflag - - for (i = 0; i < nlocal; i++) { - m = 0; - for (j = 0; j < nspecial[i][2]; j++) - if (dflag[i][j]) onefour[i][m++] = onefour[i][j]; - nspecial[i][2] = m; + proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; + inbuf[m].me = -2; + inbuf[m].atomID = dihedral_atom4[i][j]; + inbuf[m].partnerID = dihedral_atom1[i][j]; + m++; + } } - // clean up + // perform rendezvous operation + // each proc owns random subset of atoms + // func = compute bbox of each body, flag atom closest to geometric center + // when done: each atom has atom ID of owning atom of its body + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), + rendezvous_trim, + buf,sizeof(OutRvous),(void *) this); + OutRvous *outbuf = (OutRvous *) buf; - memory->destroy(dflag); - memory->destroy(buf); + memory->destroy(proclist); + memory->sfree(inbuf); + + // reset nspecial[2] and onefour for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + } + + memory->destroy(outbuf); // if no dihedrals are defined, delete all 1-4 neighs @@ -888,262 +922,213 @@ void Special::dihedral_trim() } /* ---------------------------------------------------------------------- - when receive buffer, scan tags for atoms I own - when find one, increment nspecial count for that atom + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N InRvous datums + create outbuf = list of Nout OutRvous datums ------------------------------------------------------------------------- */ -void Special::ring_one(int ndatum, char *cbuf, void *ptr) +int Special::rendezvous_1234(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) { + int i,j,m; + Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + Memory *memory = sptr->memory; - tagint *buf = (tagint *) cbuf; - int m; + // setup hash + // ncount = number of atoms assigned to me + // key = atom ID + // value = index into Ncount-length data structure - for (int i = 0; i < ndatum; i++) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) nspecial[m][0]++; + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) + if (in[i].me >= 0) + hash[in[i].atomID] = ncount++; + + // procowner = caller proc that owns each atom + // atomID = ID of each rendezvous atom I own + + int *procowner,*npartner; + tagint *atomID; + memory->create(procowner,ncount,"special:procowner"); + memory->create(atomID,ncount,"special:atomID"); + memory->create(npartner,ncount,"special:npartner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].atomID)->second; + if (in[i].me >= 0) { + procowner[m] = in[i].me; + atomID[m] = in[i].atomID; + } else npartner[m]++; } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan 2nd-atom tags for atoms I own - when find one, add 1st-atom tag to onetwo list for 2nd atom -------------------------------------------------------------------------- */ + int max = 0; + for (m = 0; m < ncount; m++) + max = MAX(max,npartner[m]); + sptr->max_rvous = max; -void Special::ring_two(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int nlocal = atom->nlocal; + int **partner; + memory->create(partner,ncount,max,"special:partner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; - tagint **onetwo = sptr->onetwo; - int *count = sptr->count; - - tagint *buf = (tagint *) cbuf; - int m; - - for (int i = 1; i < ndatum; i += 2) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) onetwo[m][count[m]++] = buf[i-1]; + for (i = 0; i < n; i++) { + if (in[i].me >= 0) continue; + m = hash.find(in[i].atomID)->second; + partner[m][npartner[m]++] = in[i].partnerID; } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-2 neighbors for atoms I own - when find one, increment 1-3 count by # of 1-2 neighbors of my atom, - subtracting one since my list will contain original atom -------------------------------------------------------------------------- */ + // pass list of OutRvous datums back to comm->rendezvous -void Special::ring_three(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + int nout = 0; + for (m = 0; m < ncount; m++) nout += npartner[m]; - tagint *buf = (tagint *) cbuf; - int i,j,m,n,num12; + memory->create(proclist,nout,"special:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); - i = 0; - while (i < ndatum) { - n = buf[i]; - num12 = buf[i+1]; - for (j = 0; j < num12; j++) { - m = atom->map(buf[i+2+j]); - if (m >= 0 && m < nlocal) - n += nspecial[m][0] - 1; + nout = 0; + for (m = 0; m < ncount; m++) + for (j = 0; j < npartner[m]; j++) { + proclist[nout] = procowner[m]; + out[nout].atomID = atomID[m]; + out[nout].partnerID = partner[m][j]; + nout++; } - buf[i] = n; - i += 2 + num12; - } + + outbuf = (char *) out; + + // clean up + // Comm::rendezvous will delete proclist and out (outbuf) + + memory->destroy(procowner); + memory->destroy(atomID); + memory->destroy(npartner); + memory->destroy(partner); + + return nout; } /* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-2 neighbors for atoms I own - when find one, add its neighbors to 1-3 list - increment the count in buf(i+4) - exclude the atom whose tag = original - this process may include duplicates but they will be culled later + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N InRvous datums + create outbuf = list of Nout OutRvous datums ------------------------------------------------------------------------- */ -void Special::ring_four(int ndatum, char *cbuf, void *ptr) +int Special::rendezvous_trim(int n, char *inbuf, + int *&proclist, char *&outbuf, + void *ptr) { + int i,j,m; + Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + Memory *memory = sptr->memory; - tagint **onetwo = sptr->onetwo; + // setup hash + // ncount = number of atoms assigned to me + // key = atom ID + // value = index into Ncount-length data structure - tagint *buf = (tagint *) cbuf; - tagint original; - int i,j,k,m,n,num12,num13; + InRvous *in = (InRvous *) inbuf; + std::map hash; + tagint id; + + int ncount = 0; + for (i = 0; i < n; i++) + if (in[i].me >= 0) + hash[in[i].atomID] = ncount++; - i = 0; - while (i < ndatum) { - original = buf[i]; - num12 = buf[i+1]; - num13 = buf[i+2]; - n = buf[i+3]; - for (j = 0; j < num12; j++) { - m = atom->map(buf[i+4+j]); - if (m >= 0 && m < nlocal) - for (k = 0; k < nspecial[m][0]; k++) - if (onetwo[m][k] != original) - buf[i+4+num12+(n++)] = onetwo[m][k]; + // procowner = caller proc that owns each atom + // atomID = ID of each rendezvous atom I own + // npartner = # of 1-3 partners for each atom I own + + int *procowner,*npartner; + tagint *atomID; + memory->create(procowner,ncount,"special:procowner"); + memory->create(atomID,ncount,"special:atomID"); + memory->create(npartner,ncount,"special:npartner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + m = hash.find(in[i].atomID)->second; + if (in[i].me >= 0) { + procowner[m] = in[i].me; + atomID[m] = in[i].atomID; + } else if (in[i].me == -1) npartner[m]++; + } + + int max = 0; + for (m = 0; m < ncount; m++) max = MAX(max,npartner[m]); + + // partner = list of 1-3 or 1-4 partners for each atom I own + + int **partner; + memory->create(partner,ncount,max,"special:partner"); + for (m = 0; m < ncount; m++) npartner[m] = 0; + + for (i = 0; i < n; i++) { + if (in[i].me >= 0 || in[i].me == -2) continue; + m = hash.find(in[i].atomID)->second; + partner[m][npartner[m]++] = in[i].partnerID; + } + + // flag = 1 if partner is in an actual angle or in a dihedral + + int **flag; + memory->create(flag,ncount,max,"special:flag"); + + for (i = 0; i < ncount; i++) + for (j = 0; j < npartner[i]; j++) + flag[i][j] = 0; + + tagint actual; + for (i = 0; i < n; i++) { + if (in[i].me != -2) continue; + actual = in[i].partnerID; + m = hash.find(in[i].atomID)->second; + for (j = 0; j < npartner[m]; j++) + if (partner[m][j] == actual) { + flag[m][j] = 1; + break; + } + } + + // pass list of OutRvous datums back to comm->rendezvous + + int nout = 0; + for (m = 0; m < ncount; m++) nout += npartner[m]; + + memory->create(proclist,nout,"special:proclist"); + OutRvous *out = (OutRvous *) + memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); + + nout = 0; + for (m = 0; m < ncount; m++) + for (j = 0; j < npartner[m]; j++) { + if (flag[m][j] == 0) continue; + proclist[nout] = procowner[m]; + out[nout].atomID = atomID[m]; + out[nout].partnerID = partner[m][j]; + nout++; } - buf[i+3] = n; - i += 4 + num12 + num13; - } -} -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-3 neighbors for atoms I own - when find one, increment 1-4 count by # of 1-2 neighbors of my atom - may include duplicates and original atom but they will be culled later -------------------------------------------------------------------------- */ + outbuf = (char *) out; -void Special::ring_five(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; + // clean up + // Comm::rendezvous will delete proclist and out (outbuf) - tagint *buf = (tagint *) cbuf; - int i,j,m,n,num13; + memory->destroy(procowner); + memory->destroy(atomID); + memory->destroy(npartner); + memory->destroy(partner); + memory->destroy(flag); - i = 0; - while (i < ndatum) { - n = buf[i]; - num13 = buf[i+1]; - for (j = 0; j < num13; j++) { - m = atom->map(buf[i+2+j]); - if (m >= 0 && m < nlocal) n += nspecial[m][0]; - } - buf[i] = n; - i += 2 + num13; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1-3 neighbors for atoms I own - when find one, add its neighbors to 1-4 list - incrementing the count in buf(i+4) - this process may include duplicates but they will be culled later -------------------------------------------------------------------------- */ - -void Special::ring_six(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onetwo = sptr->onetwo; - - tagint *buf = (tagint *) cbuf; - int i,j,k,m,n,num13,num14; - - i = 0; - while (i < ndatum) { - num13 = buf[i]; - num14 = buf[i+1]; - n = buf[i+2]; - for (j = 0; j < num13; j++) { - m = atom->map(buf[i+3+j]); - if (m >= 0 && m < nlocal) - for (k = 0; k < nspecial[m][0]; k++) - buf[i+3+num13+(n++)] = onetwo[m][k]; - } - buf[i+2] = n; - i += 3 + num13 + num14; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1,3 atoms looking for atoms I own - when find one, scan its 1-3 neigh list and mark I,J as in an angle -------------------------------------------------------------------------- */ - -void Special::ring_seven(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onethree = sptr->onethree; - int **dflag = sptr->dflag; - - tagint *buf = (tagint *) cbuf; - tagint iglobal,jglobal; - int i,m,ilocal,jlocal; - - i = 0; - while (i < ndatum) { - iglobal = buf[i]; - jglobal = buf[i+1]; - ilocal = atom->map(iglobal); - jlocal = atom->map(jglobal); - if (ilocal >= 0 && ilocal < nlocal) - for (m = 0; m < nspecial[ilocal][1]; m++) - if (jglobal == onethree[ilocal][m]) { - dflag[ilocal][m] = 1; - break; - } - if (jlocal >= 0 && jlocal < nlocal) - for (m = 0; m < nspecial[jlocal][1]; m++) - if (iglobal == onethree[jlocal][m]) { - dflag[jlocal][m] = 1; - break; - } - i += 2; - } -} - -/* ---------------------------------------------------------------------- - when receive buffer, scan list of 1,4 atoms looking for atoms I own - when find one, scan its 1-4 neigh list and mark I,J as in a dihedral -------------------------------------------------------------------------- */ - -void Special::ring_eight(int ndatum, char *cbuf, void *ptr) -{ - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - - tagint **onefour = sptr->onefour; - int **dflag = sptr->dflag; - - tagint *buf = (tagint *) cbuf; - tagint iglobal,jglobal; - int i,m,ilocal,jlocal; - - i = 0; - while (i < ndatum) { - iglobal = buf[i]; - jglobal = buf[i+1]; - ilocal = atom->map(iglobal); - jlocal = atom->map(jglobal); - if (ilocal >= 0 && ilocal < nlocal) - for (m = 0; m < nspecial[ilocal][2]; m++) - if (jglobal == onefour[ilocal][m]) { - dflag[ilocal][m] = 1; - break; - } - if (jlocal >= 0 && jlocal < nlocal) - for (m = 0; m < nspecial[jlocal][2]; m++) - if (iglobal == onefour[jlocal][m]) { - dflag[jlocal][m] = 1; - break; - } - i += 2; - } + return nout; } /* ---------------------------------------------------------------------- @@ -1159,3 +1144,15 @@ void Special::fix_alteration() modify->fix[ifix]->rebuild_special(); } +/* ---------------------------------------------------------------------- + print timing output +------------------------------------------------------------------------- */ + +void Special::timer_output(double time1) +{ + double t2 = MPI_Wtime(); + if (comm->me == 0) { + if (screen) fprintf(screen," special bonds CPU = %g secs\n",t2-t1); + if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",t2-t1); + } +} diff --git a/src/special.h b/src/special.h index 9f25200336..f7892075ac 100644 --- a/src/special.h +++ b/src/special.h @@ -28,27 +28,30 @@ class Special : protected Pointers { int me,nprocs; tagint **onetwo,**onethree,**onefour; - // data used by ring callback methods + // data used by rendezvous callback methods - int *count; - int **dflag; + int max_rvous; + + struct InRvous { + int me; + tagint atomID,partnerID; + }; + + struct OutRvous { + tagint atomID,partnerID; + }; void dedup(); void angle_trim(); void dihedral_trim(); void combine(); void fix_alteration(); + void timer_output(double); - // callback functions for ring communication + // callback function for rendezvous communication - static void ring_one(int, char *, void *); - static void ring_two(int, char *, void *); - static void ring_three(int, char *, void *); - static void ring_four(int, char *, void *); - static void ring_five(int, char *, void *); - static void ring_six(int, char *, void *); - static void ring_seven(int, char *, void *); - static void ring_eight(int, char *, void *); + static int rendezvous_1234(int, char *, int *&, char *&, void *); + static int rendezvous_trim(int, char *, int *&, char *&, void *); }; } From 3f9d59294e344787fe621ae60133ce1866e33106 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 13:06:31 -0700 Subject: [PATCH 144/243] replace STL map with atom->map in special, better code comments --- src/RIGID/fix_rigid_small.cpp | 8 ++-- src/comm.cpp | 20 ++++++-- src/read_data.cpp | 8 ++-- src/read_restart.cpp | 4 +- src/special.cpp | 89 +++++++++++++++++++++++++---------- 5 files changed, 92 insertions(+), 37 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index a48395be04..097a66ccec 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1571,9 +1571,9 @@ void FixRigidSmall::create_bodies(tagint *bodyID) } // perform rendezvous operation - // each proc owns random subset of bodies, receives all atoms in the bodies - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body + // each proc owns random subset of bodies + // receives all atoms in those bodies + // func = compute bbox of each body, find atom closest to geometric center char *buf; int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), @@ -1627,6 +1627,8 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, MPI_Comm world = frsptr->world; // setup hash + // use STL map instead of atom->map + // b/c know nothing about body ID values specified by user // ncount = number of bodies assigned to me // key = body ID // value = index into Ncount-length data structure diff --git a/src/comm.cpp b/src/comm.cpp index 5fcfa141d0..6512b21fef 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -728,13 +728,27 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, /* ---------------------------------------------------------------------- rendezvous communication operation + three stages: + first Irregular converts inbuf from caller decomp to rvous decomp + callback operates on data in rendevous decomp + last Irregular converts outbuf from rvous decomp back to caller decomp + inputs: + n = # of input datums + proclist = proc that owns each input datum in rendezvous decomposition + inbuf = list of input datums + insize = size in bytes of each input datum + callback = caller function to invoke in rendezvous decomposition + outputs: + nout = # of output datums (function return) + outbuf = list of output datums + outsize = size in bytes of each output datum ------------------------------------------------------------------------- */ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, int (*callback)(int, char *, int *&, char *&, void *), char *&outbuf, int outsize, void *ptr) { - // comm data from caller decomposition to rendezvous decomposition + // comm inbuf from caller decomposition to rendezvous decomposition Irregular *irregular = new Irregular(lmp); @@ -747,7 +761,7 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, delete irregular; // peform rendezvous computation via callback() - // callback() allocates proclist_rvous and outbuf_rvous + // callback() allocates/populates proclist_rvous and outbuf_rvous int *proclist_rvous; char *outbuf_rvous; @@ -757,7 +771,7 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, memory->sfree(inbuf_rvous); - // comm data from rendezvous decomposition back to caller + // comm outbuf from rendezvous decomposition back to caller // caller will free outbuf irregular = new Irregular(lmp); diff --git a/src/read_data.cpp b/src/read_data.cpp index 08a57a3aac..e2efbaaefa 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -121,7 +121,7 @@ void ReadData::command(int narg, char **arg) if (narg < 1) error->all(FLERR,"Illegal read_data command"); MPI_Barrier(world); - double time1 = MPI_Wtime; + double time1 = MPI_Wtime(); // optional args @@ -913,13 +913,13 @@ void ReadData::command(int narg, char **arg) // total time MPI_Barrier(world); - double time2 = MPI_Wtime; + double time2 = MPI_Wtime(); if (comm->me == 0) { if (screen) - fprintf(screen," read_atoms CPU = %g secs\n",time2-time1); + fprintf(screen," read_data CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," read_atoms CPU = %g secs\n",time2-time1); + fprintf(logfile," read_data CPU = %g secs\n",time2-time1); } } diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 2eca9b58c4..5aa4622a67 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -82,7 +82,7 @@ void ReadRestart::command(int narg, char **arg) error->all(FLERR,"Cannot read_restart after simulation box is defined"); MPI_Barrier(world); - double time1 = MPI_Wtime; + double time1 = MPI_Wtime(); MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -569,7 +569,7 @@ void ReadRestart::command(int narg, char **arg) // total time MPI_Barrier(world); - double time2 = MPI_Wtime; + double time2 = MPI_Wtime(); if (comm->me == 0) { if (screen) diff --git a/src/special.cpp b/src/special.cpp index a18c597765..6dad30a9a7 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -108,9 +108,11 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID + // input datums = pairs of bonded atoms // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on m = 0; for (i = 0; i < nlocal; i++) { @@ -140,7 +142,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of atoms, receives all their bond partners + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -151,6 +154,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[0] and onetwo for all owned atoms based on output info + // output datums = pairs of atoms that are 1-2 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onetwo,nlocal,maxall,"special:onetwo"); @@ -200,9 +204,10 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID + // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onetwo pair: datum = atomID1, atomID2 m = 0; for (i = 0; i < nlocal; i++) { @@ -226,7 +231,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of atoms, receives all their bond partners + // each proc owns random subset of atoms + // receives all info to form and return their onethree lists nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -237,6 +243,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[1] and onethree for all owned atoms based on output info + // output datums = pairs of atoms that are 1-3 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onethree,nlocal,maxall,"special:onethree"); @@ -284,9 +291,10 @@ void Special::build() memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // one datum for each partner: datum = atomID, bond partner ID + // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 m = 0; for (i = 0; i < nlocal; i++) { @@ -309,9 +317,8 @@ void Special::build() } // perform rendezvous operation - // each proc owns random subset of bodies, receives all atoms in the bodies - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body + // each proc owns random subset of atoms + // receives all info to form and return their onefour lists nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), rendezvous_1234, @@ -322,6 +329,7 @@ void Special::build() memory->sfree(inbuf); // set nspecial[2] and onefour for all owned atoms based on output info + // output datums = pairs of atoms that are 1-4 neighbors MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onefour,nlocal,maxall,"special:onefour"); @@ -934,21 +942,28 @@ int Special::rendezvous_1234(int n, char *inbuf, int i,j,m; Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // setup hash + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // initialize hash // ncount = number of atoms assigned to me // key = atom ID // value = index into Ncount-length data structure InRvous *in = (InRvous *) inbuf; - std::map hash; + //std::map hash; tagint id; int ncount = 0; for (i = 0; i < n; i++) if (in[i].me >= 0) - hash[in[i].atomID] = ncount++; + //hash[in[i].atomID] = ncount++; + atom->map_one(in[i].atomID,ncount++); // procowner = caller proc that owns each atom // atomID = ID of each rendezvous atom I own @@ -961,7 +976,8 @@ int Special::rendezvous_1234(int n, char *inbuf, for (m = 0; m < ncount; m++) npartner[m] = 0; for (i = 0; i < n; i++) { - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); if (in[i].me >= 0) { procowner[m] = in[i].me; atomID[m] = in[i].atomID; @@ -979,7 +995,8 @@ int Special::rendezvous_1234(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me >= 0) continue; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); partner[m][npartner[m]++] = in[i].partnerID; } @@ -1011,6 +1028,12 @@ int Special::rendezvous_1234(int n, char *inbuf, memory->destroy(npartner); memory->destroy(partner); + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + return nout; } @@ -1027,21 +1050,28 @@ int Special::rendezvous_trim(int n, char *inbuf, int i,j,m; Special *sptr = (Special *) ptr; + Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // setup hash + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // initialize hash // ncount = number of atoms assigned to me // key = atom ID // value = index into Ncount-length data structure InRvous *in = (InRvous *) inbuf; - std::map hash; + //std::map hash; tagint id; int ncount = 0; for (i = 0; i < n; i++) if (in[i].me >= 0) - hash[in[i].atomID] = ncount++; + //hash[in[i].atomID] = ncount++; + atom->map_one(in[i].atomID,ncount++); // procowner = caller proc that owns each atom // atomID = ID of each rendezvous atom I own @@ -1055,7 +1085,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (m = 0; m < ncount; m++) npartner[m] = 0; for (i = 0; i < n; i++) { - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); if (in[i].me >= 0) { procowner[m] = in[i].me; atomID[m] = in[i].atomID; @@ -1073,7 +1104,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me >= 0 || in[i].me == -2) continue; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); partner[m][npartner[m]++] = in[i].partnerID; } @@ -1090,7 +1122,8 @@ int Special::rendezvous_trim(int n, char *inbuf, for (i = 0; i < n; i++) { if (in[i].me != -2) continue; actual = in[i].partnerID; - m = hash.find(in[i].atomID)->second; + //m = hash.find(in[i].atomID)->second; + m = atom->map(in[i].atomID); for (j = 0; j < npartner[m]; j++) if (partner[m][j] == actual) { flag[m][j] = 1; @@ -1128,6 +1161,12 @@ int Special::rendezvous_trim(int n, char *inbuf, memory->destroy(partner); memory->destroy(flag); + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + return nout; } @@ -1150,9 +1189,9 @@ void Special::fix_alteration() void Special::timer_output(double time1) { - double t2 = MPI_Wtime(); + double time2 = MPI_Wtime(); if (comm->me == 0) { - if (screen) fprintf(screen," special bonds CPU = %g secs\n",t2-t1); - if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",t2-t1); + if (screen) fprintf(screen," special bonds CPU = %g secs\n",time2-time1); + if (logfile) fprintf(logfile," special bonds CPU = %g secs\n",time2-time1); } } From 17817fc290ae4d0128fccfad64491ba38c2c39e7 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Dec 2018 15:46:27 -0700 Subject: [PATCH 145/243] less comm version of special bonds rendezvous --- src/comm.cpp | 8 +- src/comm.h | 2 +- src/special.cpp | 834 ++++++++++++++++++++++++++++-------------------- src/special.h | 26 +- 4 files changed, 517 insertions(+), 353 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 6512b21fef..9bdaf0798a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -745,7 +745,7 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, ------------------------------------------------------------------------- */ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, - int (*callback)(int, char *, int *&, char *&, void *), + int (*callback)(int, char *, int &, int *&, char *&, void *), char *&outbuf, int outsize, void *ptr) { // comm inbuf from caller decomposition to rendezvous decomposition @@ -763,13 +763,15 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, // peform rendezvous computation via callback() // callback() allocates/populates proclist_rvous and outbuf_rvous + int flag; int *proclist_rvous; char *outbuf_rvous; int nout_rvous = - callback(n_rvous,inbuf_rvous,proclist_rvous,outbuf_rvous,ptr); + callback(n_rvous,inbuf_rvous,flag,proclist_rvous,outbuf_rvous,ptr); - memory->sfree(inbuf_rvous); + if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular // comm outbuf from rendezvous decomposition back to caller // caller will free outbuf diff --git a/src/comm.h b/src/comm.h index 8bb057a0c1..a1bac53ac8 100644 --- a/src/comm.h +++ b/src/comm.h @@ -110,7 +110,7 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); int rendezvous(int, int *, char *, int, - int (*)(int, char *, int *&, char *&, void *), + int (*)(int, char *, int &, int *&, char *&, void *), char *&, int, void *); int read_lines_from_file(FILE *, int, int, char *); diff --git a/src/special.cpp b/src/special.cpp index 6dad30a9a7..79d2f77e46 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -55,20 +55,9 @@ Special::~Special() void Special::build() { - int i,j,k,m,n,size,proc; - int max,maxall; - char *buf; - MPI_Barrier(world); double time1 = MPI_Wtime(); - int nlocal = atom->nlocal; - - tagint *tag = atom->tag; - int *num_bond = atom->num_bond; - tagint **bond_atom = atom->bond_atom; - int **nspecial = atom->nspecial; - if (me == 0 && screen) { const double * const special_lj = force->special_lj; const double * const special_coul = force->special_coul; @@ -81,183 +70,51 @@ void Special::build() // initialize nspecial counters to 0 - for (i = 0; i < nlocal; i++) { + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { nspecial[i][0] = 0; nspecial[i][1] = 0; nspecial[i][2] = 0; } - // ----------------------------------------------------- - // compute nspecial[i][0] = # of 1-2 neighbors of atom i + // setup atomIDs and procowner vectors in rendezvous decomposition + + atom_owners(); + + // tally nspecial[i][0] = # of 1-2 neighbors of atom i // create onetwo[i] = list of 1-2 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send (newton or newton off) - // include nlocal datums with owner of each atom + if (force->newton_bond) onetwo_build_newton(); + else onetwo_build_newton_off(); - int newton_bond = force->newton_bond; - - int ncount = 0; - for (i = 0; i < nlocal; i++) ncount += num_bond[i]; - if (newton_bond) ncount *= 2; - ncount += nlocal; - - int *proclist; - memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on - - m = 0; - for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < num_bond[i]; j++) { - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = bond_atom[i][j]; - m++; - } - if (newton_bond) { - for (j = 0; j < num_bond[i]; j++) { - proclist[m] = hashlittle(&bond_atom[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -1; - inbuf[m].atomID = bond_atom[i][j]; - inbuf[m].partnerID = tag[i]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists - - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[0] and onetwo for all owned atoms based on output info - // output datums = pairs of atoms that are 1-2 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onetwo,nlocal,maxall,"special:onetwo"); - - for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; - } - - memory->sfree(outbuf); - - // compute and print max # of 1-2 neighbors + // print max # of 1-2 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-2 neighbors\n",maxall); if (logfile) fprintf(logfile," %d = max # of 1-2 neighbors\n",maxall); } - // ----------------------------------------------------- // done if special_bond weights for 1-3, 1-4 are set to 1.0 - // ----------------------------------------------------- if (force->special_lj[2] == 1.0 && force->special_coul[2] == 1.0 && force->special_lj[3] == 1.0 && force->special_coul[3] == 1.0) { dedup(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); timer_output(time1); return; } - // ----------------------------------------------------- - // compute nspecial[i][1] = # of 1-3 neighbors of atom i + // tally nspecial[i][1] = # of 1-3 neighbors of atom i // create onethree[i] = list of 1-3 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + onethree_build(); - ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][0]*(nspecial[i][0]-1); - - memory->create(proclist,ncount,"special:proclist"); - inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onetwo pair: datum = atomID1, atomID2 - - m = 0; - for (i = 0; i < nlocal; i++) { - proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][0]; j++) { - proc = hashlittle(&onetwo[i][j],sizeof(tagint),0) % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - if (j == k) continue; - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = onetwo[i][j]; - inbuf[m].partnerID = onetwo[i][k]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onethree lists - - nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[1] and onethree for all owned atoms based on output info - // output datums = pairs of atoms that are 1-3 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onethree,nlocal,maxall,"special:onethree"); - - for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; - } - - memory->destroy(outbuf); - - // compute and print max # of 1-3 neighbors + // print max # of 1-3 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-3 neighbors\n",maxall); @@ -271,79 +128,18 @@ void Special::build() if (force->special_angle) angle_trim(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); timer_output(time1); return; } - // ----------------------------------------------------- - // compute nspecial[i][2] = # of 1-4 neighbors of atom i + // tally nspecial[i][2] = # of 1-4 neighbors of atom i // create onefour[i] = list of 1-4 neighbors for atom i - // ----------------------------------------------------- - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + onefour_build(); - ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]*nspecial[i][0]; - - memory->create(proclist,ncount,"special:proclist"); - inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); - - // setup input buf to rendezvous comm - // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 - - m = 0; - for (i = 0; i < nlocal; i++) { - proclist[m] = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][1]; j++) { - proc = hashlittle(&onethree[i][j],sizeof(tagint),0) % nprocs; - for (k = 0; k < nspecial[i][0]; k++) { - proclist[m] = proc; - inbuf[m].me = -1; - inbuf[m].atomID = onethree[i][j]; - inbuf[m].partnerID = onetwo[i][k]; - m++; - } - } - } - - // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onefour lists - - nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_1234, - buf,sizeof(OutRvous),(void *) this); - outbuf = (OutRvous *) buf; - - memory->destroy(proclist); - memory->sfree(inbuf); - - // set nspecial[2] and onefour for all owned atoms based on output info - // output datums = pairs of atoms that are 1-4 neighbors - - MPI_Allreduce(&max_rvous,&maxall,1,MPI_INT,MPI_MAX,world); - memory->create(onefour,nlocal,maxall,"special:onefour"); - - for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; - - for (m = 0; m < nreturn; m++) { - i = atom->map(outbuf[m].atomID); - onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; - } - - memory->destroy(outbuf); - - // compute and print max # of 1-4 neighbors + // print max # of 1-4 neighbors if (me == 0) { if (screen) fprintf(screen," %d = max # of 1-4 neighbors\n",maxall); @@ -357,9 +153,380 @@ void Special::build() if (force->special_dihedral) dihedral_trim(); combine(); fix_alteration(); + memory->destroy(procowner); + memory->destroy(atomIDs); + timer_output(time1); } +/* ---------------------------------------------------------------------- + setup atomIDs and procowner +------------------------------------------------------------------------- */ + +void Special::atom_owners() +{ + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + int *proclist; + memory->create(proclist,nlocal,"special:proclist"); + IDRvous *idbuf = (IDRvous *) + memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on + + for (int i = 0; i < nlocal; i++) { + //proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; + proclist[i] = tag[i] % nprocs; + idbuf[i].me = me; + idbuf[i].atomID = tag[i]; + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists + + char *buf; + comm->rendezvous(nlocal,proclist, + (char *) idbuf,sizeof(PairRvous), + rendezvous_ids,buf,sizeof(PairRvous), + (void *) this); + + memory->destroy(proclist); + memory->sfree(idbuf); +} + +/* ---------------------------------------------------------------------- + onetwo build +------------------------------------------------------------------------- */ + +void Special::onetwo_build_newton() +{ + int i,j,m; + + tagint *tag = atom->tag; + int *num_bond = atom->num_bond; + tagint **bond_atom = atom->bond_atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m < 0 || m >= nlocal) ncount++; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each bond partner: datum = atomID, bond partner ID + // add inverted datum when netwon_bond on + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) continue; + proclist[ncount] = bond_atom[i][j] % nprocs; + inbuf[ncount].atomID = bond_atom[i][j]; + inbuf[ncount].partnerID = tag[i]; + ncount++; + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onetwo lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[0] and onetwo for all owned atoms based on output info + // output datums = pairs of atoms that are 1-2 neighbors + + for (i = 0; i < nlocal; i++) { + nspecial[i][0] = num_bond[i]; + for (j = 0; j < num_bond[i]; j++) { + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][0]++; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][0]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][0]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_bond[i]; j++) { + onetwo[i][nspecial[i][0]++] = bond_atom[i][j]; + m = atom->map(bond_atom[i][j]); + if (m >= 0 && m < nlocal) onetwo[m][nspecial[m][0]++] = tag[i]; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + onetwo build with newton_bond flag off + no need for rendezvous comm +------------------------------------------------------------------------- */ + +void Special::onetwo_build_newton_off() +{ +} + +/* ---------------------------------------------------------------------- + onetwo build with newton_bond flag off + no need for rendezvous comm +------------------------------------------------------------------------- */ + +void Special::onethree_build() +{ + int i,j,k,m,proc; + + tagint *tag = atom->tag; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m < 0 || m >= nlocal) ncount += nspecial[i][0]-1; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onetwo pair: datum = atomID1, atomID2 + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m >= 0 && m < nlocal) continue; + proc = onetwo[i][j] % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + proclist[ncount] = proc; + inbuf[ncount].atomID = onetwo[i][j]; + inbuf[ncount].partnerID = onetwo[i][k]; + ncount++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onethree lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[1] and onethree for all owned atoms based on output info + // output datums = pairs of atoms that are 1-3 neighbors + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][1] += nspecial[i][0]-1; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][1]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][1]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onethree,nlocal,maxall,"special:onethree"); + + for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][0]; j++) { + m = atom->map(onetwo[i][j]); + if (m < 0 || m >= nlocal) continue; + for (k = 0; k < nspecial[i][0]; k++) { + if (j == k) continue; + onethree[m][nspecial[m][1]++] = onetwo[i][k]; + } + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + remove duplicates within each of onetwo, onethree, onefour individually +------------------------------------------------------------------------- */ + +void Special::onefour_build() +{ + int i,j,k,m,proc; + + tagint *tag = atom->tag; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + // ncount = # of my datums to send + // include nlocal datums with owner of each atom + + int ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m < 0 || m >= nlocal) ncount += nspecial[i][0]; + } + } + + int *proclist; + memory->create(proclist,ncount,"special:proclist"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + + // setup input buf to rendezvous comm + // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 + + ncount = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m >= 0 && m < nlocal) continue; + proc = onethree[i][j] % nprocs; + for (k = 0; k < nspecial[i][0]; k++) { + proclist[ncount] = proc; + inbuf[ncount].atomID = onethree[i][j]; + inbuf[ncount].partnerID = onetwo[i][k]; + ncount++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all info to form and return their onefour lists + + char *buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_1234,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set nspecial[2] and onefour for all owned atoms based on output info + // output datums = pairs of atoms that are 1-4 neighbors + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m >= 0 && m < nlocal) nspecial[m][2] += nspecial[i][0]; + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + nspecial[i][2]++; + } + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][2]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onefour,nlocal,maxall,"special:onefour"); + + for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < nspecial[i][1]; j++) { + m = atom->map(onethree[i][j]); + if (m < 0 || m >= nlocal) continue; + for (k = 0; k < nspecial[i][0]; k++) { + onefour[m][nspecial[m][2]++] = onetwo[i][k]; + } + } + } + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + } + + memory->sfree(outbuf); +} + /* ---------------------------------------------------------------------- remove duplicates within each of onetwo, onethree, onefour individually ------------------------------------------------------------------------- */ @@ -662,8 +829,8 @@ void Special::angle_trim() int *proclist; memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // one datum for each owned atom: datum = proc, atomID @@ -675,16 +842,9 @@ void Special::angle_trim() m = 0; for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - for (j = 0; j < nspecial[i][1]; j++) { proclist[m] = proc; - inbuf[m].me = -1; + //inbuf[m].me = -1; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = onethree[i][j]; m++; @@ -695,13 +855,13 @@ void Special::angle_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = angle_atom1[i][j]; inbuf[m].partnerID = angle_atom3[i][j]; m++; proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = angle_atom3[i][j]; inbuf[m].partnerID = angle_atom1[i][j]; m++; @@ -712,25 +872,25 @@ void Special::angle_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom1[i][j]; inbuf[m].partnerID = dihedral_atom3[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom2[i][j]; inbuf[m].partnerID = dihedral_atom4[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom3[i][j]; inbuf[m].partnerID = dihedral_atom1[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom4[i][j]; inbuf[m].partnerID = dihedral_atom2[i][j]; m++; @@ -743,10 +903,11 @@ void Special::angle_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_trim, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_trim,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); @@ -836,8 +997,8 @@ void Special::dihedral_trim() int *proclist; memory->create(proclist,ncount,"special:proclist"); - InRvous *inbuf = (InRvous *) - memory->smalloc((bigint) ncount*sizeof(InRvous),"special:inbuf"); + PairRvous *inbuf = (PairRvous *) + memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // one datum for each owned atom: datum = proc, atomID @@ -851,14 +1012,14 @@ void Special::dihedral_trim() for (i = 0; i < nlocal; i++) { proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; proclist[m] = proc; - inbuf[m].me = me; + //inbuf[m].me = me; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = 0; m++; for (j = 0; j < nspecial[i][2]; j++) { proclist[m] = proc; - inbuf[m].me = -1; + //inbuf[m].me = -1; inbuf[m].atomID = tag[i]; inbuf[m].partnerID = onefour[i][j]; m++; @@ -869,13 +1030,13 @@ void Special::dihedral_trim() if (index < 0 || index >= nlocal) continue; proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom1[i][j]; inbuf[m].partnerID = dihedral_atom4[i][j]; m++; proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - inbuf[m].me = -2; + //inbuf[m].me = -2; inbuf[m].atomID = dihedral_atom4[i][j]; inbuf[m].partnerID = dihedral_atom1[i][j]; m++; @@ -888,10 +1049,11 @@ void Special::dihedral_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_trim, - buf,sizeof(OutRvous),(void *) this); - OutRvous *outbuf = (OutRvous *) buf; + int nreturn = comm->rendezvous(ncount,proclist, + (char *) inbuf,sizeof(PairRvous), + rendezvous_trim,buf,sizeof(PairRvous), + (void *) this); + PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); @@ -931,16 +1093,55 @@ void Special::dihedral_trim() /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N InRvous datums - create outbuf = list of Nout OutRvous datums + inbuf = list of N PairRvous datums + outbuf = empty +------------------------------------------------------------------------- */ + +int Special::rendezvous_ids(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + Special *sptr = (Special *) ptr; + Memory *memory = sptr->memory; + + int *procowner; + tagint *atomIDs; + + memory->create(procowner,n,"special:procowner"); + memory->create(atomIDs,n,"special:atomIDs"); + // NOTE: when to free these vectors + + IDRvous *in = (IDRvous *) inbuf; + + for (int i = 0; i < n; i++) { + procowner[i] = in[i].me; + atomIDs[i] = in[i].atomID; + } + + // store rendezvous data in Special class + + sptr->ncount = n; + sptr->procowner = procowner; + sptr->atomIDs = atomIDs; + + proclist = NULL; + outbuf = NULL; + + flag = 0; + return 0; +} + + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ int Special::rendezvous_1234(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &flag, int *&proclist, char *&outbuf, void *ptr) { - int i,j,m; - Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; Memory *memory = sptr->memory; @@ -950,105 +1151,52 @@ int Special::rendezvous_1234(int n, char *inbuf, atom->map_clear(); - // initialize hash - // ncount = number of atoms assigned to me - // key = atom ID - // value = index into Ncount-length data structure - - InRvous *in = (InRvous *) inbuf; - //std::map hash; - tagint id; + // hash atom IDs stored in rendezvous decomposition - int ncount = 0; - for (i = 0; i < n; i++) - if (in[i].me >= 0) - //hash[in[i].atomID] = ncount++; - atom->map_one(in[i].atomID,ncount++); + int ncount = sptr->ncount; + tagint *atomIDs = sptr->atomIDs; - // procowner = caller proc that owns each atom - // atomID = ID of each rendezvous atom I own + for (int i = 0; i < ncount; i++) + atom->map_one(atomIDs[i],i); - int *procowner,*npartner; - tagint *atomID; - memory->create(procowner,ncount,"special:procowner"); - memory->create(atomID,ncount,"special:atomID"); - memory->create(npartner,ncount,"special:npartner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; + // proclist = owner of atomID in caller decomposition + + PairRvous *in = (PairRvous *) inbuf; + int *procowner = sptr->procowner; + memory->create(proclist,n,"special:proclist"); - for (i = 0; i < n; i++) { - //m = hash.find(in[i].atomID)->second; + int m; + for (int i = 0; i < n; i++) { m = atom->map(in[i].atomID); - if (in[i].me >= 0) { - procowner[m] = in[i].me; - atomID[m] = in[i].atomID; - } else npartner[m]++; + proclist[i] = procowner[m]; } - int max = 0; - for (m = 0; m < ncount; m++) - max = MAX(max,npartner[m]); - sptr->max_rvous = max; - - int **partner; - memory->create(partner,ncount,max,"special:partner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - if (in[i].me >= 0) continue; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - partner[m][npartner[m]++] = in[i].partnerID; - } - - // pass list of OutRvous datums back to comm->rendezvous - - int nout = 0; - for (m = 0; m < ncount; m++) nout += npartner[m]; - - memory->create(proclist,nout,"special:proclist"); - OutRvous *out = (OutRvous *) - memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); - - nout = 0; - for (m = 0; m < ncount; m++) - for (j = 0; j < npartner[m]; j++) { - proclist[nout] = procowner[m]; - out[nout].atomID = atomID[m]; - out[nout].partnerID = partner[m][j]; - nout++; - } - - outbuf = (char *) out; - - // clean up - // Comm::rendezvous will delete proclist and out (outbuf) - - memory->destroy(procowner); - memory->destroy(atomID); - memory->destroy(npartner); - memory->destroy(partner); - + outbuf = inbuf; + // NOTE: set out = in flag + // re-create atom map atom->map_init(0); atom->nghost = 0; atom->map_set(); - return nout; + flag = 1; + return n; } /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N InRvous datums - create outbuf = list of Nout OutRvous datums + inbuf = list of N PairRvous datums + create outbuf = list of Nout PairRvous datums ------------------------------------------------------------------------- */ int Special::rendezvous_trim(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &flag, int *&proclist, char *&outbuf, void *ptr) { int i,j,m; + /* Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; Memory *memory = sptr->memory; @@ -1063,7 +1211,7 @@ int Special::rendezvous_trim(int n, char *inbuf, // key = atom ID // value = index into Ncount-length data structure - InRvous *in = (InRvous *) inbuf; + PairRvous *in = (PairRvous *) inbuf; //std::map hash; tagint id; @@ -1131,14 +1279,14 @@ int Special::rendezvous_trim(int n, char *inbuf, } } - // pass list of OutRvous datums back to comm->rendezvous + // pass list of PairRvous datums back to comm->rendezvous int nout = 0; for (m = 0; m < ncount; m++) nout += npartner[m]; memory->create(proclist,nout,"special:proclist"); - OutRvous *out = (OutRvous *) - memory->smalloc((bigint) nout*sizeof(OutRvous),"special:out"); + PairRvous *out = (PairRvous *) + memory->smalloc((bigint) nout*sizeof(PairRvous),"special:out"); nout = 0; for (m = 0; m < ncount; m++) @@ -1167,7 +1315,11 @@ int Special::rendezvous_trim(int n, char *inbuf, atom->nghost = 0; atom->map_set(); - return nout; + */ + + //return nout; + flag = 2; + return 0; } /* ---------------------------------------------------------------------- diff --git a/src/special.h b/src/special.h index f7892075ac..772ba613ac 100644 --- a/src/special.h +++ b/src/special.h @@ -26,20 +26,29 @@ class Special : protected Pointers { private: int me,nprocs; + int maxall; tagint **onetwo,**onethree,**onefour; // data used by rendezvous callback methods - int max_rvous; + int ncount; + tagint *atomIDs; + int *procowner; - struct InRvous { + struct IDRvous { int me; + tagint atomID; + }; + + struct PairRvous { tagint atomID,partnerID; }; - struct OutRvous { - tagint atomID,partnerID; - }; + void atom_owners(); + void onetwo_build_newton(); + void onetwo_build_newton_off(); + void onethree_build(); + void onefour_build(); void dedup(); void angle_trim(); @@ -48,10 +57,11 @@ class Special : protected Pointers { void fix_alteration(); void timer_output(double); - // callback function for rendezvous communication + // callback functions for rendezvous communication - static int rendezvous_1234(int, char *, int *&, char *&, void *); - static int rendezvous_trim(int, char *, int *&, char *&, void *); + static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); + static int rendezvous_1234(int, char *, int &, int *&, char *&, void *); + static int rendezvous_trim(int, char *, int &, int *&, char *&, void *); }; } From a3a16acead2f5bc52ac4527342cc578817afa31e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Dec 2018 16:43:01 -0700 Subject: [PATCH 146/243] propagate rendezvous changes to fix rigid/small --- src/RIGID/fix_rigid_small.cpp | 3 ++- src/RIGID/fix_rigid_small.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 097a66ccec..f9d181ef96 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1611,7 +1611,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) ------------------------------------------------------------------------- */ int FixRigidSmall::rendezvous_body(int n, char *inbuf, - int *&proclist, char *&outbuf, + int &rflag, int *&proclist, char *&outbuf, void *ptr) { int i,j,m; @@ -1749,6 +1749,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, memory->destroy(iclose); memory->destroy(rsqclose); + rflag = 2; return nout; } diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index a820efcdea..f6ad1b7206 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -209,7 +209,7 @@ class FixRigidSmall : public Fix { // callback function for rendezvous communication - static int rendezvous_body(int, char *, int *&, char *&, void *); + static int rendezvous_body(int, char *, int &, int *&, char *&, void *); // debug From b370a61b60d26eebf4ed299bdfb0dd978dd2610a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 12 Dec 2018 17:14:56 -0700 Subject: [PATCH 147/243] added rendezvous alg to fix shake --- src/RIGID/fix_rigid_small.cpp | 6 +- src/RIGID/fix_shake.cpp | 795 +++++++++++++++++++++++----------- src/RIGID/fix_shake.h | 43 +- src/special.cpp | 633 +++++++++++++-------------- src/special.h | 7 +- 5 files changed, 899 insertions(+), 585 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index f9d181ef96..4de368ca85 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -414,9 +414,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (comm->me == 0) { if (screen) - fprintf(screen," create_bodies CPU = %g secs\n",time2-time1); + fprintf(screen," create bodies CPU = %g secs\n",time2-time1); if (logfile) - fprintf(logfile," create_bodies CPU = %g secs\n",time2-time1); + fprintf(logfile," create bodies CPU = %g secs\n",time2-time1); } // set nlocal_body and allocate bodies I own @@ -1749,6 +1749,8 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, memory->destroy(iclose); memory->destroy(rsqclose); + // flag = 2: new outbuf + rflag = 2; return nout; } diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index e0d1bf132b..66c92d42c5 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -219,8 +219,19 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : // identify all SHAKE clusters + double time1 = MPI_Wtime(); + find_clusters(); + double time2 = MPI_Wtime(); + + if (comm->me == 0) { + if (screen) + fprintf(screen," find clusters CPU = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," find clusters CPU = %g secs\n",time2-time1); + } + // initialize list of SHAKE clusters to constrain maxlist = 0; @@ -707,13 +718,6 @@ void FixShake::find_clusters() int nlocal = atom->nlocal; int angles_allow = atom->avec->angles_allow; - // setup ring of procs - - int next = me + 1; - int prev = me -1; - if (next == nprocs) next = 0; - if (prev < 0) prev = nprocs - 1; - // ----------------------------------------------------- // allocate arrays for self (1d) and bond partners (2d) // max = max # of bond partners for owned atoms = 2nd dim of partner arrays @@ -755,6 +759,10 @@ void FixShake::find_clusters() memory->create(partner_shake,nlocal,max,"shake:partner_shake"); memory->create(partner_nshake,nlocal,max,"shake:partner_nshake"); + // setup atomIDs and procowner vectors in rendezvous decomposition + + atom_owners(); + // ----------------------------------------------------- // set npartner and partner_tag from special arrays // ----------------------------------------------------- @@ -778,86 +786,13 @@ void FixShake::find_clusters() } // ----------------------------------------------------- - // set partner_mask, partner_type, partner_massflag, partner_bondtype - // for bonded partners - // requires communication for off-proc partners + // set partner_mask, partner_type, partner_massflag, + // partner_bondtype for all my bonded partners + // requires rendezvous communication for off-proc partners // ----------------------------------------------------- - // fill in mask, type, massflag, bondtype if own bond partner - // info to store in buf for each off-proc bond = nper = 6 - // 2 atoms IDs in bond, space for mask, type, massflag, bondtype - // nbufmax = largest buffer needed to hold info from any proc - - int nper = 6; - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - partner_mask[i][j] = 0; - partner_type[i][j] = 0; - partner_massflag[i][j] = 0; - partner_bondtype[i][j] = 0; - - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) { - partner_mask[i][j] = mask[m]; - partner_type[i][j] = type[m]; - if (nmass) { - if (rmass) massone = rmass[m]; - else massone = mass[type[m]]; - partner_massflag[i][j] = masscheck(massone); - } - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - else { - n = bondtype_findset(m,tag[i],partner_tag[i][j],0); - if (n) partner_bondtype[i][j] = n; - } - } else nbuf += nper; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = tag[i]; - buf[size+1] = partner_tag[i][j]; - buf[size+2] = 0; - buf[size+3] = 0; - buf[size+4] = 0; - n = bondtype_findset(i,tag[i],partner_tag[i][j],0); - if (n) buf[size+5] = n; - else buf[size+5] = 0; - size += nper; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,1,ring_bonds,buf,(void *)this); - - // store partner info returned to me - - m = 0; - while (m < size) { - i = atom->map(buf[m]); - for (j = 0; j < npartner[i]; j++) - if (buf[m+1] == partner_tag[i][j]) break; - partner_mask[i][j] = buf[m+2]; - partner_type[i][j] = buf[m+3]; - partner_massflag[i][j] = buf[m+4]; - partner_bondtype[i][j] = buf[m+5]; - m += nper; - } - - memory->destroy(buf); + partner_info(npartner,partner_tag,partner_mask,partner_type, + partner_massflag,partner_bondtype); // error check for unfilled partner info // if partner_type not set, is an error @@ -868,17 +803,18 @@ void FixShake::find_clusters() // else it's an error flag = 0; + int flag2 = 0; for (i = 0; i < nlocal; i++) for (j = 0; j < npartner[i]; j++) { - if (partner_type[i][j] == 0) flag = 1; + if (partner_type[i][j] == 0) flag++; if (!(mask[i] & groupbit)) continue; if (!(partner_mask[i][j] & groupbit)) continue; - if (partner_bondtype[i][j] == 0) flag = 1; + if (partner_bondtype[i][j] == 0) flag2++; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Did not find fix shake partner info"); - + // ----------------------------------------------------- // identify SHAKEable bonds // set nshake[i] = # of SHAKE bonds attached to atom i @@ -931,56 +867,11 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set partner_nshake for bonded partners - // requires communication for off-proc partners + // requires rendezvous communication for off-proc partners // ----------------------------------------------------- - // fill in partner_nshake if own bond partner - // info to store in buf for each off-proc bond = - // 2 atoms IDs in bond, space for nshake value - // nbufmax = largest buffer needed to hold info from any proc - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) partner_nshake[i][j] = nshake[m]; - else nbuf += 3; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - for (j = 0; j < npartner[i]; j++) { - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = tag[i]; - buf[size+1] = partner_tag[i][j]; - size += 3; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,2,ring_nshake,buf,(void *)this); - - // store partner info returned to me - - m = 0; - while (m < size) { - i = atom->map(buf[m]); - for (j = 0; j < npartner[i]; j++) - if (buf[m+1] == partner_tag[i][j]) break; - partner_nshake[i][j] = buf[m+2]; - m += 3; - } - - memory->destroy(buf); - + nshake_info(npartner,partner_tag,partner_nshake); + // ----------------------------------------------------- // error checks // no atom with nshake > 3 @@ -988,7 +879,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- flag = 0; - for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag = 1; + for (i = 0; i < nlocal; i++) if (nshake[i] > 3) flag++; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake cluster of more than 4 atoms"); @@ -996,7 +887,7 @@ void FixShake::find_clusters() for (i = 0; i < nlocal; i++) { if (nshake[i] <= 1) continue; for (j = 0; j < npartner[i]; j++) - if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag = 1; + if (partner_shake[i][j] && partner_nshake[i][j] > 1) flag++; } MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Shake clusters are connected"); @@ -1067,60 +958,7 @@ void FixShake::find_clusters() // requires communication for off-proc atoms // ----------------------------------------------------- - // fill in shake arrays for each bond partner I own - // info to store in buf for each off-proc bond = - // all values from shake_flag, shake_atom, shake_type - // nbufmax = largest buffer needed to hold info from any proc - - nbuf = 0; - for (i = 0; i < nlocal; i++) { - if (shake_flag[i] == 0) continue; - for (j = 0; j < npartner[i]; j++) { - if (partner_shake[i][j] == 0) continue; - m = atom->map(partner_tag[i][j]); - if (m >= 0 && m < nlocal) { - shake_flag[m] = shake_flag[i]; - shake_atom[m][0] = shake_atom[i][0]; - shake_atom[m][1] = shake_atom[i][1]; - shake_atom[m][2] = shake_atom[i][2]; - shake_atom[m][3] = shake_atom[i][3]; - shake_type[m][0] = shake_type[i][0]; - shake_type[m][1] = shake_type[i][1]; - shake_type[m][2] = shake_type[i][2]; - } else nbuf += 9; - } - } - - memory->create(buf,nbuf,"shake:buf"); - - // fill buffer with info - - size = 0; - for (i = 0; i < nlocal; i++) { - if (shake_flag[i] == 0) continue; - for (j = 0; j < npartner[i]; j++) { - if (partner_shake[i][j] == 0) continue; - m = atom->map(partner_tag[i][j]); - if (m < 0 || m >= nlocal) { - buf[size] = partner_tag[i][j]; - buf[size+1] = shake_flag[i]; - buf[size+2] = shake_atom[i][0]; - buf[size+3] = shake_atom[i][1]; - buf[size+4] = shake_atom[i][2]; - buf[size+5] = shake_atom[i][3]; - buf[size+6] = shake_type[i][0]; - buf[size+7] = shake_type[i][1]; - buf[size+8] = shake_type[i][2]; - size += 9; - } - } - } - - // cycle buffer around ring of procs back to self - - comm->ring(size,sizeof(tagint),buf,3,ring_shake,NULL,(void *)this); - - memory->destroy(buf); + shake_info(npartner,partner_tag,partner_shake); // ----------------------------------------------------- // free local memory @@ -1199,98 +1037,549 @@ void FixShake::find_clusters() } /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner: - fill in mask and type and massflag - search for bond with 1st atom and fill in bondtype + setup atomIDs and procowner ------------------------------------------------------------------------- */ -void FixShake::ring_bonds(int ndatum, char *cbuf, void *ptr) +void FixShake::atom_owners() { - FixShake *fsptr = (FixShake *)ptr; - Atom *atom = fsptr->atom; + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + int *proclist; + memory->create(proclist,nlocal,"shake:proclist"); + IDRvous *idbuf = (IDRvous *) + memory->smalloc((bigint) nlocal*sizeof(IDRvous),"shake:idbuf"); + + // setup input buf to rendezvous comm + // input datums = pairs of bonded atoms + // owning proc for each datum = random hash of atomID + // one datum for each owned atom: datum = owning proc, atomID + + for (int i = 0; i < nlocal; i++) { + proclist[i] = tag[i] % nprocs; + idbuf[i].me = me; + idbuf[i].atomID = tag[i]; + } + + // perform rendezvous operation + // each proc assigned every 1/Pth atom + + char *buf; + comm->rendezvous(nlocal,proclist, + (char *) idbuf,sizeof(IDRvous), + rendezvous_ids,buf,0,(void *) this); + + memory->destroy(proclist); + memory->sfree(idbuf); +} + +/* ---------------------------------------------------------------------- + setup partner_mask, partner_type, partner_massflag, partner_bondtype +------------------------------------------------------------------------- */ + +void FixShake::partner_info(int *npartner, tagint **partner_tag, + int **partner_mask, int **partner_type, + int **partner_massflag, int **partner_bondtype) +{ + int i,j,m,n; + int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + PartnerInfo *inbuf = (PartnerInfo *) + memory->smalloc((bigint) nsend*sizeof(PartnerInfo),"special:inbuf"); + + // set values in 4 partner arrays for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = pair of bonded atoms where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) + // 4 values for my owned atom + double *rmass = atom->rmass; double *mass = atom->mass; - int *mask = atom->mask; int *type = atom->type; + int *mask = atom->mask; + tagint *tag = atom->tag; + + double massone; + + nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + partner_mask[i][j] = 0; + partner_type[i][j] = 0; + partner_massflag[i][j] = 0; + partner_bondtype[i][j] = 0; + + m = atom->map(partner_tag[i][j]); + + if (m >= 0 && m < nlocal) { + partner_mask[i][j] = mask[m]; + partner_type[i][j] = type[m]; + if (nmass) { + if (rmass) massone = rmass[m]; + else massone = mass[type[m]]; + partner_massflag[i][j] = masscheck(massone); + } + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + else { + n = bondtype_findset(m,tag[i],partner_tag[i][j],0); + if (n) partner_bondtype[i][j] = n; + } + + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].mask = mask[i]; + inbuf[nsend].type = type[i]; + if (nmass) { + if (rmass) massone = rmass[i]; + else massone = mass[type[i]]; + inbuf[nsend].massflag = masscheck(massone); + } else inbuf[nsend].massflag = 0; + + // my atom may own bond, in which case set partner_bondtype + // else receiver of this datum will own the bond and return the value + + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); + if (n) { + partner_bondtype[i][j] = n; + inbuf[nsend].bondtype = n; + } else inbuf[nsend].bondtype = 0; + + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned partner 4 values + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(PartnerInfo), + rendezvous_partners_info,buf,sizeof(PartnerInfo), + (void *) this); + PartnerInfo *outbuf = (PartnerInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set partner 4 values for un-onwed partners based on output info + // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + for (j = 0; j < npartner[i]; j++) + if (partner_tag[i][j] == outbuf[m].partnerID) break; + partner_mask[i][j] = outbuf[m].mask; + partner_type[i][j] = outbuf[m].type; + partner_massflag[i][j] = outbuf[m].massflag; + + // only set partner_bondtype if my atom did not set it when setting up rendezvous + // if this proc set it, then sender of this datum set outbuf.bondtype = 0 + + if (partner_bondtype[i][j] == 0) + partner_bondtype[i][j] = outbuf[m].bondtype; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + setup partner_nshake +------------------------------------------------------------------------- */ + +void FixShake::nshake_info(int *npartner, tagint **partner_tag, + int **partner_nshake) +{ + int i,j,m,n; int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + NShakeInfo *inbuf = (NShakeInfo *) + memory->smalloc((bigint) nsend*sizeof(NShakeInfo),"special:inbuf"); + + // set partner_nshake for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = pair of bonded atoms where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc), partnerID = tag (on-proc) + // nshake value for my owned atom + + tagint *tag = atom->tag; + + nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + partner_nshake[i][j] = 0; + m = atom->map(partner_tag[i][j]); + if (m >= 0 && m < nlocal) { + partner_nshake[i][j] = nshake[m]; + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].nshake = nshake[i]; + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned partner nshake + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(NShakeInfo), + rendezvous_nshake,buf,sizeof(NShakeInfo), + (void *) this); + NShakeInfo *outbuf = (NShakeInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set partner nshake for un-onwed partners based on output info + // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + for (j = 0; j < npartner[i]; j++) + if (partner_tag[i][j] == outbuf[m].partnerID) break; + partner_nshake[i][j] = outbuf[m].nshake; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + setup shake_flag, shake_atom, shake_type +------------------------------------------------------------------------- */ + +void FixShake::shake_info(int *npartner, tagint **partner_tag, + int **partner_shake) +{ + int i,j,m,n; + int nlocal = atom->nlocal; + + // nsend = # of my datums to send + // one datum for every off-processor partner + + int nsend = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < npartner[i]; j++) { + m = atom->map(partner_tag[i][j]); + if (m < 0 || m >= nlocal) nsend++; + } + } + + int *proclist; + memory->create(proclist,nsend,"special:proclist"); + ShakeInfo *inbuf = (ShakeInfo *) + memory->smalloc((bigint) nsend*sizeof(ShakeInfo),"special:inbuf"); + + // set 3 shake arrays for all partner atoms I own + // also setup input buf to rendezvous comm + // input datums = partner atom where I do not own partner + // owning proc for each datum = partner_tag % nprocs + // datum: atomID = partner_tag (off-proc) + // values in 3 shake arrays + + nsend = 0; + for (i = 0; i < nlocal; i++) { + if (shake_flag[i] == 0) continue; + for (j = 0; j < npartner[i]; j++) { + if (partner_shake[i][j] == 0) continue; + m = atom->map(partner_tag[i][j]); + + if (m >= 0 && m < nlocal) { + shake_flag[m] = shake_flag[i]; + shake_atom[m][0] = shake_atom[i][0]; + shake_atom[m][1] = shake_atom[i][1]; + shake_atom[m][2] = shake_atom[i][2]; + shake_atom[m][3] = shake_atom[i][3]; + shake_type[m][0] = shake_type[i][0]; + shake_type[m][1] = shake_type[i][1]; + shake_type[m][2] = shake_type[i][2]; + + } else { + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].shake_flag = shake_flag[i]; + inbuf[nsend].shake_atom[0] = shake_atom[i][0]; + inbuf[nsend].shake_atom[1] = shake_atom[i][1]; + inbuf[nsend].shake_atom[2] = shake_atom[i][2]; + inbuf[nsend].shake_atom[3] = shake_atom[i][3]; + inbuf[nsend].shake_type[0] = shake_type[i][0]; + inbuf[nsend].shake_type[1] = shake_type[i][1]; + inbuf[nsend].shake_type[2] = shake_type[i][2]; + nsend++; + } + } + } + + // perform rendezvous operation + // each proc owns random subset of atoms + // receives all data needed to populate un-owned shake info + + char *buf; + int nreturn = comm->rendezvous(nsend,proclist, + (char *) inbuf,sizeof(ShakeInfo), + rendezvous_shake,buf,sizeof(ShakeInfo), + (void *) this); + ShakeInfo *outbuf = (ShakeInfo *) buf; + + memory->destroy(proclist); + memory->sfree(inbuf); + + // set shake info for un-onwed partners based on output info + + for (m = 0; m < nreturn; m++) { + i = atom->map(outbuf[m].atomID); + shake_flag[i] = outbuf[m].shake_flag; + shake_atom[i][0] = outbuf[m].shake_atom[0]; + shake_atom[i][1] = outbuf[m].shake_atom[1]; + shake_atom[i][2] = outbuf[m].shake_atom[2]; + shake_atom[i][3] = outbuf[m].shake_atom[3]; + shake_type[i][0] = outbuf[m].shake_type[0]; + shake_type[i][1] = outbuf[m].shake_type[1]; + shake_type[i][2] = outbuf[m].shake_type[2]; + } + + memory->sfree(outbuf); +} + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N IDRvous datums + no outbuf +------------------------------------------------------------------------- */ + +int FixShake::rendezvous_ids(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + FixShake *fsptr = (FixShake *) ptr; + Memory *memory = fsptr->memory; + + int *procowner; + tagint *atomIDs; + + memory->create(procowner,n,"special:procowner"); + memory->create(atomIDs,n,"special:atomIDs"); + + IDRvous *in = (IDRvous *) inbuf; + + for (int i = 0; i < n; i++) { + procowner[i] = in[i].me; + atomIDs[i] = in[i].atomID; + } + + // store rendezvous data in FixShake class + + fsptr->nrvous = n; + fsptr->procowner = procowner; + fsptr->atomIDs = atomIDs; + + // flag = 0: no 2nd irregular comm needed in comm->rendezvous + + flag = 0; + return 0; +} + +/* ---------------------------------------------------------------------- + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs +------------------------------------------------------------------------- */ + +int FixShake::rendezvous_partners_info(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) +{ + int i,m; + + FixShake *fsptr = (FixShake *) ptr; + Atom *atom = fsptr->atom; + Memory *memory = fsptr->memory; + + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts + + atom->map_clear(); + + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID = 4 values + + PartnerInfo *in = (PartnerInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + double massone; int nmass = fsptr->nmass; - tagint *buf = (tagint *) cbuf; - int m,n; - double massone; - - for (int i = 0; i < ndatum; i += 6) { - m = atom->map(buf[i+1]); - if (m >= 0 && m < nlocal) { - buf[i+2] = mask[m]; - buf[i+3] = type[m]; - if (nmass) { - if (rmass) massone = rmass[m]; - else massone = mass[type[m]]; - buf[i+4] = fsptr->masscheck(massone); - } - if (buf[i+5] == 0) { - n = fsptr->bondtype_findset(m,buf[i],buf[i+1],0); - if (n) buf[i+5] = n; - } - } + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf + + flag = 1; + return n; } /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner, fill in nshake value + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N NShakeInfo datums + outbuf = same list of N NShakeInfo datums, routed to different procs ------------------------------------------------------------------------- */ -void FixShake::ring_nshake(int ndatum, char *cbuf, void *ptr) +int FixShake::rendezvous_nshake(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) { - FixShake *fsptr = (FixShake *)ptr; + int i,j,m; + + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; - int nlocal = atom->nlocal; + Memory *memory = fsptr->memory; - int *nshake = fsptr->nshake; + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts - tagint *buf = (tagint *) cbuf; - int m; + atom->map_clear(); - for (int i = 0; i < ndatum; i += 3) { - m = atom->map(buf[i+1]); - if (m >= 0 && m < nlocal) buf[i+2] = nshake[m]; + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID + + NShakeInfo *in = (NShakeInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf + + flag = 1; + return n; } - /* ---------------------------------------------------------------------- - when receive buffer, scan bond partner IDs for atoms I own - if I own partner, fill in nshake value + process data for atoms assigned to me in rendezvous decomposition + inbuf = list of N PairRvous datums + outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ -void FixShake::ring_shake(int ndatum, char *cbuf, void *ptr) +int FixShake::rendezvous_shake(int n, char *inbuf, + int &flag, int *&proclist, char *&outbuf, + void *ptr) { - FixShake *fsptr = (FixShake *)ptr; + int i,j,m; + + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; - int nlocal = atom->nlocal; + Memory *memory = fsptr->memory; - int *shake_flag = fsptr->shake_flag; - tagint **shake_atom = fsptr->shake_atom; - int **shake_type = fsptr->shake_type; + // clear atom map so it can be here as a hash table + // faster than an STL map for large atom counts - tagint *buf = (tagint *) cbuf; - int m; + atom->map_clear(); - for (int i = 0; i < ndatum; i += 9) { - m = atom->map(buf[i]); - if (m >= 0 && m < nlocal) { - shake_flag[m] = buf[i+1]; - shake_atom[m][0] = buf[i+2]; - shake_atom[m][1] = buf[i+3]; - shake_atom[m][2] = buf[i+4]; - shake_atom[m][3] = buf[i+5]; - shake_type[m][0] = buf[i+6]; - shake_type[m][1] = buf[i+7]; - shake_type[m][2] = buf[i+8]; - } + // hash atom IDs stored in rendezvous decomposition + + int nrvous = fsptr->nrvous; + tagint *atomIDs = fsptr->atomIDs; + + for (i = 0; i < nrvous; i++) + atom->map_one(atomIDs[i],i); + + // proclist = owner of atomID in caller decomposition + // outbuf = info about owned atomID + + ShakeInfo *in = (ShakeInfo *) inbuf; + int *procowner = fsptr->procowner; + memory->create(proclist,n,"shake:proclist"); + + for (i = 0; i < n; i++) { + m = atom->map(in[i].atomID); + proclist[i] = procowner[m]; } + + outbuf = inbuf; + + // re-create atom map + + atom->map_init(0); + atom->nghost = 0; + atom->map_set(); + + // flag = 1: outbuf = inbuf; + + flag = 1; + return n; } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index d4e7b85ec4..2baea90a4a 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -120,6 +120,11 @@ class FixShake : public Fix { int nmol; void find_clusters(); + void atom_owners(); + void partner_info(int *, tagint **, int **, int **, int **, int **); + void nshake_info(int *, tagint **, int **); + void shake_info(int *, tagint **, int **); + int masscheck(double); void unconstrained_update(); void unconstrained_update_respa(int); @@ -131,12 +136,40 @@ class FixShake : public Fix { int bondtype_findset(int, tagint, tagint, int); int angletype_findset(int, tagint, tagint, int); - // static variable for ring communication callback to access class data - // callback functions for ring communication + // data used by rendezvous callback methods - static void ring_bonds(int, char *, void *); - static void ring_nshake(int, char *, void *); - static void ring_shake(int, char *, void *); + int nrvous; + tagint *atomIDs; + int *procowner; + + struct IDRvous { + int me; + tagint atomID; + }; + + struct PartnerInfo { + tagint atomID,partnerID; + int mask,type,massflag,bondtype; + }; + + struct NShakeInfo { + tagint atomID,partnerID; + int nshake; + }; + + struct ShakeInfo { + tagint atomID; + int shake_flag; + int shake_atom[4]; + int shake_type[3]; + }; + + // callback functions for rendezvous communication + + static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); + static int rendezvous_partners_info(int, char *, int &, int *&, char *&, void *); + static int rendezvous_nshake(int, char *, int &, int *&, char *&, void *); + static int rendezvous_shake(int, char *, int &, int *&, char *&, void *); }; } diff --git a/src/special.cpp b/src/special.cpp index 79d2f77e46..b0d5bc7dca 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -21,7 +21,6 @@ #include "modify.h" #include "fix.h" #include "accelerator_kokkos.h" -#include "hashlittle.h" #include "atom_masks.h" #include "memory.h" #include "error.h" @@ -177,25 +176,20 @@ void Special::atom_owners() // input datums = pairs of bonded atoms // owning proc for each datum = random hash of atomID // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on for (int i = 0; i < nlocal; i++) { - //proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; proclist[i] = tag[i] % nprocs; idbuf[i].me = me; idbuf[i].atomID = tag[i]; } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists + // each proc assigned every 1/Pth atom char *buf; comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(PairRvous), - rendezvous_ids,buf,sizeof(PairRvous), - (void *) this); + (char *) idbuf,sizeof(IDRvous), + rendezvous_ids,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -215,49 +209,45 @@ void Special::onetwo_build_newton() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + // nsend = # of my datums to send - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_bond[i]; j++) { m = atom->map(bond_atom[i][j]); - if (m < 0 || m >= nlocal) ncount++; + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each bond partner: datum = atomID, bond partner ID - // add inverted datum when netwon_bond on + // owning proc for each datum = atomID % nprocs + // one datum for each bond partner: bond partner ID, atomID - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_bond[i]; j++) { m = atom->map(bond_atom[i][j]); if (m >= 0 && m < nlocal) continue; - proclist[ncount] = bond_atom[i][j] % nprocs; - inbuf[ncount].atomID = bond_atom[i][j]; - inbuf[ncount].partnerID = tag[i]; - ncount++; + proclist[nsend] = bond_atom[i][j] % nprocs; + inbuf[nsend].atomID = bond_atom[i][j]; + inbuf[nsend].partnerID = tag[i]; + nsend++; } } // perform rendezvous operation // each proc owns random subset of atoms - // receives all info to form and return their onetwo lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -312,6 +302,28 @@ void Special::onetwo_build_newton() void Special::onetwo_build_newton_off() { + int i,j; + + int *num_bond = atom->num_bond; + tagint **bond_atom = atom->bond_atom; + int **nspecial = atom->nspecial; + int nlocal = atom->nlocal; + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,num_bond[i]); + + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + memory->create(onetwo,nlocal,maxall,"special:onetwo"); + + // nsend = # of my datums to send + // include nlocal datums with owner of each atom + + for (i = 0; i < nlocal; i++) { + nspecial[i][0] = num_bond[i]; + for (j = 0; j < num_bond[i]; j++) + onetwo[i][j] = bond_atom[i][j]; + } } /* ---------------------------------------------------------------------- @@ -327,21 +339,20 @@ void Special::onethree_build() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send - // include nlocal datums with owner of each atom + // nsend = # of my datums to send - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][0]; j++) { m = atom->map(onetwo[i][j]); - if (m < 0 || m >= nlocal) ncount += nspecial[i][0]-1; + if (m < 0 || m >= nlocal) nsend += nspecial[i][0]-1; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) @@ -349,7 +360,7 @@ void Special::onethree_build() // one datum for each owned atom: datum = owning proc, atomID // one datum for each onetwo pair: datum = atomID1, atomID2 - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][0]; j++) { m = atom->map(onetwo[i][j]); @@ -357,10 +368,10 @@ void Special::onethree_build() proc = onetwo[i][j] % nprocs; for (k = 0; k < nspecial[i][0]; k++) { if (j == k) continue; - proclist[ncount] = proc; - inbuf[ncount].atomID = onetwo[i][j]; - inbuf[ncount].partnerID = onetwo[i][k]; - ncount++; + proclist[nsend] = proc; + inbuf[nsend].atomID = onetwo[i][j]; + inbuf[nsend].partnerID = onetwo[i][k]; + nsend++; } } } @@ -370,9 +381,9 @@ void Special::onethree_build() // receives all info to form and return their onethree lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -434,21 +445,21 @@ void Special::onefour_build() int **nspecial = atom->nspecial; int nlocal = atom->nlocal; - // ncount = # of my datums to send + // nsend = # of my datums to send // include nlocal datums with owner of each atom - int ncount = 0; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][1]; j++) { m = atom->map(onethree[i][j]); - if (m < 0 || m >= nlocal) ncount += nspecial[i][0]; + if (m < 0 || m >= nlocal) nsend += nspecial[i][0]; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) @@ -456,17 +467,17 @@ void Special::onefour_build() // one datum for each owned atom: datum = owning proc, atomID // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 - ncount = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < nspecial[i][1]; j++) { m = atom->map(onethree[i][j]); if (m >= 0 && m < nlocal) continue; proc = onethree[i][j] % nprocs; for (k = 0; k < nspecial[i][0]; k++) { - proclist[ncount] = proc; - inbuf[ncount].atomID = onethree[i][j]; - inbuf[ncount].partnerID = onetwo[i][k]; - ncount++; + proclist[nsend] = proc; + inbuf[nsend].atomID = onethree[i][j]; + inbuf[nsend].partnerID = onetwo[i][k]; + nsend++; } } } @@ -476,9 +487,9 @@ void Special::onefour_build() // receives all info to form and return their onefour lists char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_1234,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -773,7 +784,7 @@ void Special::combine() void Special::angle_trim() { - int i,j,m,n,proc,index; + int i,j,k,m;; int *num_angle = atom->num_angle; int *num_dihedral = atom->num_dihedral; @@ -804,96 +815,89 @@ void Special::angle_trim() " %g = # of 1-3 neighbors before angle trim\n",allcount); } - // if angles or dihedrals are defined, - // flag each 1-3 neigh if it appears in an angle or dihedral + // if angles or dihedrals are defined + // rendezvous angle 1-3 and dihedral 1-3,2-4 pairs if ((num_angle && atom->nangles) || (num_dihedral && atom->ndihedrals)) { - // ncount = # of my datums to send in 3 parts for each owned atom - // proc owner, onethree list, angle end points - // angle end points are from angle list and 1-3 and 2-4 pairs in dihedrals - // latter is only for angles or dihedrlas where I own atom2 + // nsend = # of my datums to send + // latter is only for angles or dihedrlas where I own atom2 (newton bond off) - int ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][1]; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { - index = atom->map(angle_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 2; + if (tag[i] != angle_atom2[i][j]) continue; + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; } for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 4; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // sent to owner of atomID - // one datum for each 1-4 partner: datum = atomID, ID - // sent to owner of atomID - // two datums for each dihedral 1-4 endatoms : datum = atomID, ID - // sent to owner of atomID - m = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { - for (j = 0; j < nspecial[i][1]; j++) { - proclist[m] = proc; - //inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = onethree[i][j]; - m++; - } - for (j = 0; j < num_angle[i]; j++) { - index = atom->map(angle_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != angle_atom2[i][j]) continue; - proclist[m] = hashlittle(&angle_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = angle_atom1[i][j]; - inbuf[m].partnerID = angle_atom3[i][j]; - m++; + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom1[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom1[i][j]; + inbuf[nsend].partnerID = angle_atom3[i][j]; + nsend++; + } - proclist[m] = hashlittle(&angle_atom3[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = angle_atom3[i][j]; - inbuf[m].partnerID = angle_atom1[i][j]; - m++; + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom3[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom3[i][j]; + inbuf[nsend].partnerID = angle_atom1[i][j]; + nsend++; + } } for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom1[i][j]; - inbuf[m].partnerID = dihedral_atom3[i][j]; - m++; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom3[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom2[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom2[i][j]; - inbuf[m].partnerID = dihedral_atom4[i][j]; - m++; + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom3[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom3[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom3[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom3[i][j]; - inbuf[m].partnerID = dihedral_atom1[i][j]; - m++; - - proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom4[i][j]; - inbuf[m].partnerID = dihedral_atom2[i][j]; - m++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom2[i][j]; + nsend++; + } } } @@ -903,26 +907,112 @@ void Special::angle_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_trim,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // reset nspecial[1] and onethree for all owned atoms based on output info + // flag all onethree atoms to keep - for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][1]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + + int **flag; + memory->create(flag,nlocal,maxall,"special:flag"); + + for (i = 0; i < nlocal; i++) + for (j = 0; j < nspecial[i][1]; j++) + flag[i][j] = 0; + + // reset nspecial[1] and onethree for all owned atoms based on output info + + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_angle[i]; j++) { + if (tag[i] != angle_atom2[i][j]) continue; + + m = atom->map(angle_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(angle_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + } + + for (j = 0; j < num_dihedral[i]; j++) { + if (tag[i] != dihedral_atom2[i][j]) continue; + + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom2[i][j]) { + flag[m][k] = 1; + break; + } + } + } + } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); - onethree[i][nspecial[i][1]++] = outbuf[m].partnerID; + for (k = 0; k < nspecial[i][1]; k++) + if (onethree[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } - + memory->destroy(outbuf); + // use flag values to compress onefour list for each atom + + for (i = 0; i < nlocal; i++) { + j = 0; + while (j < nspecial[i][1]) { + if (flag[i][j] == 0) { + onethree[i][j] = onethree[i][nspecial[i][1]-1]; + flag[i][j] = flag[i][nspecial[i][1]-1]; + nspecial[i][1]--; + } else j++; + } + } + + memory->destroy(flag); + // if no angles or dihedrals are defined, delete all 1-3 neighs } else { @@ -952,7 +1042,7 @@ void Special::angle_trim() void Special::dihedral_trim() { - int i,j,m,n,proc,index; + int i,j,k,m; int *num_dihedral = atom->num_dihedral; tagint **dihedral_atom1 = atom->dihedral_atom1; @@ -978,68 +1068,51 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, rendezvous onefour list with dihedral 1-4 pairs + // if dihedrals are defined, rendezvous dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { - // ncount = # of my datums to send in 3 parts for each owned atom - // onefour list, proc owner, dihedral end points - // latter is only for dihedrals where I own atom2 + // nsend = # of my datums to send + // latter is only for dihedrals where I own atom2 (newton bond off) - int ncount = nlocal; - for (i = 0; i < nlocal; i++) ncount += nspecial[i][2]; + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index >= 0 && index < nlocal) ncount += 2; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } int *proclist; - memory->create(proclist,ncount,"special:proclist"); + memory->create(proclist,nsend,"special:proclist"); PairRvous *inbuf = (PairRvous *) - memory->smalloc((bigint) ncount*sizeof(PairRvous),"special:inbuf"); - + memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); + // setup input buf to rendezvous comm - // one datum for each owned atom: datum = proc, atomID - // sent to owner of atomID - // one datum for each 1-4 partner: datum = atomID, ID - // sent to owner of atomID - // two datums for each dihedral 1-4 endatoms : datum = atomID, ID - // sent to owner of atomID - m = 0; + nsend = 0; for (i = 0; i < nlocal; i++) { - proc = hashlittle(&tag[i],sizeof(tagint),0) % nprocs; - proclist[m] = proc; - //inbuf[m].me = me; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = 0; - m++; - - for (j = 0; j < nspecial[i][2]; j++) { - proclist[m] = proc; - //inbuf[m].me = -1; - inbuf[m].atomID = tag[i]; - inbuf[m].partnerID = onefour[i][j]; - m++; - } - for (j = 0; j < num_dihedral[i]; j++) { - index = atom->map(dihedral_atom2[i][j]); - if (index < 0 || index >= nlocal) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - proclist[m] = hashlittle(&dihedral_atom1[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom1[i][j]; - inbuf[m].partnerID = dihedral_atom4[i][j]; - m++; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom4[i][j]; + nsend++; + } - proclist[m] = hashlittle(&dihedral_atom4[i][j],sizeof(tagint),0) % nprocs; - //inbuf[m].me = -2; - inbuf[m].atomID = dihedral_atom4[i][j]; - inbuf[m].partnerID = dihedral_atom1[i][j]; - m++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } } } @@ -1049,26 +1122,81 @@ void Special::dihedral_trim() // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(ncount,proclist, + int nreturn = comm->rendezvous(nsend,proclist, (char *) inbuf,sizeof(PairRvous), - rendezvous_trim,buf,sizeof(PairRvous), + rendezvous_pairs,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); + // flag all onefour atoms to keep + + int max = 0; + for (i = 0; i < nlocal; i++) + max = MAX(max,nspecial[i][2]); + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); + + int **flag; + memory->create(flag,nlocal,maxall,"special:flag"); + + for (i = 0; i < nlocal; i++) + for (j = 0; j < nspecial[i][2]; j++) + flag[i][j] = 0; + // reset nspecial[2] and onefour for all owned atoms based on output info - for (i = 0; i < nlocal; i++) nspecial[i][2] = 0; + for (i = 0; i < nlocal; i++) { + for (j = 0; j < num_dihedral[i]; j++) { + if (tag[i] != dihedral_atom2[i][j]) continue; + + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom4[i][j]) { + flag[m][k] = 1; + break; + } + } + + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } + } + } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); - onefour[i][nspecial[i][2]++] = outbuf[m].partnerID; + for (k = 0; k < nspecial[i][2]; k++) + if (onefour[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } memory->destroy(outbuf); + // use flag values to compress onefour list for each atom + + for (i = 0; i < nlocal; i++) { + j = 0; + while (j < nspecial[i][2]) { + if (flag[i][j] == 0) { + onefour[i][j] = onefour[i][nspecial[i][2]-1]; + flag[i][j] = flag[i][nspecial[i][2]-1]; + nspecial[i][2]--; + } else j++; + } + } + + memory->destroy(flag); + // if no dihedrals are defined, delete all 1-4 neighs } else { @@ -1093,8 +1221,8 @@ void Special::dihedral_trim() /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - outbuf = empty + inbuf = list of N IDRvous datums + no outbuf ------------------------------------------------------------------------- */ int Special::rendezvous_ids(int n, char *inbuf, @@ -1109,7 +1237,6 @@ int Special::rendezvous_ids(int n, char *inbuf, memory->create(procowner,n,"special:procowner"); memory->create(atomIDs,n,"special:atomIDs"); - // NOTE: when to free these vectors IDRvous *in = (IDRvous *) inbuf; @@ -1120,13 +1247,12 @@ int Special::rendezvous_ids(int n, char *inbuf, // store rendezvous data in Special class - sptr->ncount = n; + sptr->nrvous = n; sptr->procowner = procowner; sptr->atomIDs = atomIDs; - proclist = NULL; - outbuf = NULL; - + // flag = 0: no 2nd irregular comm needed in comm->rendezvous + flag = 0; return 0; } @@ -1138,7 +1264,7 @@ int Special::rendezvous_ids(int n, char *inbuf, outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ -int Special::rendezvous_1234(int n, char *inbuf, +int Special::rendezvous_pairs(int n, char *inbuf, int &flag, int *&proclist, char *&outbuf, void *ptr) { @@ -1153,10 +1279,10 @@ int Special::rendezvous_1234(int n, char *inbuf, // hash atom IDs stored in rendezvous decomposition - int ncount = sptr->ncount; + int nrvous = sptr->nrvous; tagint *atomIDs = sptr->atomIDs; - for (int i = 0; i < ncount; i++) + for (int i = 0; i < nrvous; i++) atom->map_one(atomIDs[i],i); // proclist = owner of atomID in caller decomposition @@ -1172,7 +1298,6 @@ int Special::rendezvous_1234(int n, char *inbuf, } outbuf = inbuf; - // NOTE: set out = in flag // re-create atom map @@ -1180,148 +1305,12 @@ int Special::rendezvous_1234(int n, char *inbuf, atom->nghost = 0; atom->map_set(); + // flag = 1: outbuf = inbuf + flag = 1; return n; } -/* ---------------------------------------------------------------------- - process data for atoms assigned to me in rendezvous decomposition - inbuf = list of N PairRvous datums - create outbuf = list of Nout PairRvous datums -------------------------------------------------------------------------- */ - -int Special::rendezvous_trim(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) -{ - int i,j,m; - - /* - Special *sptr = (Special *) ptr; - Atom *atom = sptr->atom; - Memory *memory = sptr->memory; - - // clear atom map so it can be here as a hash table - // faster than an STL map for large atom counts - - atom->map_clear(); - - // initialize hash - // ncount = number of atoms assigned to me - // key = atom ID - // value = index into Ncount-length data structure - - PairRvous *in = (PairRvous *) inbuf; - //std::map hash; - tagint id; - - int ncount = 0; - for (i = 0; i < n; i++) - if (in[i].me >= 0) - //hash[in[i].atomID] = ncount++; - atom->map_one(in[i].atomID,ncount++); - - // procowner = caller proc that owns each atom - // atomID = ID of each rendezvous atom I own - // npartner = # of 1-3 partners for each atom I own - - int *procowner,*npartner; - tagint *atomID; - memory->create(procowner,ncount,"special:procowner"); - memory->create(atomID,ncount,"special:atomID"); - memory->create(npartner,ncount,"special:npartner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - if (in[i].me >= 0) { - procowner[m] = in[i].me; - atomID[m] = in[i].atomID; - } else if (in[i].me == -1) npartner[m]++; - } - - int max = 0; - for (m = 0; m < ncount; m++) max = MAX(max,npartner[m]); - - // partner = list of 1-3 or 1-4 partners for each atom I own - - int **partner; - memory->create(partner,ncount,max,"special:partner"); - for (m = 0; m < ncount; m++) npartner[m] = 0; - - for (i = 0; i < n; i++) { - if (in[i].me >= 0 || in[i].me == -2) continue; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - partner[m][npartner[m]++] = in[i].partnerID; - } - - // flag = 1 if partner is in an actual angle or in a dihedral - - int **flag; - memory->create(flag,ncount,max,"special:flag"); - - for (i = 0; i < ncount; i++) - for (j = 0; j < npartner[i]; j++) - flag[i][j] = 0; - - tagint actual; - for (i = 0; i < n; i++) { - if (in[i].me != -2) continue; - actual = in[i].partnerID; - //m = hash.find(in[i].atomID)->second; - m = atom->map(in[i].atomID); - for (j = 0; j < npartner[m]; j++) - if (partner[m][j] == actual) { - flag[m][j] = 1; - break; - } - } - - // pass list of PairRvous datums back to comm->rendezvous - - int nout = 0; - for (m = 0; m < ncount; m++) nout += npartner[m]; - - memory->create(proclist,nout,"special:proclist"); - PairRvous *out = (PairRvous *) - memory->smalloc((bigint) nout*sizeof(PairRvous),"special:out"); - - nout = 0; - for (m = 0; m < ncount; m++) - for (j = 0; j < npartner[m]; j++) { - if (flag[m][j] == 0) continue; - proclist[nout] = procowner[m]; - out[nout].atomID = atomID[m]; - out[nout].partnerID = partner[m][j]; - nout++; - } - - outbuf = (char *) out; - - // clean up - // Comm::rendezvous will delete proclist and out (outbuf) - - memory->destroy(procowner); - memory->destroy(atomID); - memory->destroy(npartner); - memory->destroy(partner); - memory->destroy(flag); - - // re-create atom map - - atom->map_init(0); - atom->nghost = 0; - atom->map_set(); - - */ - - //return nout; - flag = 2; - return 0; -} - /* ---------------------------------------------------------------------- allow fixes to alter special list currently, only fix drude does this diff --git a/src/special.h b/src/special.h index 772ba613ac..d02a8522f6 100644 --- a/src/special.h +++ b/src/special.h @@ -31,7 +31,7 @@ class Special : protected Pointers { // data used by rendezvous callback methods - int ncount; + int nrvous; tagint *atomIDs; int *procowner; @@ -44,6 +44,8 @@ class Special : protected Pointers { tagint atomID,partnerID; }; + // private methods + void atom_owners(); void onetwo_build_newton(); void onetwo_build_newton_off(); @@ -60,8 +62,7 @@ class Special : protected Pointers { // callback functions for rendezvous communication static int rendezvous_ids(int, char *, int &, int *&, char *&, void *); - static int rendezvous_1234(int, char *, int &, int *&, char *&, void *); - static int rendezvous_trim(int, char *, int &, int *&, char *&, void *); + static int rendezvous_pairs(int, char *, int &, int *&, char *&, void *); }; } From 981f12ebebdce2344bdb4aa341aaf18f494501c6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 19 Dec 2018 17:40:35 -0700 Subject: [PATCH 148/243] fix a small memory leak in SHAKE setup --- src/RIGID/fix_shake.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 66c92d42c5..51121f0853 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -955,7 +955,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- // set shake_flag,shake_atom,shake_type for non-central atoms - // requires communication for off-proc atoms + // requires rendezvous communication for off-proc atoms // ----------------------------------------------------- shake_info(npartner,partner_tag,partner_shake); @@ -964,6 +964,9 @@ void FixShake::find_clusters() // free local memory // ----------------------------------------------------- + memory->destroy(atomIDs); + memory->destroy(procowner); + memory->destroy(npartner); memory->destroy(nshake); memory->destroy(partner_tag); @@ -1390,24 +1393,24 @@ int FixShake::rendezvous_ids(int n, char *inbuf, FixShake *fsptr = (FixShake *) ptr; Memory *memory = fsptr->memory; - int *procowner; tagint *atomIDs; + int *procowner; - memory->create(procowner,n,"special:procowner"); memory->create(atomIDs,n,"special:atomIDs"); + memory->create(procowner,n,"special:procowner"); IDRvous *in = (IDRvous *) inbuf; for (int i = 0; i < n; i++) { - procowner[i] = in[i].me; atomIDs[i] = in[i].atomID; + procowner[i] = in[i].me; } // store rendezvous data in FixShake class fsptr->nrvous = n; - fsptr->procowner = procowner; fsptr->atomIDs = atomIDs; + fsptr->procowner = procowner; // flag = 0: no 2nd irregular comm needed in comm->rendezvous From fc002e30d34c5dbe064d6ed8940e1f9b356e5acd Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Jan 2019 14:49:52 -0700 Subject: [PATCH 149/243] added rendezvous via all2all --- src/RIGID/fix_rigid_small.cpp | 5 +- src/RIGID/fix_shake.cpp | 30 ++-- src/comm.cpp | 318 +++++++++++++++++++++++++++++++--- src/comm.h | 12 +- src/irregular.cpp | 185 +++++++++++++++++++- src/irregular.h | 2 + src/special.cpp | 119 +++++++------ 7 files changed, 566 insertions(+), 105 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 4de368ca85..7c6aab4861 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1576,8 +1576,9 @@ void FixRigidSmall::create_bodies(tagint *bodyID) // func = compute bbox of each body, find atom closest to geometric center char *buf; - int nreturn = comm->rendezvous(ncount,proclist,(char *) inbuf,sizeof(InRvous), - rendezvous_body,buf,sizeof(OutRvous), + int nreturn = comm->rendezvous(1,ncount,(char *) inbuf,sizeof(InRvous), + 0,proclist, + rendezvous_body,0,buf,sizeof(OutRvous), (void *) this); OutRvous *outbuf = (OutRvous *) buf; diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 51121f0853..35153de839 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1068,9 +1068,9 @@ void FixShake::atom_owners() // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(IDRvous), - rendezvous_ids,buf,0,(void *) this); + comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), + 0,proclist, + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -1174,9 +1174,10 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner 4 values char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PartnerInfo), - rendezvous_partners_info,buf,sizeof(PartnerInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PartnerInfo), + 0,proclist, + rendezvous_partners_info, + 0,buf,sizeof(PartnerInfo), (void *) this); PartnerInfo *outbuf = (PartnerInfo *) buf; @@ -1194,7 +1195,8 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, partner_type[i][j] = outbuf[m].type; partner_massflag[i][j] = outbuf[m].massflag; - // only set partner_bondtype if my atom did not set it when setting up rendezvous + // only set partner_bondtype if my atom did not set it + // when setting up rendezvous // if this proc set it, then sender of this datum set outbuf.bondtype = 0 if (partner_bondtype[i][j] == 0) @@ -1261,9 +1263,9 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner nshake char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(NShakeInfo), - rendezvous_nshake,buf,sizeof(NShakeInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), + 0,proclist, + rendezvous_nshake,0,buf,sizeof(NShakeInfo), (void *) this); NShakeInfo *outbuf = (NShakeInfo *) buf; @@ -1354,9 +1356,9 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned shake info char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(ShakeInfo), - rendezvous_shake,buf,sizeof(ShakeInfo), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), + 0,proclist, + rendezvous_shake,0,buf,sizeof(ShakeInfo), (void *) this); ShakeInfo *outbuf = (ShakeInfo *) buf; @@ -1412,7 +1414,7 @@ int FixShake::rendezvous_ids(int n, char *inbuf, fsptr->atomIDs = atomIDs; fsptr->procowner = procowner; - // flag = 0: no 2nd irregular comm needed in comm->rendezvous + // flag = 0: no second comm needed in rendezvous flag = 0; return 0; diff --git a/src/comm.cpp b/src/comm.cpp index 9bdaf0798a..39d4311aa2 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -729,34 +729,78 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, /* ---------------------------------------------------------------------- rendezvous communication operation three stages: - first Irregular converts inbuf from caller decomp to rvous decomp + first comm sends inbuf from caller decomp to rvous decomp callback operates on data in rendevous decomp - last Irregular converts outbuf from rvous decomp back to caller decomp + second comm sends outbuf from rvous decomp back to caller decomp inputs: - n = # of input datums - proclist = proc that owns each input datum in rendezvous decomposition - inbuf = list of input datums - insize = size in bytes of each input datum + which = perform (0) irregular or (1) MPI_All2allv communication + n = # of datums in inbuf + inbuf = vector of input datums + insize = byte size of each input datum + inorder = 0 for inbuf in random proc order, 1 for datums ordered by proc + procs: inorder 0 = proc to send each datum to, 1 = # of datums/proc, callback = caller function to invoke in rendezvous decomposition + takes input datums, returns output datums + outorder = same as inorder, but for datums returned by callback() + ptr = pointer to caller class, passed to callback() outputs: nout = # of output datums (function return) - outbuf = list of output datums - outsize = size in bytes of each output datum + outbuf = vector of output datums + outsize = byte size of each output datum + callback inputs: + nrvous = # of rvous decomp datums in inbuf_rvous + inbuf_rvous = vector of rvous decomp input datums + ptr = pointer to caller class + callback outputs: + nrvous_out = # of rvous decomp output datums (function return) + flag = 0 for no second comm, 1 for outbuf_rvous = inbuf_rvous, + 2 for second comm with new outbuf_rvous + procs_rvous = outorder 0 = proc to send each datum to, 1 = # of datums/proc + allocated + outbuf_rvous = vector of rvous decomp output datums + NOTE: could use MPI_INT or MPI_DOUBLE insead of MPI_CHAR + to avoid checked-for overflow in MPI_Alltoallv? ------------------------------------------------------------------------- */ -int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, - int (*callback)(int, char *, int &, int *&, char *&, void *), - char *&outbuf, int outsize, void *ptr) +int Comm:: +rendezvous(int which, int n, char *inbuf, int insize, + int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, int outsize, void *ptr) { - // comm inbuf from caller decomposition to rendezvous decomposition + int nout; + if (which == 0) + nout = rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr); + else + nout = rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr); + + return nout; +} + +/* ---------------------------------------------------------------------- */ + +int Comm:: +rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, + int outsize, void *ptr) +{ + // irregular comm of inbuf from caller decomp to rendezvous decomp + Irregular *irregular = new Irregular(lmp); - int n_rvous = irregular->create_data(n,proclist); // add sort - char *inbuf_rvous = (char *) memory->smalloc((bigint) n_rvous*insize, - "rendezvous:inbuf_rvous"); + int nrvous; + if (inorder) nrvous = irregular->create_data_grouped(n,procs); + else nrvous = irregular->create_data(n,procs); + + char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, + "rendezvous:inbuf"); irregular->exchange_data(inbuf,insize,inbuf_rvous); + bigint irregular1_bytes = 0; //irregular->irregular_bytes; irregular->destroy_data(); delete irregular; @@ -764,29 +808,253 @@ int Comm::rendezvous(int n, int *proclist, char *inbuf, int insize, // callback() allocates/populates proclist_rvous and outbuf_rvous int flag; - int *proclist_rvous; + int *procs_rvous; char *outbuf_rvous; - - int nout_rvous = - callback(n_rvous,inbuf_rvous,flag,proclist_rvous,outbuf_rvous,ptr); + int nrvous_out = callback(nrvous,inbuf_rvous,flag, + procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd comm stage - // comm outbuf from rendezvous decomposition back to caller + // irregular comm of outbuf from rendezvous decomp back to caller decomp // caller will free outbuf irregular = new Irregular(lmp); - int nout = irregular->create_data(nout_rvous,proclist_rvous); - outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + int nout; + if (outorder) + nout = irregular->create_data_grouped(nrvous_out,procs_rvous); + else nout = irregular->create_data(nrvous_out,procs_rvous); + + outbuf = (char *) memory->smalloc((bigint) nout*outsize, + "rendezvous:outbuf"); irregular->exchange_data(outbuf_rvous,outsize,outbuf); - + + bigint irregular2_bytes = 0; //irregular->irregular_bytes; irregular->destroy_data(); delete irregular; - memory->destroy(proclist_rvous); + + memory->destroy(procs_rvous); memory->sfree(outbuf_rvous); + // approximate memory tally + + bigint rvous_bytes = 0; + rvous_bytes += n*insize; // inbuf + rvous_bytes += nout*outsize; // outbuf + rvous_bytes += nrvous*insize; // inbuf_rvous + rvous_bytes += nrvous_out*outsize; // outbuf_rvous + rvous_bytes += nrvous_out*sizeof(int); // procs_rvous + rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms + + // return number of output datums + + return nout; +} + +/* ---------------------------------------------------------------------- */ + +int Comm:: +rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, + int (*callback)(int, char *, int &, int *&, char *&, void *), + int outorder, char *&outbuf, int outsize, void *ptr) +{ + int iproc; + bigint all2all1_bytes,all2all2_bytes; + int *sendcount,*sdispls,*recvcount,*rdispls; + int *procs_a2a; + bigint *offsets; + char *inbuf_a2a,*outbuf_a2a; + + // create procs and inbuf for All2all if necesary + + if (!inorder) { + memory->create(procs_a2a,nprocs,"rendezvous:procs"); + inbuf_a2a = (char *) memory->smalloc((bigint) n*insize, + "rendezvous:inbuf"); + memory->create(offsets,nprocs,"rendezvous:offsets"); + + for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; + for (int i = 0; i < n; i++) procs_a2a[procs[i]]++; + + offsets[0] = 0; + for (int i = 1; i < nprocs; i++) + offsets[i] = offsets[i-1] + insize*procs_a2a[i-1]; + + bigint offset = 0; + for (int i = 0; i < n; i++) { + iproc = procs[i]; + memcpy(&inbuf_a2a[offsets[iproc]],&inbuf[offset],insize); + offsets[iproc] += insize; + offset += insize; + } + + all2all1_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + n*insize; + + } else { + procs_a2a = procs; + inbuf_a2a = inbuf; + all2all1_bytes = 0; + } + + // create args for MPI_Alltoallv() on input data + + memory->create(sendcount,nprocs,"rendezvous:sendcount"); + memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); + + memory->create(recvcount,nprocs,"rendezvous:recvcount"); + MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); + + memory->create(sdispls,nprocs,"rendezvous:sdispls"); + memory->create(rdispls,nprocs,"rendezvous:rdispls"); + sdispls[0] = rdispls[0] = 0; + for (int i = 1; i < nprocs; i++) { + sdispls[i] = sdispls[i-1] + sendcount[i-1]; + rdispls[i] = rdispls[i-1] + recvcount[i-1]; + } + int nrvous = rdispls[nprocs-1] + recvcount[nprocs-1]; + + // test for overflow of input data due to imbalance or insize + // means that individual sdispls or rdispls values overflow + + int overflow = 0; + if ((bigint) n*insize > MAXSMALLINT) overflow = 1; + if ((bigint) nrvous*insize > MAXSMALLINT) overflow = 1; + int overflowall; + MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); + if (overflowall) error->all(FLERR,"Overflow input size in rendezvous_a2a"); + + for (int i = 0; i < nprocs; i++) { + sendcount[i] *= insize; + sdispls[i] *= insize; + recvcount[i] *= insize; + rdispls[i] *= insize; + } + + // all2all comm of inbuf from caller decomp to rendezvous decomp + + char *inbuf_rvous = (char *) memory->smalloc((bigint) nrvous*insize, + "rendezvous:inbuf"); + + MPI_Alltoallv(inbuf_a2a,sendcount,sdispls,MPI_CHAR, + inbuf_rvous,recvcount,rdispls,MPI_CHAR,world); + + if (!inorder) { + memory->destroy(procs_a2a); + memory->sfree(inbuf_a2a); + memory->destroy(offsets); + } + + // peform rendezvous computation via callback() + // callback() allocates/populates proclist_rvous and outbuf_rvous + + int flag; + int *procs_rvous; + char *outbuf_rvous; + + int nrvous_out = callback(nrvous,inbuf_rvous,flag, + procs_rvous,outbuf_rvous,ptr); + + if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous + if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + + // create procs and outbuf for All2all if necesary + + if (!outorder) { + memory->create(procs_a2a,nprocs,"rendezvous_a2a:procs"); + + outbuf_a2a = (char *) memory->smalloc((bigint) nrvous_out*outsize, + "rendezvous:outbuf"); + memory->create(offsets,nprocs,"rendezvous:offsets"); + + for (int i = 0; i < nprocs; i++) procs_a2a[i] = 0; + for (int i = 0; i < nrvous_out; i++) procs_a2a[procs_rvous[i]]++; + + offsets[0] = 0; + for (int i = 1; i < nprocs; i++) + offsets[i] = offsets[i-1] + outsize*procs_a2a[i-1]; + + bigint offset = 0; + for (int i = 0; i < nrvous_out; i++) { + iproc = procs_rvous[i]; + memcpy(&outbuf_a2a[offsets[iproc]],&outbuf_rvous[offset],outsize); + offsets[iproc] += outsize; + offset += outsize; + } + + all2all2_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + + nrvous_out*outsize; + + } else { + procs_a2a = procs_rvous; + outbuf_a2a = outbuf_rvous; + all2all2_bytes = 0; + } + + // comm outbuf from rendezvous decomposition back to caller + + memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); + + MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); + + sdispls[0] = rdispls[0] = 0; + for (int i = 1; i < nprocs; i++) { + sdispls[i] = sdispls[i-1] + sendcount[i-1]; + rdispls[i] = rdispls[i-1] + recvcount[i-1]; + } + int nout = rdispls[nprocs-1] + recvcount[nprocs-1]; + + // test for overflow of outbuf due to imbalance or outsize + // means that individual sdispls or rdispls values overflow + + overflow = 0; + if ((bigint) nrvous*outsize > MAXSMALLINT) overflow = 1; + if ((bigint) nout*outsize > MAXSMALLINT) overflow = 1; + MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); + if (overflowall) error->all(FLERR,"Overflow output in rendezvous_a2a"); + + for (int i = 0; i < nprocs; i++) { + sendcount[i] *= outsize; + sdispls[i] *= outsize; + recvcount[i] *= outsize; + rdispls[i] *= outsize; + } + + // all2all comm of outbuf from rendezvous decomp back to caller decomp + // caller will free outbuf + + outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); + + MPI_Alltoallv(outbuf_a2a,sendcount,sdispls,MPI_CHAR, + outbuf,recvcount,rdispls,MPI_CHAR,world); + + memory->destroy(procs_rvous); + memory->sfree(outbuf_rvous); + + if (!outorder) { + memory->destroy(procs_a2a); + memory->sfree(outbuf_a2a); + memory->destroy(offsets); + } + + // clean up + + memory->destroy(sendcount); + memory->destroy(recvcount); + memory->destroy(sdispls); + memory->destroy(rdispls); + + // approximate memory tally + + bigint rvous_bytes = 0; + rvous_bytes += n*insize; // inbuf + rvous_bytes += nout*outsize; // outbuf + rvous_bytes += nrvous*insize; // inbuf_rvous + rvous_bytes += nrvous_out*outsize; // outbuf_rvous + rvous_bytes += nrvous_out*sizeof(int); // procs_rvous + rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors + rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops + // return number of datums return nout; diff --git a/src/comm.h b/src/comm.h index a1bac53ac8..807da9bf0d 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,9 +109,9 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); - int rendezvous(int, int *, char *, int, + int rendezvous(int, int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - char *&, int, void *); + int, char *&, int, void *); int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); @@ -146,6 +146,14 @@ class Comm : protected Pointers { int ncores; // # of cores per node int coregrid[3]; // 3d grid of cores within a node int user_coregrid[3]; // user request for cores in each dim + + int rendezvous_irregular(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), + int, char *&, int, void *); + int rendezvous_all2all(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), + int, char *&, int, void *); + public: enum{MULTIPLE}; }; diff --git a/src/irregular.cpp b/src/irregular.cpp index 60025249cf..77278ec4c5 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -622,6 +622,7 @@ int Irregular::create_data(int n, int *proclist, int sortflag) num_send = new int[nsend_proc]; index_send = new int[n-work1[me]]; index_self = new int[work1[me]]; + maxindex = n; // proc_send = procs I send to // num_send = # of datums I send to each proc @@ -679,8 +680,182 @@ int Irregular::create_data(int n, int *proclist, int sortflag) // receive incoming messages // proc_recv = procs I recv from - // num_recv = total size of message each proc sends me - // nrecvdatum = total size of data I recv + // num_recv = # of datums each proc sends me + // nrecvdatum = total # of datums I recv + + int nrecvdatum = 0; + for (i = 0; i < nrecv_proc; i++) { + MPI_Recv(&num_recv[i],1,MPI_INT,MPI_ANY_SOURCE,0,world,status); + proc_recv[i] = status->MPI_SOURCE; + nrecvdatum += num_recv[i]; + } + nrecvdatum += num_self; + + // sort proc_recv and num_recv by proc ID if requested + // useful for debugging to insure reproducible ordering of received datums + + if (sortflag) { + int *order = new int[nrecv_proc]; + int *proc_recv_ordered = new int[nrecv_proc]; + int *num_recv_ordered = new int[nrecv_proc]; + + for (i = 0; i < nrecv_proc; i++) order[i] = i; + +#if defined(LMP_QSORT) + proc_recv_copy = proc_recv; + qsort(order,nrecv_proc,sizeof(int),compare_standalone); +#else + merge_sort(order,nrecv_proc,(void *)proc_recv,compare_standalone); +#endif + + int j; + for (i = 0; i < nrecv_proc; i++) { + j = order[i]; + proc_recv_ordered[i] = proc_recv[j]; + num_recv_ordered[i] = num_recv[j]; + } + + memcpy(proc_recv,proc_recv_ordered,nrecv_proc*sizeof(int)); + memcpy(num_recv,num_recv_ordered,nrecv_proc*sizeof(int)); + delete [] order; + delete [] proc_recv_ordered; + delete [] num_recv_ordered; + } + + // barrier to insure all MPI_ANY_SOURCE messages are received + // else another proc could proceed to exchange_data() and send to me + + MPI_Barrier(world); + + // return # of datums I will receive + + return nrecvdatum; +} + +/* ---------------------------------------------------------------------- + create communication plan based on list of datums of uniform size + n = # of datums to send + procs = how many datums to send to each proc, must include self + sort = flag for sorting order of received messages by proc ID + return total # of datums I will recv, including any to self +------------------------------------------------------------------------- */ + +int Irregular::create_data_grouped(int n, int *procs, int sortflag) +{ + int i,j,k,m; + + // setup for collective comm + // work1 = # of datums I send to each proc, set self to 0 + // work2 = 1 for all procs, used for ReduceScatter + + for (i = 0; i < nprocs; i++) { + work1[i] = procs[i]; + work2[i] = 1; + } + work1[me] = 0; + + // nrecv_proc = # of procs I receive messages from, not including self + // options for performing ReduceScatter operation + // some are more efficient on some machines at big sizes + +#ifdef LAMMPS_RS_ALLREDUCE_INPLACE + MPI_Allreduce(MPI_IN_PLACE,work1,nprocs,MPI_INT,MPI_SUM,world); + nrecv_proc = work1[me]; +#else +#ifdef LAMMPS_RS_ALLREDUCE + MPI_Allreduce(work1,work2,nprocs,MPI_INT,MPI_SUM,world); + nrecv_proc = work2[me]; +#else + MPI_Reduce_scatter(work1,&nrecv_proc,work2,MPI_INT,MPI_SUM,world); +#endif +#endif + + // allocate receive arrays + + proc_recv = new int[nrecv_proc]; + num_recv = new int[nrecv_proc]; + request = new MPI_Request[nrecv_proc]; + status = new MPI_Status[nrecv_proc]; + + // work1 = # of datums I send to each proc, including self + // nsend_proc = # of procs I send messages to, not including self + + for (i = 0; i < nprocs; i++) work1[i] = procs[i]; + + nsend_proc = 0; + for (i = 0; i < nprocs; i++) + if (work1[i]) nsend_proc++; + if (work1[me]) nsend_proc--; + + // allocate send and self arrays + + proc_send = new int[nsend_proc]; + num_send = new int[nsend_proc]; + index_send = new int[n-work1[me]]; + index_self = new int[work1[me]]; + maxindex = n; + + // proc_send = procs I send to + // num_send = # of datums I send to each proc + // num_self = # of datums I copy to self + // to balance pattern of send messages: + // each proc begins with iproc > me, continues until iproc = me + // reset work1 to store which send message each proc corresponds to + + int iproc = me; + int isend = 0; + for (i = 0; i < nprocs; i++) { + iproc++; + if (iproc == nprocs) iproc = 0; + if (iproc == me) { + num_self = work1[iproc]; + work1[iproc] = 0; + } else if (work1[iproc] > 0) { + proc_send[isend] = iproc; + num_send[isend] = work1[iproc]; + work1[iproc] = isend; + isend++; + } + } + + // work2 = offsets into index_send for each proc I send to + // m = ptr into index_self + // index_send = list of which datums to send to each proc + // 1st N1 values are datum indices for 1st proc, + // next N2 values are datum indices for 2nd proc, etc + // index_self = list of which datums to copy to self + + work2[0] = 0; + for (i = 1; i < nsend_proc; i++) work2[i] = work2[i-1] + num_send[i-1]; + + m = 0; + i = 0; + for (iproc = 0; iproc < nprocs; iproc++) { + k = procs[iproc]; + for (j = 0; j < k; j++) { + if (iproc == me) index_self[m++] = i++; + else { + isend = work1[iproc]; + index_send[work2[isend]++] = i++; + } + } + } + + // tell receivers how much data I send + // sendmax_proc = largest # of datums I send in a single message + + sendmax_proc = 0; + for (i = 0; i < nsend_proc; i++) { + MPI_Request tmpReq; // Use non-blocking send to avoid possible deadlock + MPI_Isend(&num_send[i],1,MPI_INT,proc_send[i],0,world,&tmpReq); + MPI_Request_free(&tmpReq); // the MPI_Barrier below marks completion + sendmax_proc = MAX(sendmax_proc,num_send[i]); + } + + // receive incoming messages + // proc_recv = procs I recv from + // num_recv = # of datums each proc sends me + // nrecvdatum = total # of datums I recv int nrecvdatum = 0; for (i = 0; i < nrecv_proc; i++) { @@ -789,6 +964,12 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) // wait on all incoming messages if (nrecv_proc) MPI_Waitall(nrecv_proc,request,status); + + // approximate memory tally + + bigint irregular_bytes = 2*nprocs*sizeof(int); + irregular_bytes += maxindex*sizeof(int); + irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- diff --git a/src/irregular.h b/src/irregular.h index 1f74fe801b..d56bcb253d 100644 --- a/src/irregular.h +++ b/src/irregular.h @@ -33,6 +33,7 @@ class Irregular : protected Pointers { int *procassign = NULL); int migrate_check(); int create_data(int, int *, int sortflag = 0); + int create_data_grouped(int, int *, int sortflag = 0); void exchange_data(char *, int, char *); void destroy_data(); bigint memory_usage(); @@ -48,6 +49,7 @@ class Irregular : protected Pointers { double *dbuf; // double buf for largest single atom send int maxbuf; // size of char buf in bytes char *buf; // char buf for largest single data send + int maxindex; // combined size of index_send + index_self int *mproclist,*msizes; // persistent vectors in migrate_atoms int maxlocal; // allocated size of mproclist and msizes diff --git a/src/special.cpp b/src/special.cpp index b0d5bc7dca..34685d8c65 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -172,10 +172,9 @@ void Special::atom_owners() IDRvous *idbuf = (IDRvous *) memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); - // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = random hash of atomID + // setup input buf for rendezvous comm // one datum for each owned atom: datum = owning proc, atomID + // each proc assigned every 1/Pth atom for (int i = 0; i < nlocal; i++) { proclist[i] = tag[i] % nprocs; @@ -184,19 +183,18 @@ void Special::atom_owners() } // perform rendezvous operation - // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(nlocal,proclist, - (char *) idbuf,sizeof(IDRvous), - rendezvous_ids,buf,0,(void *) this); + comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); } /* ---------------------------------------------------------------------- - onetwo build + onetwo build when newton_bond flag on + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onetwo_build_newton() @@ -225,9 +223,8 @@ void Special::onetwo_build_newton() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = pairs of bonded atoms - // owning proc for each datum = atomID % nprocs - // one datum for each bond partner: bond partner ID, atomID + // one datum for each unowned bond partner: bond partner ID, atomID + // owning proc for each datum = bond partner ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -242,19 +239,19 @@ void Special::onetwo_build_newton() } // perform rendezvous operation - // each proc owns random subset of atoms char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[0] and onetwo for all owned atoms based on output info + // set nspecial[0] and onetwo for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-2 neighbors for (i = 0; i < nlocal; i++) { @@ -327,8 +324,8 @@ void Special::onetwo_build_newton_off() } /* ---------------------------------------------------------------------- - onetwo build with newton_bond flag off - no need for rendezvous comm + onethree build + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onethree_build() @@ -355,10 +352,10 @@ void Special::onethree_build() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = all pairs of onetwo atoms (they are 1-3 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onetwo pair: datum = atomID1, atomID2 + // datums = pairs of onetwo partners where either is unknown + // these pairs are onethree neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onetwo ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -377,20 +374,19 @@ void Special::onethree_build() } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onethree lists char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[1] and onethree for all owned atoms based on output info + // set nspecial[1] and onethree for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-3 neighbors for (i = 0; i < nlocal; i++) { @@ -434,7 +430,8 @@ void Special::onethree_build() } /* ---------------------------------------------------------------------- - remove duplicates within each of onetwo, onethree, onefour individually + onefour build + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::onefour_build() @@ -446,7 +443,6 @@ void Special::onefour_build() int nlocal = atom->nlocal; // nsend = # of my datums to send - // include nlocal datums with owner of each atom int nsend = 0; for (i = 0; i < nlocal; i++) { @@ -462,10 +458,10 @@ void Special::onefour_build() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm - // input datums = all pairs of onethree and onetwo atoms (they're 1-4 neighbors) - // owning proc for each datum = random hash of atomID - // one datum for each owned atom: datum = owning proc, atomID - // one datum for each onethree/onetwo pair: datum = atomID1, atomID2 + // datums = pairs of onethree and onetwo partners where onethree is unknown + // these pairs are onefour neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onethree ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -483,20 +479,19 @@ void Special::onefour_build() } // perform rendezvous operation - // each proc owns random subset of atoms - // receives all info to form and return their onefour lists char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // set nspecial[2] and onefour for all owned atoms based on output info + // set nspecial[2] and onefour for all owned atoms + // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-4 neighbors for (i = 0; i < nlocal; i++) { @@ -780,6 +775,7 @@ void Special::combine() trim list of 1-3 neighbors by checking defined angles delete a 1-3 neigh if they are not end atoms of a defined angle and if they are not 1,3 or 2,4 atoms of a defined dihedral + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::angle_trim() @@ -849,6 +845,10 @@ void Special::angle_trim() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm + // datums = pairs of onetwo partners where either is unknown + // these pairs are onethree neighbors + // datum = onetwo ID, onetwo ID + // owning proc for each datum = onetwo ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -902,14 +902,11 @@ void Special::angle_trim() } // perform rendezvous operation - // each proc owns random subset of atoms - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; @@ -931,6 +928,8 @@ void Special::angle_trim() flag[i][j] = 0; // reset nspecial[1] and onethree for all owned atoms based on output info + // based on owned info plus rendezvous output info + // output datums = pairs of atoms that are 1-3 neighbors for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { @@ -1036,8 +1035,9 @@ void Special::angle_trim() } /* ---------------------------------------------------------------------- - trim list of 1-4 neighbors by checking defined dihedrals + trim list of 1-4 neighbors by checking all defined dihedrals delete a 1-4 neigh if they are not end atoms of a defined dihedral + uses rendezvous comm ------------------------------------------------------------------------- */ void Special::dihedral_trim() @@ -1068,12 +1068,11 @@ void Special::dihedral_trim() " %g = # of 1-4 neighbors before dihedral trim\n",allcount); } - // if dihedrals are defined, rendezvous dihedral 1-4 pairs + // if dihedrals are defined, rendezvous the dihedral 1-4 pairs if (num_dihedral && atom->ndihedrals) { // nsend = # of my datums to send - // latter is only for dihedrals where I own atom2 (newton bond off) int nsend = 0; for (i = 0; i < nlocal; i++) { @@ -1092,6 +1091,11 @@ void Special::dihedral_trim() memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm + // datums = pairs of onefour atom IDs in a dihedral defined for my atoms + // only dihedrals where I own atom2 (in case newton_bond off) + // datum = atom1 ID and atom4 ID + // send the datum twice, to owner of atom1 ID and atom4 ID + // owning procs for each datum = atom1 or atom4 ID % nprocs nsend = 0; for (i = 0; i < nlocal; i++) { @@ -1117,21 +1121,18 @@ void Special::dihedral_trim() } // perform rendezvous operation - // each proc owns random subset of atoms - // func = compute bbox of each body, flag atom closest to geometric center - // when done: each atom has atom ID of owning atom of its body char *buf; - int nreturn = comm->rendezvous(nsend,proclist, - (char *) inbuf,sizeof(PairRvous), - rendezvous_pairs,buf,sizeof(PairRvous), + int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); memory->sfree(inbuf); - // flag all onefour atoms to keep + // flag all of my onefour IDs to keep int max = 0; for (i = 0; i < nlocal; i++) @@ -1145,8 +1146,6 @@ void Special::dihedral_trim() for (j = 0; j < nspecial[i][2]; j++) flag[i][j] = 0; - // reset nspecial[2] and onefour for all owned atoms based on output info - for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { if (tag[i] != dihedral_atom2[i][j]) continue; @@ -1251,7 +1250,7 @@ int Special::rendezvous_ids(int n, char *inbuf, sptr->procowner = procowner; sptr->atomIDs = atomIDs; - // flag = 0: no 2nd irregular comm needed in comm->rendezvous + // flag = 0: no second comm needed in rendezvous flag = 0; return 0; @@ -1272,7 +1271,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, Atom *atom = sptr->atom; Memory *memory = sptr->memory; - // clear atom map so it can be here as a hash table + // clear atom map so it can be used here as a hash table // faster than an STL map for large atom counts atom->map_clear(); From bbe6c9bb631b2aecbbae57f3792e4fc8d33a0187 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Jan 2019 16:01:10 -0700 Subject: [PATCH 150/243] added diagnostic info for memory and balance info --- src/RIGID/fix_shake.cpp | 8 +- src/comm.cpp | 185 ++++++++++++++++++++++++++++++++++++---- src/comm.h | 6 +- src/irregular.cpp | 7 +- src/special.cpp | 12 +-- 5 files changed, 184 insertions(+), 34 deletions(-) diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 35153de839..46e478064c 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1070,7 +1070,7 @@ void FixShake::atom_owners() char *buf; comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, - rendezvous_ids,0,buf,0,(void *) this); + rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); memory->sfree(idbuf); @@ -1178,7 +1178,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), - (void *) this); + (void *) this,1); PartnerInfo *outbuf = (PartnerInfo *) buf; memory->destroy(proclist); @@ -1266,7 +1266,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), - (void *) this); + (void *) this,1); NShakeInfo *outbuf = (NShakeInfo *) buf; memory->destroy(proclist); @@ -1359,7 +1359,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), - (void *) this); + (void *) this,1); ShakeInfo *outbuf = (ShakeInfo *) buf; memory->destroy(proclist); diff --git a/src/comm.cpp b/src/comm.cpp index 39d4311aa2..54476078be 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -766,18 +766,14 @@ int Comm:: rendezvous(int which, int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr) + int outorder, char *&outbuf, int outsize, void *ptr, int statflag) { - int nout; - if (which == 0) - nout = rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr); + return rendezvous_irregular(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr,statflag); else - nout = rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, - outorder,outbuf,outsize,ptr); - - return nout; + return rendezvous_all2all(n,inbuf,insize,inorder,procs,callback, + outorder,outbuf,outsize,ptr,statflag); } /* ---------------------------------------------------------------------- */ @@ -786,7 +782,7 @@ int Comm:: rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), int outorder, char *&outbuf, - int outsize, void *ptr) + int outsize, void *ptr, int statflag) { // irregular comm of inbuf from caller decomp to rendezvous decomp @@ -837,8 +833,82 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(procs_rvous); memory->sfree(outbuf_rvous); - // approximate memory tally + // return number of output datums + if (!statflag) return nout; + + // memory info for caller and rendezvous decompositions + + bigint size_in_all,size_in_max,size_in_min; + bigint size_out_all,size_out_max,size_out_min; + bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; + bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + + bigint size = (bigint) n*insize; + MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nout*outsize; + MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous*insize; + MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous_out*insize; + MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + int mbytes = 1024*1024; + + if (me == 0) { + if (screen) { + fprintf(screen,"Rendezvous balance and memory info:\n"); + fprintf(screen," input datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_in_all/insize,1.0*size_in_all/nprocs/insize, + size_in_max/insize,size_in_min/insize); + fprintf(screen," input data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, + 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); + fprintf(screen," output datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + fprintf(screen," output data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, + 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); + fprintf(screen," input rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, + size_inrvous_max/insize,size_inrvous_min/insize); + fprintf(screen," input rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, + 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); + fprintf(screen," output rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + fprintf(screen," output rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, + 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + } + } + + /* bigint rvous_bytes = 0; rvous_bytes += n*insize; // inbuf rvous_bytes += nout*outsize; // outbuf @@ -846,8 +916,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, rvous_bytes += nrvous_out*outsize; // outbuf_rvous rvous_bytes += nrvous_out*sizeof(int); // procs_rvous rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms - - // return number of output datums + */ return nout; } @@ -857,7 +926,8 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, int Comm:: rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, int outsize, void *ptr) + int outorder, char *&outbuf, int outsize, void *ptr, + int statflag) { int iproc; bigint all2all1_bytes,all2all2_bytes; @@ -956,7 +1026,13 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd irregular + if (flag == 0) { + memory->destroy(sendcount); + memory->destroy(recvcount); + memory->destroy(sdispls); + memory->destroy(rdispls); + return 0; // all nout_rvous are 0, no 2nd irregular + } // create procs and outbuf for All2all if necesary @@ -1044,8 +1120,82 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(sdispls); memory->destroy(rdispls); - // approximate memory tally + // return number of output datums + if (!statflag) return nout; + + // memory info for caller and rendezvous decompositions + + bigint size_in_all,size_in_max,size_in_min; + bigint size_out_all,size_out_max,size_out_min; + bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; + bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + + bigint size = (bigint) n*insize; + MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nout*outsize; + MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous*insize; + MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + size = (bigint) nrvous_out*insize; + MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + + int mbytes = 1024*1024; + + if (me == 0) { + if (screen) { + fprintf(screen,"Rendezvous balance and memory info:\n"); + fprintf(screen," input datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_in_all/insize,1.0*size_in_all/nprocs/insize, + size_in_max/insize,size_in_min/insize); + fprintf(screen," input data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, + 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); + fprintf(screen," output datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + fprintf(screen," output data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, + 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); + fprintf(screen," input rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, + size_inrvous_max/insize,size_inrvous_min/insize); + fprintf(screen," input rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, + 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); + fprintf(screen," output rvous datum count " + "(tot,ave,max,min): " BIGINT_FORMAT " %g " + BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + fprintf(screen," output rvous data (MB) " + "(tot,ave,max,min): %g %g %g %g\n", + 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, + 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + } + } + + /* bigint rvous_bytes = 0; rvous_bytes += n*insize; // inbuf rvous_bytes += nout*outsize; // outbuf @@ -1054,8 +1204,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, rvous_bytes += nrvous_out*sizeof(int); // procs_rvous rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops - - // return number of datums + */ return nout; } diff --git a/src/comm.h b/src/comm.h index 807da9bf0d..89889e3ebe 100644 --- a/src/comm.h +++ b/src/comm.h @@ -111,7 +111,7 @@ class Comm : protected Pointers { void *, void *, int self = 1); int rendezvous(int, int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int statflag=0); int read_lines_from_file(FILE *, int, int, char *); int read_lines_from_file_universe(FILE *, int, int, char *); @@ -149,10 +149,10 @@ class Comm : protected Pointers { int rendezvous_irregular(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int); int rendezvous_all2all(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), - int, char *&, int, void *); + int, char *&, int, void *, int); public: enum{MULTIPLE}; diff --git a/src/irregular.cpp b/src/irregular.cpp index 77278ec4c5..c27a8c8e18 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -966,10 +966,11 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) if (nrecv_proc) MPI_Waitall(nrecv_proc,request,status); // approximate memory tally + // DEBUG lines - bigint irregular_bytes = 2*nprocs*sizeof(int); - irregular_bytes += maxindex*sizeof(int); - irregular_bytes += maxbuf; + //bigint irregular_bytes = 2*nprocs*sizeof(int); + //irregular_bytes += maxindex*sizeof(int); + //irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- diff --git a/src/special.cpp b/src/special.cpp index 34685d8c65..5e0f865488 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -186,7 +186,7 @@ void Special::atom_owners() char *buf; comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, - rendezvous_ids,0,buf,0,(void *) this); + rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); memory->sfree(idbuf); @@ -244,7 +244,7 @@ void Special::onetwo_build_newton() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -379,7 +379,7 @@ void Special::onethree_build() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -484,7 +484,7 @@ void Special::onefour_build() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -907,7 +907,7 @@ void Special::angle_trim() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1126,7 +1126,7 @@ void Special::dihedral_trim() int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + (void *) this,1); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); From 62045a9c52b3df771e86af49a68fb4ac3a0e4c37 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 24 Jan 2019 09:56:21 -0700 Subject: [PATCH 151/243] cleanup up rendezvous diagnostic output --- src/RIGID/fix_rigid_small.cpp | 19 +++- src/RIGID/fix_shake.cpp | 10 ++- src/comm.cpp | 163 +++++++++------------------------- src/comm.h | 1 + src/special.cpp | 14 +-- 5 files changed, 73 insertions(+), 134 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 7c6aab4861..8697f66056 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -28,6 +28,7 @@ #include "modify.h" #include "group.h" #include "comm.h" +#include "neighbor.h" #include "force.h" #include "input.h" #include "output.h" @@ -44,6 +45,8 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; +#define RVOUS 1 // 0 for irregular, 1 for all2all + #define MAXLINE 1024 #define CHUNK 1024 #define ATTRIBUTE_PERBODY 20 @@ -585,12 +588,22 @@ void FixRigidSmall::init() if (rflag && (modify->fmask[i] & POST_FORCE) && !modify->fix[i]->rigid_flag) { char str[128]; - snprintf(str,128,"Fix %s alters forces after fix rigid",modify->fix[i]->id); + snprintf(str,128,"Fix %s alters forces after fix rigid", + modify->fix[i]->id); error->warning(FLERR,str); } } } + // error if maxextent > comm->cutghost + // NOTE: could just warn if an override flag set + // NOTE: this could fail for comm multi mode if user sets a wrong cutoff + // for atom types in rigid bodies - need a more careful test + + double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); + if (maxextent > cutghost) + error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); + // error if npt,nph fix comes before rigid fix for (i = 0; i < modify->nfix; i++) { @@ -1576,10 +1589,10 @@ void FixRigidSmall::create_bodies(tagint *bodyID) // func = compute bbox of each body, find atom closest to geometric center char *buf; - int nreturn = comm->rendezvous(1,ncount,(char *) inbuf,sizeof(InRvous), + int nreturn = comm->rendezvous(RVOUS,ncount,(char *) inbuf,sizeof(InRvous), 0,proclist, rendezvous_body,0,buf,sizeof(OutRvous), - (void *) this); + (void *) this,1); OutRvous *outbuf = (OutRvous *) buf; memory->destroy(proclist); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 46e478064c..2d3244885d 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -39,6 +39,8 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; +#define RVOUS 1 // 0 for irregular, 1 for all2all + #define BIG 1.0e20 #define MASSDELTA 0.1 @@ -1068,7 +1070,7 @@ void FixShake::atom_owners() // each proc assigned every 1/Pth atom char *buf; - comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous), + comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, rendezvous_ids,0,buf,0,(void *) this,1); @@ -1174,7 +1176,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner 4 values char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PartnerInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PartnerInfo), 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), @@ -1263,7 +1265,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned partner nshake char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(NShakeInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), (void *) this,1); @@ -1356,7 +1358,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, // receives all data needed to populate un-owned shake info char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(ShakeInfo), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), (void *) this,1); diff --git a/src/comm.cpp b/src/comm.cpp index 54476078be..e8a796036c 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -796,7 +796,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, "rendezvous:inbuf"); irregular->exchange_data(inbuf,insize,inbuf_rvous); - bigint irregular1_bytes = 0; //irregular->irregular_bytes; + bigint irregular1_bytes = irregular->memory_usage(); irregular->destroy_data(); delete irregular; @@ -826,7 +826,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, "rendezvous:outbuf"); irregular->exchange_data(outbuf_rvous,outsize,outbuf); - bigint irregular2_bytes = 0; //irregular->irregular_bytes; + bigint irregular2_bytes = irregular->memory_usage(); irregular->destroy_data(); delete irregular; @@ -834,90 +834,11 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, memory->sfree(outbuf_rvous); // return number of output datums + // last arg to stats() = memory for procs_rvous + irregular comm - if (!statflag) return nout; - - // memory info for caller and rendezvous decompositions - - bigint size_in_all,size_in_max,size_in_min; - bigint size_out_all,size_out_max,size_out_min; - bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; - bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; - - bigint size = (bigint) n*insize; - MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_in_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_in_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nout*outsize; - MPI_Allreduce(&size,&size_out_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_out_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_out_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous*insize; - MPI_Allreduce(&size,&size_inrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_inrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_inrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - size = (bigint) nrvous_out*insize; - MPI_Allreduce(&size,&size_outrvous_all,1,MPI_LMP_BIGINT,MPI_SUM,world); - MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); - MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); - - int mbytes = 1024*1024; - - if (me == 0) { - if (screen) { - fprintf(screen,"Rendezvous balance and memory info:\n"); - fprintf(screen," input datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_in_all/insize,1.0*size_in_all/nprocs/insize, - size_in_max/insize,size_in_min/insize); - fprintf(screen," input data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, - 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_out_all/outsize,1.0*size_out_all/nprocs/outsize, - size_out_max/outsize,size_out_min/outsize); - fprintf(screen," output data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, - 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); - fprintf(screen," input rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, - size_inrvous_max/insize,size_inrvous_min/insize); - fprintf(screen," input rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, - 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, - size_outrvous_max/outsize,size_outrvous_min/outsize); - fprintf(screen," output rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", - 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, - 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); - } - } - - /* - bigint rvous_bytes = 0; - rvous_bytes += n*insize; // inbuf - rvous_bytes += nout*outsize; // outbuf - rvous_bytes += nrvous*insize; // inbuf_rvous - rvous_bytes += nrvous_out*outsize; // outbuf_rvous - rvous_bytes += nrvous_out*sizeof(int); // procs_rvous - rvous_bytes += MAX(irregular1_bytes,irregular2_bytes); // max of 2 comms - */ - + if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + MAX(irregular1_bytes,irregular2_bytes)); return nout; } @@ -1121,15 +1042,28 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(rdispls); // return number of output datums + // last arg to stats() = mem for procs_rvous + per-proc vecs + reordering ops - if (!statflag) return nout; + if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + 4*nprocs*sizeof(int) + + MAX(all2all1_bytes,all2all2_bytes)); + return nout; +} - // memory info for caller and rendezvous decompositions +/* ---------------------------------------------------------------------- + print balance and memory info for rendezvous operation + useful for debugging +------------------------------------------------------------------------- */ +void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, + int insize, int outsize, bigint commsize) +{ bigint size_in_all,size_in_max,size_in_min; bigint size_out_all,size_out_max,size_out_min; bigint size_inrvous_all,size_inrvous_max,size_inrvous_min; bigint size_outrvous_all,size_outrvous_max,size_outrvous_min; + bigint size_comm_all,size_comm_max,size_comm_min; bigint size = (bigint) n*insize; MPI_Allreduce(&size,&size_in_all,1,MPI_LMP_BIGINT,MPI_SUM,world); @@ -1151,62 +1085,49 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, MPI_Allreduce(&size,&size_outrvous_max,1,MPI_LMP_BIGINT,MPI_MAX,world); MPI_Allreduce(&size,&size_outrvous_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + size = commsize; + MPI_Allreduce(&size,&size_comm_all,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&size,&size_comm_max,1,MPI_LMP_BIGINT,MPI_MAX,world); + MPI_Allreduce(&size,&size_comm_min,1,MPI_LMP_BIGINT,MPI_MIN,world); + int mbytes = 1024*1024; if (me == 0) { if (screen) { - fprintf(screen,"Rendezvous balance and memory info:\n"); - fprintf(screen," input datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen,"Rendezvous balance and memory info: (tot,ave,max,min) \n"); + fprintf(screen," input datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_in_all/insize,1.0*size_in_all/nprocs/insize, size_in_max/insize,size_in_min/insize); - fprintf(screen," input data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," input data (MB): %g %g %g %g\n", 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_out_all/outsize,1.0*size_out_all/nprocs/outsize, size_out_max/outsize,size_out_min/outsize); - fprintf(screen," output data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," output data (MB): %g %g %g %g\n", 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); - fprintf(screen," input rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," input rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_inrvous_all/insize,1.0*size_inrvous_all/nprocs/insize, size_inrvous_max/insize,size_inrvous_min/insize); - fprintf(screen," input rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," input rvous data (MB): %g %g %g %g\n", 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count " - "(tot,ave,max,min): " BIGINT_FORMAT " %g " - BIGINT_FORMAT " " BIGINT_FORMAT "\n", + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, size_outrvous_max/outsize,size_outrvous_min/outsize); - fprintf(screen," output rvous data (MB) " - "(tot,ave,max,min): %g %g %g %g\n", + fprintf(screen," output rvous data (MB): %g %g %g %g\n", 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); + fprintf(screen," rvous comm (MB): %g %g %g %g\n", + 1.0*size_comm_all/mbytes,1.0*size_comm_all/nprocs/mbytes, + 1.0*size_comm_max/mbytes,1.0*size_comm_min/mbytes); } } - - /* - bigint rvous_bytes = 0; - rvous_bytes += n*insize; // inbuf - rvous_bytes += nout*outsize; // outbuf - rvous_bytes += nrvous*insize; // inbuf_rvous - rvous_bytes += nrvous_out*outsize; // outbuf_rvous - rvous_bytes += nrvous_out*sizeof(int); // procs_rvous - rvous_bytes += 4*nprocs*sizeof(int); // all2all vectors - rvous_bytes += MAX(all2all1_bytes,all2all2_bytes); // reorder ops - */ - - return nout; } /* ---------------------------------------------------------------------- diff --git a/src/comm.h b/src/comm.h index 89889e3ebe..9c0112b4c4 100644 --- a/src/comm.h +++ b/src/comm.h @@ -153,6 +153,7 @@ class Comm : protected Pointers { int rendezvous_all2all(int, char *, int, int, int *, int (*)(int, char *, int &, int *&, char *&, void *), int, char *&, int, void *, int); + void rendezvous_stats(int, int, int, int, int, int, bigint); public: enum{MULTIPLE}; diff --git a/src/special.cpp b/src/special.cpp index 5e0f865488..a0739d6ccc 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -27,6 +27,8 @@ using namespace LAMMPS_NS; +#define RVOUS 1 // 0 for irregular, 1 for all2all + /* ---------------------------------------------------------------------- */ Special::Special(LAMMPS *lmp) : Pointers(lmp) @@ -185,7 +187,7 @@ void Special::atom_owners() // perform rendezvous operation char *buf; - comm->rendezvous(1,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, + comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, rendezvous_ids,0,buf,0,(void *) this,1); memory->destroy(proclist); @@ -241,7 +243,7 @@ void Special::onetwo_build_newton() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -376,7 +378,7 @@ void Special::onethree_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -481,7 +483,7 @@ void Special::onefour_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -904,7 +906,7 @@ void Special::angle_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); @@ -1123,7 +1125,7 @@ void Special::dihedral_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(1,nsend,(char *) inbuf,sizeof(PairRvous), + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this,1); From 0bf6b915768baa1ee85fe84f337d9f772f361421 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 10:20:32 -0600 Subject: [PATCH 152/243] bug fix for new fix shake redezvous comm --- src/RIGID/fix_shake.h | 2 +- src/comm.cpp | 41 ++++++++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index 2baea90a4a..b99a35f958 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -159,8 +159,8 @@ class FixShake : public Fix { struct ShakeInfo { tagint atomID; + tagint shake_atom[4]; int shake_flag; - int shake_atom[4]; int shake_type[3]; }; diff --git a/src/comm.cpp b/src/comm.cpp index e8a796036c..729f96581a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -810,7 +810,12 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, procs_rvous,outbuf_rvous,ptr); if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous - if (flag == 0) return 0; // all nout_rvous are 0, no 2nd comm stage + if (flag == 0) { + if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + irregular1_bytes); + return 0; // all nout_rvous are 0, no 2nd comm stage + } // irregular comm of outbuf from rendezvous decomp back to caller decomp // caller will free outbuf @@ -952,9 +957,17 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(recvcount); memory->destroy(sdispls); memory->destroy(rdispls); + if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, + (bigint) nrvous_out*sizeof(int) + + 4*nprocs*sizeof(int) + all2all1_bytes); return 0; // all nout_rvous are 0, no 2nd irregular } + + + + + // create procs and outbuf for All2all if necesary if (!outorder) { @@ -1102,10 +1115,15 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, fprintf(screen," input data (MB): %g %g %g %g\n", 1.0*size_in_all/mbytes,1.0*size_in_all/nprocs/mbytes, 1.0*size_in_max/mbytes,1.0*size_in_min/mbytes); - fprintf(screen," output datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_out_all/outsize,1.0*size_out_all/nprocs/outsize, - size_out_max/outsize,size_out_min/outsize); + if (outsize) + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_out_all/outsize,1.0*size_out_all/nprocs/outsize, + size_out_max/outsize,size_out_min/outsize); + else + fprintf(screen," output datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + 0,0.0,0,0); fprintf(screen," output data (MB): %g %g %g %g\n", 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); @@ -1116,10 +1134,15 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, fprintf(screen," input rvous data (MB): %g %g %g %g\n", 1.0*size_inrvous_all/mbytes,1.0*size_inrvous_all/nprocs/mbytes, 1.0*size_inrvous_max/mbytes,1.0*size_inrvous_min/mbytes); - fprintf(screen," output rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, - size_outrvous_max/outsize,size_outrvous_min/outsize); + if (outsize) + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, + size_outrvous_max/outsize,size_outrvous_min/outsize); + else + fprintf(screen," output rvous datum count: " + BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", + 0,0.0,0,0); fprintf(screen," output rvous data (MB): %g %g %g %g\n", 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); From 1ca0c78a2e97a06f9f41c53a21e04dc7457c04ef Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 25 Mar 2019 10:29:06 -0600 Subject: [PATCH 153/243] turn off diagnostic output for rendezvous op --- src/RIGID/fix_rigid_small.cpp | 2 +- src/RIGID/fix_shake.cpp | 8 ++++---- src/special.cpp | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 8697f66056..d74dd0fc3b 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1592,7 +1592,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) int nreturn = comm->rendezvous(RVOUS,ncount,(char *) inbuf,sizeof(InRvous), 0,proclist, rendezvous_body,0,buf,sizeof(OutRvous), - (void *) this,1); + (void *) this); OutRvous *outbuf = (OutRvous *) buf; memory->destroy(proclist); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 2d3244885d..dcdb190d45 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1072,7 +1072,7 @@ void FixShake::atom_owners() char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, - rendezvous_ids,0,buf,0,(void *) this,1); + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -1180,7 +1180,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, 0,proclist, rendezvous_partners_info, 0,buf,sizeof(PartnerInfo), - (void *) this,1); + (void *) this); PartnerInfo *outbuf = (PartnerInfo *) buf; memory->destroy(proclist); @@ -1268,7 +1268,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(NShakeInfo), 0,proclist, rendezvous_nshake,0,buf,sizeof(NShakeInfo), - (void *) this,1); + (void *) this); NShakeInfo *outbuf = (NShakeInfo *) buf; memory->destroy(proclist); @@ -1361,7 +1361,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(ShakeInfo), 0,proclist, rendezvous_shake,0,buf,sizeof(ShakeInfo), - (void *) this,1); + (void *) this); ShakeInfo *outbuf = (ShakeInfo *) buf; memory->destroy(proclist); diff --git a/src/special.cpp b/src/special.cpp index a0739d6ccc..b9287df472 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -188,7 +188,7 @@ void Special::atom_owners() char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, - rendezvous_ids,0,buf,0,(void *) this,1); + rendezvous_ids,0,buf,0,(void *) this); memory->destroy(proclist); memory->sfree(idbuf); @@ -246,7 +246,7 @@ void Special::onetwo_build_newton() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -381,7 +381,7 @@ void Special::onethree_build() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -486,7 +486,7 @@ void Special::onefour_build() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -909,7 +909,7 @@ void Special::angle_trim() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1128,7 +1128,7 @@ void Special::dihedral_trim() int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this,1); + (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); From 1266b866e09d5f0b1af7b799c3eabe9201c70261 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 14:03:29 -0400 Subject: [PATCH 154/243] add some degree of endian detection to hashlittle.cpp --- src/hashlittle.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index be930217a1..f1d4e61142 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -2,10 +2,26 @@ // from lookup3.c, by Bob Jenkins, May 2006, Public Domain // bob_jenkins@burtleburtle.net -#include "stddef.h" -#include "stdint.h" +#include +#include +#include -#define HASH_LITTLE_ENDIAN 1 // Intel and AMD are little endian +// if the system defines the __BYTE_ORDER__ define, +// we use it instead of guessing the platform + +#if defined(__BYTE_ORDER__) +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define HASH_LITTLE_ENDIAN 1 +# else +# define HASH_LITTLE_ENDIAN 0 +# endif +#else // heuristic platform guess +# if defined(__bg__) +# define HASH_LITTLE_ENDIAN 0 // IBM BlueGene is big endian +# else +# define HASH_LITTLE_ENDIAN 1 // Intel and AMD x86 are little endian +# endif +#endif #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) From fff28a8666f89b5b690c86e78d288f0867b04f40 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 11:17:21 -0400 Subject: [PATCH 155/243] remove trailing whitespace --- src/RIGID/fix_rigid_small.cpp | 16 +++---- src/RIGID/fix_shake.cpp | 78 ++++++++++++++++----------------- src/RIGID/fix_shake.h | 2 +- src/comm.cpp | 46 ++++++++++---------- src/comm.h | 12 ++--- src/hashlittle.cpp | 12 ++--- src/irregular.cpp | 2 +- src/special.cpp | 82 +++++++++++++++++------------------ src/special.h | 2 +- 9 files changed, 126 insertions(+), 126 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index d74dd0fc3b..afd597ef8e 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -601,7 +601,7 @@ void FixRigidSmall::init() // for atom types in rigid bodies - need a more careful test double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); - if (maxextent > cutghost) + if (maxextent > cutghost) error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); // error if npt,nph fix comes before rigid fix @@ -1549,7 +1549,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) // allocate buffer for input to rendezvous comm // ncount = # of my atoms in bodies - + int *mask = atom->mask; int nlocal = atom->nlocal; @@ -1559,7 +1559,7 @@ void FixRigidSmall::create_bodies(tagint *bodyID) int *proclist; memory->create(proclist,ncount,"rigid/small:proclist"); - InRvous *inbuf = (InRvous *) + InRvous *inbuf = (InRvous *) memory->smalloc(ncount*sizeof(InRvous),"rigid/small:inbuf"); // setup buf to pass to rendezvous comm @@ -1594,13 +1594,13 @@ void FixRigidSmall::create_bodies(tagint *bodyID) rendezvous_body,0,buf,sizeof(OutRvous), (void *) this); OutRvous *outbuf = (OutRvous *) buf; - + memory->destroy(proclist); memory->sfree(inbuf); // set bodytag of all owned atoms based on outbuf info for constituent atoms - for (i = 0; i < nlocal; i++) + for (i = 0; i < nlocal; i++) if (!(mask[i] & groupbit)) bodytag[i] = 0; for (m = 0; m < nreturn; m++) @@ -1650,7 +1650,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, InRvous *in = (InRvous *) inbuf; std::map hash; tagint id; - + int ncount = 0; for (i = 0; i < n; i++) { id = in[i].bodyID; @@ -1722,7 +1722,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, // compute rsqfar for all bodies I own // set rsqfar back in caller - + double rsqfar = 0.0; for (int i = 0; i < n; i++) { @@ -1742,7 +1742,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, int nout = n; memory->create(proclist,nout,"rigid/small:proclist"); - OutRvous *out = (OutRvous *) + OutRvous *out = (OutRvous *) memory->smalloc(nout*sizeof(OutRvous),"rigid/small:out"); for (int i = 0; i < nout; i++) { diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index dcdb190d45..6293028090 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -816,7 +816,7 @@ void FixShake::find_clusters() MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); if (flag_all) error->all(FLERR,"Did not find fix shake partner info"); - + // ----------------------------------------------------- // identify SHAKEable bonds // set nshake[i] = # of SHAKE bonds attached to atom i @@ -873,7 +873,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- nshake_info(npartner,partner_tag,partner_nshake); - + // ----------------------------------------------------- // error checks // no atom with nshake > 3 @@ -1052,7 +1052,7 @@ void FixShake::atom_owners() int *proclist; memory->create(proclist,nlocal,"shake:proclist"); - IDRvous *idbuf = (IDRvous *) + IDRvous *idbuf = (IDRvous *) memory->smalloc((bigint) nlocal*sizeof(IDRvous),"shake:idbuf"); // setup input buf to rendezvous comm @@ -1068,7 +1068,7 @@ void FixShake::atom_owners() // perform rendezvous operation // each proc assigned every 1/Pth atom - + char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous), 0,proclist, @@ -1091,7 +1091,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // nsend = # of my datums to send // one datum for every off-processor partner - + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < npartner[i]; j++) { @@ -1102,7 +1102,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, int *proclist; memory->create(proclist,nsend,"special:proclist"); - PartnerInfo *inbuf = (PartnerInfo *) + PartnerInfo *inbuf = (PartnerInfo *) memory->smalloc((bigint) nsend*sizeof(PartnerInfo),"special:inbuf"); // set values in 4 partner arrays for all partner atoms I own @@ -1117,9 +1117,9 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, int *type = atom->type; int *mask = atom->mask; tagint *tag = atom->tag; - + double massone; - + nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < npartner[i]; j++) { @@ -1129,7 +1129,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, partner_bondtype[i][j] = 0; m = atom->map(partner_tag[i][j]); - + if (m >= 0 && m < nlocal) { partner_mask[i][j] = mask[m]; partner_type[i][j] = type[m]; @@ -1182,13 +1182,13 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, 0,buf,sizeof(PartnerInfo), (void *) this); PartnerInfo *outbuf = (PartnerInfo *) buf; - + memory->destroy(proclist); memory->sfree(inbuf); // set partner 4 values for un-onwed partners based on output info // outbuf.atomID = my owned atom, outbuf.partnerID = partner the info is for - + for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); for (j = 0; j < npartner[i]; j++) @@ -1200,7 +1200,7 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, // only set partner_bondtype if my atom did not set it // when setting up rendezvous // if this proc set it, then sender of this datum set outbuf.bondtype = 0 - + if (partner_bondtype[i][j] == 0) partner_bondtype[i][j] = outbuf[m].bondtype; } @@ -1220,7 +1220,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, // nsend = # of my datums to send // one datum for every off-processor partner - + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < npartner[i]; j++) { @@ -1231,7 +1231,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, int *proclist; memory->create(proclist,nsend,"special:proclist"); - NShakeInfo *inbuf = (NShakeInfo *) + NShakeInfo *inbuf = (NShakeInfo *) memory->smalloc((bigint) nsend*sizeof(NShakeInfo),"special:inbuf"); // set partner_nshake for all partner atoms I own @@ -1270,7 +1270,7 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, rendezvous_nshake,0,buf,sizeof(NShakeInfo), (void *) this); NShakeInfo *outbuf = (NShakeInfo *) buf; - + memory->destroy(proclist); memory->sfree(inbuf); @@ -1299,7 +1299,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, // nsend = # of my datums to send // one datum for every off-processor partner - + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < npartner[i]; j++) { @@ -1310,7 +1310,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, int *proclist; memory->create(proclist,nsend,"special:proclist"); - ShakeInfo *inbuf = (ShakeInfo *) + ShakeInfo *inbuf = (ShakeInfo *) memory->smalloc((bigint) nsend*sizeof(ShakeInfo),"special:inbuf"); // set 3 shake arrays for all partner atoms I own @@ -1326,7 +1326,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, for (j = 0; j < npartner[i]; j++) { if (partner_shake[i][j] == 0) continue; m = atom->map(partner_tag[i][j]); - + if (m >= 0 && m < nlocal) { shake_flag[m] = shake_flag[i]; shake_atom[m][0] = shake_atom[i][0]; @@ -1363,7 +1363,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, rendezvous_shake,0,buf,sizeof(ShakeInfo), (void *) this); ShakeInfo *outbuf = (ShakeInfo *) buf; - + memory->destroy(proclist); memory->sfree(inbuf); @@ -1399,10 +1399,10 @@ int FixShake::rendezvous_ids(int n, char *inbuf, tagint *atomIDs; int *procowner; - + memory->create(atomIDs,n,"special:atomIDs"); memory->create(procowner,n,"special:procowner"); - + IDRvous *in = (IDRvous *) inbuf; for (int i = 0; i < n; i++) { @@ -1411,13 +1411,13 @@ int FixShake::rendezvous_ids(int n, char *inbuf, } // store rendezvous data in FixShake class - + fsptr->nrvous = n; fsptr->atomIDs = atomIDs; fsptr->procowner = procowner; // flag = 0: no second comm needed in rendezvous - + flag = 0; return 0; } @@ -1433,7 +1433,7 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, void *ptr) { int i,m; - + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; Memory *memory = fsptr->memory; @@ -1444,7 +1444,7 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, atom->map_clear(); // hash atom IDs stored in rendezvous decomposition - + int nrvous = fsptr->nrvous; tagint *atomIDs = fsptr->atomIDs; @@ -1453,7 +1453,7 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, // proclist = owner of atomID in caller decomposition // outbuf = info about owned atomID = 4 values - + PartnerInfo *in = (PartnerInfo *) inbuf; int *procowner = fsptr->procowner; memory->create(proclist,n,"shake:proclist"); @@ -1467,7 +1467,7 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, } outbuf = inbuf; - + // re-create atom map atom->map_init(0); @@ -1475,7 +1475,7 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, atom->map_set(); // flag = 1: outbuf = inbuf - + flag = 1; return n; } @@ -1491,7 +1491,7 @@ int FixShake::rendezvous_nshake(int n, char *inbuf, void *ptr) { int i,j,m; - + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; Memory *memory = fsptr->memory; @@ -1502,7 +1502,7 @@ int FixShake::rendezvous_nshake(int n, char *inbuf, atom->map_clear(); // hash atom IDs stored in rendezvous decomposition - + int nrvous = fsptr->nrvous; tagint *atomIDs = fsptr->atomIDs; @@ -1511,18 +1511,18 @@ int FixShake::rendezvous_nshake(int n, char *inbuf, // proclist = owner of atomID in caller decomposition // outbuf = info about owned atomID - + NShakeInfo *in = (NShakeInfo *) inbuf; int *procowner = fsptr->procowner; memory->create(proclist,n,"shake:proclist"); - + for (i = 0; i < n; i++) { m = atom->map(in[i].atomID); proclist[i] = procowner[m]; } outbuf = inbuf; - + // re-create atom map atom->map_init(0); @@ -1530,7 +1530,7 @@ int FixShake::rendezvous_nshake(int n, char *inbuf, atom->map_set(); // flag = 1: outbuf = inbuf - + flag = 1; return n; } @@ -1545,7 +1545,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, void *ptr) { int i,j,m; - + FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; Memory *memory = fsptr->memory; @@ -1556,7 +1556,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, atom->map_clear(); // hash atom IDs stored in rendezvous decomposition - + int nrvous = fsptr->nrvous; tagint *atomIDs = fsptr->atomIDs; @@ -1565,7 +1565,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, // proclist = owner of atomID in caller decomposition // outbuf = info about owned atomID - + ShakeInfo *in = (ShakeInfo *) inbuf; int *procowner = fsptr->procowner; memory->create(proclist,n,"shake:proclist"); @@ -1576,7 +1576,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, } outbuf = inbuf; - + // re-create atom map atom->map_init(0); @@ -1584,7 +1584,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, atom->map_set(); // flag = 1: outbuf = inbuf; - + flag = 1; return n; } diff --git a/src/RIGID/fix_shake.h b/src/RIGID/fix_shake.h index b99a35f958..ee9f520fea 100644 --- a/src/RIGID/fix_shake.h +++ b/src/RIGID/fix_shake.h @@ -124,7 +124,7 @@ class FixShake : public Fix { void partner_info(int *, tagint **, int **, int **, int **, int **); void nshake_info(int *, tagint **, int **); void shake_info(int *, tagint **, int **); - + int masscheck(double); void unconstrained_update(); void unconstrained_update_respa(int); diff --git a/src/comm.cpp b/src/comm.cpp index 729f96581a..dc117d2631 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -738,7 +738,7 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, inbuf = vector of input datums insize = byte size of each input datum inorder = 0 for inbuf in random proc order, 1 for datums ordered by proc - procs: inorder 0 = proc to send each datum to, 1 = # of datums/proc, + procs: inorder 0 = proc to send each datum to, 1 = # of datums/proc, callback = caller function to invoke in rendezvous decomposition takes input datums, returns output datums outorder = same as inorder, but for datums returned by callback() @@ -781,11 +781,11 @@ rendezvous(int which, int n, char *inbuf, int insize, int Comm:: rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, int (*callback)(int, char *, int &, int *&, char *&, void *), - int outorder, char *&outbuf, + int outorder, char *&outbuf, int outsize, void *ptr, int statflag) { // irregular comm of inbuf from caller decomp to rendezvous decomp - + Irregular *irregular = new Irregular(lmp); int nrvous; @@ -812,7 +812,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, if (flag != 1) memory->sfree(inbuf_rvous); // outbuf_rvous = inbuf_vous if (flag == 0) { if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + + (bigint) nrvous_out*sizeof(int) + irregular1_bytes); return 0; // all nout_rvous are 0, no 2nd comm stage } @@ -821,9 +821,9 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, // caller will free outbuf irregular = new Irregular(lmp); - + int nout; - if (outorder) + if (outorder) nout = irregular->create_data_grouped(nrvous_out,procs_rvous); else nout = irregular->create_data(nrvous_out,procs_rvous); @@ -842,7 +842,7 @@ rendezvous_irregular(int n, char *inbuf, int insize, int inorder, int *procs, // last arg to stats() = memory for procs_rvous + irregular comm if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + + (bigint) nrvous_out*sizeof(int) + MAX(irregular1_bytes,irregular2_bytes)); return nout; } @@ -863,7 +863,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, char *inbuf_a2a,*outbuf_a2a; // create procs and inbuf for All2all if necesary - + if (!inorder) { memory->create(procs_a2a,nprocs,"rendezvous:procs"); inbuf_a2a = (char *) memory->smalloc((bigint) n*insize, @@ -894,10 +894,10 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, } // create args for MPI_Alltoallv() on input data - + memory->create(sendcount,nprocs,"rendezvous:sendcount"); memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); - + memory->create(recvcount,nprocs,"rendezvous:recvcount"); MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); @@ -912,14 +912,14 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, // test for overflow of input data due to imbalance or insize // means that individual sdispls or rdispls values overflow - + int overflow = 0; if ((bigint) n*insize > MAXSMALLINT) overflow = 1; if ((bigint) nrvous*insize > MAXSMALLINT) overflow = 1; int overflowall; MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); if (overflowall) error->all(FLERR,"Overflow input size in rendezvous_a2a"); - + for (int i = 0; i < nprocs; i++) { sendcount[i] *= insize; sdispls[i] *= insize; @@ -958,7 +958,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, memory->destroy(sdispls); memory->destroy(rdispls); if (statflag) rendezvous_stats(n,0,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + + (bigint) nrvous_out*sizeof(int) + 4*nprocs*sizeof(int) + all2all1_bytes); return 0; // all nout_rvous are 0, no 2nd irregular } @@ -969,7 +969,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, // create procs and outbuf for All2all if necesary - + if (!outorder) { memory->create(procs_a2a,nprocs,"rendezvous_a2a:procs"); @@ -991,8 +991,8 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, offsets[iproc] += outsize; offset += outsize; } - - all2all2_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + + + all2all2_bytes = nprocs*sizeof(int) + nprocs*sizeof(bigint) + nrvous_out*outsize; } else { @@ -1004,9 +1004,9 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, // comm outbuf from rendezvous decomposition back to caller memcpy(sendcount,procs_a2a,nprocs*sizeof(int)); - + MPI_Alltoall(sendcount,1,MPI_INT,recvcount,1,MPI_INT,world); - + sdispls[0] = rdispls[0] = 0; for (int i = 1; i < nprocs; i++) { sdispls[i] = sdispls[i-1] + sendcount[i-1]; @@ -1016,13 +1016,13 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, // test for overflow of outbuf due to imbalance or outsize // means that individual sdispls or rdispls values overflow - + overflow = 0; if ((bigint) nrvous*outsize > MAXSMALLINT) overflow = 1; if ((bigint) nout*outsize > MAXSMALLINT) overflow = 1; MPI_Allreduce(&overflow,&overflowall,1,MPI_INT,MPI_MAX,world); if (overflowall) error->all(FLERR,"Overflow output in rendezvous_a2a"); - + for (int i = 0; i < nprocs; i++) { sendcount[i] *= outsize; sdispls[i] *= outsize; @@ -1058,8 +1058,8 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, // last arg to stats() = mem for procs_rvous + per-proc vecs + reordering ops if (statflag) rendezvous_stats(n,nout,nrvous,nrvous_out,insize,outsize, - (bigint) nrvous_out*sizeof(int) + - 4*nprocs*sizeof(int) + + (bigint) nrvous_out*sizeof(int) + + 4*nprocs*sizeof(int) + MAX(all2all1_bytes,all2all2_bytes)); return nout; } @@ -1120,7 +1120,7 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", size_out_all/outsize,1.0*size_out_all/nprocs/outsize, size_out_max/outsize,size_out_min/outsize); - else + else fprintf(screen," output datum count: " BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", 0,0.0,0,0); diff --git a/src/comm.h b/src/comm.h index 9c0112b4c4..30360b1059 100644 --- a/src/comm.h +++ b/src/comm.h @@ -109,8 +109,8 @@ class Comm : protected Pointers { void ring(int, int, void *, int, void (*)(int, char *, void *), void *, void *, int self = 1); - int rendezvous(int, int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), + int rendezvous(int, int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), int, char *&, int, void *, int statflag=0); int read_lines_from_file(FILE *, int, int, char *); @@ -147,11 +147,11 @@ class Comm : protected Pointers { int coregrid[3]; // 3d grid of cores within a node int user_coregrid[3]; // user request for cores in each dim - int rendezvous_irregular(int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), + int rendezvous_irregular(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), int, char *&, int, void *, int); - int rendezvous_all2all(int, char *, int, int, int *, - int (*)(int, char *, int &, int *&, char *&, void *), + int rendezvous_all2all(int, char *, int, int, int *, + int (*)(int, char *, int &, int *&, char *&, void *), int, char *&, int, void *, int); void rendezvous_stats(int, int, int, int, int, int, bigint); diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index f1d4e61142..b6932efa8d 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -43,7 +43,7 @@ This was tested for: the output delta to a Gray code (a^(a>>1)) so a string of 1's (as is commonly produced by subtraction) look like a single 1-bit difference. -* the base values were pseudorandom, all zero but one bit set, or +* the base values were pseudorandom, all zero but one bit set, or all zero plus a counter that starts at zero. Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that @@ -53,7 +53,7 @@ satisfy this are 14 9 3 7 17 3 Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing for "differ" defined as + with a one-bit base and a two-bit delta. I -used http://burtleburtle.net/bob/hash/avalanche.html to choose +used http://burtleburtle.net/bob/hash/avalanche.html to choose the operations, constants, and arrangements of the variables. This does not achieve avalanche. There are input bits of (a,b,c) @@ -92,7 +92,7 @@ produce values of c that look totally different. This was tested for the output delta to a Gray code (a^(a>>1)) so a string of 1's (as is commonly produced by subtraction) look like a single 1-bit difference. -* the base values were pseudorandom, all zero but one bit set, or +* the base values were pseudorandom, all zero but one bit set, or all zero plus a counter that starts at zero. These constants passed: @@ -169,7 +169,7 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) } /*----------------------------- handle the last (probably partial) block */ - /* + /* * "k[2]&0xffffff" actually reads beyond the end of the string, but * then masks off the part it's not allowed to read. Because the * string is aligned, the masked-off tail is in the same word as the @@ -314,9 +314,9 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) #else /* PURIFY_HATES_HASHLITTLE */ /* I don't know what it is about Jenkins' hashlittle function, but - * it drives purify insane, even with VALGRIND defined. It makes + * it drives purify insane, even with VALGRIND defined. It makes * purify unusable!! The code execution doesn't even make sense. - * Below is a (probably) weaker hash function that at least allows + * Below is a (probably) weaker hash function that at least allows * testing with purify. */ #define MAXINT_DIV_PHI 11400714819323198485U diff --git a/src/irregular.cpp b/src/irregular.cpp index c27a8c8e18..848d853f2a 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -761,7 +761,7 @@ int Irregular::create_data_grouped(int n, int *procs, int sortflag) #ifdef LAMMPS_RS_ALLREDUCE_INPLACE MPI_Allreduce(MPI_IN_PLACE,work1,nprocs,MPI_INT,MPI_SUM,world); nrecv_proc = work1[me]; -#else +#else #ifdef LAMMPS_RS_ALLREDUCE MPI_Allreduce(work1,work2,nprocs,MPI_INT,MPI_SUM,world); nrecv_proc = work2[me]; diff --git a/src/special.cpp b/src/special.cpp index b9287df472..076697084d 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -171,7 +171,7 @@ void Special::atom_owners() int *proclist; memory->create(proclist,nlocal,"special:proclist"); - IDRvous *idbuf = (IDRvous *) + IDRvous *idbuf = (IDRvous *) memory->smalloc((bigint) nlocal*sizeof(IDRvous),"special:idbuf"); // setup input buf for rendezvous comm @@ -185,7 +185,7 @@ void Special::atom_owners() } // perform rendezvous operation - + char *buf; comm->rendezvous(RVOUS,nlocal,(char *) idbuf,sizeof(IDRvous),0,proclist, rendezvous_ids,0,buf,0,(void *) this); @@ -210,7 +210,7 @@ void Special::onetwo_build_newton() int nlocal = atom->nlocal; // nsend = # of my datums to send - + int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_bond[i]; j++) { @@ -221,7 +221,7 @@ void Special::onetwo_build_newton() int *proclist; memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) + PairRvous *inbuf = (PairRvous *) memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm @@ -239,7 +239,7 @@ void Special::onetwo_build_newton() nsend++; } } - + // perform rendezvous operation char *buf; @@ -248,7 +248,7 @@ void Special::onetwo_build_newton() rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; - + memory->destroy(proclist); memory->sfree(inbuf); @@ -268,14 +268,14 @@ void Special::onetwo_build_newton() i = atom->map(outbuf[m].atomID); nspecial[i][0]++; } - + int max = 0; for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][0]); - + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onetwo,nlocal,maxall,"special:onetwo"); - + for (i = 0; i < nlocal; i++) nspecial[i][0] = 0; for (i = 0; i < nlocal; i++) { @@ -290,7 +290,7 @@ void Special::onetwo_build_newton() i = atom->map(outbuf[m].atomID); onetwo[i][nspecial[i][0]++] = outbuf[m].partnerID; } - + memory->sfree(outbuf); } @@ -311,13 +311,13 @@ void Special::onetwo_build_newton_off() int max = 0; for (i = 0; i < nlocal; i++) max = MAX(max,num_bond[i]); - + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onetwo,nlocal,maxall,"special:onetwo"); - + // nsend = # of my datums to send // include nlocal datums with owner of each atom - + for (i = 0; i < nlocal; i++) { nspecial[i][0] = num_bond[i]; for (j = 0; j < num_bond[i]; j++) @@ -350,7 +350,7 @@ void Special::onethree_build() int *proclist; memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) + PairRvous *inbuf = (PairRvous *) memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm @@ -402,11 +402,11 @@ void Special::onethree_build() i = atom->map(outbuf[m].atomID); nspecial[i][1]++; } - + int max = 0; for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][1]); - + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onethree,nlocal,maxall,"special:onethree"); @@ -456,7 +456,7 @@ void Special::onefour_build() int *proclist; memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) + PairRvous *inbuf = (PairRvous *) memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm @@ -507,11 +507,11 @@ void Special::onefour_build() i = atom->map(outbuf[m].atomID); nspecial[i][2]++; } - + int max = 0; for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][2]); - + MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); memory->create(onefour,nlocal,maxall,"special:onefour"); @@ -843,7 +843,7 @@ void Special::angle_trim() int *proclist; memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) + PairRvous *inbuf = (PairRvous *) memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); // setup input buf to rendezvous comm @@ -904,7 +904,7 @@ void Special::angle_trim() } // perform rendezvous operation - + char *buf; int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, @@ -921,18 +921,18 @@ void Special::angle_trim() for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][1]); MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - + int **flag; memory->create(flag,nlocal,maxall,"special:flag"); for (i = 0; i < nlocal; i++) for (j = 0; j < nspecial[i][1]; j++) flag[i][j] = 0; - + // reset nspecial[1] and onethree for all owned atoms based on output info // based on owned info plus rendezvous output info // output datums = pairs of atoms that are 1-3 neighbors - + for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { if (tag[i] != angle_atom2[i][j]) continue; @@ -1011,7 +1011,7 @@ void Special::angle_trim() } else j++; } } - + memory->destroy(flag); // if no angles or dihedrals are defined, delete all 1-3 neighs @@ -1089,9 +1089,9 @@ void Special::dihedral_trim() int *proclist; memory->create(proclist,nsend,"special:proclist"); - PairRvous *inbuf = (PairRvous *) + PairRvous *inbuf = (PairRvous *) memory->smalloc((bigint) nsend*sizeof(PairRvous),"special:inbuf"); - + // setup input buf to rendezvous comm // datums = pairs of onefour atom IDs in a dihedral defined for my atoms // only dihedrals where I own atom2 (in case newton_bond off) @@ -1123,7 +1123,7 @@ void Special::dihedral_trim() } // perform rendezvous operation - + char *buf; int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, @@ -1140,14 +1140,14 @@ void Special::dihedral_trim() for (i = 0; i < nlocal; i++) max = MAX(max,nspecial[i][2]); MPI_Allreduce(&max,&maxall,1,MPI_INT,MPI_MAX,world); - + int **flag; memory->create(flag,nlocal,maxall,"special:flag"); for (i = 0; i < nlocal; i++) for (j = 0; j < nspecial[i][2]; j++) flag[i][j] = 0; - + for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { if (tag[i] != dihedral_atom2[i][j]) continue; @@ -1195,9 +1195,9 @@ void Special::dihedral_trim() } else j++; } } - + memory->destroy(flag); - + // if no dihedrals are defined, delete all 1-4 neighs } else { @@ -1235,10 +1235,10 @@ int Special::rendezvous_ids(int n, char *inbuf, int *procowner; tagint *atomIDs; - + memory->create(procowner,n,"special:procowner"); memory->create(atomIDs,n,"special:atomIDs"); - + IDRvous *in = (IDRvous *) inbuf; for (int i = 0; i < n; i++) { @@ -1247,17 +1247,17 @@ int Special::rendezvous_ids(int n, char *inbuf, } // store rendezvous data in Special class - + sptr->nrvous = n; sptr->procowner = procowner; sptr->atomIDs = atomIDs; // flag = 0: no second comm needed in rendezvous - + flag = 0; return 0; } - + /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition @@ -1279,7 +1279,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, atom->map_clear(); // hash atom IDs stored in rendezvous decomposition - + int nrvous = sptr->nrvous; tagint *atomIDs = sptr->atomIDs; @@ -1287,7 +1287,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, atom->map_one(atomIDs[i],i); // proclist = owner of atomID in caller decomposition - + PairRvous *in = (PairRvous *) inbuf; int *procowner = sptr->procowner; memory->create(proclist,n,"special:proclist"); @@ -1299,7 +1299,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, } outbuf = inbuf; - + // re-create atom map atom->map_init(0); @@ -1307,7 +1307,7 @@ int Special::rendezvous_pairs(int n, char *inbuf, atom->map_set(); // flag = 1: outbuf = inbuf - + flag = 1; return n; } diff --git a/src/special.h b/src/special.h index d02a8522f6..10d2609536 100644 --- a/src/special.h +++ b/src/special.h @@ -45,7 +45,7 @@ class Special : protected Pointers { }; // private methods - + void atom_owners(); void onetwo_build_newton(); void onetwo_build_newton_off(); From efad31f4743cf2a718462d9ac59e5c15fbe92387 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 26 Mar 2019 10:09:16 -0600 Subject: [PATCH 156/243] bug fixes to added rendezvous algorithms --- src/RIGID/fix_rigid_small.cpp | 19 ++++++++++--------- src/special.cpp | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index afd597ef8e..18057b7c14 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -595,15 +595,6 @@ void FixRigidSmall::init() } } - // error if maxextent > comm->cutghost - // NOTE: could just warn if an override flag set - // NOTE: this could fail for comm multi mode if user sets a wrong cutoff - // for atom types in rigid bodies - need a more careful test - - double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); - if (maxextent > cutghost) - error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); - // error if npt,nph fix comes before rigid fix for (i = 0; i < modify->nfix; i++) { @@ -662,6 +653,16 @@ void FixRigidSmall::setup(int vflag) { int i,n,ibody; + // error if maxextent > comm->cutghost + // NOTE: could just warn if an override flag set + // NOTE: this could fail for comm multi mode if user sets a wrong cutoff + // for atom types in rigid bodies - need a more careful test + // must check here, not in init, b/c neigh/comm values set after fix init + + double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); + if (maxextent > cutghost) + error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); + //check(1); // sum fcm, torque across all rigid bodies diff --git a/src/special.cpp b/src/special.cpp index 076697084d..ed505ff957 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -257,8 +257,8 @@ void Special::onetwo_build_newton() // output datums = pairs of atoms that are 1-2 neighbors for (i = 0; i < nlocal; i++) { - nspecial[i][0] = num_bond[i]; for (j = 0; j < num_bond[i]; j++) { + nspecial[i][0]++; m = atom->map(bond_atom[i][j]); if (m >= 0 && m < nlocal) nspecial[m][0]++; } From cf349633f77050a78b085094e1b6a3eb39d18397 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 13:09:49 -0400 Subject: [PATCH 157/243] cosmetic changes --- src/RIGID/fix_rigid_small.cpp | 2 +- src/RIGID/fix_rigid_small.h | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 18057b7c14..ce44fb4e93 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -660,7 +660,7 @@ void FixRigidSmall::setup(int vflag) // must check here, not in init, b/c neigh/comm values set after fix init double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); - if (maxextent > cutghost) + if (maxextent > cutghost) error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); //check(1); diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index f6ad1b7206..b5a3d5208d 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -22,9 +22,6 @@ FixStyle(rigid/small,FixRigidSmall) #include "fix.h" -// replace this later -//#include - namespace LAMMPS_NS { class FixRigidSmall : public Fix { From 26b90727b36c7416455653c093e054f27f4523e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 13:26:09 -0400 Subject: [PATCH 158/243] whitespace cleanup --- src/REPLICA/fix_hyper_local.cpp | 28 ++++++++++++++-------------- src/REPLICA/fix_hyper_local.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index be4a642ebb..dc7a0b94b9 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -46,7 +46,7 @@ enum{IGNORE,WARN,ERROR}; FixHyperLocal::FixHyperLocal(LAMMPS *lmp, int narg, char **arg) : FixHyper(lmp, narg, arg), blist(NULL), biascoeff(NULL), numbond(NULL), - maxhalf(NULL), eligible(NULL), maxhalfstrain(NULL), old2now(NULL), + maxhalf(NULL), eligible(NULL), maxhalfstrain(NULL), old2now(NULL), tagold(NULL), xold(NULL), maxstrain(NULL), maxstrain_domain(NULL), biasflag(NULL), bias(NULL), cpage(NULL), clist(NULL), numcoeff(NULL) { @@ -325,7 +325,7 @@ void FixHyperLocal::setup_pre_reverse(int eflag, int vflag) { // only called for dynamics, not minimization // setupflag prevents boostostat update of bias coeffs in setup - // also prevents increments of nbias_running, nobias_running, + // also prevents increments of nbias_running, nobias_running, // negstrain_running, sumbiascoeff setupflag = 1; @@ -474,8 +474,8 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) maxstrain[i] = MAX(maxstrain[i],estrain); maxstrain[j] = MAX(maxstrain[j],estrain); if (estrain > halfstrain) { - halfstrain = estrain; - ijhalf = m; + halfstrain = estrain; + ijhalf = m; } m++; } @@ -544,22 +544,22 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) i = old2now[iold]; emax = selfstrain = maxstrain[i]; ncount = 0; - + for (jj = 0; jj < jnum; jj++) { jold = jlist[jj]; j = old2now[jold]; // special case for missing (drifted) J atom - + if (j < 0) { emax = MAX(emax,qfactor); - if (selfstrain == qfactor) ncount++; + if (selfstrain == qfactor) ncount++; continue; } emax = MAX(emax,maxstrain[j]); if (selfstrain == maxstrain[j]) ncount++; - + // optional diagnostic // tally largest distance from subbox that a ghost atom is (rmaxbig) // and the largest distance if strain < qfactor (rmax) @@ -583,7 +583,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) } } } - + if (maxhalfstrain[iold] < selfstrain) eligible[iold] = 0; if (selfstrain < emax) eligible[iold] = 0; else if (ncount > 1) { @@ -855,7 +855,7 @@ void FixHyperLocal::build_bond_list(int natom) } // store old bond coeffs so can persist them in new blist - // while loop allows growing value of maxbondperatom + // while loop allows growing value of maxbondperatom // will loop at most 2 times, stops when maxbondperatom is large enough // requires reverse comm, no forward comm: // b/c new coeff list is stored only by current owned atoms @@ -893,7 +893,7 @@ void FixHyperLocal::build_bond_list(int natom) numcoeff[i]++; if (numcoeff[j] < maxbondperatom) { - clist[j][numcoeff[j]].biascoeff = biascoeff[m]; + clist[j][numcoeff[j]].biascoeff = biascoeff[m]; clist[j][numcoeff[j]].tag = tag[i]; } numcoeff[j]++; @@ -935,7 +935,7 @@ void FixHyperLocal::build_bond_list(int natom) memory->create(maxhalf,maxlocal,"hyper/local:maxhalf"); memory->create(maxhalfstrain,maxlocal,"hyper/local:maxhalfstrain"); } - + if (nall > maxall) { memory->destroy(xold); memory->destroy(tagold); @@ -1285,12 +1285,12 @@ void FixHyperLocal::unpack_reverse_comm(int n, int *list, double *buf) maxstrain[j] = MAX(maxstrain[j],buf[m]); m++; } - + // STRAINDOMAIN // unpack maxstrain_domain vector // use MAX, b/c want maximum abs value strain for each atom's domain // could also use SUM, b/c exactly one ghost or owned value is non-zero - + } else if (commflag == STRAINDOMAIN) { int offset; int nonzero = (int) ubuf(buf[m++]).i; // # of atoms with values diff --git a/src/REPLICA/fix_hyper_local.h b/src/REPLICA/fix_hyper_local.h index f0075c185c..6f13acb606 100644 --- a/src/REPLICA/fix_hyper_local.h +++ b/src/REPLICA/fix_hyper_local.h @@ -93,7 +93,7 @@ class FixHyperLocal : public FixHyper { double mybias; // sum of bias potentials for biased bonds double maxbondlen; // cummulative max length of any bond - double maxdriftsq; // max distance any bond atom drifts from quenched x + double maxdriftsq; // max distance any bond atom drifts from quenched x double sumbiascoeff; // sum of all bond bias coeffs at each timestep double avebiascoeff; // cummulative sumbiascoeff/allbonds across steps From 07a6749ddce729103620fb6215afcad9ca9ecbdd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 16:00:48 -0400 Subject: [PATCH 159/243] install LAMMPS python module with either install-python or install target if prerequisites are given --- cmake/CMakeLists.txt | 46 +++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e138a7dffc..2bb40a6e88 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1475,23 +1475,47 @@ install( ) ############################################################################### -# Install LAMMPS module into site-packages folder -# Only available, if a shared library is built +# Install LAMMPS lib and python module into site-packages folder with +# "install-python" target. Behaves exactly like "make install-python" for +# conventional build. Only available, if a shared library is built. +# This is primarily for people that only want to use the Python wrapper. ############################################################################### if(BUILD_LIB AND BUILD_SHARED_LIBS) find_package(PythonInterp) - add_custom_target( - install-python - ${PYTHON_EXECUTABLE} install.py -v ${LAMMPS_SOURCE_DIR}/version.h - -m ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py - -l ${CMAKE_BINARY_DIR}/liblammps${CMAKE_SHARED_LIBRARY_SUFFIX} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../python - COMMENT "Installing LAMMPS Python module" - ) + if (${PYTHONINTERP_FOUND}) + add_custom_target( + install-python + ${PYTHON_EXECUTABLE} install.py -v ${LAMMPS_SOURCE_DIR}/version.h + -m ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py + -l ${CMAKE_BINARY_DIR}/liblammps${CMAKE_SHARED_LIBRARY_SUFFIX} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../python + COMMENT "Installing LAMMPS Python module") + else() + add_custom_target( + install-python + echo "Must have Python installed to install the LAMMPS Python module") + endif() else() add_custom_target( install-python - echo "Installation of the LAMMPS Python module requires building the LAMMPS shared library") + echo "Must build LAMMPS as a shared library to use the Python module") +endif() + +############################################################################### +# Add LAMMPS python module to "install" target. This is taylored for building +# LAMMPS for package managers and with different prefix settings. +# This requires either a shared library or that the PYTHON package is included. +############################################################################### +if((BUILD_LIB AND BUILD_SHARED_LIBS) OR (PKG_PYTHON)) + find_package(PythonInterp) + if (${PYTHONINTERP_FOUND}) + if(NOT PYTHON_INSTDIR) + execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" + OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) + endif() endif() ############################################################################### From dbd458e9e3aaf6c708d87c7c0df28654e1aa928c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 16:35:35 -0400 Subject: [PATCH 160/243] update micelle example with corrected data file and rigid body input --- examples/micelle/data.micelle | 3065 +++++++++-------- examples/micelle/in.micelle-rigid | 86 + examples/micelle/log.27Nov18.micelle.g++.1 | 255 -- examples/micelle/log.27Nov18.micelle.g++.4 | 255 -- .../micelle/log.28Feb2019.micelle-rigid.g++.1 | 286 ++ .../micelle/log.28Feb2019.micelle-rigid.g++.4 | 286 ++ examples/micelle/log.28Feb2019.micelle.g++.1 | 256 ++ examples/micelle/log.28Feb2019.micelle.g++.4 | 256 ++ 8 files changed, 2707 insertions(+), 2038 deletions(-) create mode 100644 examples/micelle/in.micelle-rigid delete mode 100644 examples/micelle/log.27Nov18.micelle.g++.1 delete mode 100644 examples/micelle/log.27Nov18.micelle.g++.4 create mode 100644 examples/micelle/log.28Feb2019.micelle-rigid.g++.1 create mode 100644 examples/micelle/log.28Feb2019.micelle-rigid.g++.4 create mode 100644 examples/micelle/log.28Feb2019.micelle.g++.1 create mode 100644 examples/micelle/log.28Feb2019.micelle.g++.4 diff --git a/examples/micelle/data.micelle b/examples/micelle/data.micelle index e4805bceee..4f6abae3ca 100644 --- a/examples/micelle/data.micelle +++ b/examples/micelle/data.micelle @@ -1,1530 +1,1539 @@ - LAMMPS 2d micelle data file - - 1200 atoms - 300 bonds - 0 angles - 0 dihedrals - 0 impropers - - 4 atom types - 1 bond types - 0 angle types - 0 dihedral types - 0 improper types - - 0.0000000E+00 35.85686 xlo xhi - 0.0000000E+00 35.85686 ylo yhi - -0.1000000 0.1000000 zlo zhi - +LAMMPS data file. CGCMM style. atom_style bond generated by VMD/TopoTools v1.7 on Tue Mar 26 16:13:26 EDT 2019 + 1200 atoms + 300 bonds + 0 angles + 0 dihedrals + 0 impropers + 4 atom types + 1 bond types + 0 angle types + 0 dihedral types + 0 improper types + -0.392930 35.463931 xlo xhi + -0.050929 35.805932 ylo yhi + -0.100000 0.100000 zlo zhi + +# Pair Coeffs +# +# 1 1 +# 2 2 +# 3 3 +# 4 4 + +# Bond Coeffs +# +# 1 1 + Masses - - 1 1.000000 - 2 1.000000 - 3 1.000000 - 4 1.000000 - - Atoms - - 1 139 2 0.000 0.000 0.000 - 2 0 1 1.195 0.000 0.000 - 3 0 1 2.390 0.000 0.000 - 4 0 1 3.586 0.000 0.000 - 5 0 1 4.781 0.000 0.000 - 6 0 1 5.976 0.000 0.000 - 7 0 1 7.171 0.000 0.000 - 8 0 1 8.367 0.000 0.000 - 9 0 1 9.562 0.000 0.000 - 10 114 2 10.757 0.000 0.000 - 11 0 1 11.952 0.000 0.000 - 12 52 2 13.148 0.000 0.000 - 13 0 1 14.343 0.000 0.000 - 14 0 1 15.538 0.000 0.000 - 15 0 1 16.733 0.000 0.000 - 16 0 1 17.928 0.000 0.000 - 17 0 1 19.124 0.000 0.000 - 18 0 1 20.319 0.000 0.000 - 19 0 1 21.514 0.000 0.000 - 20 0 1 22.709 0.000 0.000 - 21 0 1 23.905 0.000 0.000 - 22 0 1 25.100 0.000 0.000 - 23 0 1 26.295 0.000 0.000 - 24 110 2 27.490 0.000 0.000 - 25 128 2 28.685 0.000 0.000 - 26 0 1 29.881 0.000 0.000 - 27 0 1 31.076 0.000 0.000 - 28 0 1 32.271 0.000 0.000 - 29 0 1 33.466 0.000 0.000 - 30 0 1 34.662 0.000 0.000 - 31 0 1 0.000 1.195 0.000 - 32 0 1 1.195 1.195 0.000 - 33 113 2 2.390 1.195 0.000 - 34 0 1 3.586 1.195 0.000 - 35 75 2 4.781 1.195 0.000 - 36 0 1 5.976 1.195 0.000 - 37 0 1 7.171 1.195 0.000 - 38 89 2 8.367 1.195 0.000 - 39 0 1 9.562 1.195 0.000 - 40 94 2 10.757 1.195 0.000 - 41 0 1 11.952 1.195 0.000 - 42 35 2 13.148 1.195 0.000 - 43 0 1 14.343 1.195 0.000 - 44 0 1 15.538 1.195 0.000 - 45 0 1 16.733 1.195 0.000 - 46 0 1 17.928 1.195 0.000 - 47 0 1 19.124 1.195 0.000 - 48 0 1 20.319 1.195 0.000 - 49 0 1 21.514 1.195 0.000 - 50 0 1 22.709 1.195 0.000 - 51 0 1 23.905 1.195 0.000 - 52 0 1 25.100 1.195 0.000 - 53 0 1 26.295 1.195 0.000 - 54 0 1 27.490 1.195 0.000 - 55 0 1 28.685 1.195 0.000 - 56 0 1 29.881 1.195 0.000 - 57 0 1 31.076 1.195 0.000 - 58 0 1 32.271 1.195 0.000 - 59 0 1 33.466 1.195 0.000 - 60 0 1 34.662 1.195 0.000 - 61 0 1 0.000 2.390 0.000 - 62 0 1 1.195 2.390 0.000 - 63 119 2 2.390 2.390 0.000 - 64 0 1 3.586 2.390 0.000 - 65 24 2 4.781 2.390 0.000 - 66 0 1 5.976 2.390 0.000 - 67 0 1 7.171 2.390 0.000 - 68 0 1 8.367 2.390 0.000 - 69 0 1 9.562 2.390 0.000 - 70 0 1 10.757 2.390 0.000 - 71 0 1 11.952 2.390 0.000 - 72 0 1 13.148 2.390 0.000 - 73 0 1 14.343 2.390 0.000 - 74 0 1 15.538 2.390 0.000 - 75 0 1 16.733 2.390 0.000 - 76 0 1 17.928 2.390 0.000 - 77 0 1 19.124 2.390 0.000 - 78 0 1 20.319 2.390 0.000 - 79 0 1 21.514 2.390 0.000 - 80 0 1 22.709 2.390 0.000 - 81 0 1 23.905 2.390 0.000 - 82 74 2 25.100 2.390 0.000 - 83 0 1 26.295 2.390 0.000 - 84 0 1 27.490 2.390 0.000 - 85 0 1 28.685 2.390 0.000 - 86 47 2 29.881 2.390 0.000 - 87 0 1 31.076 2.390 0.000 - 88 0 1 32.271 2.390 0.000 - 89 0 1 33.466 2.390 0.000 - 90 0 1 34.662 2.390 0.000 - 91 0 1 0.000 3.586 0.000 - 92 0 1 1.195 3.586 0.000 - 93 0 1 2.390 3.586 0.000 - 94 0 1 3.586 3.586 0.000 - 95 0 1 4.781 3.586 0.000 - 96 0 1 5.976 3.586 0.000 - 97 0 1 7.171 3.586 0.000 - 98 0 1 8.367 3.586 0.000 - 99 0 1 9.562 3.586 0.000 - 100 121 2 10.757 3.586 0.000 - 101 0 1 11.952 3.586 0.000 - 102 0 1 13.148 3.586 0.000 - 103 129 2 14.343 3.586 0.000 - 104 0 1 15.538 3.586 0.000 - 105 0 1 16.733 3.586 0.000 - 106 0 1 17.928 3.586 0.000 - 107 0 1 19.124 3.586 0.000 - 108 0 1 20.319 3.586 0.000 - 109 117 2 21.514 3.586 0.000 - 110 0 1 22.709 3.586 0.000 - 111 0 1 23.905 3.586 0.000 - 112 0 1 25.100 3.586 0.000 - 113 0 1 26.295 3.586 0.000 - 114 0 1 27.490 3.586 0.000 - 115 0 1 28.685 3.586 0.000 - 116 49 2 29.881 3.586 0.000 - 117 0 1 31.076 3.586 0.000 - 118 0 1 32.271 3.586 0.000 - 119 0 1 33.466 3.586 0.000 - 120 0 1 34.662 3.586 0.000 - 121 0 1 0.000 4.781 0.000 - 122 0 1 1.195 4.781 0.000 - 123 0 1 2.390 4.781 0.000 - 124 0 1 3.586 4.781 0.000 - 125 38 2 4.781 4.781 0.000 - 126 0 1 5.976 4.781 0.000 - 127 67 2 7.171 4.781 0.000 - 128 0 1 8.367 4.781 0.000 - 129 3 2 9.562 4.781 0.000 - 130 0 1 10.757 4.781 0.000 - 131 41 2 11.952 4.781 0.000 - 132 0 1 13.148 4.781 0.000 - 133 131 2 14.343 4.781 0.000 - 134 0 1 15.538 4.781 0.000 - 135 0 1 16.733 4.781 0.000 - 136 0 1 17.928 4.781 0.000 - 137 0 1 19.124 4.781 0.000 - 138 0 1 20.319 4.781 0.000 - 139 0 1 21.514 4.781 0.000 - 140 0 1 22.709 4.781 0.000 - 141 0 1 23.905 4.781 0.000 - 142 0 1 25.100 4.781 0.000 - 143 0 1 26.295 4.781 0.000 - 144 0 1 27.490 4.781 0.000 - 145 0 1 28.685 4.781 0.000 - 146 0 1 29.881 4.781 0.000 - 147 0 1 31.076 4.781 0.000 - 148 0 1 32.271 4.781 0.000 - 149 0 1 33.466 4.781 0.000 - 150 0 1 34.662 4.781 0.000 - 151 53 2 0.000 5.976 0.000 - 152 0 1 1.195 5.976 0.000 - 153 0 1 2.390 5.976 0.000 - 154 0 1 3.586 5.976 0.000 - 155 0 1 4.781 5.976 0.000 - 156 0 1 5.976 5.976 0.000 - 157 48 2 7.171 5.976 0.000 - 158 0 1 8.367 5.976 0.000 - 159 30 2 9.562 5.976 0.000 - 160 0 1 10.757 5.976 0.000 - 161 0 1 11.952 5.976 0.000 - 162 104 2 13.148 5.976 0.000 - 163 0 1 14.343 5.976 0.000 - 164 136 2 15.538 5.976 0.000 - 165 0 1 16.733 5.976 0.000 - 166 0 1 17.928 5.976 0.000 - 167 0 1 19.124 5.976 0.000 - 168 116 2 20.319 5.976 0.000 - 169 0 1 21.514 5.976 0.000 - 170 0 1 22.709 5.976 0.000 - 171 0 1 23.905 5.976 0.000 - 172 0 1 25.100 5.976 0.000 - 173 40 2 26.295 5.976 0.000 - 174 0 1 27.490 5.976 0.000 - 175 145 2 28.685 5.976 0.000 - 176 33 2 29.881 5.976 0.000 - 177 0 1 31.076 5.976 0.000 - 178 0 1 32.271 5.976 0.000 - 179 0 1 33.466 5.976 0.000 - 180 0 1 34.662 5.976 0.000 - 181 0 1 0.000 7.171 0.000 - 182 0 1 1.195 7.171 0.000 - 183 0 1 2.390 7.171 0.000 - 184 0 1 3.586 7.171 0.000 - 185 0 1 4.781 7.171 0.000 - 186 0 1 5.976 7.171 0.000 - 187 0 1 7.171 7.171 0.000 - 188 0 1 8.367 7.171 0.000 - 189 0 1 9.562 7.171 0.000 - 190 0 1 10.757 7.171 0.000 - 191 0 1 11.952 7.171 0.000 - 192 15 2 13.148 7.171 0.000 - 193 0 1 14.343 7.171 0.000 - 194 0 1 15.538 7.171 0.000 - 195 0 1 16.733 7.171 0.000 - 196 0 1 17.928 7.171 0.000 - 197 0 1 19.124 7.171 0.000 - 198 0 1 20.319 7.171 0.000 - 199 0 1 21.514 7.171 0.000 - 200 0 1 22.709 7.171 0.000 - 201 108 2 23.905 7.171 0.000 - 202 0 1 25.100 7.171 0.000 - 203 0 1 26.295 7.171 0.000 - 204 0 1 27.490 7.171 0.000 - 205 132 2 28.685 7.171 0.000 - 206 0 1 29.881 7.171 0.000 - 207 0 1 31.076 7.171 0.000 - 208 0 1 32.271 7.171 0.000 - 209 0 1 33.466 7.171 0.000 - 210 0 1 34.662 7.171 0.000 - 211 0 1 0.000 8.367 0.000 - 212 0 1 1.195 8.367 0.000 - 213 0 1 2.390 8.367 0.000 - 214 0 1 3.586 8.367 0.000 - 215 0 1 4.781 8.367 0.000 - 216 0 1 5.976 8.367 0.000 - 217 0 1 7.171 8.367 0.000 - 218 0 1 8.367 8.367 0.000 - 219 0 1 9.562 8.367 0.000 - 220 0 1 10.757 8.367 0.000 - 221 0 1 11.952 8.367 0.000 - 222 0 1 13.148 8.367 0.000 - 223 0 1 14.343 8.367 0.000 - 224 0 1 15.538 8.367 0.000 - 225 0 1 16.733 8.367 0.000 - 226 0 1 17.928 8.367 0.000 - 227 0 1 19.124 8.367 0.000 - 228 0 1 20.319 8.367 0.000 - 229 0 1 21.514 8.367 0.000 - 230 97 2 22.709 8.367 0.000 - 231 0 1 23.905 8.367 0.000 - 232 12 2 25.100 8.367 0.000 - 233 71 2 26.295 8.367 0.000 - 234 0 1 27.490 8.367 0.000 - 235 0 1 28.685 8.367 0.000 - 236 0 1 29.881 8.367 0.000 - 237 0 1 31.076 8.367 0.000 - 238 6 2 32.271 8.367 0.000 - 239 0 1 33.466 8.367 0.000 - 240 34 2 34.662 8.367 0.000 - 241 0 1 0.000 9.562 0.000 - 242 0 1 1.195 9.562 0.000 - 243 0 1 2.390 9.562 0.000 - 244 0 1 3.586 9.562 0.000 - 245 146 2 4.781 9.562 0.000 - 246 0 1 5.976 9.562 0.000 - 247 90 2 7.171 9.562 0.000 - 248 0 1 8.367 9.562 0.000 - 249 0 1 9.562 9.562 0.000 - 250 0 1 10.757 9.562 0.000 - 251 0 1 11.952 9.562 0.000 - 252 0 1 13.148 9.562 0.000 - 253 0 1 14.343 9.562 0.000 - 254 0 1 15.538 9.562 0.000 - 255 0 1 16.733 9.562 0.000 - 256 0 1 17.928 9.562 0.000 - 257 61 2 19.124 9.562 0.000 - 258 0 1 20.319 9.562 0.000 - 259 0 1 21.514 9.562 0.000 - 260 0 1 22.709 9.562 0.000 - 261 0 1 23.905 9.562 0.000 - 262 64 2 25.100 9.562 0.000 - 263 0 1 26.295 9.562 0.000 - 264 0 1 27.490 9.562 0.000 - 265 0 1 28.685 9.562 0.000 - 266 0 1 29.881 9.562 0.000 - 267 0 1 31.076 9.562 0.000 - 268 0 1 32.271 9.562 0.000 - 269 0 1 33.466 9.562 0.000 - 270 0 1 34.662 9.562 0.000 - 271 0 1 0.000 10.757 0.000 - 272 0 1 1.195 10.757 0.000 - 273 0 1 2.390 10.757 0.000 - 274 0 1 3.586 10.757 0.000 - 275 68 2 4.781 10.757 0.000 - 276 0 1 5.976 10.757 0.000 - 277 0 1 7.171 10.757 0.000 - 278 0 1 8.367 10.757 0.000 - 279 0 1 9.562 10.757 0.000 - 280 0 1 10.757 10.757 0.000 - 281 0 1 11.952 10.757 0.000 - 282 0 1 13.148 10.757 0.000 - 283 0 1 14.343 10.757 0.000 - 284 109 2 15.538 10.757 0.000 - 285 0 1 16.733 10.757 0.000 - 286 0 1 17.928 10.757 0.000 - 287 0 1 19.124 10.757 0.000 - 288 0 1 20.319 10.757 0.000 - 289 0 1 21.514 10.757 0.000 - 290 0 1 22.709 10.757 0.000 - 291 0 1 23.905 10.757 0.000 - 292 0 1 25.100 10.757 0.000 - 293 0 1 26.295 10.757 0.000 - 294 73 2 27.490 10.757 0.000 - 295 0 1 28.685 10.757 0.000 - 296 0 1 29.881 10.757 0.000 - 297 0 1 31.076 10.757 0.000 - 298 0 1 32.271 10.757 0.000 - 299 0 1 33.466 10.757 0.000 - 300 0 1 34.662 10.757 0.000 - 301 0 1 0.000 11.952 0.000 - 302 0 1 1.195 11.952 0.000 - 303 0 1 2.390 11.952 0.000 - 304 0 1 3.586 11.952 0.000 - 305 0 1 4.781 11.952 0.000 - 306 134 2 5.976 11.952 0.000 - 307 0 1 7.171 11.952 0.000 - 308 0 1 8.367 11.952 0.000 - 309 57 2 9.562 11.952 0.000 - 310 101 2 10.757 11.952 0.000 - 311 120 2 11.952 11.952 0.000 - 312 0 1 13.148 11.952 0.000 - 313 0 1 14.343 11.952 0.000 - 314 0 1 15.538 11.952 0.000 - 315 0 1 16.733 11.952 0.000 - 316 0 1 17.928 11.952 0.000 - 317 32 2 19.124 11.952 0.000 - 318 0 1 20.319 11.952 0.000 - 319 0 1 21.514 11.952 0.000 - 320 0 1 22.709 11.952 0.000 - 321 0 1 23.905 11.952 0.000 - 322 0 1 25.100 11.952 0.000 - 323 0 1 26.295 11.952 0.000 - 324 0 1 27.490 11.952 0.000 - 325 0 1 28.685 11.952 0.000 - 326 0 1 29.881 11.952 0.000 - 327 0 1 31.076 11.952 0.000 - 328 42 2 32.271 11.952 0.000 - 329 0 1 33.466 11.952 0.000 - 330 0 1 34.662 11.952 0.000 - 331 0 1 0.000 13.148 0.000 - 332 10 2 1.195 13.148 0.000 - 333 54 2 2.390 13.148 0.000 - 334 0 1 3.586 13.148 0.000 - 335 0 1 4.781 13.148 0.000 - 336 0 1 5.976 13.148 0.000 - 337 0 1 7.171 13.148 0.000 - 338 0 1 8.367 13.148 0.000 - 339 20 2 9.562 13.148 0.000 - 340 0 1 10.757 13.148 0.000 - 341 0 1 11.952 13.148 0.000 - 342 0 1 13.148 13.148 0.000 - 343 11 2 14.343 13.148 0.000 - 344 0 1 15.538 13.148 0.000 - 345 0 1 16.733 13.148 0.000 - 346 0 1 17.928 13.148 0.000 - 347 0 1 19.124 13.148 0.000 - 348 0 1 20.319 13.148 0.000 - 349 17 2 21.514 13.148 0.000 - 350 0 1 22.709 13.148 0.000 - 351 0 1 23.905 13.148 0.000 - 352 0 1 25.100 13.148 0.000 - 353 0 1 26.295 13.148 0.000 - 354 0 1 27.490 13.148 0.000 - 355 0 1 28.685 13.148 0.000 - 356 0 1 29.881 13.148 0.000 - 357 0 1 31.076 13.148 0.000 - 358 0 1 32.271 13.148 0.000 - 359 0 1 33.466 13.148 0.000 - 360 0 1 34.662 13.148 0.000 - 361 0 1 0.000 14.343 0.000 - 362 0 1 1.195 14.343 0.000 - 363 8 2 2.390 14.343 0.000 - 364 0 1 3.586 14.343 0.000 - 365 0 1 4.781 14.343 0.000 - 366 0 1 5.976 14.343 0.000 - 367 0 1 7.171 14.343 0.000 - 368 0 1 8.367 14.343 0.000 - 369 0 1 9.562 14.343 0.000 - 370 0 1 10.757 14.343 0.000 - 371 106 2 11.952 14.343 0.000 - 372 0 1 13.148 14.343 0.000 - 373 0 1 14.343 14.343 0.000 - 374 0 1 15.538 14.343 0.000 - 375 0 1 16.733 14.343 0.000 - 376 102 2 17.928 14.343 0.000 - 377 0 1 19.124 14.343 0.000 - 378 81 2 20.319 14.343 0.000 - 379 9 2 21.514 14.343 0.000 - 380 0 1 22.709 14.343 0.000 - 381 0 1 23.905 14.343 0.000 - 382 0 1 25.100 14.343 0.000 - 383 0 1 26.295 14.343 0.000 - 384 0 1 27.490 14.343 0.000 - 385 0 1 28.685 14.343 0.000 - 386 0 1 29.881 14.343 0.000 - 387 0 1 31.076 14.343 0.000 - 388 0 1 32.271 14.343 0.000 - 389 0 1 33.466 14.343 0.000 - 390 0 1 34.662 14.343 0.000 - 391 0 1 0.000 15.538 0.000 - 392 0 1 1.195 15.538 0.000 - 393 0 1 2.390 15.538 0.000 - 394 0 1 3.586 15.538 0.000 - 395 0 1 4.781 15.538 0.000 - 396 0 1 5.976 15.538 0.000 - 397 0 1 7.171 15.538 0.000 - 398 0 1 8.367 15.538 0.000 - 399 70 2 9.562 15.538 0.000 - 400 0 1 10.757 15.538 0.000 - 401 0 1 11.952 15.538 0.000 - 402 0 1 13.148 15.538 0.000 - 403 0 1 14.343 15.538 0.000 - 404 0 1 15.538 15.538 0.000 - 405 0 1 16.733 15.538 0.000 - 406 0 1 17.928 15.538 0.000 - 407 0 1 19.124 15.538 0.000 - 408 0 1 20.319 15.538 0.000 - 409 0 1 21.514 15.538 0.000 - 410 0 1 22.709 15.538 0.000 - 411 0 1 23.905 15.538 0.000 - 412 0 1 25.100 15.538 0.000 - 413 93 2 26.295 15.538 0.000 - 414 0 1 27.490 15.538 0.000 - 415 0 1 28.685 15.538 0.000 - 416 27 2 29.881 15.538 0.000 - 417 0 1 31.076 15.538 0.000 - 418 60 2 32.271 15.538 0.000 - 419 107 2 33.466 15.538 0.000 - 420 111 2 34.662 15.538 0.000 - 421 0 1 0.000 16.733 0.000 - 422 0 1 1.195 16.733 0.000 - 423 0 1 2.390 16.733 0.000 - 424 0 1 3.586 16.733 0.000 - 425 0 1 4.781 16.733 0.000 - 426 0 1 5.976 16.733 0.000 - 427 133 2 7.171 16.733 0.000 - 428 0 1 8.367 16.733 0.000 - 429 0 1 9.562 16.733 0.000 - 430 0 1 10.757 16.733 0.000 - 431 65 2 11.952 16.733 0.000 - 432 0 1 13.148 16.733 0.000 - 433 0 1 14.343 16.733 0.000 - 434 0 1 15.538 16.733 0.000 - 435 0 1 16.733 16.733 0.000 - 436 0 1 17.928 16.733 0.000 - 437 80 2 19.124 16.733 0.000 - 438 0 1 20.319 16.733 0.000 - 439 0 1 21.514 16.733 0.000 - 440 0 1 22.709 16.733 0.000 - 441 0 1 23.905 16.733 0.000 - 442 0 1 25.100 16.733 0.000 - 443 51 2 26.295 16.733 0.000 - 444 0 1 27.490 16.733 0.000 - 445 0 1 28.685 16.733 0.000 - 446 0 1 29.881 16.733 0.000 - 447 44 2 31.076 16.733 0.000 - 448 0 1 32.271 16.733 0.000 - 449 0 1 33.466 16.733 0.000 - 450 137 2 34.662 16.733 0.000 - 451 0 1 0.000 17.928 0.000 - 452 86 2 1.195 17.928 0.000 - 453 0 1 2.390 17.928 0.000 - 454 0 1 3.586 17.928 0.000 - 455 112 2 4.781 17.928 0.000 - 456 0 1 5.976 17.928 0.000 - 457 0 1 7.171 17.928 0.000 - 458 0 1 8.367 17.928 0.000 - 459 0 1 9.562 17.928 0.000 - 460 2 2 10.757 17.928 0.000 - 461 0 1 11.952 17.928 0.000 - 462 0 1 13.148 17.928 0.000 - 463 0 1 14.343 17.928 0.000 - 464 147 2 15.538 17.928 0.000 - 465 0 1 16.733 17.928 0.000 - 466 0 1 17.928 17.928 0.000 - 467 14 2 19.124 17.928 0.000 - 468 0 1 20.319 17.928 0.000 - 469 0 1 21.514 17.928 0.000 - 470 142 2 22.709 17.928 0.000 - 471 0 1 23.905 17.928 0.000 - 472 0 1 25.100 17.928 0.000 - 473 0 1 26.295 17.928 0.000 - 474 0 1 27.490 17.928 0.000 - 475 84 2 28.685 17.928 0.000 - 476 0 1 29.881 17.928 0.000 - 477 0 1 31.076 17.928 0.000 - 478 0 1 32.271 17.928 0.000 - 479 0 1 33.466 17.928 0.000 - 480 26 2 34.662 17.928 0.000 - 481 0 1 0.000 19.124 0.000 - 482 0 1 1.195 19.124 0.000 - 483 56 2 2.390 19.124 0.000 - 484 0 1 3.586 19.124 0.000 - 485 0 1 4.781 19.124 0.000 - 486 0 1 5.976 19.124 0.000 - 487 21 2 7.171 19.124 0.000 - 488 0 1 8.367 19.124 0.000 - 489 0 1 9.562 19.124 0.000 - 490 0 1 10.757 19.124 0.000 - 491 0 1 11.952 19.124 0.000 - 492 0 1 13.148 19.124 0.000 - 493 58 2 14.343 19.124 0.000 - 494 0 1 15.538 19.124 0.000 - 495 0 1 16.733 19.124 0.000 - 496 0 1 17.928 19.124 0.000 - 497 0 1 19.124 19.124 0.000 - 498 0 1 20.319 19.124 0.000 - 499 0 1 21.514 19.124 0.000 - 500 0 1 22.709 19.124 0.000 - 501 0 1 23.905 19.124 0.000 - 502 0 1 25.100 19.124 0.000 - 503 0 1 26.295 19.124 0.000 - 504 0 1 27.490 19.124 0.000 - 505 0 1 28.685 19.124 0.000 - 506 0 1 29.881 19.124 0.000 - 507 0 1 31.076 19.124 0.000 - 508 0 1 32.271 19.124 0.000 - 509 0 1 33.466 19.124 0.000 - 510 123 2 34.662 19.124 0.000 - 511 0 1 0.000 20.319 0.000 - 512 0 1 1.195 20.319 0.000 - 513 0 1 2.390 20.319 0.000 - 514 0 1 3.586 20.319 0.000 - 515 0 1 4.781 20.319 0.000 - 516 0 1 5.976 20.319 0.000 - 517 0 1 7.171 20.319 0.000 - 518 0 1 8.367 20.319 0.000 - 519 118 2 9.562 20.319 0.000 - 520 36 2 10.757 20.319 0.000 - 521 76 2 11.952 20.319 0.000 - 522 0 1 13.148 20.319 0.000 - 523 0 1 14.343 20.319 0.000 - 524 22 2 15.538 20.319 0.000 - 525 0 1 16.733 20.319 0.000 - 526 127 2 17.928 20.319 0.000 - 527 0 1 19.124 20.319 0.000 - 528 0 1 20.319 20.319 0.000 - 529 0 1 21.514 20.319 0.000 - 530 0 1 22.709 20.319 0.000 - 531 62 2 23.905 20.319 0.000 - 532 0 1 25.100 20.319 0.000 - 533 0 1 26.295 20.319 0.000 - 534 0 1 27.490 20.319 0.000 - 535 0 1 28.685 20.319 0.000 - 536 4 2 29.881 20.319 0.000 - 537 0 1 31.076 20.319 0.000 - 538 0 1 32.271 20.319 0.000 - 539 0 1 33.466 20.319 0.000 - 540 0 1 34.662 20.319 0.000 - 541 0 1 0.000 21.514 0.000 - 542 0 1 1.195 21.514 0.000 - 543 0 1 2.390 21.514 0.000 - 544 0 1 3.586 21.514 0.000 - 545 0 1 4.781 21.514 0.000 - 546 0 1 5.976 21.514 0.000 - 547 0 1 7.171 21.514 0.000 - 548 0 1 8.367 21.514 0.000 - 549 0 1 9.562 21.514 0.000 - 550 0 1 10.757 21.514 0.000 - 551 0 1 11.952 21.514 0.000 - 552 0 1 13.148 21.514 0.000 - 553 99 2 14.343 21.514 0.000 - 554 0 1 15.538 21.514 0.000 - 555 0 1 16.733 21.514 0.000 - 556 0 1 17.928 21.514 0.000 - 557 0 1 19.124 21.514 0.000 - 558 0 1 20.319 21.514 0.000 - 559 0 1 21.514 21.514 0.000 - 560 1 2 22.709 21.514 0.000 - 561 130 2 23.905 21.514 0.000 - 562 0 1 25.100 21.514 0.000 - 563 0 1 26.295 21.514 0.000 - 564 0 1 27.490 21.514 0.000 - 565 79 2 28.685 21.514 0.000 - 566 0 1 29.881 21.514 0.000 - 567 0 1 31.076 21.514 0.000 - 568 0 1 32.271 21.514 0.000 - 569 0 1 33.466 21.514 0.000 - 570 0 1 34.662 21.514 0.000 - 571 0 1 0.000 22.709 0.000 - 572 0 1 1.195 22.709 0.000 - 573 0 1 2.390 22.709 0.000 - 574 0 1 3.586 22.709 0.000 - 575 0 1 4.781 22.709 0.000 - 576 0 1 5.976 22.709 0.000 - 577 0 1 7.171 22.709 0.000 - 578 0 1 8.367 22.709 0.000 - 579 0 1 9.562 22.709 0.000 - 580 0 1 10.757 22.709 0.000 - 581 0 1 11.952 22.709 0.000 - 582 0 1 13.148 22.709 0.000 - 583 0 1 14.343 22.709 0.000 - 584 0 1 15.538 22.709 0.000 - 585 0 1 16.733 22.709 0.000 - 586 0 1 17.928 22.709 0.000 - 587 100 2 19.124 22.709 0.000 - 588 0 1 20.319 22.709 0.000 - 589 0 1 21.514 22.709 0.000 - 590 0 1 22.709 22.709 0.000 - 591 0 1 23.905 22.709 0.000 - 592 0 1 25.100 22.709 0.000 - 593 126 2 26.295 22.709 0.000 - 594 0 1 27.490 22.709 0.000 - 595 0 1 28.685 22.709 0.000 - 596 0 1 29.881 22.709 0.000 - 597 0 1 31.076 22.709 0.000 - 598 0 1 32.271 22.709 0.000 - 599 0 1 33.466 22.709 0.000 - 600 0 1 34.662 22.709 0.000 - 601 0 1 0.000 23.905 0.000 - 602 0 1 1.195 23.905 0.000 - 603 0 1 2.390 23.905 0.000 - 604 37 2 3.586 23.905 0.000 - 605 0 1 4.781 23.905 0.000 - 606 140 2 5.976 23.905 0.000 - 607 0 1 7.171 23.905 0.000 - 608 0 1 8.367 23.905 0.000 - 609 0 1 9.562 23.905 0.000 - 610 0 1 10.757 23.905 0.000 - 611 0 1 11.952 23.905 0.000 - 612 0 1 13.148 23.905 0.000 - 613 0 1 14.343 23.905 0.000 - 614 0 1 15.538 23.905 0.000 - 615 0 1 16.733 23.905 0.000 - 616 0 1 17.928 23.905 0.000 - 617 0 1 19.124 23.905 0.000 - 618 0 1 20.319 23.905 0.000 - 619 0 1 21.514 23.905 0.000 - 620 0 1 22.709 23.905 0.000 - 621 0 1 23.905 23.905 0.000 - 622 0 1 25.100 23.905 0.000 - 623 0 1 26.295 23.905 0.000 - 624 0 1 27.490 23.905 0.000 - 625 0 1 28.685 23.905 0.000 - 626 141 2 29.881 23.905 0.000 - 627 0 1 31.076 23.905 0.000 - 628 0 1 32.271 23.905 0.000 - 629 0 1 33.466 23.905 0.000 - 630 0 1 34.662 23.905 0.000 - 631 148 2 0.000 25.100 0.000 - 632 0 1 1.195 25.100 0.000 - 633 0 1 2.390 25.100 0.000 - 634 0 1 3.586 25.100 0.000 - 635 0 1 4.781 25.100 0.000 - 636 0 1 5.976 25.100 0.000 - 637 0 1 7.171 25.100 0.000 - 638 0 1 8.367 25.100 0.000 - 639 39 2 9.562 25.100 0.000 - 640 0 1 10.757 25.100 0.000 - 641 0 1 11.952 25.100 0.000 - 642 0 1 13.148 25.100 0.000 - 643 69 2 14.343 25.100 0.000 - 644 0 1 15.538 25.100 0.000 - 645 0 1 16.733 25.100 0.000 - 646 143 2 17.928 25.100 0.000 - 647 98 2 19.124 25.100 0.000 - 648 0 1 20.319 25.100 0.000 - 649 31 2 21.514 25.100 0.000 - 650 138 2 22.709 25.100 0.000 - 651 0 1 23.905 25.100 0.000 - 652 0 1 25.100 25.100 0.000 - 653 0 1 26.295 25.100 0.000 - 654 0 1 27.490 25.100 0.000 - 655 0 1 28.685 25.100 0.000 - 656 0 1 29.881 25.100 0.000 - 657 0 1 31.076 25.100 0.000 - 658 0 1 32.271 25.100 0.000 - 659 0 1 33.466 25.100 0.000 - 660 0 1 34.662 25.100 0.000 - 661 0 1 0.000 26.295 0.000 - 662 0 1 1.195 26.295 0.000 - 663 0 1 2.390 26.295 0.000 - 664 0 1 3.586 26.295 0.000 - 665 0 1 4.781 26.295 0.000 - 666 0 1 5.976 26.295 0.000 - 667 0 1 7.171 26.295 0.000 - 668 0 1 8.367 26.295 0.000 - 669 0 1 9.562 26.295 0.000 - 670 124 2 10.757 26.295 0.000 - 671 0 1 11.952 26.295 0.000 - 672 0 1 13.148 26.295 0.000 - 673 0 1 14.343 26.295 0.000 - 674 0 1 15.538 26.295 0.000 - 675 0 1 16.733 26.295 0.000 - 676 0 1 17.928 26.295 0.000 - 677 0 1 19.124 26.295 0.000 - 678 0 1 20.319 26.295 0.000 - 679 16 2 21.514 26.295 0.000 - 680 0 1 22.709 26.295 0.000 - 681 0 1 23.905 26.295 0.000 - 682 0 1 25.100 26.295 0.000 - 683 0 1 26.295 26.295 0.000 - 684 0 1 27.490 26.295 0.000 - 685 0 1 28.685 26.295 0.000 - 686 0 1 29.881 26.295 0.000 - 687 0 1 31.076 26.295 0.000 - 688 0 1 32.271 26.295 0.000 - 689 0 1 33.466 26.295 0.000 - 690 0 1 34.662 26.295 0.000 - 691 0 1 0.000 27.490 0.000 - 692 0 1 1.195 27.490 0.000 - 693 0 1 2.390 27.490 0.000 - 694 0 1 3.586 27.490 0.000 - 695 0 1 4.781 27.490 0.000 - 696 0 1 5.976 27.490 0.000 - 697 0 1 7.171 27.490 0.000 - 698 0 1 8.367 27.490 0.000 - 699 0 1 9.562 27.490 0.000 - 700 0 1 10.757 27.490 0.000 - 701 0 1 11.952 27.490 0.000 - 702 0 1 13.148 27.490 0.000 - 703 66 2 14.343 27.490 0.000 - 704 0 1 15.538 27.490 0.000 - 705 0 1 16.733 27.490 0.000 - 706 0 1 17.928 27.490 0.000 - 707 0 1 19.124 27.490 0.000 - 708 135 2 20.319 27.490 0.000 - 709 0 1 21.514 27.490 0.000 - 710 0 1 22.709 27.490 0.000 - 711 0 1 23.905 27.490 0.000 - 712 0 1 25.100 27.490 0.000 - 713 0 1 26.295 27.490 0.000 - 714 105 2 27.490 27.490 0.000 - 715 0 1 28.685 27.490 0.000 - 716 0 1 29.881 27.490 0.000 - 717 0 1 31.076 27.490 0.000 - 718 0 1 32.271 27.490 0.000 - 719 0 1 33.466 27.490 0.000 - 720 0 1 34.662 27.490 0.000 - 721 95 2 0.000 28.685 0.000 - 722 0 1 1.195 28.685 0.000 - 723 115 2 2.390 28.685 0.000 - 724 0 1 3.586 28.685 0.000 - 725 0 1 4.781 28.685 0.000 - 726 78 2 5.976 28.685 0.000 - 727 0 1 7.171 28.685 0.000 - 728 0 1 8.367 28.685 0.000 - 729 0 1 9.562 28.685 0.000 - 730 0 1 10.757 28.685 0.000 - 731 0 1 11.952 28.685 0.000 - 732 96 2 13.148 28.685 0.000 - 733 0 1 14.343 28.685 0.000 - 734 0 1 15.538 28.685 0.000 - 735 0 1 16.733 28.685 0.000 - 736 82 2 17.928 28.685 0.000 - 737 0 1 19.124 28.685 0.000 - 738 0 1 20.319 28.685 0.000 - 739 0 1 21.514 28.685 0.000 - 740 0 1 22.709 28.685 0.000 - 741 0 1 23.905 28.685 0.000 - 742 0 1 25.100 28.685 0.000 - 743 0 1 26.295 28.685 0.000 - 744 0 1 27.490 28.685 0.000 - 745 0 1 28.685 28.685 0.000 - 746 0 1 29.881 28.685 0.000 - 747 0 1 31.076 28.685 0.000 - 748 0 1 32.271 28.685 0.000 - 749 0 1 33.466 28.685 0.000 - 750 0 1 34.662 28.685 0.000 - 751 0 1 0.000 29.881 0.000 - 752 0 1 1.195 29.881 0.000 - 753 0 1 2.390 29.881 0.000 - 754 0 1 3.586 29.881 0.000 - 755 0 1 4.781 29.881 0.000 - 756 72 2 5.976 29.881 0.000 - 757 0 1 7.171 29.881 0.000 - 758 0 1 8.367 29.881 0.000 - 759 0 1 9.562 29.881 0.000 - 760 0 1 10.757 29.881 0.000 - 761 0 1 11.952 29.881 0.000 - 762 63 2 13.148 29.881 0.000 - 763 0 1 14.343 29.881 0.000 - 764 0 1 15.538 29.881 0.000 - 765 0 1 16.733 29.881 0.000 - 766 0 1 17.928 29.881 0.000 - 767 0 1 19.124 29.881 0.000 - 768 0 1 20.319 29.881 0.000 - 769 13 2 21.514 29.881 0.000 - 770 5 2 22.709 29.881 0.000 - 771 0 1 23.905 29.881 0.000 - 772 88 2 25.100 29.881 0.000 - 773 0 1 26.295 29.881 0.000 - 774 29 2 27.490 29.881 0.000 - 775 0 1 28.685 29.881 0.000 - 776 0 1 29.881 29.881 0.000 - 777 0 1 31.076 29.881 0.000 - 778 0 1 32.271 29.881 0.000 - 779 0 1 33.466 29.881 0.000 - 780 0 1 34.662 29.881 0.000 - 781 0 1 0.000 31.076 0.000 - 782 0 1 1.195 31.076 0.000 - 783 149 2 2.390 31.076 0.000 - 784 0 1 3.586 31.076 0.000 - 785 46 2 4.781 31.076 0.000 - 786 0 1 5.976 31.076 0.000 - 787 0 1 7.171 31.076 0.000 - 788 0 1 8.367 31.076 0.000 - 789 0 1 9.562 31.076 0.000 - 790 0 1 10.757 31.076 0.000 - 791 0 1 11.952 31.076 0.000 - 792 0 1 13.148 31.076 0.000 - 793 0 1 14.343 31.076 0.000 - 794 0 1 15.538 31.076 0.000 - 795 0 1 16.733 31.076 0.000 - 796 0 1 17.928 31.076 0.000 - 797 0 1 19.124 31.076 0.000 - 798 0 1 20.319 31.076 0.000 - 799 0 1 21.514 31.076 0.000 - 800 0 1 22.709 31.076 0.000 - 801 0 1 23.905 31.076 0.000 - 802 0 1 25.100 31.076 0.000 - 803 0 1 26.295 31.076 0.000 - 804 0 1 27.490 31.076 0.000 - 805 0 1 28.685 31.076 0.000 - 806 0 1 29.881 31.076 0.000 - 807 0 1 31.076 31.076 0.000 - 808 0 1 32.271 31.076 0.000 - 809 0 1 33.466 31.076 0.000 - 810 0 1 34.662 31.076 0.000 - 811 0 1 0.000 32.271 0.000 - 812 0 1 1.195 32.271 0.000 - 813 92 2 2.390 32.271 0.000 - 814 0 1 3.586 32.271 0.000 - 815 0 1 4.781 32.271 0.000 - 816 0 1 5.976 32.271 0.000 - 817 0 1 7.171 32.271 0.000 - 818 0 1 8.367 32.271 0.000 - 819 91 2 9.562 32.271 0.000 - 820 0 1 10.757 32.271 0.000 - 821 0 1 11.952 32.271 0.000 - 822 0 1 13.148 32.271 0.000 - 823 0 1 14.343 32.271 0.000 - 824 0 1 15.538 32.271 0.000 - 825 0 1 16.733 32.271 0.000 - 826 7 2 17.928 32.271 0.000 - 827 0 1 19.124 32.271 0.000 - 828 0 1 20.319 32.271 0.000 - 829 0 1 21.514 32.271 0.000 - 830 0 1 22.709 32.271 0.000 - 831 83 2 23.905 32.271 0.000 - 832 0 1 25.100 32.271 0.000 - 833 0 1 26.295 32.271 0.000 - 834 87 2 27.490 32.271 0.000 - 835 0 1 28.685 32.271 0.000 - 836 0 1 29.881 32.271 0.000 - 837 0 1 31.076 32.271 0.000 - 838 0 1 32.271 32.271 0.000 - 839 0 1 33.466 32.271 0.000 - 840 0 1 34.662 32.271 0.000 - 841 25 2 0.000 33.466 0.000 - 842 150 2 1.195 33.466 0.000 - 843 0 1 2.390 33.466 0.000 - 844 0 1 3.586 33.466 0.000 - 845 0 1 4.781 33.466 0.000 - 846 19 2 5.976 33.466 0.000 - 847 0 1 7.171 33.466 0.000 - 848 0 1 8.367 33.466 0.000 - 849 0 1 9.562 33.466 0.000 - 850 0 1 10.757 33.466 0.000 - 851 0 1 11.952 33.466 0.000 - 852 0 1 13.148 33.466 0.000 - 853 0 1 14.343 33.466 0.000 - 854 77 2 15.538 33.466 0.000 - 855 125 2 16.733 33.466 0.000 - 856 0 1 17.928 33.466 0.000 - 857 0 1 19.124 33.466 0.000 - 858 0 1 20.319 33.466 0.000 - 859 103 2 21.514 33.466 0.000 - 860 28 2 22.709 33.466 0.000 - 861 0 1 23.905 33.466 0.000 - 862 0 1 25.100 33.466 0.000 - 863 0 1 26.295 33.466 0.000 - 864 0 1 27.490 33.466 0.000 - 865 0 1 28.685 33.466 0.000 - 866 0 1 29.881 33.466 0.000 - 867 144 2 31.076 33.466 0.000 - 868 85 2 32.271 33.466 0.000 - 869 43 2 33.466 33.466 0.000 - 870 0 1 34.662 33.466 0.000 - 871 0 1 0.000 34.662 0.000 - 872 0 1 1.195 34.662 0.000 - 873 0 1 2.390 34.662 0.000 - 874 0 1 3.586 34.662 0.000 - 875 0 1 4.781 34.662 0.000 - 876 59 2 5.976 34.662 0.000 - 877 0 1 7.171 34.662 0.000 - 878 122 2 8.367 34.662 0.000 - 879 0 1 9.562 34.662 0.000 - 880 18 2 10.757 34.662 0.000 - 881 45 2 11.952 34.662 0.000 - 882 0 1 13.148 34.662 0.000 - 883 0 1 14.343 34.662 0.000 - 884 0 1 15.538 34.662 0.000 - 885 0 1 16.733 34.662 0.000 - 886 0 1 17.928 34.662 0.000 - 887 0 1 19.124 34.662 0.000 - 888 0 1 20.319 34.662 0.000 - 889 0 1 21.514 34.662 0.000 - 890 0 1 22.709 34.662 0.000 - 891 0 1 23.905 34.662 0.000 - 892 0 1 25.100 34.662 0.000 - 893 0 1 26.295 34.662 0.000 - 894 55 2 27.490 34.662 0.000 - 895 0 1 28.685 34.662 0.000 - 896 0 1 29.881 34.662 0.000 - 897 23 2 31.076 34.662 0.000 - 898 0 1 32.271 34.662 0.000 - 899 0 1 33.466 34.662 0.000 - 900 50 2 34.662 34.662 0.000 - 901 1 3 23.446 21.656 0.000 - 902 1 4 24.182 21.798 0.000 - 903 2 3 10.203 17.423 0.000 - 904 2 4 9.649 16.918 0.000 - 905 3 3 8.904 4.421 0.000 - 906 3 4 8.245 4.062 0.000 - 907 4 3 30.012 21.057 0.000 - 908 4 4 30.144 21.796 0.000 - 909 5 3 21.972 29.746 0.000 - 910 5 4 21.234 29.611 0.000 - 911 6 3 32.971 8.637 0.000 - 912 6 4 33.670 8.907 0.000 - 913 7 3 18.651 32.471 0.000 - 914 7 4 19.374 32.671 0.000 - 915 8 3 2.971 14.818 0.000 - 916 8 4 3.551 15.293 0.000 - 917 9 3 20.785 14.519 0.000 - 918 9 4 20.056 14.695 0.000 - 919 10 3 1.764 12.658 0.000 - 920 10 4 2.332 12.169 0.000 - 921 11 3 14.987 12.763 0.000 - 922 11 4 15.630 12.378 0.000 - 923 12 3 24.552 8.879 0.000 - 924 12 4 24.004 9.391 0.000 - 925 13 3 20.963 29.372 0.000 - 926 13 4 20.412 28.864 0.000 - 927 14 3 19.031 18.673 0.000 - 928 14 4 18.939 19.417 0.000 - 929 15 3 12.725 6.552 0.000 - 930 15 4 12.302 5.933 0.000 - 931 16 3 21.105 25.667 0.000 - 932 16 4 20.695 25.038 0.000 - 933 17 3 22.262 13.198 0.000 - 934 17 4 23.011 13.249 0.000 - 935 18 3 11.459 34.399 0.000 - 936 18 4 12.162 34.136 0.000 - 937 19 3 5.247 33.289 0.000 - 938 19 4 4.519 33.112 0.000 - 939 20 3 9.628 12.400 0.000 - 940 20 4 9.694 11.653 0.000 - 941 21 3 7.454 19.819 0.000 - 942 21 4 7.736 20.513 0.000 - 943 22 3 16.281 20.219 0.000 - 944 22 4 17.025 20.119 0.000 - 945 23 3 30.370 34.916 0.000 - 946 23 4 29.665 35.170 0.000 - 947 24 3 5.151 1.738 0.000 - 948 24 4 5.521 1.086 0.000 - 949 25 3 0.677 33.143 0.000 - 950 25 4 1.353 32.819 0.000 - 951 26 3 35.071 18.557 0.000 - 952 26 4 35.480 19.186 0.000 - 953 27 3 29.131 15.504 0.000 - 954 27 4 28.382 15.470 0.000 - 955 28 3 23.456 33.395 0.000 - 956 28 4 24.202 33.323 0.000 - 957 29 3 27.682 29.156 0.000 - 958 29 4 27.873 28.430 0.000 - 959 30 3 8.964 5.523 0.000 - 960 30 4 8.366 5.071 0.000 - 961 31 3 20.874 24.710 0.000 - 962 31 4 20.233 24.320 0.000 - 963 32 3 18.692 11.339 0.000 - 964 32 4 18.260 10.726 0.000 - 965 33 3 29.828 6.724 0.000 - 966 33 4 29.776 7.472 0.000 - 967 34 3 34.865 9.089 0.000 - 968 34 4 35.068 9.811 0.000 - 969 35 3 13.797 0.821 0.000 - 970 35 4 14.447 0.446 0.000 - 971 36 3 11.184 20.935 0.000 - 972 36 4 11.611 21.552 0.000 - 973 37 3 3.927 23.237 0.000 - 974 37 4 4.268 22.569 0.000 - 975 38 3 4.589 5.506 0.000 - 976 38 4 4.396 6.231 0.000 - 977 39 3 10.244 24.788 0.000 - 978 39 4 10.926 24.477 0.000 - 979 40 3 26.755 5.384 0.000 - 980 40 4 27.215 4.792 0.000 - 981 41 3 12.578 4.368 0.000 - 982 41 4 13.204 3.955 0.000 - 983 42 3 32.760 12.521 0.000 - 984 42 4 33.250 13.089 0.000 - 985 43 3 33.337 34.205 0.000 - 986 43 4 33.208 34.944 0.000 - 987 44 3 30.490 17.201 0.000 - 988 44 4 29.903 17.669 0.000 - 989 45 3 11.350 34.215 0.000 - 990 45 4 10.747 33.768 0.000 - 991 46 3 4.207 31.559 0.000 - 992 46 4 3.633 32.042 0.000 - 993 47 3 29.131 2.378 0.000 - 994 47 4 28.381 2.365 0.000 - 995 48 3 6.841 5.303 0.000 - 996 48 4 6.510 4.630 0.000 - 997 49 3 30.612 3.421 0.000 - 998 49 4 31.344 3.255 0.000 - 999 50 3 33.918 34.761 0.000 - 1000 50 4 33.175 34.860 0.000 - 1001 51 3 25.725 17.220 0.000 - 1002 51 4 25.154 17.707 0.000 - 1003 52 3 12.684 0.590 0.000 - 1004 52 4 12.220 1.179 0.000 - 1005 53 3 35.273 6.447 0.000 - 1006 53 4 34.690 6.918 0.000 - 1007 54 3 2.829 13.756 0.000 - 1008 54 4 3.268 14.364 0.000 - 1009 55 3 26.740 34.672 0.000 - 1010 55 4 25.990 34.682 0.000 - 1011 56 3 2.771 18.477 0.000 - 1012 56 4 3.151 17.831 0.000 - 1013 57 3 9.635 12.699 0.000 - 1014 57 4 9.708 13.445 0.000 - 1015 58 3 13.791 19.631 0.000 - 1016 58 4 13.239 20.139 0.000 - 1017 59 3 5.234 34.554 0.000 - 1018 59 4 4.492 34.447 0.000 - 1019 60 3 33.007 15.392 0.000 - 1020 60 4 33.743 15.246 0.000 - 1021 61 3 19.707 10.034 0.000 - 1022 61 4 20.289 10.506 0.000 - 1023 62 3 24.178 19.620 0.000 - 1024 62 4 24.451 18.922 0.000 - 1025 63 3 13.735 30.347 0.000 - 1026 63 4 14.323 30.813 0.000 - 1027 64 3 25.743 9.947 0.000 - 1028 64 4 26.387 10.333 0.000 - 1029 65 3 12.610 17.093 0.000 - 1030 65 4 13.268 17.453 0.000 - 1031 66 3 14.320 26.741 0.000 - 1032 66 4 14.297 25.991 0.000 - 1033 67 3 6.831 5.449 0.000 - 1034 67 4 6.490 6.117 0.000 - 1035 68 3 5.518 10.617 0.000 - 1036 68 4 6.255 10.478 0.000 - 1037 69 3 13.604 25.229 0.000 - 1038 69 4 12.865 25.359 0.000 - 1039 70 3 8.831 15.371 0.000 - 1040 70 4 8.099 15.205 0.000 - 1041 71 3 25.741 8.873 0.000 - 1042 71 4 25.188 9.379 0.000 - 1043 72 3 5.314 30.232 0.000 - 1044 72 4 4.651 30.583 0.000 - 1045 73 3 27.864 11.407 0.000 - 1046 73 4 28.238 12.057 0.000 - 1047 74 3 25.724 2.806 0.000 - 1048 74 4 26.349 3.221 0.000 - 1049 75 3 5.357 0.715 0.000 - 1050 75 4 5.934 0.235 0.000 - 1051 76 3 11.355 20.772 0.000 - 1052 76 4 10.757 21.225 0.000 - 1053 77 3 15.439 32.723 0.000 - 1054 77 4 15.341 31.979 0.000 - 1055 78 3 6.689 28.919 0.000 - 1056 78 4 7.401 29.153 0.000 - 1057 79 3 28.300 20.871 0.000 - 1058 79 4 27.915 20.227 0.000 - 1059 80 3 19.267 15.997 0.000 - 1060 80 4 19.410 15.261 0.000 - 1061 81 3 20.293 15.092 0.000 - 1062 81 4 20.267 15.842 0.000 - 1063 82 3 18.458 29.216 0.000 - 1064 82 4 18.988 29.747 0.000 - 1065 83 3 23.376 32.803 0.000 - 1066 83 4 22.847 33.335 0.000 - 1067 84 3 27.938 17.869 0.000 - 1068 84 4 27.190 17.809 0.000 - 1069 85 3 33.021 33.461 0.000 - 1070 85 4 33.771 33.455 0.000 - 1071 86 3 0.552 18.315 0.000 - 1072 86 4 35.766 18.701 0.000 - 1073 87 3 28.026 32.796 0.000 - 1074 87 4 28.562 33.321 0.000 - 1075 88 3 24.351 29.925 0.000 - 1076 88 4 23.602 29.968 0.000 - 1077 89 3 7.621 1.112 0.000 - 1078 89 4 6.876 1.029 0.000 - 1079 90 3 7.084 10.307 0.000 - 1080 90 4 6.997 11.052 0.000 - 1081 91 3 8.815 32.201 0.000 - 1082 91 4 8.068 32.132 0.000 - 1083 92 3 3.044 31.903 0.000 - 1084 92 4 3.697 31.534 0.000 - 1085 93 3 26.170 16.278 0.000 - 1086 93 4 26.046 17.017 0.000 - 1087 94 3 10.380 0.547 0.000 - 1088 94 4 10.003 35.755 0.000 - 1089 95 3 0.419 29.308 0.000 - 1090 95 4 0.837 29.930 0.000 - 1091 96 3 13.712 28.191 0.000 - 1092 96 4 14.276 27.697 0.000 - 1093 97 3 22.218 7.800 0.000 - 1094 97 4 21.727 7.233 0.000 - 1095 98 3 18.383 25.220 0.000 - 1096 98 4 17.643 25.340 0.000 - 1097 99 3 13.873 20.929 0.000 - 1098 99 4 13.404 20.344 0.000 - 1099 100 3 19.838 22.480 0.000 - 1100 100 4 20.552 22.252 0.000 - 1101 101 3 10.516 12.663 0.000 - 1102 101 4 10.275 13.373 0.000 - 1103 102 3 17.336 14.803 0.000 - 1104 102 4 16.744 15.263 0.000 - 1105 103 3 21.530 32.717 0.000 - 1106 103 4 21.547 31.967 0.000 - 1107 104 3 13.517 6.629 0.000 - 1108 104 4 13.886 7.282 0.000 - 1109 105 3 28.227 27.629 0.000 - 1110 105 4 28.964 27.769 0.000 - 1111 106 3 12.490 14.866 0.000 - 1112 106 4 13.028 15.388 0.000 - 1113 107 3 32.890 16.018 0.000 - 1114 107 4 32.314 16.499 0.000 - 1115 108 3 23.345 6.672 0.000 - 1116 108 4 22.786 6.172 0.000 - 1117 109 3 16.215 10.435 0.000 - 1118 109 4 16.893 10.113 0.000 - 1119 110 3 26.961 0.531 0.000 - 1120 110 4 26.431 1.062 0.000 - 1121 111 3 33.932 15.366 0.000 - 1122 111 4 33.202 15.193 0.000 - 1123 112 3 5.463 17.616 0.000 - 1124 112 4 6.145 17.304 0.000 - 1125 113 3 1.707 1.505 0.000 - 1126 113 4 1.025 1.815 0.000 - 1127 114 3 11.142 0.643 0.000 - 1128 114 4 11.528 1.287 0.000 - 1129 115 3 2.236 29.419 0.000 - 1130 115 4 2.082 30.153 0.000 - 1131 116 3 20.514 5.252 0.000 - 1132 116 4 20.710 4.528 0.000 - 1133 117 3 21.836 2.908 0.000 - 1134 117 4 22.159 2.231 0.000 - 1135 118 3 9.519 21.068 0.000 - 1136 118 4 9.476 21.816 0.000 - 1137 119 3 2.875 1.818 0.000 - 1138 119 4 3.359 1.245 0.000 - 1139 120 3 11.204 11.996 0.000 - 1140 120 4 10.455 12.040 0.000 - 1141 121 3 10.817 4.333 0.000 - 1142 121 4 10.877 5.081 0.000 - 1143 122 3 7.965 34.028 0.000 - 1144 122 4 7.564 33.394 0.000 - 1145 123 3 34.366 18.435 0.000 - 1146 123 4 34.069 17.745 0.000 - 1147 124 3 10.053 26.554 0.000 - 1148 124 4 9.350 26.814 0.000 - 1149 125 3 16.151 32.994 0.000 - 1150 125 4 15.568 32.521 0.000 - 1151 126 3 26.788 22.144 0.000 - 1152 126 4 27.280 21.578 0.000 - 1153 127 3 17.615 19.638 0.000 - 1154 127 4 17.302 18.956 0.000 - 1155 128 3 29.412 35.671 0.000 - 1156 128 4 30.139 35.486 0.000 - 1157 129 3 13.808 3.060 0.000 - 1158 129 4 13.274 2.533 0.000 - 1159 130 3 24.601 21.792 0.000 - 1160 130 4 25.298 22.070 0.000 - 1161 131 3 14.805 5.371 0.000 - 1162 131 4 15.268 5.962 0.000 - 1163 132 3 28.138 6.659 0.000 - 1164 132 4 27.590 6.147 0.000 - 1165 133 3 7.913 16.622 0.000 - 1166 133 4 8.655 16.511 0.000 - 1167 134 3 6.561 11.483 0.000 - 1168 134 4 7.146 11.013 0.000 - 1169 135 3 21.057 27.626 0.000 - 1170 135 4 21.794 27.761 0.000 - 1171 136 3 15.201 5.306 0.000 - 1172 136 4 14.863 4.637 0.000 - 1173 137 3 34.687 17.483 0.000 - 1174 137 4 34.713 18.232 0.000 - 1175 138 3 23.371 24.747 0.000 - 1176 138 4 24.033 24.394 0.000 - 1177 139 3 0.161 0.733 0.000 - 1178 139 4 0.321 1.465 0.000 - 1179 140 3 6.715 24.032 0.000 - 1180 140 4 7.454 24.160 0.000 - 1181 141 3 30.509 24.315 0.000 - 1182 141 4 31.136 24.725 0.000 - 1183 142 3 23.433 18.125 0.000 - 1184 142 4 24.157 18.322 0.000 - 1185 143 3 17.679 25.807 0.000 - 1186 143 4 17.430 26.515 0.000 - 1187 144 3 30.332 33.373 0.000 - 1188 144 4 29.588 33.280 0.000 - 1189 145 3 27.947 6.108 0.000 - 1190 145 4 27.209 6.240 0.000 - 1191 146 3 4.081 9.292 0.000 - 1192 146 4 3.381 9.022 0.000 - 1193 147 3 15.306 18.641 0.000 - 1194 147 4 15.073 19.355 0.000 - 1195 148 3 35.231 25.514 0.000 - 1196 148 4 34.606 25.928 0.000 - 1197 149 3 2.992 30.628 0.000 - 1198 149 4 3.593 30.179 0.000 - 1199 150 3 1.855 33.110 0.000 - 1200 150 4 2.516 32.754 0.000 - + + 1 1.000000 # 1 + 2 1.000000 # 2 + 3 1.000000 # 3 + 4 1.000000 # 4 + + Atoms # bond + +1 140 2 0.000000 0.000000 0.000000 # 2 +2 1 1 1.195000 0.000000 0.000000 # 1 +3 1 1 2.390000 0.000000 0.000000 # 1 +4 1 1 3.586000 0.000000 0.000000 # 1 +5 1 1 4.781000 0.000000 0.000000 # 1 +6 1 1 5.976000 0.000000 0.000000 # 1 +7 1 1 7.171000 0.000000 0.000000 # 1 +8 1 1 8.367000 0.000000 0.000000 # 1 +9 1 1 9.562000 0.000000 0.000000 # 1 +10 115 2 10.757000 0.000000 0.000000 # 2 +11 1 1 11.952000 0.000000 0.000000 # 1 +12 53 2 13.148000 0.000000 0.000000 # 2 +13 1 1 14.343000 0.000000 0.000000 # 1 +14 1 1 15.538000 0.000000 0.000000 # 1 +15 1 1 16.733000 0.000000 0.000000 # 1 +16 1 1 17.927999 0.000000 0.000000 # 1 +17 1 1 19.124001 0.000000 0.000000 # 1 +18 1 1 20.319000 0.000000 0.000000 # 1 +19 1 1 21.514000 0.000000 0.000000 # 1 +20 1 1 22.709000 0.000000 0.000000 # 1 +21 1 1 23.905001 0.000000 0.000000 # 1 +22 1 1 25.100000 0.000000 0.000000 # 1 +23 1 1 26.295000 0.000000 0.000000 # 1 +24 111 2 27.490000 0.000000 0.000000 # 2 +25 129 2 28.684999 35.856861 0.000000 # 2 +26 1 1 29.881001 0.000000 0.000000 # 1 +27 1 1 31.076000 0.000000 0.000000 # 1 +28 1 1 32.271000 0.000000 0.000000 # 1 +29 1 1 33.466000 0.000000 0.000000 # 1 +30 1 1 34.661999 0.000000 0.000000 # 1 +31 1 1 0.000000 1.195000 0.000000 # 1 +32 1 1 1.195000 1.195000 0.000000 # 1 +33 114 2 2.390000 1.195000 0.000000 # 2 +34 1 1 3.586000 1.195000 0.000000 # 1 +35 76 2 4.781000 1.195000 0.000000 # 2 +36 1 1 5.976000 1.195000 0.000000 # 1 +37 1 1 7.171000 1.195000 0.000000 # 1 +38 90 2 8.367000 1.195000 0.000000 # 2 +39 1 1 9.562000 1.195000 0.000000 # 1 +40 95 2 10.757000 1.195000 0.000000 # 2 +41 1 1 11.952000 1.195000 0.000000 # 1 +42 36 2 13.148000 1.195000 0.000000 # 2 +43 1 1 14.343000 1.195000 0.000000 # 1 +44 1 1 15.538000 1.195000 0.000000 # 1 +45 1 1 16.733000 1.195000 0.000000 # 1 +46 1 1 17.927999 1.195000 0.000000 # 1 +47 1 1 19.124001 1.195000 0.000000 # 1 +48 1 1 20.319000 1.195000 0.000000 # 1 +49 1 1 21.514000 1.195000 0.000000 # 1 +50 1 1 22.709000 1.195000 0.000000 # 1 +51 1 1 23.905001 1.195000 0.000000 # 1 +52 1 1 25.100000 1.195000 0.000000 # 1 +53 1 1 26.295000 1.195000 0.000000 # 1 +54 1 1 27.490000 1.195000 0.000000 # 1 +55 1 1 28.684999 1.195000 0.000000 # 1 +56 1 1 29.881001 1.195000 0.000000 # 1 +57 1 1 31.076000 1.195000 0.000000 # 1 +58 1 1 32.271000 1.195000 0.000000 # 1 +59 1 1 33.466000 1.195000 0.000000 # 1 +60 1 1 34.661999 1.195000 0.000000 # 1 +61 1 1 0.000000 2.390000 0.000000 # 1 +62 1 1 1.195000 2.390000 0.000000 # 1 +63 120 2 2.390000 2.390000 0.000000 # 2 +64 1 1 3.586000 2.390000 0.000000 # 1 +65 25 2 4.781000 2.390000 0.000000 # 2 +66 1 1 5.976000 2.390000 0.000000 # 1 +67 1 1 7.171000 2.390000 0.000000 # 1 +68 1 1 8.367000 2.390000 0.000000 # 1 +69 1 1 9.562000 2.390000 0.000000 # 1 +70 1 1 10.757000 2.390000 0.000000 # 1 +71 1 1 11.952000 2.390000 0.000000 # 1 +72 1 1 13.148000 2.390000 0.000000 # 1 +73 1 1 14.343000 2.390000 0.000000 # 1 +74 1 1 15.538000 2.390000 0.000000 # 1 +75 1 1 16.733000 2.390000 0.000000 # 1 +76 1 1 17.927999 2.390000 0.000000 # 1 +77 1 1 19.124001 2.390000 0.000000 # 1 +78 1 1 20.319000 2.390000 0.000000 # 1 +79 1 1 21.514000 2.390000 0.000000 # 1 +80 1 1 22.709000 2.390000 0.000000 # 1 +81 1 1 23.905001 2.390000 0.000000 # 1 +82 75 2 25.100000 2.390000 0.000000 # 2 +83 1 1 26.295000 2.390000 0.000000 # 1 +84 1 1 27.490000 2.390000 0.000000 # 1 +85 1 1 28.684999 2.390000 0.000000 # 1 +86 48 2 29.881001 2.390000 0.000000 # 2 +87 1 1 31.076000 2.390000 0.000000 # 1 +88 1 1 32.271000 2.390000 0.000000 # 1 +89 1 1 33.466000 2.390000 0.000000 # 1 +90 1 1 34.661999 2.390000 0.000000 # 1 +91 1 1 0.000000 3.586000 0.000000 # 1 +92 1 1 1.195000 3.586000 0.000000 # 1 +93 1 1 2.390000 3.586000 0.000000 # 1 +94 1 1 3.586000 3.586000 0.000000 # 1 +95 1 1 4.781000 3.586000 0.000000 # 1 +96 1 1 5.976000 3.586000 0.000000 # 1 +97 1 1 7.171000 3.586000 0.000000 # 1 +98 1 1 8.367000 3.586000 0.000000 # 1 +99 1 1 9.562000 3.586000 0.000000 # 1 +100 122 2 10.757000 3.586000 0.000000 # 2 +101 1 1 11.952000 3.586000 0.000000 # 1 +102 1 1 13.148000 3.586000 0.000000 # 1 +103 130 2 14.343000 3.586000 0.000000 # 2 +104 1 1 15.538000 3.586000 0.000000 # 1 +105 1 1 16.733000 3.586000 0.000000 # 1 +106 1 1 17.927999 3.586000 0.000000 # 1 +107 1 1 19.124001 3.586000 0.000000 # 1 +108 1 1 20.319000 3.586000 0.000000 # 1 +109 118 2 21.514000 3.586000 0.000000 # 2 +110 1 1 22.709000 3.586000 0.000000 # 1 +111 1 1 23.905001 3.586000 0.000000 # 1 +112 1 1 25.100000 3.586000 0.000000 # 1 +113 1 1 26.295000 3.586000 0.000000 # 1 +114 1 1 27.490000 3.586000 0.000000 # 1 +115 1 1 28.684999 3.586000 0.000000 # 1 +116 50 2 29.881001 3.586000 0.000000 # 2 +117 1 1 31.076000 3.586000 0.000000 # 1 +118 1 1 32.271000 3.586000 0.000000 # 1 +119 1 1 33.466000 3.586000 0.000000 # 1 +120 1 1 34.661999 3.586000 0.000000 # 1 +121 1 1 0.000000 4.781000 0.000000 # 1 +122 1 1 1.195000 4.781000 0.000000 # 1 +123 1 1 2.390000 4.781000 0.000000 # 1 +124 1 1 3.586000 4.781000 0.000000 # 1 +125 39 2 4.781000 4.781000 0.000000 # 2 +126 1 1 5.976000 4.781000 0.000000 # 1 +127 68 2 7.171000 4.781000 0.000000 # 2 +128 1 1 8.367000 4.781000 0.000000 # 1 +129 4 2 9.562000 4.781000 0.000000 # 2 +130 1 1 10.757000 4.781000 0.000000 # 1 +131 42 2 11.952000 4.781000 0.000000 # 2 +132 1 1 13.148000 4.781000 0.000000 # 1 +133 132 2 14.343000 4.781000 0.000000 # 2 +134 1 1 15.538000 4.781000 0.000000 # 1 +135 1 1 16.733000 4.781000 0.000000 # 1 +136 1 1 17.927999 4.781000 0.000000 # 1 +137 1 1 19.124001 4.781000 0.000000 # 1 +138 1 1 20.319000 4.781000 0.000000 # 1 +139 1 1 21.514000 4.781000 0.000000 # 1 +140 1 1 22.709000 4.781000 0.000000 # 1 +141 1 1 23.905001 4.781000 0.000000 # 1 +142 1 1 25.100000 4.781000 0.000000 # 1 +143 1 1 26.295000 4.781000 0.000000 # 1 +144 1 1 27.490000 4.781000 0.000000 # 1 +145 1 1 28.684999 4.781000 0.000000 # 1 +146 1 1 29.881001 4.781000 0.000000 # 1 +147 1 1 31.076000 4.781000 0.000000 # 1 +148 1 1 32.271000 4.781000 0.000000 # 1 +149 1 1 33.466000 4.781000 0.000000 # 1 +150 1 1 34.661999 4.781000 0.000000 # 1 +151 54 2 35.856861 5.976000 0.000000 # 2 +152 1 1 1.195000 5.976000 0.000000 # 1 +153 1 1 2.390000 5.976000 0.000000 # 1 +154 1 1 3.586000 5.976000 0.000000 # 1 +155 1 1 4.781000 5.976000 0.000000 # 1 +156 1 1 5.976000 5.976000 0.000000 # 1 +157 49 2 7.171000 5.976000 0.000000 # 2 +158 1 1 8.367000 5.976000 0.000000 # 1 +159 31 2 9.562000 5.976000 0.000000 # 2 +160 1 1 10.757000 5.976000 0.000000 # 1 +161 1 1 11.952000 5.976000 0.000000 # 1 +162 105 2 13.148000 5.976000 0.000000 # 2 +163 1 1 14.343000 5.976000 0.000000 # 1 +164 137 2 15.538000 5.976000 0.000000 # 2 +165 1 1 16.733000 5.976000 0.000000 # 1 +166 1 1 17.927999 5.976000 0.000000 # 1 +167 1 1 19.124001 5.976000 0.000000 # 1 +168 117 2 20.319000 5.976000 0.000000 # 2 +169 1 1 21.514000 5.976000 0.000000 # 1 +170 1 1 22.709000 5.976000 0.000000 # 1 +171 1 1 23.905001 5.976000 0.000000 # 1 +172 1 1 25.100000 5.976000 0.000000 # 1 +173 41 2 26.295000 5.976000 0.000000 # 2 +174 1 1 27.490000 5.976000 0.000000 # 1 +175 146 2 28.684999 5.976000 0.000000 # 2 +176 34 2 29.881001 5.976000 0.000000 # 2 +177 1 1 31.076000 5.976000 0.000000 # 1 +178 1 1 32.271000 5.976000 0.000000 # 1 +179 1 1 33.466000 5.976000 0.000000 # 1 +180 1 1 34.661999 5.976000 0.000000 # 1 +181 1 1 0.000000 7.171000 0.000000 # 1 +182 1 1 1.195000 7.171000 0.000000 # 1 +183 1 1 2.390000 7.171000 0.000000 # 1 +184 1 1 3.586000 7.171000 0.000000 # 1 +185 1 1 4.781000 7.171000 0.000000 # 1 +186 1 1 5.976000 7.171000 0.000000 # 1 +187 1 1 7.171000 7.171000 0.000000 # 1 +188 1 1 8.367000 7.171000 0.000000 # 1 +189 1 1 9.562000 7.171000 0.000000 # 1 +190 1 1 10.757000 7.171000 0.000000 # 1 +191 1 1 11.952000 7.171000 0.000000 # 1 +192 16 2 13.148000 7.171000 0.000000 # 2 +193 1 1 14.343000 7.171000 0.000000 # 1 +194 1 1 15.538000 7.171000 0.000000 # 1 +195 1 1 16.733000 7.171000 0.000000 # 1 +196 1 1 17.927999 7.171000 0.000000 # 1 +197 1 1 19.124001 7.171000 0.000000 # 1 +198 1 1 20.319000 7.171000 0.000000 # 1 +199 1 1 21.514000 7.171000 0.000000 # 1 +200 1 1 22.709000 7.171000 0.000000 # 1 +201 109 2 23.905001 7.171000 0.000000 # 2 +202 1 1 25.100000 7.171000 0.000000 # 1 +203 1 1 26.295000 7.171000 0.000000 # 1 +204 1 1 27.490000 7.171000 0.000000 # 1 +205 133 2 28.684999 7.171000 0.000000 # 2 +206 1 1 29.881001 7.171000 0.000000 # 1 +207 1 1 31.076000 7.171000 0.000000 # 1 +208 1 1 32.271000 7.171000 0.000000 # 1 +209 1 1 33.466000 7.171000 0.000000 # 1 +210 1 1 34.661999 7.171000 0.000000 # 1 +211 1 1 0.000000 8.367000 0.000000 # 1 +212 1 1 1.195000 8.367000 0.000000 # 1 +213 1 1 2.390000 8.367000 0.000000 # 1 +214 1 1 3.586000 8.367000 0.000000 # 1 +215 1 1 4.781000 8.367000 0.000000 # 1 +216 1 1 5.976000 8.367000 0.000000 # 1 +217 1 1 7.171000 8.367000 0.000000 # 1 +218 1 1 8.367000 8.367000 0.000000 # 1 +219 1 1 9.562000 8.367000 0.000000 # 1 +220 1 1 10.757000 8.367000 0.000000 # 1 +221 1 1 11.952000 8.367000 0.000000 # 1 +222 1 1 13.148000 8.367000 0.000000 # 1 +223 1 1 14.343000 8.367000 0.000000 # 1 +224 1 1 15.538000 8.367000 0.000000 # 1 +225 1 1 16.733000 8.367000 0.000000 # 1 +226 1 1 17.927999 8.367000 0.000000 # 1 +227 1 1 19.124001 8.367000 0.000000 # 1 +228 1 1 20.319000 8.367000 0.000000 # 1 +229 1 1 21.514000 8.367000 0.000000 # 1 +230 98 2 22.709000 8.367000 0.000000 # 2 +231 1 1 23.905001 8.367000 0.000000 # 1 +232 13 2 25.100000 8.367000 0.000000 # 2 +233 72 2 26.295000 8.367000 0.000000 # 2 +234 1 1 27.490000 8.367000 0.000000 # 1 +235 1 1 28.684999 8.367000 0.000000 # 1 +236 1 1 29.881001 8.367000 0.000000 # 1 +237 1 1 31.076000 8.367000 0.000000 # 1 +238 7 2 32.271000 8.367000 0.000000 # 2 +239 1 1 33.466000 8.367000 0.000000 # 1 +240 35 2 34.661999 8.367000 0.000000 # 2 +241 1 1 0.000000 9.562000 0.000000 # 1 +242 1 1 1.195000 9.562000 0.000000 # 1 +243 1 1 2.390000 9.562000 0.000000 # 1 +244 1 1 3.586000 9.562000 0.000000 # 1 +245 147 2 4.781000 9.562000 0.000000 # 2 +246 1 1 5.976000 9.562000 0.000000 # 1 +247 91 2 7.171000 9.562000 0.000000 # 2 +248 1 1 8.367000 9.562000 0.000000 # 1 +249 1 1 9.562000 9.562000 0.000000 # 1 +250 1 1 10.757000 9.562000 0.000000 # 1 +251 1 1 11.952000 9.562000 0.000000 # 1 +252 1 1 13.148000 9.562000 0.000000 # 1 +253 1 1 14.343000 9.562000 0.000000 # 1 +254 1 1 15.538000 9.562000 0.000000 # 1 +255 1 1 16.733000 9.562000 0.000000 # 1 +256 1 1 17.927999 9.562000 0.000000 # 1 +257 62 2 19.124001 9.562000 0.000000 # 2 +258 1 1 20.319000 9.562000 0.000000 # 1 +259 1 1 21.514000 9.562000 0.000000 # 1 +260 1 1 22.709000 9.562000 0.000000 # 1 +261 1 1 23.905001 9.562000 0.000000 # 1 +262 65 2 25.100000 9.562000 0.000000 # 2 +263 1 1 26.295000 9.562000 0.000000 # 1 +264 1 1 27.490000 9.562000 0.000000 # 1 +265 1 1 28.684999 9.562000 0.000000 # 1 +266 1 1 29.881001 9.562000 0.000000 # 1 +267 1 1 31.076000 9.562000 0.000000 # 1 +268 1 1 32.271000 9.562000 0.000000 # 1 +269 1 1 33.466000 9.562000 0.000000 # 1 +270 1 1 34.661999 9.562000 0.000000 # 1 +271 1 1 0.000000 10.757000 0.000000 # 1 +272 1 1 1.195000 10.757000 0.000000 # 1 +273 1 1 2.390000 10.757000 0.000000 # 1 +274 1 1 3.586000 10.757000 0.000000 # 1 +275 69 2 4.781000 10.757000 0.000000 # 2 +276 1 1 5.976000 10.757000 0.000000 # 1 +277 1 1 7.171000 10.757000 0.000000 # 1 +278 1 1 8.367000 10.757000 0.000000 # 1 +279 1 1 9.562000 10.757000 0.000000 # 1 +280 1 1 10.757000 10.757000 0.000000 # 1 +281 1 1 11.952000 10.757000 0.000000 # 1 +282 1 1 13.148000 10.757000 0.000000 # 1 +283 1 1 14.343000 10.757000 0.000000 # 1 +284 110 2 15.538000 10.757000 0.000000 # 2 +285 1 1 16.733000 10.757000 0.000000 # 1 +286 1 1 17.927999 10.757000 0.000000 # 1 +287 1 1 19.124001 10.757000 0.000000 # 1 +288 1 1 20.319000 10.757000 0.000000 # 1 +289 1 1 21.514000 10.757000 0.000000 # 1 +290 1 1 22.709000 10.757000 0.000000 # 1 +291 1 1 23.905001 10.757000 0.000000 # 1 +292 1 1 25.100000 10.757000 0.000000 # 1 +293 1 1 26.295000 10.757000 0.000000 # 1 +294 74 2 27.490000 10.757000 0.000000 # 2 +295 1 1 28.684999 10.757000 0.000000 # 1 +296 1 1 29.881001 10.757000 0.000000 # 1 +297 1 1 31.076000 10.757000 0.000000 # 1 +298 1 1 32.271000 10.757000 0.000000 # 1 +299 1 1 33.466000 10.757000 0.000000 # 1 +300 1 1 34.661999 10.757000 0.000000 # 1 +301 1 1 0.000000 11.952000 0.000000 # 1 +302 1 1 1.195000 11.952000 0.000000 # 1 +303 1 1 2.390000 11.952000 0.000000 # 1 +304 1 1 3.586000 11.952000 0.000000 # 1 +305 1 1 4.781000 11.952000 0.000000 # 1 +306 135 2 5.976000 11.952000 0.000000 # 2 +307 1 1 7.171000 11.952000 0.000000 # 1 +308 1 1 8.367000 11.952000 0.000000 # 1 +309 58 2 9.562000 11.952000 0.000000 # 2 +310 102 2 10.757000 11.952000 0.000000 # 2 +311 121 2 11.952000 11.952000 0.000000 # 2 +312 1 1 13.148000 11.952000 0.000000 # 1 +313 1 1 14.343000 11.952000 0.000000 # 1 +314 1 1 15.538000 11.952000 0.000000 # 1 +315 1 1 16.733000 11.952000 0.000000 # 1 +316 1 1 17.927999 11.952000 0.000000 # 1 +317 33 2 19.124001 11.952000 0.000000 # 2 +318 1 1 20.319000 11.952000 0.000000 # 1 +319 1 1 21.514000 11.952000 0.000000 # 1 +320 1 1 22.709000 11.952000 0.000000 # 1 +321 1 1 23.905001 11.952000 0.000000 # 1 +322 1 1 25.100000 11.952000 0.000000 # 1 +323 1 1 26.295000 11.952000 0.000000 # 1 +324 1 1 27.490000 11.952000 0.000000 # 1 +325 1 1 28.684999 11.952000 0.000000 # 1 +326 1 1 29.881001 11.952000 0.000000 # 1 +327 1 1 31.076000 11.952000 0.000000 # 1 +328 43 2 32.271000 11.952000 0.000000 # 2 +329 1 1 33.466000 11.952000 0.000000 # 1 +330 1 1 34.661999 11.952000 0.000000 # 1 +331 1 1 0.000000 13.148000 0.000000 # 1 +332 11 2 1.195000 13.148000 0.000000 # 2 +333 55 2 2.390000 13.148000 0.000000 # 2 +334 1 1 3.586000 13.148000 0.000000 # 1 +335 1 1 4.781000 13.148000 0.000000 # 1 +336 1 1 5.976000 13.148000 0.000000 # 1 +337 1 1 7.171000 13.148000 0.000000 # 1 +338 1 1 8.367000 13.148000 0.000000 # 1 +339 21 2 9.562000 13.148000 0.000000 # 2 +340 1 1 10.757000 13.148000 0.000000 # 1 +341 1 1 11.952000 13.148000 0.000000 # 1 +342 1 1 13.148000 13.148000 0.000000 # 1 +343 12 2 14.343000 13.148000 0.000000 # 2 +344 1 1 15.538000 13.148000 0.000000 # 1 +345 1 1 16.733000 13.148000 0.000000 # 1 +346 1 1 17.927999 13.148000 0.000000 # 1 +347 1 1 19.124001 13.148000 0.000000 # 1 +348 1 1 20.319000 13.148000 0.000000 # 1 +349 18 2 21.514000 13.148000 0.000000 # 2 +350 1 1 22.709000 13.148000 0.000000 # 1 +351 1 1 23.905001 13.148000 0.000000 # 1 +352 1 1 25.100000 13.148000 0.000000 # 1 +353 1 1 26.295000 13.148000 0.000000 # 1 +354 1 1 27.490000 13.148000 0.000000 # 1 +355 1 1 28.684999 13.148000 0.000000 # 1 +356 1 1 29.881001 13.148000 0.000000 # 1 +357 1 1 31.076000 13.148000 0.000000 # 1 +358 1 1 32.271000 13.148000 0.000000 # 1 +359 1 1 33.466000 13.148000 0.000000 # 1 +360 1 1 34.661999 13.148000 0.000000 # 1 +361 1 1 0.000000 14.343000 0.000000 # 1 +362 1 1 1.195000 14.343000 0.000000 # 1 +363 9 2 2.390000 14.343000 0.000000 # 2 +364 1 1 3.586000 14.343000 0.000000 # 1 +365 1 1 4.781000 14.343000 0.000000 # 1 +366 1 1 5.976000 14.343000 0.000000 # 1 +367 1 1 7.171000 14.343000 0.000000 # 1 +368 1 1 8.367000 14.343000 0.000000 # 1 +369 1 1 9.562000 14.343000 0.000000 # 1 +370 1 1 10.757000 14.343000 0.000000 # 1 +371 107 2 11.952000 14.343000 0.000000 # 2 +372 1 1 13.148000 14.343000 0.000000 # 1 +373 1 1 14.343000 14.343000 0.000000 # 1 +374 1 1 15.538000 14.343000 0.000000 # 1 +375 1 1 16.733000 14.343000 0.000000 # 1 +376 103 2 17.927999 14.343000 0.000000 # 2 +377 1 1 19.124001 14.343000 0.000000 # 1 +378 82 2 20.319000 14.343000 0.000000 # 2 +379 10 2 21.514000 14.343000 0.000000 # 2 +380 1 1 22.709000 14.343000 0.000000 # 1 +381 1 1 23.905001 14.343000 0.000000 # 1 +382 1 1 25.100000 14.343000 0.000000 # 1 +383 1 1 26.295000 14.343000 0.000000 # 1 +384 1 1 27.490000 14.343000 0.000000 # 1 +385 1 1 28.684999 14.343000 0.000000 # 1 +386 1 1 29.881001 14.343000 0.000000 # 1 +387 1 1 31.076000 14.343000 0.000000 # 1 +388 1 1 32.271000 14.343000 0.000000 # 1 +389 1 1 33.466000 14.343000 0.000000 # 1 +390 1 1 34.661999 14.343000 0.000000 # 1 +391 1 1 0.000000 15.538000 0.000000 # 1 +392 1 1 1.195000 15.538000 0.000000 # 1 +393 1 1 2.390000 15.538000 0.000000 # 1 +394 1 1 3.586000 15.538000 0.000000 # 1 +395 1 1 4.781000 15.538000 0.000000 # 1 +396 1 1 5.976000 15.538000 0.000000 # 1 +397 1 1 7.171000 15.538000 0.000000 # 1 +398 1 1 8.367000 15.538000 0.000000 # 1 +399 71 2 9.562000 15.538000 0.000000 # 2 +400 1 1 10.757000 15.538000 0.000000 # 1 +401 1 1 11.952000 15.538000 0.000000 # 1 +402 1 1 13.148000 15.538000 0.000000 # 1 +403 1 1 14.343000 15.538000 0.000000 # 1 +404 1 1 15.538000 15.538000 0.000000 # 1 +405 1 1 16.733000 15.538000 0.000000 # 1 +406 1 1 17.927999 15.538000 0.000000 # 1 +407 1 1 19.124001 15.538000 0.000000 # 1 +408 1 1 20.319000 15.538000 0.000000 # 1 +409 1 1 21.514000 15.538000 0.000000 # 1 +410 1 1 22.709000 15.538000 0.000000 # 1 +411 1 1 23.905001 15.538000 0.000000 # 1 +412 1 1 25.100000 15.538000 0.000000 # 1 +413 94 2 26.295000 15.538000 0.000000 # 2 +414 1 1 27.490000 15.538000 0.000000 # 1 +415 1 1 28.684999 15.538000 0.000000 # 1 +416 28 2 29.881001 15.538000 0.000000 # 2 +417 1 1 31.076000 15.538000 0.000000 # 1 +418 61 2 32.271000 15.538000 0.000000 # 2 +419 108 2 33.466000 15.538000 0.000000 # 2 +420 112 2 34.661999 15.538000 0.000000 # 2 +421 1 1 0.000000 16.733000 0.000000 # 1 +422 1 1 1.195000 16.733000 0.000000 # 1 +423 1 1 2.390000 16.733000 0.000000 # 1 +424 1 1 3.586000 16.733000 0.000000 # 1 +425 1 1 4.781000 16.733000 0.000000 # 1 +426 1 1 5.976000 16.733000 0.000000 # 1 +427 134 2 7.171000 16.733000 0.000000 # 2 +428 1 1 8.367000 16.733000 0.000000 # 1 +429 1 1 9.562000 16.733000 0.000000 # 1 +430 1 1 10.757000 16.733000 0.000000 # 1 +431 66 2 11.952000 16.733000 0.000000 # 2 +432 1 1 13.148000 16.733000 0.000000 # 1 +433 1 1 14.343000 16.733000 0.000000 # 1 +434 1 1 15.538000 16.733000 0.000000 # 1 +435 1 1 16.733000 16.733000 0.000000 # 1 +436 1 1 17.927999 16.733000 0.000000 # 1 +437 81 2 19.124001 16.733000 0.000000 # 2 +438 1 1 20.319000 16.733000 0.000000 # 1 +439 1 1 21.514000 16.733000 0.000000 # 1 +440 1 1 22.709000 16.733000 0.000000 # 1 +441 1 1 23.905001 16.733000 0.000000 # 1 +442 1 1 25.100000 16.733000 0.000000 # 1 +443 52 2 26.295000 16.733000 0.000000 # 2 +444 1 1 27.490000 16.733000 0.000000 # 1 +445 1 1 28.684999 16.733000 0.000000 # 1 +446 1 1 29.881001 16.733000 0.000000 # 1 +447 45 2 31.076000 16.733000 0.000000 # 2 +448 1 1 32.271000 16.733000 0.000000 # 1 +449 1 1 33.466000 16.733000 0.000000 # 1 +450 138 2 34.661999 16.733000 0.000000 # 2 +451 1 1 0.000000 17.927999 0.000000 # 1 +452 87 2 1.195000 17.927999 0.000000 # 2 +453 1 1 2.390000 17.927999 0.000000 # 1 +454 1 1 3.586000 17.927999 0.000000 # 1 +455 113 2 4.781000 17.927999 0.000000 # 2 +456 1 1 5.976000 17.927999 0.000000 # 1 +457 1 1 7.171000 17.927999 0.000000 # 1 +458 1 1 8.367000 17.927999 0.000000 # 1 +459 1 1 9.562000 17.927999 0.000000 # 1 +460 3 2 10.757000 17.927999 0.000000 # 2 +461 1 1 11.952000 17.927999 0.000000 # 1 +462 1 1 13.148000 17.927999 0.000000 # 1 +463 1 1 14.343000 17.927999 0.000000 # 1 +464 148 2 15.538000 17.927999 0.000000 # 2 +465 1 1 16.733000 17.927999 0.000000 # 1 +466 1 1 17.927999 17.927999 0.000000 # 1 +467 15 2 19.124001 17.927999 0.000000 # 2 +468 1 1 20.319000 17.927999 0.000000 # 1 +469 1 1 21.514000 17.927999 0.000000 # 1 +470 143 2 22.709000 17.927999 0.000000 # 2 +471 1 1 23.905001 17.927999 0.000000 # 1 +472 1 1 25.100000 17.927999 0.000000 # 1 +473 1 1 26.295000 17.927999 0.000000 # 1 +474 1 1 27.490000 17.927999 0.000000 # 1 +475 85 2 28.684999 17.927999 0.000000 # 2 +476 1 1 29.881001 17.927999 0.000000 # 1 +477 1 1 31.076000 17.927999 0.000000 # 1 +478 1 1 32.271000 17.927999 0.000000 # 1 +479 1 1 33.466000 17.927999 0.000000 # 1 +480 27 2 34.661999 17.927999 0.000000 # 2 +481 1 1 0.000000 19.124001 0.000000 # 1 +482 1 1 1.195000 19.124001 0.000000 # 1 +483 57 2 2.390000 19.124001 0.000000 # 2 +484 1 1 3.586000 19.124001 0.000000 # 1 +485 1 1 4.781000 19.124001 0.000000 # 1 +486 1 1 5.976000 19.124001 0.000000 # 1 +487 22 2 7.171000 19.124001 0.000000 # 2 +488 1 1 8.367000 19.124001 0.000000 # 1 +489 1 1 9.562000 19.124001 0.000000 # 1 +490 1 1 10.757000 19.124001 0.000000 # 1 +491 1 1 11.952000 19.124001 0.000000 # 1 +492 1 1 13.148000 19.124001 0.000000 # 1 +493 59 2 14.343000 19.124001 0.000000 # 2 +494 1 1 15.538000 19.124001 0.000000 # 1 +495 1 1 16.733000 19.124001 0.000000 # 1 +496 1 1 17.927999 19.124001 0.000000 # 1 +497 1 1 19.124001 19.124001 0.000000 # 1 +498 1 1 20.319000 19.124001 0.000000 # 1 +499 1 1 21.514000 19.124001 0.000000 # 1 +500 1 1 22.709000 19.124001 0.000000 # 1 +501 1 1 23.905001 19.124001 0.000000 # 1 +502 1 1 25.100000 19.124001 0.000000 # 1 +503 1 1 26.295000 19.124001 0.000000 # 1 +504 1 1 27.490000 19.124001 0.000000 # 1 +505 1 1 28.684999 19.124001 0.000000 # 1 +506 1 1 29.881001 19.124001 0.000000 # 1 +507 1 1 31.076000 19.124001 0.000000 # 1 +508 1 1 32.271000 19.124001 0.000000 # 1 +509 1 1 33.466000 19.124001 0.000000 # 1 +510 124 2 34.661999 19.124001 0.000000 # 2 +511 1 1 0.000000 20.319000 0.000000 # 1 +512 1 1 1.195000 20.319000 0.000000 # 1 +513 1 1 2.390000 20.319000 0.000000 # 1 +514 1 1 3.586000 20.319000 0.000000 # 1 +515 1 1 4.781000 20.319000 0.000000 # 1 +516 1 1 5.976000 20.319000 0.000000 # 1 +517 1 1 7.171000 20.319000 0.000000 # 1 +518 1 1 8.367000 20.319000 0.000000 # 1 +519 119 2 9.562000 20.319000 0.000000 # 2 +520 37 2 10.757000 20.319000 0.000000 # 2 +521 77 2 11.952000 20.319000 0.000000 # 2 +522 1 1 13.148000 20.319000 0.000000 # 1 +523 1 1 14.343000 20.319000 0.000000 # 1 +524 23 2 15.538000 20.319000 0.000000 # 2 +525 1 1 16.733000 20.319000 0.000000 # 1 +526 128 2 17.927999 20.319000 0.000000 # 2 +527 1 1 19.124001 20.319000 0.000000 # 1 +528 1 1 20.319000 20.319000 0.000000 # 1 +529 1 1 21.514000 20.319000 0.000000 # 1 +530 1 1 22.709000 20.319000 0.000000 # 1 +531 63 2 23.905001 20.319000 0.000000 # 2 +532 1 1 25.100000 20.319000 0.000000 # 1 +533 1 1 26.295000 20.319000 0.000000 # 1 +534 1 1 27.490000 20.319000 0.000000 # 1 +535 1 1 28.684999 20.319000 0.000000 # 1 +536 5 2 29.881001 20.319000 0.000000 # 2 +537 1 1 31.076000 20.319000 0.000000 # 1 +538 1 1 32.271000 20.319000 0.000000 # 1 +539 1 1 33.466000 20.319000 0.000000 # 1 +540 1 1 34.661999 20.319000 0.000000 # 1 +541 1 1 0.000000 21.514000 0.000000 # 1 +542 1 1 1.195000 21.514000 0.000000 # 1 +543 1 1 2.390000 21.514000 0.000000 # 1 +544 1 1 3.586000 21.514000 0.000000 # 1 +545 1 1 4.781000 21.514000 0.000000 # 1 +546 1 1 5.976000 21.514000 0.000000 # 1 +547 1 1 7.171000 21.514000 0.000000 # 1 +548 1 1 8.367000 21.514000 0.000000 # 1 +549 1 1 9.562000 21.514000 0.000000 # 1 +550 1 1 10.757000 21.514000 0.000000 # 1 +551 1 1 11.952000 21.514000 0.000000 # 1 +552 1 1 13.148000 21.514000 0.000000 # 1 +553 100 2 14.343000 21.514000 0.000000 # 2 +554 1 1 15.538000 21.514000 0.000000 # 1 +555 1 1 16.733000 21.514000 0.000000 # 1 +556 1 1 17.927999 21.514000 0.000000 # 1 +557 1 1 19.124001 21.514000 0.000000 # 1 +558 1 1 20.319000 21.514000 0.000000 # 1 +559 1 1 21.514000 21.514000 0.000000 # 1 +560 2 2 22.709000 21.514000 0.000000 # 2 +561 131 2 23.905001 21.514000 0.000000 # 2 +562 1 1 25.100000 21.514000 0.000000 # 1 +563 1 1 26.295000 21.514000 0.000000 # 1 +564 1 1 27.490000 21.514000 0.000000 # 1 +565 80 2 28.684999 21.514000 0.000000 # 2 +566 1 1 29.881001 21.514000 0.000000 # 1 +567 1 1 31.076000 21.514000 0.000000 # 1 +568 1 1 32.271000 21.514000 0.000000 # 1 +569 1 1 33.466000 21.514000 0.000000 # 1 +570 1 1 34.661999 21.514000 0.000000 # 1 +571 1 1 0.000000 22.709000 0.000000 # 1 +572 1 1 1.195000 22.709000 0.000000 # 1 +573 1 1 2.390000 22.709000 0.000000 # 1 +574 1 1 3.586000 22.709000 0.000000 # 1 +575 1 1 4.781000 22.709000 0.000000 # 1 +576 1 1 5.976000 22.709000 0.000000 # 1 +577 1 1 7.171000 22.709000 0.000000 # 1 +578 1 1 8.367000 22.709000 0.000000 # 1 +579 1 1 9.562000 22.709000 0.000000 # 1 +580 1 1 10.757000 22.709000 0.000000 # 1 +581 1 1 11.952000 22.709000 0.000000 # 1 +582 1 1 13.148000 22.709000 0.000000 # 1 +583 1 1 14.343000 22.709000 0.000000 # 1 +584 1 1 15.538000 22.709000 0.000000 # 1 +585 1 1 16.733000 22.709000 0.000000 # 1 +586 1 1 17.927999 22.709000 0.000000 # 1 +587 101 2 19.124001 22.709000 0.000000 # 2 +588 1 1 20.319000 22.709000 0.000000 # 1 +589 1 1 21.514000 22.709000 0.000000 # 1 +590 1 1 22.709000 22.709000 0.000000 # 1 +591 1 1 23.905001 22.709000 0.000000 # 1 +592 1 1 25.100000 22.709000 0.000000 # 1 +593 127 2 26.295000 22.709000 0.000000 # 2 +594 1 1 27.490000 22.709000 0.000000 # 1 +595 1 1 28.684999 22.709000 0.000000 # 1 +596 1 1 29.881001 22.709000 0.000000 # 1 +597 1 1 31.076000 22.709000 0.000000 # 1 +598 1 1 32.271000 22.709000 0.000000 # 1 +599 1 1 33.466000 22.709000 0.000000 # 1 +600 1 1 34.661999 22.709000 0.000000 # 1 +601 1 1 0.000000 23.905001 0.000000 # 1 +602 1 1 1.195000 23.905001 0.000000 # 1 +603 1 1 2.390000 23.905001 0.000000 # 1 +604 38 2 3.586000 23.905001 0.000000 # 2 +605 1 1 4.781000 23.905001 0.000000 # 1 +606 141 2 5.976000 23.905001 0.000000 # 2 +607 1 1 7.171000 23.905001 0.000000 # 1 +608 1 1 8.367000 23.905001 0.000000 # 1 +609 1 1 9.562000 23.905001 0.000000 # 1 +610 1 1 10.757000 23.905001 0.000000 # 1 +611 1 1 11.952000 23.905001 0.000000 # 1 +612 1 1 13.148000 23.905001 0.000000 # 1 +613 1 1 14.343000 23.905001 0.000000 # 1 +614 1 1 15.538000 23.905001 0.000000 # 1 +615 1 1 16.733000 23.905001 0.000000 # 1 +616 1 1 17.927999 23.905001 0.000000 # 1 +617 1 1 19.124001 23.905001 0.000000 # 1 +618 1 1 20.319000 23.905001 0.000000 # 1 +619 1 1 21.514000 23.905001 0.000000 # 1 +620 1 1 22.709000 23.905001 0.000000 # 1 +621 1 1 23.905001 23.905001 0.000000 # 1 +622 1 1 25.100000 23.905001 0.000000 # 1 +623 1 1 26.295000 23.905001 0.000000 # 1 +624 1 1 27.490000 23.905001 0.000000 # 1 +625 1 1 28.684999 23.905001 0.000000 # 1 +626 142 2 29.881001 23.905001 0.000000 # 2 +627 1 1 31.076000 23.905001 0.000000 # 1 +628 1 1 32.271000 23.905001 0.000000 # 1 +629 1 1 33.466000 23.905001 0.000000 # 1 +630 1 1 34.661999 23.905001 0.000000 # 1 +631 149 2 35.856861 25.100000 0.000000 # 2 +632 1 1 1.195000 25.100000 0.000000 # 1 +633 1 1 2.390000 25.100000 0.000000 # 1 +634 1 1 3.586000 25.100000 0.000000 # 1 +635 1 1 4.781000 25.100000 0.000000 # 1 +636 1 1 5.976000 25.100000 0.000000 # 1 +637 1 1 7.171000 25.100000 0.000000 # 1 +638 1 1 8.367000 25.100000 0.000000 # 1 +639 40 2 9.562000 25.100000 0.000000 # 2 +640 1 1 10.757000 25.100000 0.000000 # 1 +641 1 1 11.952000 25.100000 0.000000 # 1 +642 1 1 13.148000 25.100000 0.000000 # 1 +643 70 2 14.343000 25.100000 0.000000 # 2 +644 1 1 15.538000 25.100000 0.000000 # 1 +645 1 1 16.733000 25.100000 0.000000 # 1 +646 144 2 17.927999 25.100000 0.000000 # 2 +647 99 2 19.124001 25.100000 0.000000 # 2 +648 1 1 20.319000 25.100000 0.000000 # 1 +649 32 2 21.514000 25.100000 0.000000 # 2 +650 139 2 22.709000 25.100000 0.000000 # 2 +651 1 1 23.905001 25.100000 0.000000 # 1 +652 1 1 25.100000 25.100000 0.000000 # 1 +653 1 1 26.295000 25.100000 0.000000 # 1 +654 1 1 27.490000 25.100000 0.000000 # 1 +655 1 1 28.684999 25.100000 0.000000 # 1 +656 1 1 29.881001 25.100000 0.000000 # 1 +657 1 1 31.076000 25.100000 0.000000 # 1 +658 1 1 32.271000 25.100000 0.000000 # 1 +659 1 1 33.466000 25.100000 0.000000 # 1 +660 1 1 34.661999 25.100000 0.000000 # 1 +661 1 1 0.000000 26.295000 0.000000 # 1 +662 1 1 1.195000 26.295000 0.000000 # 1 +663 1 1 2.390000 26.295000 0.000000 # 1 +664 1 1 3.586000 26.295000 0.000000 # 1 +665 1 1 4.781000 26.295000 0.000000 # 1 +666 1 1 5.976000 26.295000 0.000000 # 1 +667 1 1 7.171000 26.295000 0.000000 # 1 +668 1 1 8.367000 26.295000 0.000000 # 1 +669 1 1 9.562000 26.295000 0.000000 # 1 +670 125 2 10.757000 26.295000 0.000000 # 2 +671 1 1 11.952000 26.295000 0.000000 # 1 +672 1 1 13.148000 26.295000 0.000000 # 1 +673 1 1 14.343000 26.295000 0.000000 # 1 +674 1 1 15.538000 26.295000 0.000000 # 1 +675 1 1 16.733000 26.295000 0.000000 # 1 +676 1 1 17.927999 26.295000 0.000000 # 1 +677 1 1 19.124001 26.295000 0.000000 # 1 +678 1 1 20.319000 26.295000 0.000000 # 1 +679 17 2 21.514000 26.295000 0.000000 # 2 +680 1 1 22.709000 26.295000 0.000000 # 1 +681 1 1 23.905001 26.295000 0.000000 # 1 +682 1 1 25.100000 26.295000 0.000000 # 1 +683 1 1 26.295000 26.295000 0.000000 # 1 +684 1 1 27.490000 26.295000 0.000000 # 1 +685 1 1 28.684999 26.295000 0.000000 # 1 +686 1 1 29.881001 26.295000 0.000000 # 1 +687 1 1 31.076000 26.295000 0.000000 # 1 +688 1 1 32.271000 26.295000 0.000000 # 1 +689 1 1 33.466000 26.295000 0.000000 # 1 +690 1 1 34.661999 26.295000 0.000000 # 1 +691 1 1 0.000000 27.490000 0.000000 # 1 +692 1 1 1.195000 27.490000 0.000000 # 1 +693 1 1 2.390000 27.490000 0.000000 # 1 +694 1 1 3.586000 27.490000 0.000000 # 1 +695 1 1 4.781000 27.490000 0.000000 # 1 +696 1 1 5.976000 27.490000 0.000000 # 1 +697 1 1 7.171000 27.490000 0.000000 # 1 +698 1 1 8.367000 27.490000 0.000000 # 1 +699 1 1 9.562000 27.490000 0.000000 # 1 +700 1 1 10.757000 27.490000 0.000000 # 1 +701 1 1 11.952000 27.490000 0.000000 # 1 +702 1 1 13.148000 27.490000 0.000000 # 1 +703 67 2 14.343000 27.490000 0.000000 # 2 +704 1 1 15.538000 27.490000 0.000000 # 1 +705 1 1 16.733000 27.490000 0.000000 # 1 +706 1 1 17.927999 27.490000 0.000000 # 1 +707 1 1 19.124001 27.490000 0.000000 # 1 +708 136 2 20.319000 27.490000 0.000000 # 2 +709 1 1 21.514000 27.490000 0.000000 # 1 +710 1 1 22.709000 27.490000 0.000000 # 1 +711 1 1 23.905001 27.490000 0.000000 # 1 +712 1 1 25.100000 27.490000 0.000000 # 1 +713 1 1 26.295000 27.490000 0.000000 # 1 +714 106 2 27.490000 27.490000 0.000000 # 2 +715 1 1 28.684999 27.490000 0.000000 # 1 +716 1 1 29.881001 27.490000 0.000000 # 1 +717 1 1 31.076000 27.490000 0.000000 # 1 +718 1 1 32.271000 27.490000 0.000000 # 1 +719 1 1 33.466000 27.490000 0.000000 # 1 +720 1 1 34.661999 27.490000 0.000000 # 1 +721 96 2 0.000000 28.684999 0.000000 # 2 +722 1 1 1.195000 28.684999 0.000000 # 1 +723 116 2 2.390000 28.684999 0.000000 # 2 +724 1 1 3.586000 28.684999 0.000000 # 1 +725 1 1 4.781000 28.684999 0.000000 # 1 +726 79 2 5.976000 28.684999 0.000000 # 2 +727 1 1 7.171000 28.684999 0.000000 # 1 +728 1 1 8.367000 28.684999 0.000000 # 1 +729 1 1 9.562000 28.684999 0.000000 # 1 +730 1 1 10.757000 28.684999 0.000000 # 1 +731 1 1 11.952000 28.684999 0.000000 # 1 +732 97 2 13.148000 28.684999 0.000000 # 2 +733 1 1 14.343000 28.684999 0.000000 # 1 +734 1 1 15.538000 28.684999 0.000000 # 1 +735 1 1 16.733000 28.684999 0.000000 # 1 +736 83 2 17.927999 28.684999 0.000000 # 2 +737 1 1 19.124001 28.684999 0.000000 # 1 +738 1 1 20.319000 28.684999 0.000000 # 1 +739 1 1 21.514000 28.684999 0.000000 # 1 +740 1 1 22.709000 28.684999 0.000000 # 1 +741 1 1 23.905001 28.684999 0.000000 # 1 +742 1 1 25.100000 28.684999 0.000000 # 1 +743 1 1 26.295000 28.684999 0.000000 # 1 +744 1 1 27.490000 28.684999 0.000000 # 1 +745 1 1 28.684999 28.684999 0.000000 # 1 +746 1 1 29.881001 28.684999 0.000000 # 1 +747 1 1 31.076000 28.684999 0.000000 # 1 +748 1 1 32.271000 28.684999 0.000000 # 1 +749 1 1 33.466000 28.684999 0.000000 # 1 +750 1 1 34.661999 28.684999 0.000000 # 1 +751 1 1 0.000000 29.881001 0.000000 # 1 +752 1 1 1.195000 29.881001 0.000000 # 1 +753 1 1 2.390000 29.881001 0.000000 # 1 +754 1 1 3.586000 29.881001 0.000000 # 1 +755 1 1 4.781000 29.881001 0.000000 # 1 +756 73 2 5.976000 29.881001 0.000000 # 2 +757 1 1 7.171000 29.881001 0.000000 # 1 +758 1 1 8.367000 29.881001 0.000000 # 1 +759 1 1 9.562000 29.881001 0.000000 # 1 +760 1 1 10.757000 29.881001 0.000000 # 1 +761 1 1 11.952000 29.881001 0.000000 # 1 +762 64 2 13.148000 29.881001 0.000000 # 2 +763 1 1 14.343000 29.881001 0.000000 # 1 +764 1 1 15.538000 29.881001 0.000000 # 1 +765 1 1 16.733000 29.881001 0.000000 # 1 +766 1 1 17.927999 29.881001 0.000000 # 1 +767 1 1 19.124001 29.881001 0.000000 # 1 +768 1 1 20.319000 29.881001 0.000000 # 1 +769 14 2 21.514000 29.881001 0.000000 # 2 +770 6 2 22.709000 29.881001 0.000000 # 2 +771 1 1 23.905001 29.881001 0.000000 # 1 +772 89 2 25.100000 29.881001 0.000000 # 2 +773 1 1 26.295000 29.881001 0.000000 # 1 +774 30 2 27.490000 29.881001 0.000000 # 2 +775 1 1 28.684999 29.881001 0.000000 # 1 +776 1 1 29.881001 29.881001 0.000000 # 1 +777 1 1 31.076000 29.881001 0.000000 # 1 +778 1 1 32.271000 29.881001 0.000000 # 1 +779 1 1 33.466000 29.881001 0.000000 # 1 +780 1 1 34.661999 29.881001 0.000000 # 1 +781 1 1 0.000000 31.076000 0.000000 # 1 +782 1 1 1.195000 31.076000 0.000000 # 1 +783 150 2 2.390000 31.076000 0.000000 # 2 +784 1 1 3.586000 31.076000 0.000000 # 1 +785 47 2 4.781000 31.076000 0.000000 # 2 +786 1 1 5.976000 31.076000 0.000000 # 1 +787 1 1 7.171000 31.076000 0.000000 # 1 +788 1 1 8.367000 31.076000 0.000000 # 1 +789 1 1 9.562000 31.076000 0.000000 # 1 +790 1 1 10.757000 31.076000 0.000000 # 1 +791 1 1 11.952000 31.076000 0.000000 # 1 +792 1 1 13.148000 31.076000 0.000000 # 1 +793 1 1 14.343000 31.076000 0.000000 # 1 +794 1 1 15.538000 31.076000 0.000000 # 1 +795 1 1 16.733000 31.076000 0.000000 # 1 +796 1 1 17.927999 31.076000 0.000000 # 1 +797 1 1 19.124001 31.076000 0.000000 # 1 +798 1 1 20.319000 31.076000 0.000000 # 1 +799 1 1 21.514000 31.076000 0.000000 # 1 +800 1 1 22.709000 31.076000 0.000000 # 1 +801 1 1 23.905001 31.076000 0.000000 # 1 +802 1 1 25.100000 31.076000 0.000000 # 1 +803 1 1 26.295000 31.076000 0.000000 # 1 +804 1 1 27.490000 31.076000 0.000000 # 1 +805 1 1 28.684999 31.076000 0.000000 # 1 +806 1 1 29.881001 31.076000 0.000000 # 1 +807 1 1 31.076000 31.076000 0.000000 # 1 +808 1 1 32.271000 31.076000 0.000000 # 1 +809 1 1 33.466000 31.076000 0.000000 # 1 +810 1 1 34.661999 31.076000 0.000000 # 1 +811 1 1 0.000000 32.271000 0.000000 # 1 +812 1 1 1.195000 32.271000 0.000000 # 1 +813 93 2 2.390000 32.271000 0.000000 # 2 +814 1 1 3.586000 32.271000 0.000000 # 1 +815 1 1 4.781000 32.271000 0.000000 # 1 +816 1 1 5.976000 32.271000 0.000000 # 1 +817 1 1 7.171000 32.271000 0.000000 # 1 +818 1 1 8.367000 32.271000 0.000000 # 1 +819 92 2 9.562000 32.271000 0.000000 # 2 +820 1 1 10.757000 32.271000 0.000000 # 1 +821 1 1 11.952000 32.271000 0.000000 # 1 +822 1 1 13.148000 32.271000 0.000000 # 1 +823 1 1 14.343000 32.271000 0.000000 # 1 +824 1 1 15.538000 32.271000 0.000000 # 1 +825 1 1 16.733000 32.271000 0.000000 # 1 +826 8 2 17.927999 32.271000 0.000000 # 2 +827 1 1 19.124001 32.271000 0.000000 # 1 +828 1 1 20.319000 32.271000 0.000000 # 1 +829 1 1 21.514000 32.271000 0.000000 # 1 +830 1 1 22.709000 32.271000 0.000000 # 1 +831 84 2 23.905001 32.271000 0.000000 # 2 +832 1 1 25.100000 32.271000 0.000000 # 1 +833 1 1 26.295000 32.271000 0.000000 # 1 +834 88 2 27.490000 32.271000 0.000000 # 2 +835 1 1 28.684999 32.271000 0.000000 # 1 +836 1 1 29.881001 32.271000 0.000000 # 1 +837 1 1 31.076000 32.271000 0.000000 # 1 +838 1 1 32.271000 32.271000 0.000000 # 1 +839 1 1 33.466000 32.271000 0.000000 # 1 +840 1 1 34.661999 32.271000 0.000000 # 1 +841 26 2 0.000000 33.466000 0.000000 # 2 +842 151 2 1.195000 33.466000 0.000000 # 2 +843 1 1 2.390000 33.466000 0.000000 # 1 +844 1 1 3.586000 33.466000 0.000000 # 1 +845 1 1 4.781000 33.466000 0.000000 # 1 +846 20 2 5.976000 33.466000 0.000000 # 2 +847 1 1 7.171000 33.466000 0.000000 # 1 +848 1 1 8.367000 33.466000 0.000000 # 1 +849 1 1 9.562000 33.466000 0.000000 # 1 +850 1 1 10.757000 33.466000 0.000000 # 1 +851 1 1 11.952000 33.466000 0.000000 # 1 +852 1 1 13.148000 33.466000 0.000000 # 1 +853 1 1 14.343000 33.466000 0.000000 # 1 +854 78 2 15.538000 33.466000 0.000000 # 2 +855 126 2 16.733000 33.466000 0.000000 # 2 +856 1 1 17.927999 33.466000 0.000000 # 1 +857 1 1 19.124001 33.466000 0.000000 # 1 +858 1 1 20.319000 33.466000 0.000000 # 1 +859 104 2 21.514000 33.466000 0.000000 # 2 +860 29 2 22.709000 33.466000 0.000000 # 2 +861 1 1 23.905001 33.466000 0.000000 # 1 +862 1 1 25.100000 33.466000 0.000000 # 1 +863 1 1 26.295000 33.466000 0.000000 # 1 +864 1 1 27.490000 33.466000 0.000000 # 1 +865 1 1 28.684999 33.466000 0.000000 # 1 +866 1 1 29.881001 33.466000 0.000000 # 1 +867 145 2 31.076000 33.466000 0.000000 # 2 +868 86 2 32.271000 33.466000 0.000000 # 2 +869 44 2 33.466000 33.466000 0.000000 # 2 +870 1 1 34.661999 33.466000 0.000000 # 1 +871 1 1 0.000000 34.661999 0.000000 # 1 +872 1 1 1.195000 34.661999 0.000000 # 1 +873 1 1 2.390000 34.661999 0.000000 # 1 +874 1 1 3.586000 34.661999 0.000000 # 1 +875 1 1 4.781000 34.661999 0.000000 # 1 +876 60 2 5.976000 34.661999 0.000000 # 2 +877 1 1 7.171000 34.661999 0.000000 # 1 +878 123 2 8.367000 34.661999 0.000000 # 2 +879 1 1 9.562000 34.661999 0.000000 # 1 +880 19 2 10.757000 34.661999 0.000000 # 2 +881 46 2 11.952000 34.661999 0.000000 # 2 +882 1 1 13.148000 34.661999 0.000000 # 1 +883 1 1 14.343000 34.661999 0.000000 # 1 +884 1 1 15.538000 34.661999 0.000000 # 1 +885 1 1 16.733000 34.661999 0.000000 # 1 +886 1 1 17.927999 34.661999 0.000000 # 1 +887 1 1 19.124001 34.661999 0.000000 # 1 +888 1 1 20.319000 34.661999 0.000000 # 1 +889 1 1 21.514000 34.661999 0.000000 # 1 +890 1 1 22.709000 34.661999 0.000000 # 1 +891 1 1 23.905001 34.661999 0.000000 # 1 +892 1 1 25.100000 34.661999 0.000000 # 1 +893 1 1 26.295000 34.661999 0.000000 # 1 +894 56 2 27.490000 34.661999 0.000000 # 2 +895 1 1 28.684999 34.661999 0.000000 # 1 +896 1 1 29.881001 34.661999 0.000000 # 1 +897 24 2 31.076000 34.661999 0.000000 # 2 +898 1 1 32.271000 34.661999 0.000000 # 1 +899 1 1 33.466000 34.661999 0.000000 # 1 +900 51 2 34.661999 34.661999 0.000000 # 2 +901 2 3 23.445999 21.656000 0.000000 # 3 +902 2 4 24.181999 21.798000 0.000000 # 4 +903 3 3 10.203000 17.423000 0.000000 # 3 +904 3 4 9.649000 16.917999 0.000000 # 4 +905 4 3 8.904000 4.421000 0.000000 # 3 +906 4 4 8.245000 4.062000 0.000000 # 4 +907 5 3 30.011999 21.056999 0.000000 # 3 +908 5 4 30.143999 21.796000 0.000000 # 4 +909 6 3 21.972000 29.746000 0.000000 # 3 +910 6 4 21.233999 29.611000 0.000000 # 4 +911 7 3 32.971001 8.637000 0.000000 # 3 +912 7 4 33.669998 8.907000 0.000000 # 4 +913 8 3 18.650999 32.471001 0.000000 # 3 +914 8 4 19.374001 32.671001 0.000000 # 4 +915 9 3 2.971000 14.818000 0.000000 # 3 +916 9 4 3.551000 15.293000 0.000000 # 4 +917 10 3 20.785000 14.519000 0.000000 # 3 +918 10 4 20.056000 14.695000 0.000000 # 4 +919 11 3 1.764000 12.658000 0.000000 # 3 +920 11 4 2.332000 12.169000 0.000000 # 4 +921 12 3 14.987000 12.763000 0.000000 # 3 +922 12 4 15.630000 12.378000 0.000000 # 4 +923 13 3 24.552000 8.879000 0.000000 # 3 +924 13 4 24.004000 9.391000 0.000000 # 4 +925 14 3 20.962999 29.372000 0.000000 # 3 +926 14 4 20.412001 28.864000 0.000000 # 4 +927 15 3 19.031000 18.673000 0.000000 # 3 +928 15 4 18.938999 19.417000 0.000000 # 4 +929 16 3 12.725000 6.552000 0.000000 # 3 +930 16 4 12.302000 5.933000 0.000000 # 4 +931 17 3 21.105000 25.667000 0.000000 # 3 +932 17 4 20.695000 25.038000 0.000000 # 4 +933 18 3 22.261999 13.198000 0.000000 # 3 +934 18 4 23.011000 13.249000 0.000000 # 4 +935 19 3 11.459000 34.398998 0.000000 # 3 +936 19 4 12.162000 34.136002 0.000000 # 4 +937 20 3 5.247000 33.289001 0.000000 # 3 +938 20 4 4.519000 33.112000 0.000000 # 4 +939 21 3 9.628000 12.400000 0.000000 # 3 +940 21 4 9.694000 11.653000 0.000000 # 4 +941 22 3 7.454000 19.819000 0.000000 # 3 +942 22 4 7.736000 20.513000 0.000000 # 4 +943 23 3 16.281000 20.219000 0.000000 # 3 +944 23 4 17.025000 20.118999 0.000000 # 4 +945 24 3 30.370001 34.916000 0.000000 # 3 +946 24 4 29.665001 35.169998 0.000000 # 4 +947 25 3 5.151000 1.738000 0.000000 # 3 +948 25 4 5.521000 1.086000 0.000000 # 4 +949 26 3 0.677000 33.143002 0.000000 # 3 +950 26 4 1.353000 32.819000 0.000000 # 4 +951 27 3 35.070999 18.556999 0.000000 # 3 +952 27 4 35.480000 19.186001 0.000000 # 4 +953 28 3 29.131001 15.504000 0.000000 # 3 +954 28 4 28.382000 15.470000 0.000000 # 4 +955 29 3 23.455999 33.395000 0.000000 # 3 +956 29 4 24.202000 33.323002 0.000000 # 4 +957 30 3 27.681999 29.156000 0.000000 # 3 +958 30 4 27.872999 28.430000 0.000000 # 4 +959 31 3 8.964000 5.523000 0.000000 # 3 +960 31 4 8.366000 5.071000 0.000000 # 4 +961 32 3 20.874001 24.709999 0.000000 # 3 +962 32 4 20.233000 24.320000 0.000000 # 4 +963 33 3 18.691999 11.339000 0.000000 # 3 +964 33 4 18.260000 10.726000 0.000000 # 4 +965 34 3 29.827999 6.724000 0.000000 # 3 +966 34 4 29.775999 7.472000 0.000000 # 4 +967 35 3 34.865002 9.089000 0.000000 # 3 +968 35 4 35.068001 9.811000 0.000000 # 4 +969 36 3 13.797000 0.821000 0.000000 # 3 +970 36 4 14.447000 0.446000 0.000000 # 4 +971 37 3 11.184000 20.934999 0.000000 # 3 +972 37 4 11.611000 21.552000 0.000000 # 4 +973 38 3 3.927000 23.237000 0.000000 # 3 +974 38 4 4.268000 22.569000 0.000000 # 4 +975 39 3 4.589000 5.506000 0.000000 # 3 +976 39 4 4.396000 6.231000 0.000000 # 4 +977 40 3 10.244000 24.788000 0.000000 # 3 +978 40 4 10.926000 24.476999 0.000000 # 4 +979 41 3 26.754999 5.384000 0.000000 # 3 +980 41 4 27.215000 4.792000 0.000000 # 4 +981 42 3 12.578000 4.368000 0.000000 # 3 +982 42 4 13.204000 3.955000 0.000000 # 4 +983 43 3 32.759998 12.521000 0.000000 # 3 +984 43 4 33.250000 13.089000 0.000000 # 4 +985 44 3 33.337002 34.205002 0.000000 # 3 +986 44 4 33.208000 34.944000 0.000000 # 4 +987 45 3 30.490000 17.201000 0.000000 # 3 +988 45 4 29.903000 17.669001 0.000000 # 4 +989 46 3 11.350000 34.215000 0.000000 # 3 +990 46 4 10.747000 33.768002 0.000000 # 4 +991 47 3 4.207000 31.559000 0.000000 # 3 +992 47 4 3.633000 32.042000 0.000000 # 4 +993 48 3 29.131001 2.378000 0.000000 # 3 +994 48 4 28.381001 2.365000 0.000000 # 4 +995 49 3 6.841000 5.303000 0.000000 # 3 +996 49 4 6.510000 4.630000 0.000000 # 4 +997 50 3 30.612000 3.421000 0.000000 # 3 +998 50 4 31.344000 3.255000 0.000000 # 4 +999 51 3 33.917999 34.761002 0.000000 # 3 +1000 51 4 33.174999 34.860001 0.000000 # 4 +1001 52 3 25.725000 17.219999 0.000000 # 3 +1002 52 4 25.153999 17.707001 0.000000 # 4 +1003 53 3 12.684000 0.590000 0.000000 # 3 +1004 53 4 12.220000 1.179000 0.000000 # 4 +1005 54 3 35.272999 6.447000 0.000000 # 3 +1006 54 4 34.689999 6.918000 0.000000 # 4 +1007 55 3 2.829000 13.756000 0.000000 # 3 +1008 55 4 3.268000 14.364000 0.000000 # 4 +1009 56 3 26.740000 34.672001 0.000000 # 3 +1010 56 4 25.990000 34.681999 0.000000 # 4 +1011 57 3 2.771000 18.476999 0.000000 # 3 +1012 57 4 3.151000 17.830999 0.000000 # 4 +1013 58 3 9.635000 12.699000 0.000000 # 3 +1014 58 4 9.708000 13.445000 0.000000 # 4 +1015 59 3 13.791000 19.631001 0.000000 # 3 +1016 59 4 13.239000 20.139000 0.000000 # 4 +1017 60 3 5.234000 34.554001 0.000000 # 3 +1018 60 4 4.492000 34.446999 0.000000 # 4 +1019 61 3 33.007000 15.392000 0.000000 # 3 +1020 61 4 33.743000 15.246000 0.000000 # 4 +1021 62 3 19.707001 10.034000 0.000000 # 3 +1022 62 4 20.289000 10.506000 0.000000 # 4 +1023 63 3 24.177999 19.620001 0.000000 # 3 +1024 63 4 24.451000 18.922001 0.000000 # 4 +1025 64 3 13.735000 30.347000 0.000000 # 3 +1026 64 4 14.323000 30.813000 0.000000 # 4 +1027 65 3 25.743000 9.947000 0.000000 # 3 +1028 65 4 26.386999 10.333000 0.000000 # 4 +1029 66 3 12.610000 17.093000 0.000000 # 3 +1030 66 4 13.268000 17.452999 0.000000 # 4 +1031 67 3 14.320000 26.740999 0.000000 # 3 +1032 67 4 14.297000 25.990999 0.000000 # 4 +1033 68 3 6.831000 5.449000 0.000000 # 3 +1034 68 4 6.490000 6.117000 0.000000 # 4 +1035 69 3 5.518000 10.617000 0.000000 # 3 +1036 69 4 6.255000 10.478000 0.000000 # 4 +1037 70 3 13.604000 25.229000 0.000000 # 3 +1038 70 4 12.865000 25.358999 0.000000 # 4 +1039 71 3 8.831000 15.371000 0.000000 # 3 +1040 71 4 8.099000 15.205000 0.000000 # 4 +1041 72 3 25.740999 8.873000 0.000000 # 3 +1042 72 4 25.188000 9.379000 0.000000 # 4 +1043 73 3 5.314000 30.232000 0.000000 # 3 +1044 73 4 4.651000 30.583000 0.000000 # 4 +1045 74 3 27.864000 11.407000 0.000000 # 3 +1046 74 4 28.238001 12.057000 0.000000 # 4 +1047 75 3 25.724001 2.806000 0.000000 # 3 +1048 75 4 26.349001 3.221000 0.000000 # 4 +1049 76 3 5.357000 0.715000 0.000000 # 3 +1050 76 4 5.934000 0.235000 0.000000 # 4 +1051 77 3 11.355000 20.771999 0.000000 # 3 +1052 77 4 10.757000 21.225000 0.000000 # 4 +1053 78 3 15.439000 32.723000 0.000000 # 3 +1054 78 4 15.341000 31.979000 0.000000 # 4 +1055 79 3 6.689000 28.919001 0.000000 # 3 +1056 79 4 7.401000 29.153000 0.000000 # 4 +1057 80 3 28.299999 20.871000 0.000000 # 3 +1058 80 4 27.915001 20.226999 0.000000 # 4 +1059 81 3 19.267000 15.997000 0.000000 # 3 +1060 81 4 19.410000 15.261000 0.000000 # 4 +1061 82 3 20.292999 15.092000 0.000000 # 3 +1062 82 4 20.267000 15.842000 0.000000 # 4 +1063 83 3 18.458000 29.216000 0.000000 # 3 +1064 83 4 18.988001 29.747000 0.000000 # 4 +1065 84 3 23.375999 32.803001 0.000000 # 3 +1066 84 4 22.847000 33.334999 0.000000 # 4 +1067 85 3 27.938000 17.868999 0.000000 # 3 +1068 85 4 27.190001 17.809000 0.000000 # 4 +1069 86 3 33.021000 33.460999 0.000000 # 3 +1070 86 4 33.771000 33.455002 0.000000 # 4 +1071 87 3 0.552000 18.315001 0.000000 # 3 +1072 87 4 -0.785861 18.701000 0.000000 # 4 +1073 88 3 28.025999 32.796001 0.000000 # 3 +1074 88 4 28.562000 33.320999 0.000000 # 4 +1075 89 3 24.351000 29.924999 0.000000 # 3 +1076 89 4 23.601999 29.968000 0.000000 # 4 +1077 90 3 7.621000 1.112000 0.000000 # 3 +1078 90 4 6.876000 1.029000 0.000000 # 4 +1079 91 3 7.084000 10.307000 0.000000 # 3 +1080 91 4 6.997000 11.052000 0.000000 # 4 +1081 92 3 8.815000 32.201000 0.000000 # 3 +1082 92 4 8.068000 32.132000 0.000000 # 4 +1083 93 3 3.044000 31.903000 0.000000 # 3 +1084 93 4 3.697000 31.534000 0.000000 # 4 +1085 94 3 26.170000 16.278000 0.000000 # 3 +1086 94 4 26.046000 17.017000 0.000000 # 4 +1087 95 3 10.380000 0.547000 0.000000 # 3 +1088 95 4 10.003000 -0.101859 0.000000 # 4 +1089 96 3 0.419000 29.308001 0.000000 # 3 +1090 96 4 0.837000 29.930000 0.000000 # 4 +1091 97 3 13.712000 28.191000 0.000000 # 3 +1092 97 4 14.276000 27.697001 0.000000 # 4 +1093 98 3 22.218000 7.800000 0.000000 # 3 +1094 98 4 21.726999 7.233000 0.000000 # 4 +1095 99 3 18.382999 25.219999 0.000000 # 3 +1096 99 4 17.643000 25.340000 0.000000 # 4 +1097 100 3 13.873000 20.929001 0.000000 # 3 +1098 100 4 13.404000 20.344000 0.000000 # 4 +1099 101 3 19.837999 22.480000 0.000000 # 3 +1100 101 4 20.552000 22.252001 0.000000 # 4 +1101 102 3 10.516000 12.663000 0.000000 # 3 +1102 102 4 10.275000 13.373000 0.000000 # 4 +1103 103 3 17.336000 14.803000 0.000000 # 3 +1104 103 4 16.743999 15.263000 0.000000 # 4 +1105 104 3 21.530001 32.716999 0.000000 # 3 +1106 104 4 21.547001 31.966999 0.000000 # 4 +1107 105 3 13.517000 6.629000 0.000000 # 3 +1108 105 4 13.886000 7.282000 0.000000 # 4 +1109 106 3 28.226999 27.629000 0.000000 # 3 +1110 106 4 28.964001 27.768999 0.000000 # 4 +1111 107 3 12.490000 14.866000 0.000000 # 3 +1112 107 4 13.028000 15.388000 0.000000 # 4 +1113 108 3 32.889999 16.018000 0.000000 # 3 +1114 108 4 32.313999 16.499001 0.000000 # 4 +1115 109 3 23.344999 6.672000 0.000000 # 3 +1116 109 4 22.785999 6.172000 0.000000 # 4 +1117 110 3 16.215000 10.435000 0.000000 # 3 +1118 110 4 16.893000 10.113000 0.000000 # 4 +1119 111 3 26.961000 0.531000 0.000000 # 3 +1120 111 4 26.431000 1.062000 0.000000 # 4 +1121 112 3 33.931999 15.366000 0.000000 # 3 +1122 112 4 33.202000 15.193000 0.000000 # 4 +1123 113 3 5.463000 17.615999 0.000000 # 3 +1124 113 4 6.145000 17.304001 0.000000 # 4 +1125 114 3 1.707000 1.505000 0.000000 # 3 +1126 114 4 1.025000 1.815000 0.000000 # 4 +1127 115 3 11.142000 0.643000 0.000000 # 3 +1128 115 4 11.528000 1.287000 0.000000 # 4 +1129 116 3 2.236000 29.419001 0.000000 # 3 +1130 116 4 2.082000 30.153000 0.000000 # 4 +1131 117 3 20.514000 5.252000 0.000000 # 3 +1132 117 4 20.709999 4.528000 0.000000 # 4 +1133 118 3 21.836000 2.908000 0.000000 # 3 +1134 118 4 22.159000 2.231000 0.000000 # 4 +1135 119 3 9.519000 21.068001 0.000000 # 3 +1136 119 4 9.476000 21.816000 0.000000 # 4 +1137 120 3 2.875000 1.818000 0.000000 # 3 +1138 120 4 3.359000 1.245000 0.000000 # 4 +1139 121 3 11.204000 11.996000 0.000000 # 3 +1140 121 4 10.455000 12.040000 0.000000 # 4 +1141 122 3 10.817000 4.333000 0.000000 # 3 +1142 122 4 10.877000 5.081000 0.000000 # 4 +1143 123 3 7.965000 34.028000 0.000000 # 3 +1144 123 4 7.564000 33.394001 0.000000 # 4 +1145 124 3 34.366001 18.434999 0.000000 # 3 +1146 124 4 34.069000 17.745001 0.000000 # 4 +1147 125 3 10.053000 26.554001 0.000000 # 3 +1148 125 4 9.350000 26.813999 0.000000 # 4 +1149 126 3 16.150999 32.993999 0.000000 # 3 +1150 126 4 15.568000 32.521000 0.000000 # 4 +1151 127 3 26.788000 22.143999 0.000000 # 3 +1152 127 4 27.280001 21.577999 0.000000 # 4 +1153 128 3 17.615000 19.638000 0.000000 # 3 +1154 128 4 17.302000 18.955999 0.000000 # 4 +1155 129 3 29.412001 35.671001 0.000000 # 3 +1156 129 4 30.139000 35.486000 0.000000 # 4 +1157 130 3 13.808000 3.060000 0.000000 # 3 +1158 130 4 13.274000 2.533000 0.000000 # 4 +1159 131 3 24.601000 21.792000 0.000000 # 3 +1160 131 4 25.298000 22.070000 0.000000 # 4 +1161 132 3 14.805000 5.371000 0.000000 # 3 +1162 132 4 15.268000 5.962000 0.000000 # 4 +1163 133 3 28.138000 6.659000 0.000000 # 3 +1164 133 4 27.590000 6.147000 0.000000 # 4 +1165 134 3 7.913000 16.622000 0.000000 # 3 +1166 134 4 8.655000 16.511000 0.000000 # 4 +1167 135 3 6.561000 11.483000 0.000000 # 3 +1168 135 4 7.146000 11.013000 0.000000 # 4 +1169 136 3 21.056999 27.625999 0.000000 # 3 +1170 136 4 21.794001 27.761000 0.000000 # 4 +1171 137 3 15.201000 5.306000 0.000000 # 3 +1172 137 4 14.863000 4.637000 0.000000 # 4 +1173 138 3 34.687000 17.483000 0.000000 # 3 +1174 138 4 34.713001 18.232000 0.000000 # 4 +1175 139 3 23.371000 24.747000 0.000000 # 3 +1176 139 4 24.033001 24.393999 0.000000 # 4 +1177 140 3 0.161000 0.733000 0.000000 # 3 +1178 140 4 0.321000 1.465000 0.000000 # 4 +1179 141 3 6.715000 24.032000 0.000000 # 3 +1180 141 4 7.454000 24.160000 0.000000 # 4 +1181 142 3 30.509001 24.315001 0.000000 # 3 +1182 142 4 31.136000 24.725000 0.000000 # 4 +1183 143 3 23.433001 18.125000 0.000000 # 3 +1184 143 4 24.157000 18.322001 0.000000 # 4 +1185 144 3 17.679001 25.806999 0.000000 # 3 +1186 144 4 17.430000 26.514999 0.000000 # 4 +1187 145 3 30.332001 33.373001 0.000000 # 3 +1188 145 4 29.587999 33.279999 0.000000 # 4 +1189 146 3 27.947001 6.108000 0.000000 # 3 +1190 146 4 27.209000 6.240000 0.000000 # 4 +1191 147 3 4.081000 9.292000 0.000000 # 3 +1192 147 4 3.381000 9.022000 0.000000 # 4 +1193 148 3 15.306000 18.641001 0.000000 # 3 +1194 148 4 15.073000 19.355000 0.000000 # 4 +1195 149 3 35.230999 25.514000 0.000000 # 3 +1196 149 4 34.605999 25.927999 0.000000 # 4 +1197 150 3 2.992000 30.628000 0.000000 # 3 +1198 150 4 3.593000 30.179001 0.000000 # 4 +1199 151 3 1.855000 33.110001 0.000000 # 3 +1200 151 4 2.516000 32.754002 0.000000 # 4 + Bonds - - 1 1 560 901 - 2 1 901 902 - 3 1 460 903 - 4 1 903 904 - 5 1 129 905 - 6 1 905 906 - 7 1 536 907 - 8 1 907 908 - 9 1 770 909 - 10 1 909 910 - 11 1 238 911 - 12 1 911 912 - 13 1 826 913 - 14 1 913 914 - 15 1 363 915 - 16 1 915 916 - 17 1 379 917 - 18 1 917 918 - 19 1 332 919 - 20 1 919 920 - 21 1 343 921 - 22 1 921 922 - 23 1 232 923 - 24 1 923 924 - 25 1 769 925 - 26 1 925 926 - 27 1 467 927 - 28 1 927 928 - 29 1 192 929 - 30 1 929 930 - 31 1 679 931 - 32 1 931 932 - 33 1 349 933 - 34 1 933 934 - 35 1 880 935 - 36 1 935 936 - 37 1 846 937 - 38 1 937 938 - 39 1 339 939 - 40 1 939 940 - 41 1 487 941 - 42 1 941 942 - 43 1 524 943 - 44 1 943 944 - 45 1 897 945 - 46 1 945 946 - 47 1 65 947 - 48 1 947 948 - 49 1 841 949 - 50 1 949 950 - 51 1 480 951 - 52 1 951 952 - 53 1 416 953 - 54 1 953 954 - 55 1 860 955 - 56 1 955 956 - 57 1 774 957 - 58 1 957 958 - 59 1 159 959 - 60 1 959 960 - 61 1 649 961 - 62 1 961 962 - 63 1 317 963 - 64 1 963 964 - 65 1 176 965 - 66 1 965 966 - 67 1 240 967 - 68 1 967 968 - 69 1 42 969 - 70 1 969 970 - 71 1 520 971 - 72 1 971 972 - 73 1 604 973 - 74 1 973 974 - 75 1 125 975 - 76 1 975 976 - 77 1 639 977 - 78 1 977 978 - 79 1 173 979 - 80 1 979 980 - 81 1 131 981 - 82 1 981 982 - 83 1 328 983 - 84 1 983 984 - 85 1 869 985 - 86 1 985 986 - 87 1 447 987 - 88 1 987 988 - 89 1 881 989 - 90 1 989 990 - 91 1 785 991 - 92 1 991 992 - 93 1 86 993 - 94 1 993 994 - 95 1 157 995 - 96 1 995 996 - 97 1 116 997 - 98 1 997 998 - 99 1 900 999 - 100 1 999 1000 - 101 1 443 1001 - 102 1 1001 1002 - 103 1 12 1003 - 104 1 1003 1004 - 105 1 151 1005 - 106 1 1005 1006 - 107 1 333 1007 - 108 1 1007 1008 - 109 1 894 1009 - 110 1 1009 1010 - 111 1 483 1011 - 112 1 1011 1012 - 113 1 309 1013 - 114 1 1013 1014 - 115 1 493 1015 - 116 1 1015 1016 - 117 1 876 1017 - 118 1 1017 1018 - 119 1 418 1019 - 120 1 1019 1020 - 121 1 257 1021 - 122 1 1021 1022 - 123 1 531 1023 - 124 1 1023 1024 - 125 1 762 1025 - 126 1 1025 1026 - 127 1 262 1027 - 128 1 1027 1028 - 129 1 431 1029 - 130 1 1029 1030 - 131 1 703 1031 - 132 1 1031 1032 - 133 1 127 1033 - 134 1 1033 1034 - 135 1 275 1035 - 136 1 1035 1036 - 137 1 643 1037 - 138 1 1037 1038 - 139 1 399 1039 - 140 1 1039 1040 - 141 1 233 1041 - 142 1 1041 1042 - 143 1 756 1043 - 144 1 1043 1044 - 145 1 294 1045 - 146 1 1045 1046 - 147 1 82 1047 - 148 1 1047 1048 - 149 1 35 1049 - 150 1 1049 1050 - 151 1 521 1051 - 152 1 1051 1052 - 153 1 854 1053 - 154 1 1053 1054 - 155 1 726 1055 - 156 1 1055 1056 - 157 1 565 1057 - 158 1 1057 1058 - 159 1 437 1059 - 160 1 1059 1060 - 161 1 378 1061 - 162 1 1061 1062 - 163 1 736 1063 - 164 1 1063 1064 - 165 1 831 1065 - 166 1 1065 1066 - 167 1 475 1067 - 168 1 1067 1068 - 169 1 868 1069 - 170 1 1069 1070 - 171 1 452 1071 - 172 1 1071 1072 - 173 1 834 1073 - 174 1 1073 1074 - 175 1 772 1075 - 176 1 1075 1076 - 177 1 38 1077 - 178 1 1077 1078 - 179 1 247 1079 - 180 1 1079 1080 - 181 1 819 1081 - 182 1 1081 1082 - 183 1 813 1083 - 184 1 1083 1084 - 185 1 413 1085 - 186 1 1085 1086 - 187 1 40 1087 - 188 1 1087 1088 - 189 1 721 1089 - 190 1 1089 1090 - 191 1 732 1091 - 192 1 1091 1092 - 193 1 230 1093 - 194 1 1093 1094 - 195 1 647 1095 - 196 1 1095 1096 - 197 1 553 1097 - 198 1 1097 1098 - 199 1 587 1099 - 200 1 1099 1100 - 201 1 310 1101 - 202 1 1101 1102 - 203 1 376 1103 - 204 1 1103 1104 - 205 1 859 1105 - 206 1 1105 1106 - 207 1 162 1107 - 208 1 1107 1108 - 209 1 714 1109 - 210 1 1109 1110 - 211 1 371 1111 - 212 1 1111 1112 - 213 1 419 1113 - 214 1 1113 1114 - 215 1 201 1115 - 216 1 1115 1116 - 217 1 284 1117 - 218 1 1117 1118 - 219 1 24 1119 - 220 1 1119 1120 - 221 1 420 1121 - 222 1 1121 1122 - 223 1 455 1123 - 224 1 1123 1124 - 225 1 33 1125 - 226 1 1125 1126 - 227 1 10 1127 - 228 1 1127 1128 - 229 1 723 1129 - 230 1 1129 1130 - 231 1 168 1131 - 232 1 1131 1132 - 233 1 109 1133 - 234 1 1133 1134 - 235 1 519 1135 - 236 1 1135 1136 - 237 1 63 1137 - 238 1 1137 1138 - 239 1 311 1139 - 240 1 1139 1140 - 241 1 100 1141 - 242 1 1141 1142 - 243 1 878 1143 - 244 1 1143 1144 - 245 1 510 1145 - 246 1 1145 1146 - 247 1 670 1147 - 248 1 1147 1148 - 249 1 855 1149 - 250 1 1149 1150 - 251 1 593 1151 - 252 1 1151 1152 - 253 1 526 1153 - 254 1 1153 1154 - 255 1 25 1155 - 256 1 1155 1156 - 257 1 103 1157 - 258 1 1157 1158 - 259 1 561 1159 - 260 1 1159 1160 - 261 1 133 1161 - 262 1 1161 1162 - 263 1 205 1163 - 264 1 1163 1164 - 265 1 427 1165 - 266 1 1165 1166 - 267 1 306 1167 - 268 1 1167 1168 - 269 1 708 1169 - 270 1 1169 1170 - 271 1 164 1171 - 272 1 1171 1172 - 273 1 450 1173 - 274 1 1173 1174 - 275 1 650 1175 - 276 1 1175 1176 - 277 1 1 1177 - 278 1 1177 1178 - 279 1 606 1179 - 280 1 1179 1180 - 281 1 626 1181 - 282 1 1181 1182 - 283 1 470 1183 - 284 1 1183 1184 - 285 1 646 1185 - 286 1 1185 1186 - 287 1 867 1187 - 288 1 1187 1188 - 289 1 175 1189 - 290 1 1189 1190 - 291 1 245 1191 - 292 1 1191 1192 - 293 1 464 1193 - 294 1 1193 1194 - 295 1 631 1195 - 296 1 1195 1196 - 297 1 783 1197 - 298 1 1197 1198 - 299 1 842 1199 - 300 1 1199 1200 + +1 1 1 1177 +2 1 10 1127 +3 1 12 1003 +4 1 24 1119 +5 1 25 1155 +6 1 33 1125 +7 1 35 1049 +8 1 38 1077 +9 1 40 1087 +10 1 42 969 +11 1 63 1137 +12 1 65 947 +13 1 82 1047 +14 1 86 993 +15 1 100 1141 +16 1 103 1157 +17 1 109 1133 +18 1 116 997 +19 1 125 975 +20 1 127 1033 +21 1 129 905 +22 1 131 981 +23 1 133 1161 +24 1 151 1005 +25 1 157 995 +26 1 159 959 +27 1 162 1107 +28 1 164 1171 +29 1 168 1131 +30 1 173 979 +31 1 175 1189 +32 1 176 965 +33 1 192 929 +34 1 201 1115 +35 1 205 1163 +36 1 230 1093 +37 1 232 923 +38 1 233 1041 +39 1 238 911 +40 1 240 967 +41 1 245 1191 +42 1 247 1079 +43 1 257 1021 +44 1 262 1027 +45 1 275 1035 +46 1 284 1117 +47 1 294 1045 +48 1 306 1167 +49 1 309 1013 +50 1 310 1101 +51 1 311 1139 +52 1 317 963 +53 1 328 983 +54 1 332 919 +55 1 333 1007 +56 1 339 939 +57 1 343 921 +58 1 349 933 +59 1 363 915 +60 1 371 1111 +61 1 376 1103 +62 1 378 1061 +63 1 379 917 +64 1 399 1039 +65 1 413 1085 +66 1 416 953 +67 1 418 1019 +68 1 419 1113 +69 1 420 1121 +70 1 427 1165 +71 1 431 1029 +72 1 437 1059 +73 1 443 1001 +74 1 447 987 +75 1 450 1173 +76 1 452 1071 +77 1 455 1123 +78 1 460 903 +79 1 464 1193 +80 1 467 927 +81 1 470 1183 +82 1 475 1067 +83 1 480 951 +84 1 483 1011 +85 1 487 941 +86 1 493 1015 +87 1 510 1145 +88 1 519 1135 +89 1 520 971 +90 1 521 1051 +91 1 524 943 +92 1 526 1153 +93 1 531 1023 +94 1 536 907 +95 1 553 1097 +96 1 560 901 +97 1 561 1159 +98 1 565 1057 +99 1 587 1099 +100 1 593 1151 +101 1 604 973 +102 1 606 1179 +103 1 626 1181 +104 1 631 1195 +105 1 639 977 +106 1 643 1037 +107 1 646 1185 +108 1 647 1095 +109 1 649 961 +110 1 650 1175 +111 1 670 1147 +112 1 679 931 +113 1 703 1031 +114 1 708 1169 +115 1 714 1109 +116 1 721 1089 +117 1 723 1129 +118 1 726 1055 +119 1 732 1091 +120 1 736 1063 +121 1 756 1043 +122 1 762 1025 +123 1 769 925 +124 1 770 909 +125 1 772 1075 +126 1 774 957 +127 1 783 1197 +128 1 785 991 +129 1 813 1083 +130 1 819 1081 +131 1 826 913 +132 1 831 1065 +133 1 834 1073 +134 1 841 949 +135 1 842 1199 +136 1 846 937 +137 1 854 1053 +138 1 855 1149 +139 1 859 1105 +140 1 860 955 +141 1 867 1187 +142 1 868 1069 +143 1 869 985 +144 1 876 1017 +145 1 878 1143 +146 1 880 935 +147 1 881 989 +148 1 894 1009 +149 1 897 945 +150 1 900 999 +151 1 901 902 +152 1 903 904 +153 1 905 906 +154 1 907 908 +155 1 909 910 +156 1 911 912 +157 1 913 914 +158 1 915 916 +159 1 917 918 +160 1 919 920 +161 1 921 922 +162 1 923 924 +163 1 925 926 +164 1 927 928 +165 1 929 930 +166 1 931 932 +167 1 933 934 +168 1 935 936 +169 1 937 938 +170 1 939 940 +171 1 941 942 +172 1 943 944 +173 1 945 946 +174 1 947 948 +175 1 949 950 +176 1 951 952 +177 1 953 954 +178 1 955 956 +179 1 957 958 +180 1 959 960 +181 1 961 962 +182 1 963 964 +183 1 965 966 +184 1 967 968 +185 1 969 970 +186 1 971 972 +187 1 973 974 +188 1 975 976 +189 1 977 978 +190 1 979 980 +191 1 981 982 +192 1 983 984 +193 1 985 986 +194 1 987 988 +195 1 989 990 +196 1 991 992 +197 1 993 994 +198 1 995 996 +199 1 997 998 +200 1 999 1000 +201 1 1001 1002 +202 1 1003 1004 +203 1 1005 1006 +204 1 1007 1008 +205 1 1009 1010 +206 1 1011 1012 +207 1 1013 1014 +208 1 1015 1016 +209 1 1017 1018 +210 1 1019 1020 +211 1 1021 1022 +212 1 1023 1024 +213 1 1025 1026 +214 1 1027 1028 +215 1 1029 1030 +216 1 1031 1032 +217 1 1033 1034 +218 1 1035 1036 +219 1 1037 1038 +220 1 1039 1040 +221 1 1041 1042 +222 1 1043 1044 +223 1 1045 1046 +224 1 1047 1048 +225 1 1049 1050 +226 1 1051 1052 +227 1 1053 1054 +228 1 1055 1056 +229 1 1057 1058 +230 1 1059 1060 +231 1 1061 1062 +232 1 1063 1064 +233 1 1065 1066 +234 1 1067 1068 +235 1 1069 1070 +236 1 1071 1072 +237 1 1073 1074 +238 1 1075 1076 +239 1 1077 1078 +240 1 1079 1080 +241 1 1081 1082 +242 1 1083 1084 +243 1 1085 1086 +244 1 1087 1088 +245 1 1089 1090 +246 1 1091 1092 +247 1 1093 1094 +248 1 1095 1096 +249 1 1097 1098 +250 1 1099 1100 +251 1 1101 1102 +252 1 1103 1104 +253 1 1105 1106 +254 1 1107 1108 +255 1 1109 1110 +256 1 1111 1112 +257 1 1113 1114 +258 1 1115 1116 +259 1 1117 1118 +260 1 1119 1120 +261 1 1121 1122 +262 1 1123 1124 +263 1 1125 1126 +264 1 1127 1128 +265 1 1129 1130 +266 1 1131 1132 +267 1 1133 1134 +268 1 1135 1136 +269 1 1137 1138 +270 1 1139 1140 +271 1 1141 1142 +272 1 1143 1144 +273 1 1145 1146 +274 1 1147 1148 +275 1 1149 1150 +276 1 1151 1152 +277 1 1153 1154 +278 1 1155 1156 +279 1 1157 1158 +280 1 1159 1160 +281 1 1161 1162 +282 1 1163 1164 +283 1 1165 1166 +284 1 1167 1168 +285 1 1169 1170 +286 1 1171 1172 +287 1 1173 1174 +288 1 1175 1176 +289 1 1177 1178 +290 1 1179 1180 +291 1 1181 1182 +292 1 1183 1184 +293 1 1185 1186 +294 1 1187 1188 +295 1 1189 1190 +296 1 1191 1192 +297 1 1193 1194 +298 1 1195 1196 +299 1 1197 1198 +300 1 1199 1200 + diff --git a/examples/micelle/in.micelle-rigid b/examples/micelle/in.micelle-rigid new file mode 100644 index 0000000000..47d2f74950 --- /dev/null +++ b/examples/micelle/in.micelle-rigid @@ -0,0 +1,86 @@ +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle +special_bonds fene + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 1000 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +group solute subtract all solvent +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +fix 4 all enforce2d +run 20000 +unfix 5 +unfix 4 +fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 +fix 4 all enforce2d +run 20000 diff --git a/examples/micelle/log.27Nov18.micelle.g++.1 b/examples/micelle/log.27Nov18.micelle.g++.1 deleted file mode 100644 index 30a965e041..0000000000 --- a/examples/micelle/log.27Nov18.micelle.g++.1 +++ /dev/null @@ -1,255 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.167265 on 1 procs for 1000 steps with 1200 atoms - -Performance: 2582728.958 tau/day, 5978.539 timesteps/s -99.1% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.096171 | 0.096171 | 0.096171 | 0.0 | 57.50 -Bond | 0.006212 | 0.006212 | 0.006212 | 0.0 | 3.71 -Neigh | 0.024826 | 0.024826 | 0.024826 | 0.0 | 14.84 -Comm | 0.0047672 | 0.0047672 | 0.0047672 | 0.0 | 2.85 -Output | 0.00029063 | 0.00029063 | 0.00029063 | 0.0 | 0.17 -Modify | 0.028771 | 0.028771 | 0.028771 | 0.0 | 17.20 -Other | | 0.006227 | | | 3.72 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 195 ave 195 max 195 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3136 ave 3136 max 3136 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -run 60000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.024 | 4.024 | 4.024 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 - 1000 0.45 -1.9727655 0.058608715 -1.4645318 1.9982298 - 2000 0.46465361 -1.9897467 0.067008449 -1.4584719 1.5873463 - 3000 0.46175071 -2.0129279 0.057865385 -1.4936966 1.41269 - 4000 0.44386154 -2.0280304 0.067167835 -1.5173709 1.4022093 - 5000 0.46127582 -2.0556041 0.068318674 -1.526394 1.1416711 - 6000 0.45354052 -2.0463246 0.05461954 -1.5385425 1.1650258 - 7000 0.44082313 -2.040263 0.060218047 -1.5395891 1.3258681 - 8000 0.44353466 -2.0423792 0.061769402 -1.5374447 1.2696989 - 9000 0.46192977 -2.0761348 0.064999109 -1.5495908 0.9205826 - 10000 0.45278646 -2.0589872 0.059623919 -1.5469542 1.075581 - 11000 0.45583355 -2.0661957 0.058197558 -1.5525445 1.127643 - 12000 0.45881198 -2.0921508 0.066937896 -1.5667833 0.98383574 - 13000 0.45339481 -2.079088 0.06292782 -1.5631432 1.0188637 - 14000 0.43601312 -2.0624084 0.057999616 -1.568759 1.1452177 - 15000 0.45941503 -2.0746606 0.062523373 -1.553105 0.86928343 - 16000 0.45 -2.0743162 0.05517924 -1.569512 0.86849848 - 17000 0.45603004 -2.0657683 0.058711872 -1.5514064 0.95544551 - 18000 0.45320383 -2.1009711 0.060716634 -1.5874283 0.8343521 - 19000 0.44072983 -2.0846408 0.062893297 -1.581385 0.90776246 - 20000 0.44452441 -2.0921415 0.060341571 -1.587646 0.98180005 - 21000 0.45964557 -2.0837047 0.054459432 -1.5699827 1.0213779 - 22000 0.46351849 -2.1053613 0.058392027 -1.5838371 0.81579487 - 23000 0.45576065 -2.1001888 0.057646538 -1.5871614 0.76090085 - 24000 0.44671746 -2.0848717 0.058192801 -1.5803337 0.77003809 - 25000 0.44371239 -2.0870872 0.054804981 -1.5889396 0.92295746 - 26000 0.45381188 -2.097021 0.057195346 -1.586392 0.7743058 - 27000 0.46158533 -2.1071056 0.061289644 -1.5846153 0.78981802 - 28000 0.46534671 -2.1056151 0.054934755 -1.5857214 0.80778664 - 29000 0.4505804 -2.0949318 0.065503451 -1.5792234 0.78274755 - 30000 0.45730883 -2.1029161 0.063461968 -1.5825264 0.82507857 - 31000 0.4620071 -2.1124989 0.059980378 -1.5908964 0.78583986 - 32000 0.46934619 -2.1107818 0.056442616 -1.5853842 0.70535653 - 33000 0.45800203 -2.1062502 0.054317859 -1.594312 0.726293 - 34000 0.44634295 -2.110401 0.057764968 -1.606665 0.85401059 - 35000 0.4431929 -2.1274759 0.062048133 -1.6226042 0.64243758 - 36000 0.46049645 -2.1300979 0.068463634 -1.6015216 0.57252544 - 37000 0.45366344 -2.0977407 0.053788554 -1.5906668 0.78046879 - 38000 0.44155077 -2.1166674 0.056888683 -1.6185959 0.53429042 - 39000 0.45631012 -2.096949 0.04860872 -1.5924104 0.86494908 - 40000 0.44684402 -2.1229137 0.067190397 -1.6092516 0.65110818 - 41000 0.4479377 -2.1105264 0.059375259 -1.6035867 0.79092862 - 42000 0.46143191 -2.1174539 0.057418393 -1.5989882 0.69762908 - 43000 0.4356786 -2.085826 0.056534028 -1.5939764 0.89541946 - 44000 0.45806826 -2.126423 0.060905733 -1.6078307 0.66389027 - 45000 0.44343688 -2.1116384 0.065870114 -1.602701 0.83947585 - 46000 0.43844672 -2.1096265 0.064158652 -1.6073865 0.77278902 - 47000 0.45794928 -2.1142786 0.058919562 -1.5977914 0.62611933 - 48000 0.45412335 -2.1106058 0.059153304 -1.5977076 0.66190677 - 49000 0.45927883 -2.1197656 0.068354598 -1.5925149 0.56008845 - 50000 0.44117285 -2.1020783 0.064763249 -1.5965099 0.85935147 - 51000 0.45325398 -2.1125154 0.062295387 -1.5973438 0.80951782 - 52000 0.43896579 -2.1039004 0.057475908 -1.6078245 0.84753768 - 53000 0.45180671 -2.1092446 0.063528598 -1.5942857 0.67065038 - 54000 0.4554341 -2.1185135 0.059603337 -1.6038556 0.76399618 - 55000 0.43861159 -2.0986406 0.057733879 -1.6026606 0.77334084 - 56000 0.45522991 -2.1207166 0.063287543 -1.6025785 0.78669598 - 57000 0.46125513 -2.1150202 0.06026261 -1.5938868 0.78148646 - 58000 0.45236938 -2.1088894 0.062678374 -1.5942186 0.75643518 - 59000 0.43927269 -2.1274165 0.055355076 -1.6331548 0.63495311 - 60000 0.45331102 -2.1336193 0.051244399 -1.6294416 0.56706921 -Loop time of 13.9361 on 1 procs for 60000 steps with 1200 atoms - -Performance: 1859917.639 tau/day, 4305.365 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 9.2211 | 9.2211 | 9.2211 | 0.0 | 66.17 -Bond | 0.33763 | 0.33763 | 0.33763 | 0.0 | 2.42 -Neigh | 2.3772 | 2.3772 | 2.3772 | 0.0 | 17.06 -Comm | 0.37693 | 0.37693 | 0.37693 | 0.0 | 2.70 -Output | 0.0011795 | 0.0011795 | 0.0011795 | 0.0 | 0.01 -Modify | 1.2727 | 1.2727 | 1.2727 | 0.0 | 9.13 -Other | | 0.3493 | | | 2.51 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 405 ave 405 max 405 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 9565 ave 9565 max 9565 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 9565 -Ave neighs/atom = 7.97083 -Ave special neighs/atom = 0.5 -Neighbor list builds = 4876 -Dangerous builds = 0 -Total wall time: 0:00:14 diff --git a/examples/micelle/log.27Nov18.micelle.g++.4 b/examples/micelle/log.27Nov18.micelle.g++.4 deleted file mode 100644 index c9509df4b2..0000000000 --- a/examples/micelle/log.27Nov18.micelle.g++.4 +++ /dev/null @@ -1,255 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 2 by 2 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.0641922 on 4 procs for 1000 steps with 1200 atoms - -Performance: 6729792.131 tau/day, 15578.223 timesteps/s -90.9% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.020663 | 0.021445 | 0.022477 | 0.5 | 33.41 -Bond | 0.0014422 | 0.0015128 | 0.001569 | 0.1 | 2.36 -Neigh | 0.0067129 | 0.0067645 | 0.0068202 | 0.1 | 10.54 -Comm | 0.018454 | 0.019275 | 0.020386 | 0.5 | 30.03 -Output | 0.00038171 | 0.00040019 | 0.00044632 | 0.0 | 0.62 -Modify | 0.010561 | 0.010904 | 0.011309 | 0.3 | 16.99 -Other | | 0.003891 | | | 6.06 - -Nlocal: 300 ave 305 max 292 min -Histogram: 1 0 0 0 0 0 1 0 1 1 -Nghost: 100.25 ave 108 max 93 min -Histogram: 1 0 1 0 0 0 1 0 0 1 -Neighs: 784 ave 815 max 739 min -Histogram: 1 0 0 0 0 0 1 1 0 1 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -run 60000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.032 | 4.124 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 - 1000 0.45 -1.9727661 0.05860859 -1.4645325 1.9982402 - 2000 0.45146247 -1.9766043 0.059408886 -1.4661092 1.7398826 - 3000 0.43338517 -2.0028125 0.059884381 -1.5099041 1.4716488 - 4000 0.46674519 -2.0200954 0.066548679 -1.4871905 1.2506693 - 5000 0.45 -2.0207125 0.055926205 -1.5151613 1.3047457 - 6000 0.45447759 -2.0585234 0.068004883 -1.5364197 1.1859762 - 7000 0.43183018 -2.0170545 0.060800296 -1.5247839 1.3074223 - 8000 0.46657547 -2.053224 0.063224367 -1.523813 1.1785643 - 9000 0.45 -2.0691221 0.054959029 -1.564538 1.1833657 - 10000 0.4428252 -2.0473987 0.054306905 -1.5506356 1.181794 - 11000 0.45407036 -2.0746151 0.065849667 -1.5550734 1.1008545 - 12000 0.46061944 -2.0580809 0.063129643 -1.5347156 1.0206491 - 13000 0.45159068 -2.0640832 0.060059758 -1.5528091 1.0813494 - 14000 0.44141594 -2.0467255 0.062785088 -1.5428923 1.1465772 - 15000 0.454361 -2.0908595 0.057471037 -1.5794061 0.84297781 - 16000 0.44061091 -2.0521452 0.064644196 -1.5472573 1.1478647 - 17000 0.45118383 -2.081348 0.058660999 -1.5718791 1.0101404 - 18000 0.44664866 -2.0845745 0.060435731 -1.5778623 0.96142277 - 19000 0.45515339 -2.0914006 0.062174016 -1.5744525 0.87623323 - 20000 0.45624408 -2.0837697 0.059263054 -1.5686428 0.92810644 - 21000 0.46791657 -2.1062007 0.067355929 -1.5713181 0.88318793 - 22000 0.43907391 -2.1005271 0.065885144 -1.5959339 0.77211644 - 23000 0.43967354 -2.0723459 0.057613471 -1.5754253 1.0371548 - 24000 0.45716384 -2.0987126 0.055157377 -1.5867723 0.89670061 - 25000 0.45828285 -2.1041616 0.057736138 -1.5885245 0.79952286 - 26000 0.45 -2.0743463 0.072455519 -1.5522658 0.88260204 - 27000 0.46581599 -2.0804974 0.058113258 -1.5569564 0.93053891 - 28000 0.46904194 -2.0920124 0.059748792 -1.5636125 0.79359618 - 29000 0.46093196 -2.118556 0.063942334 -1.5940659 0.67707604 - 30000 0.45733724 -2.1197827 0.066939064 -1.5958875 0.66886075 - 31000 0.44580762 -2.0977175 0.056969121 -1.5953123 0.81042562 - 32000 0.44403029 -2.1032264 0.063465127 -1.596101 0.71796412 - 33000 0.45834072 -2.0934132 0.066035391 -1.569419 0.77873998 - 34000 0.44981563 -2.0910902 0.07138738 -1.5702621 0.75679805 - 35000 0.45383392 -2.0926654 0.067553478 -1.5716562 0.9064517 - 36000 0.44447198 -2.1107114 0.062718917 -1.6038909 0.8538349 - 37000 0.45838527 -2.1166464 0.062442606 -1.5962005 0.7300635 - 38000 0.45014075 -2.1096258 0.059293718 -1.6005665 0.73988246 - 39000 0.44377026 -2.080309 0.063545781 -1.5733628 0.99775641 - 40000 0.44577324 -2.1134607 0.065271179 -1.6027878 0.64113168 - 41000 0.45 -2.0937983 0.060881377 -1.5832919 0.78849829 - 42000 0.46866695 -2.1142283 0.056417605 -1.5895343 0.73788436 - 43000 0.43211727 -2.0819893 0.061463358 -1.5887688 0.95853724 - 44000 0.44138397 -2.0921314 0.059643895 -1.5914713 0.89486208 - 45000 0.45 -2.117209 0.054804331 -1.6127797 0.78564885 - 46000 0.44285245 -2.1090975 0.057629006 -1.6089851 0.64549424 - 47000 0.45537009 -2.1164296 0.068582324 -1.5928567 0.73629413 - 48000 0.45046732 -2.1006362 0.057249591 -1.5932947 0.74317593 - 49000 0.45425966 -2.1191703 0.064247719 -1.6010414 0.70962368 - 50000 0.45506149 -2.1184671 0.064911797 -1.5988731 0.69958156 - 51000 0.46047417 -2.1019719 0.058468259 -1.5834132 0.87219271 - 52000 0.43808317 -2.092294 0.057280941 -1.597295 0.84156893 - 53000 0.45012337 -2.1175234 0.064002667 -1.6037725 0.64562439 - 54000 0.43854679 -2.1236444 0.061316257 -1.6241468 0.72478117 - 55000 0.46382438 -2.1016563 0.060724666 -1.5774938 0.83311209 - 56000 0.44951533 -2.0946157 0.055075217 -1.5903998 0.90066109 - 57000 0.45937401 -2.0983442 0.061558996 -1.577794 0.58606161 - 58000 0.446669 -2.1146838 0.062385166 -1.6060019 0.73443388 - 59000 0.43847747 -2.1197461 0.060460257 -1.6211738 0.7230937 - 60000 0.45294215 -2.1258513 0.061895006 -1.6113915 0.70722168 -Loop time of 4.56226 on 4 procs for 60000 steps with 1200 atoms - -Performance: 5681397.232 tau/day, 13151.382 timesteps/s -97.1% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.2114 | 2.2527 | 2.3592 | 4.1 | 49.38 -Bond | 0.083713 | 0.09234 | 0.10244 | 2.3 | 2.02 -Neigh | 0.72491 | 0.7277 | 0.72957 | 0.2 | 15.95 -Comm | 0.79464 | 0.90036 | 0.94957 | 6.5 | 19.74 -Output | 0.0014119 | 0.0024976 | 0.0057502 | 3.8 | 0.05 -Modify | 0.33757 | 0.35202 | 0.36946 | 2.1 | 7.72 -Other | | 0.2346 | | | 5.14 - -Nlocal: 300 ave 306 max 289 min -Histogram: 1 0 0 0 0 0 0 1 1 1 -Nghost: 227.25 ave 250 max 216 min -Histogram: 2 0 1 0 0 0 0 0 0 1 -Neighs: 2373.25 ave 2489 max 2283 min -Histogram: 1 1 0 0 0 1 0 0 0 1 - -Total # of neighbors = 9493 -Ave neighs/atom = 7.91083 -Ave special neighs/atom = 0.5 -Neighbor list builds = 4888 -Dangerous builds = 0 -Total wall time: 0:00:04 diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 b/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 new file mode 100644 index 0000000000..ce9547408c --- /dev/null +++ b/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 @@ -0,0 +1,286 @@ +LAMMPS (28 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 + 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 + 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 + 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 + 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 + 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 + 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 + 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 + 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 + 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 + 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 + 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 + 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 + 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 + 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 + 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 + 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 + 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 + 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 + 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 + 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 +Loop time of 0.108068 on 1 procs for 1000 steps with 1200 atoms + +Performance: 3997492.279 tau/day, 9253.454 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.071711 | 0.071711 | 0.071711 | 0.0 | 66.36 +Bond | 0.0039465 | 0.0039465 | 0.0039465 | 0.0 | 3.65 +Neigh | 0.01743 | 0.01743 | 0.01743 | 0.0 | 16.13 +Comm | 0.0018625 | 0.0018625 | 0.0018625 | 0.0 | 1.72 +Output | 0.00015855 | 0.00015855 | 0.00015855 | 0.0 | 0.15 +Modify | 0.01058 | 0.01058 | 0.01058 | 0.0 | 9.79 +Other | | 0.00238 | | | 2.20 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 206 ave 206 max 206 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3191 ave 3191 max 3191 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3191 +Ave neighs/atom = 2.65917 +Ave special neighs/atom = 0.5 +Neighbor list builds = 99 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 1000 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +0 atoms in group solvent +group solute subtract all solvent +1200 atoms in group solute +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +151 rigid bodies with 1200 atoms +fix 4 all enforce2d +run 20000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.274 | 5.274 | 5.274 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.43824398 -1.7061976 0.094144249 -1.5297 35.328657 + 1000 0.44980495 -1.7618752 0.094144249 -1.5832051 -0.78239121 + 2000 0.4080548 -1.7592744 0.094144249 -1.5884498 3.7941359 + 3000 0.43543409 -1.7704837 0.094144249 -1.5945142 2.0801732 + 4000 0.43624218 -1.7752975 0.094144249 -1.5991761 5.3401997 + 5000 0.44526204 -1.7627039 0.094144249 -1.5848875 1.8074242 + 6000 0.45601171 -1.7578409 0.094144249 -1.5780044 3.6999235 + 7000 0.45000311 -1.7707158 0.094144249 -1.5920085 14.198063 + 8000 0.49199853 -1.7647643 0.094144249 -1.5781653 1.1767602 + 9000 0.42662498 -1.7719397 0.094144249 -1.5976255 1.8316615 + 10000 0.44225069 -1.7704012 0.094144249 -1.5931507 4.2515329 + 11000 0.54415369 -1.7634927 0.094144249 -1.5670929 7.626065 + 12000 0.42501235 -1.7698463 0.094144249 -1.5958351 1.4118043 + 13000 0.48382538 -1.7497323 0.094144249 -1.5646692 2.2441707 + 14000 0.4376704 -1.7658795 0.094144249 -1.5894897 2.7170856 + 15000 0.42644426 -1.758103 0.094144249 -1.5838228 5.6129465 + 16000 0.37371943 -1.7881668 0.094144249 -1.6237944 4.0731922 + 17000 0.42320956 -1.7831129 0.094144249 -1.6094406 -4.2042077 + 18000 0.47319029 -1.7642512 0.094144249 -1.5811866 1.8859862 + 19000 0.45117547 -1.7736983 0.094144249 -1.5947706 -1.3566752 + 20000 0.48993295 -1.7820573 0.094144249 -1.5958465 -0.63347623 +Loop time of 3.56168 on 1 procs for 20000 steps with 1200 atoms + +Performance: 2425823.418 tau/day, 5615.332 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.7048 | 1.7048 | 1.7048 | 0.0 | 47.86 +Bond | 0.079658 | 0.079658 | 0.079658 | 0.0 | 2.24 +Neigh | 0.36319 | 0.36319 | 0.36319 | 0.0 | 10.20 +Comm | 0.042085 | 0.042085 | 0.042085 | 0.0 | 1.18 +Output | 0.00021696 | 0.00021696 | 0.00021696 | 0.0 | 0.01 +Modify | 1.3169 | 1.3169 | 1.3169 | 0.0 | 36.97 +Other | | 0.05485 | | | 1.54 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 414 ave 414 max 414 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 8824 ave 8824 max 8824 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 8824 +Ave neighs/atom = 7.35333 +Ave special neighs/atom = 0.5 +Neighbor list builds = 1148 +Dangerous builds = 0 +unfix 5 +unfix 4 +fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 +151 rigid bodies with 1200 atoms + 25.2208 = max distance from body owner to body atom +fix 4 all enforce2d +run 20000 +Per MPI rank memory allocation (min/avg/max) = 8.642 | 8.642 | 8.642 Mbytes +Step Temp E_pair E_mol TotEng Press + 20000 0.48993295 -1.7820573 0.094144249 -1.5958465 3.267595 + 21000 0.42136691 -1.7767171 0.094144249 -1.6033909 1.1186996 + 22000 0.42456205 -1.7606471 0.094144249 -1.5867205 2.8866506 + 23000 0.48026533 -1.7693864 0.094144249 -1.5849923 7.3708907 + 24000 0.51908347 -1.7748052 0.094144249 -1.5831165 -0.88177558 + 25000 0.46033763 -1.7615973 0.094144249 -1.580948 7.0803034 + 26000 0.48667124 -1.7625783 0.094144249 -1.5769804 -11.557404 + 27000 0.45085745 -1.7833193 0.094144249 -1.6044514 6.5390499 + 28000 0.47333185 -1.7561049 0.094144249 -1.5730137 -3.2587604 + 29000 0.46380712 -1.7830962 0.094144249 -1.6017949 7.1120026 + 30000 0.41845082 -1.7808054 0.094144249 -1.6080272 3.6435588 + 31000 0.510966 -1.7649896 0.094144249 -1.5748263 1.4979844 + 32000 0.42169482 -1.7623593 0.094144249 -1.5889716 2.6130718 + 33000 0.43724881 -1.769415 0.094144249 -1.5931044 1.1205627 + 34000 0.43753147 -1.7878022 0.094144249 -1.6114385 9.0463054 + 35000 0.44230686 -1.7554417 0.094144249 -1.5781806 3.776513 + 36000 0.39564972 -1.7614398 0.094144249 -1.5929464 4.6243057 + 37000 0.39176208 -1.7586072 0.094144249 -1.5908443 -2.1444581 + 38000 0.4601972 -1.7727349 0.094144249 -1.5921119 9.513042 + 39000 0.42107042 -1.7703643 0.094144249 -1.5970939 5.3409161 + 40000 0.45100889 -1.7794839 0.094144249 -1.6005876 -8.2877164 +Loop time of 3.5613 on 1 procs for 20000 steps with 1200 atoms + +Performance: 2426077.738 tau/day, 5615.921 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.7113 | 1.7113 | 1.7113 | 0.0 | 48.05 +Bond | 0.079594 | 0.079594 | 0.079594 | 0.0 | 2.23 +Neigh | 0.36249 | 0.36249 | 0.36249 | 0.0 | 10.18 +Comm | 0.042057 | 0.042057 | 0.042057 | 0.0 | 1.18 +Output | 0.00020933 | 0.00020933 | 0.00020933 | 0.0 | 0.01 +Modify | 1.3102 | 1.3102 | 1.3102 | 0.0 | 36.79 +Other | | 0.05553 | | | 1.56 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 405 ave 405 max 405 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 8806 ave 8806 max 8806 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 8806 +Ave neighs/atom = 7.33833 +Ave special neighs/atom = 0.5 +Neighbor list builds = 1149 +Dangerous builds = 0 +Total wall time: 0:00:07 diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 b/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 new file mode 100644 index 0000000000..40ffc1c3f8 --- /dev/null +++ b/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 @@ -0,0 +1,286 @@ +LAMMPS (28 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.758 | 3.758 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 + 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 + 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 + 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 + 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 + 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 + 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 + 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 + 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 + 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 + 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 + 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 + 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 + 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 + 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 + 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 + 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 + 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 + 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 + 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 + 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 +Loop time of 0.0372003 on 4 procs for 1000 steps with 1200 atoms + +Performance: 11612799.682 tau/day, 26881.481 timesteps/s +97.2% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.016521 | 0.017472 | 0.018793 | 0.6 | 46.97 +Bond | 0.00099087 | 0.0011039 | 0.0012043 | 0.2 | 2.97 +Neigh | 0.004885 | 0.0049515 | 0.0050163 | 0.1 | 13.31 +Comm | 0.0060358 | 0.007614 | 0.0085688 | 1.1 | 20.47 +Output | 0.00021625 | 0.00048053 | 0.0012674 | 0.0 | 1.29 +Modify | 0.0035112 | 0.0037069 | 0.0038922 | 0.2 | 9.96 +Other | | 0.001872 | | | 5.03 + +Nlocal: 300 ave 305 max 295 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 105.5 ave 109 max 102 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 797.75 ave 810 max 792 min +Histogram: 2 0 1 0 0 0 0 0 0 1 + +Total # of neighbors = 3191 +Ave neighs/atom = 2.65917 +Ave special neighs/atom = 0.5 +Neighbor list builds = 99 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 1000 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +0 atoms in group solvent +group solute subtract all solvent +1200 atoms in group solute +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +151 rigid bodies with 1200 atoms +fix 4 all enforce2d +run 20000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.251 | 5.251 | 5.251 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.43824398 -1.7061976 0.094144249 -1.5297 35.328657 + 1000 0.44980495 -1.7618752 0.094144249 -1.5832051 -0.78239121 + 2000 0.40805491 -1.7592744 0.094144249 -1.5884498 3.794136 + 3000 0.43543405 -1.770484 0.094144249 -1.5945145 2.0801519 + 4000 0.43643917 -1.7753492 0.094144249 -1.5991908 5.3403198 + 5000 0.45205579 -1.7629096 0.094144249 -1.5838165 1.9144765 + 6000 0.44220306 -1.7576322 0.094144249 -1.5803906 3.6971068 + 7000 0.4462785 -1.7647165 0.094144249 -1.586709 14.683449 + 8000 0.50268339 -1.7617766 0.094144249 -1.5731698 0.60117188 + 9000 0.4185915 -1.7725393 0.094144249 -1.5997347 1.5667222 + 10000 0.41970397 -1.7644115 0.094144249 -1.5913979 3.8986052 + 11000 0.51816323 -1.766257 0.094144249 -1.5747412 7.1402513 + 12000 0.42512195 -1.7744735 0.094144249 -1.6004418 1.4082461 + 13000 0.47476574 -1.7409224 0.094144249 -1.5575618 2.340655 + 14000 0.42835873 -1.7615597 0.094144249 -1.5869197 2.3617147 + 15000 0.44020572 -1.7540214 0.094144249 -1.5771552 6.6780537 + 16000 0.40238891 -1.795345 0.094144249 -1.6255852 3.9488478 + 17000 0.45191638 -1.7874875 0.094144249 -1.6084206 -4.6290962 + 18000 0.49064485 -1.7647644 0.094144249 -1.5784198 1.7453052 + 19000 0.46160705 -1.7769365 0.094144249 -1.5960486 -1.1662864 + 20000 0.47959574 -1.7800673 0.094144249 -1.595799 -0.98697816 +Loop time of 1.7116 on 4 procs for 20000 steps with 1200 atoms + +Performance: 5047917.690 tau/day, 11684.995 timesteps/s +97.6% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.37681 | 0.38516 | 0.39458 | 1.0 | 22.50 +Bond | 0.020415 | 0.021627 | 0.022797 | 0.7 | 1.26 +Neigh | 0.10577 | 0.10609 | 0.10629 | 0.1 | 6.20 +Comm | 0.13426 | 0.14677 | 0.15824 | 2.6 | 8.58 +Output | 0.0002625 | 0.00055283 | 0.0014203 | 0.0 | 0.03 +Modify | 0.98032 | 0.99445 | 1.0072 | 1.0 | 58.10 +Other | | 0.05693 | | | 3.33 + +Nlocal: 300 ave 303 max 297 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 218.25 ave 220 max 216 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Neighs: 2200 ave 2256 max 2100 min +Histogram: 1 0 0 0 0 0 1 0 0 2 + +Total # of neighbors = 8800 +Ave neighs/atom = 7.33333 +Ave special neighs/atom = 0.5 +Neighbor list builds = 1151 +Dangerous builds = 0 +unfix 5 +unfix 4 +fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 +151 rigid bodies with 1200 atoms + 25.2208 = max distance from body owner to body atom +fix 4 all enforce2d +run 20000 +Per MPI rank memory allocation (min/avg/max) = 8.565 | 8.566 | 8.567 Mbytes +Step Temp E_pair E_mol TotEng Press + 20000 0.47959574 -1.7800673 0.094144249 -1.595799 2.1834568 + 21000 0.45192649 -1.7677564 0.094144249 -1.5886876 5.0300353 + 22000 0.48175977 -1.7671661 0.094144249 -1.5824911 2.3411062 + 23000 0.46753063 -1.7602689 0.094144249 -1.5782678 5.8757813 + 24000 0.45718166 -1.7635844 0.094144249 -1.5835281 -1.1327974 + 25000 0.45674572 -1.7712591 0.094144249 -1.5912847 -6.0018365 + 26000 0.44622761 -1.7601243 0.094144249 -1.5821264 5.1254356 + 27000 0.41586479 -1.7807035 0.094144249 -1.6084114 -5.3810671 + 28000 0.41308577 -1.7679534 0.094144249 -1.5961835 0.71052669 + 29000 0.43702439 -1.7690454 0.094144249 -1.592777 1.9213508 + 30000 0.43066072 -1.7724511 0.094144249 -1.5973785 2.4355851 + 31000 0.48969168 -1.7625278 0.094144249 -1.5763624 5.7700505 + 32000 0.39884729 -1.7714506 0.094144249 -1.6023563 11.053577 + 33000 0.4347186 -1.7737143 0.094144249 -1.5978792 -2.6480619 + 34000 0.44709286 -1.7661896 0.094144249 -1.5880292 6.5468593 + 35000 0.45546222 -1.7718546 0.094144249 -1.5921214 0.52103696 + 36000 0.48138774 -1.770575 0.094144249 -1.58597 1.1512536 + 37000 0.42613993 -1.7639698 0.094144249 -1.5897468 1.9532262 + 38000 0.45269407 -1.7624131 0.094144249 -1.5832001 4.9018622 + 39000 0.47640838 -1.7756583 0.094144249 -1.591989 0.3741248 + 40000 0.50397124 -1.7866289 0.094144249 -1.59778 1.704803 +Loop time of 1.21517 on 4 procs for 20000 steps with 1200 atoms + +Performance: 7110090.321 tau/day, 16458.542 timesteps/s +98.1% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.38099 | 0.38923 | 0.40336 | 1.4 | 32.03 +Bond | 0.020087 | 0.021536 | 0.022812 | 0.7 | 1.77 +Neigh | 0.10813 | 0.10901 | 0.10931 | 0.2 | 8.97 +Comm | 0.12643 | 0.14414 | 0.15438 | 3.0 | 11.86 +Output | 0.00025606 | 0.00054097 | 0.0013928 | 0.0 | 0.04 +Modify | 0.50525 | 0.50958 | 0.52151 | 1.0 | 41.93 +Other | | 0.04114 | | | 3.39 + +Nlocal: 300 ave 303 max 296 min +Histogram: 1 0 0 0 1 0 0 0 1 1 +Nghost: 216 ave 221 max 212 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Neighs: 2205 ave 2277 max 2105 min +Histogram: 1 0 0 0 0 0 2 0 0 1 + +Total # of neighbors = 8820 +Ave neighs/atom = 7.35 +Ave special neighs/atom = 0.5 +Neighbor list builds = 1150 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.1 b/examples/micelle/log.28Feb2019.micelle.g++.1 new file mode 100644 index 0000000000..d407a9a854 --- /dev/null +++ b/examples/micelle/log.28Feb2019.micelle.g++.1 @@ -0,0 +1,256 @@ +LAMMPS (28 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 + 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 + 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 + 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 + 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 + 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 + 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 + 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 + 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 + 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 + 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 + 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 + 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 + 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 + 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 + 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 + 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 + 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 + 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 + 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 + 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 +Loop time of 0.10837 on 1 procs for 1000 steps with 1200 atoms + +Performance: 3986358.208 tau/day, 9227.681 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.071949 | 0.071949 | 0.071949 | 0.0 | 66.39 +Bond | 0.0039806 | 0.0039806 | 0.0039806 | 0.0 | 3.67 +Neigh | 0.01737 | 0.01737 | 0.01737 | 0.0 | 16.03 +Comm | 0.0019217 | 0.0019217 | 0.0019217 | 0.0 | 1.77 +Output | 0.00016022 | 0.00016022 | 0.00016022 | 0.0 | 0.15 +Modify | 0.010607 | 0.010607 | 0.010607 | 0.0 | 9.79 +Other | | 0.002382 | | | 2.20 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 206 ave 206 max 206 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3191 ave 3191 max 3191 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3191 +Ave neighs/atom = 2.65917 +Ave special neighs/atom = 0.5 +Neighbor list builds = 99 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 1000 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +run 60000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.024 | 4.024 | 4.024 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 -1.7061976 0.094144249 -1.1624283 3.8015113 + 1000 0.45 -1.9656133 0.065736052 -1.4502522 1.8870315 + 2000 0.45917162 -1.9677772 0.06512989 -1.4438584 1.6197525 + 3000 0.45029543 -1.9993287 0.060436068 -1.4889724 1.6749521 + 4000 0.44658614 -2.0150793 0.070735372 -1.49813 1.4982834 + 5000 0.45 -2.0317981 0.06873808 -1.513435 1.375846 + 6000 0.46323984 -2.0135007 0.067698691 -1.4829482 1.3342928 + 7000 0.46154055 -2.0268144 0.064313941 -1.5013445 1.2936811 + 8000 0.45911863 -2.032873 0.058832094 -1.5153049 1.1717652 + 9000 0.46126695 -2.0435575 0.060645049 -1.5220299 1.1810833 + 10000 0.44212317 -2.0552317 0.066386857 -1.5470901 1.1217265 + 11000 0.46455191 -2.0852383 0.064035544 -1.557038 1.0722284 + 12000 0.45647983 -2.0711846 0.058592351 -1.5564929 1.1487056 + 13000 0.44296686 -2.0532457 0.059554979 -1.551093 1.1665292 + 14000 0.44154216 -2.045874 0.059814984 -1.5448848 1.1231544 + 15000 0.43921469 -2.0642415 0.057245543 -1.5681472 1.1342333 + 16000 0.44278133 -2.0696899 0.053114875 -1.5741627 1.0881442 + 17000 0.45 -2.0847259 0.060756733 -1.5743441 0.94801701 + 18000 0.45115973 -2.0899292 0.061273297 -1.5778721 0.86251832 + 19000 0.45210059 -2.0822877 0.061618471 -1.5689454 0.80428644 + 20000 0.44516679 -2.0789966 0.060221274 -1.5739795 0.98113308 + 21000 0.44850103 -2.0920747 0.060514536 -1.5834329 0.92324 + 22000 0.44679652 -2.0669569 0.067895097 -1.5526376 1.106608 + 23000 0.45651863 -2.0904722 0.06387795 -1.5704561 0.850672 + 24000 0.4584402 -2.0845866 0.062994228 -1.5635342 0.78607061 + 25000 0.45668297 -2.0867185 0.057694285 -1.5727218 0.85872516 + 26000 0.45509931 -2.0887933 0.057944017 -1.5761293 0.97591479 + 27000 0.44666043 -2.1050106 0.056793397 -1.601929 0.86053641 + 28000 0.44305811 -2.0986076 0.06061175 -1.595307 0.8337899 + 29000 0.43309506 -2.0797769 0.057836836 -1.5892059 0.781554 + 30000 0.45295672 -2.1062574 0.059985016 -1.5936931 0.82009912 + 31000 0.44732019 -2.097185 0.050654563 -1.599583 0.85301217 + 32000 0.44266582 -2.0953191 0.054789729 -1.5982324 0.71512496 + 33000 0.4453828 -2.0994714 0.060417004 -1.5940427 0.72747171 + 34000 0.46294819 -2.1152896 0.057702794 -1.5950244 0.76689535 + 35000 0.45151588 -2.1057688 0.067282487 -1.5873467 0.58239461 + 36000 0.43762794 -2.110522 0.064864579 -1.6083942 0.67640246 + 37000 0.45 -2.1238558 0.055080557 -1.6191502 0.66264135 + 38000 0.45242633 -2.090514 0.052892245 -1.5855725 0.82462117 + 39000 0.46220707 -2.1171223 0.066563814 -1.5887366 0.61579423 + 40000 0.46129497 -2.1127774 0.052158545 -1.5997083 0.7450628 + 41000 0.44910025 -2.1105051 0.055407892 -1.6063712 0.63060789 + 42000 0.43949477 -2.1111359 0.053274048 -1.6187333 0.7589387 + 43000 0.44780419 -2.1131157 0.064089346 -1.6015953 0.66207693 + 44000 0.45601736 -2.103811 0.05661822 -1.5915554 0.82031717 + 45000 0.4444893 -2.1288758 0.064280408 -1.6204765 0.63115787 + 46000 0.4412452 -2.126527 0.069196255 -1.6164532 0.5245319 + 47000 0.46558295 -2.1302034 0.061017021 -1.6039914 0.47795265 + 48000 0.4447318 -2.10327 0.051780625 -1.6071281 0.56768661 + 49000 0.45152907 -2.1159427 0.052803985 -1.6119859 0.79924946 + 50000 0.43009519 -2.1080874 0.067204222 -1.6111465 0.85332392 + 51000 0.46317379 -2.1123268 0.058408991 -1.59113 0.72230777 + 52000 0.45417978 -2.1200771 0.065575223 -1.6007006 0.7742118 + 53000 0.43662759 -2.0916043 0.061621629 -1.593719 0.80656554 + 54000 0.44985568 -2.1167148 0.063414372 -1.6038197 0.63989449 + 55000 0.44499083 -2.1104573 0.056857917 -1.6089794 0.73153307 + 56000 0.44760788 -2.1162558 0.061556514 -1.6074644 0.62340704 + 57000 0.43753788 -2.1127115 0.05633761 -1.6192006 0.7012971 + 58000 0.46476788 -2.121983 0.057525001 -1.6000774 0.64993478 + 59000 0.45 -2.1329625 0.069789212 -1.6135483 0.63819024 + 60000 0.44526017 -2.1213789 0.071976974 -1.6045128 0.71055045 +Loop time of 7.83001 on 1 procs for 60000 steps with 1200 atoms + +Performance: 3310339.921 tau/day, 7662.824 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.2292 | 5.2292 | 5.2292 | 0.0 | 66.78 +Bond | 0.23627 | 0.23627 | 0.23627 | 0.0 | 3.02 +Neigh | 1.5068 | 1.5068 | 1.5068 | 0.0 | 19.24 +Comm | 0.14386 | 0.14386 | 0.14386 | 0.0 | 1.84 +Output | 0.00068521 | 0.00068521 | 0.00068521 | 0.0 | 0.01 +Modify | 0.56151 | 0.56151 | 0.56151 | 0.0 | 7.17 +Other | | 0.1516 | | | 1.94 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 374 ave 374 max 374 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9604 ave 9604 max 9604 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9604 +Ave neighs/atom = 8.00333 +Ave special neighs/atom = 0.5 +Neighbor list builds = 4881 +Dangerous builds = 0 +Total wall time: 0:00:07 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.4 b/examples/micelle/log.28Feb2019.micelle.g++.4 new file mode 100644 index 0000000000..a4ffc7942b --- /dev/null +++ b/examples/micelle/log.28Feb2019.micelle.g++.4 @@ -0,0 +1,256 @@ +LAMMPS (28 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.758 | 3.758 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 + 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 + 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 + 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 + 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 + 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 + 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 + 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 + 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 + 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 + 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 + 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 + 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 + 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 + 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 + 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 + 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 + 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 + 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 + 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 + 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 +Loop time of 0.038061 on 4 procs for 1000 steps with 1200 atoms + +Performance: 11350211.981 tau/day, 26273.639 timesteps/s +96.0% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.016952 | 0.017563 | 0.018236 | 0.3 | 46.14 +Bond | 0.00098968 | 0.0010636 | 0.0011351 | 0.2 | 2.79 +Neigh | 0.0048919 | 0.0049396 | 0.0049865 | 0.1 | 12.98 +Comm | 0.0075874 | 0.0083745 | 0.0094497 | 0.7 | 22.00 +Output | 0.00021791 | 0.00024784 | 0.00033474 | 0.0 | 0.65 +Modify | 0.0035474 | 0.0036926 | 0.0038188 | 0.2 | 9.70 +Other | | 0.00218 | | | 5.73 + +Nlocal: 300 ave 305 max 295 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 105.5 ave 109 max 102 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 797.75 ave 810 max 792 min +Histogram: 2 0 1 0 0 0 0 0 0 1 + +Total # of neighbors = 3191 +Ave neighs/atom = 2.65917 +Ave special neighs/atom = 0.5 +Neighbor list builds = 99 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 1000 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +run 60000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.001 | 4.001 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 -1.7061976 0.094144249 -1.1624283 3.8015113 + 1000 0.45 -1.9656272 0.065737702 -1.4502645 1.8869504 + 2000 0.45643021 -1.9804979 0.06069692 -1.4637511 1.7840488 + 3000 0.45 -2.0069774 0.063273903 -1.4940785 1.5344808 + 4000 0.46877185 -2.0118089 0.063511162 -1.4799165 1.5112039 + 5000 0.45037477 -2.0202928 0.064675812 -1.5056176 1.5614253 + 6000 0.46516417 -2.041891 0.0633751 -1.5137393 1.302917 + 7000 0.43402321 -2.0309525 0.080389027 -1.5169019 1.2526669 + 8000 0.44698877 -2.0438825 0.056384491 -1.5408818 1.2320847 + 9000 0.46716896 -2.0490995 0.055185945 -1.5271339 1.1323067 + 10000 0.45585592 -2.0534599 0.059172717 -1.5388112 1.2103699 + 11000 0.44678446 -2.0702287 0.064814108 -1.5590025 0.93753889 + 12000 0.46238947 -2.0533635 0.061899722 -1.5294596 1.039375 + 13000 0.44497125 -2.0582622 0.055753243 -1.5579085 1.105247 + 14000 0.46197842 -2.0700459 0.061177996 -1.5472745 1.0365751 + 15000 0.45391975 -2.0698433 0.071128012 -1.5451738 0.94060338 + 16000 0.44617128 -2.0921643 0.064669811 -1.5816951 0.96199988 + 17000 0.45205591 -2.0892946 0.073532323 -1.5640831 0.72042835 + 18000 0.44742647 -2.0667234 0.066469731 -1.5532 1.0881956 + 19000 0.45154441 -2.0603669 0.0589846 -1.5502142 1.1682254 + 20000 0.44930673 -2.0699762 0.060197 -1.5608469 0.93709988 + 21000 0.44952144 -2.0787365 0.054909176 -1.5746805 0.91906714 + 22000 0.45094085 -2.1027668 0.05970659 -1.5924952 0.76875966 + 23000 0.45653288 -2.0752194 0.057879405 -1.5611875 0.90288603 + 24000 0.45659718 -2.1051589 0.061071012 -1.5878712 0.67941553 + 25000 0.44943892 -2.0785434 0.063137757 -1.5663412 0.91848225 + 26000 0.46662896 -2.0912992 0.060997699 -1.5640614 0.84321344 + 27000 0.45990587 -2.0872861 0.062249833 -1.5655136 0.7970408 + 28000 0.44904041 -2.0887241 0.067592763 -1.5724651 0.83063368 + 29000 0.44840621 -2.082931 0.063504343 -1.5713941 0.85259731 + 30000 0.45 -2.1005553 0.061020694 -1.5899096 0.85076517 + 31000 0.43293607 -2.0834216 0.062211326 -1.588635 0.87798767 + 32000 0.45 -2.1041864 0.056583773 -1.5979776 0.74721991 + 33000 0.45483731 -2.0843819 0.064702707 -1.5652209 0.72878185 + 34000 0.45 -2.0946388 0.056465271 -1.5885485 0.81958535 + 35000 0.45561477 -2.0962413 0.058642378 -1.5823639 0.86190757 + 36000 0.46372156 -2.0819766 0.061679429 -1.556962 0.92734228 + 37000 0.46602014 -2.0978422 0.05861007 -1.5736003 0.87514767 + 38000 0.45496066 -2.0993783 0.054914099 -1.5898827 0.7885952 + 39000 0.45215206 -2.0997742 0.061140603 -1.5868584 0.83434324 + 40000 0.43961538 -2.095479 0.061779306 -1.5944507 0.79151814 + 41000 0.45065436 -2.0992641 0.058334617 -1.5906507 0.84329542 + 42000 0.44063989 -2.0911919 0.058682846 -1.5922364 0.83653642 + 43000 0.45090762 -2.1109187 0.056792395 -1.6035945 0.66699616 + 44000 0.43620597 -2.1163977 0.068503171 -1.6120521 0.72985642 + 45000 0.4536995 -2.1169236 0.06222035 -1.6013818 0.6724514 + 46000 0.44961963 -2.0949168 0.056381135 -1.5892907 0.85934269 + 47000 0.45429621 -2.0982372 0.05977093 -1.5845486 0.78798948 + 48000 0.45889422 -2.1042317 0.062692038 -1.5830278 0.80652424 + 49000 0.44973607 -2.1107622 0.05251269 -1.6088882 0.80305097 + 50000 0.45422606 -2.1083846 0.05061301 -1.603924 0.81750837 + 51000 0.45545299 -2.1154627 0.053581638 -1.6068076 0.77970255 + 52000 0.46382715 -2.1001689 0.053408569 -1.5833197 0.77034515 + 53000 0.44707619 -2.1134818 0.055878089 -1.6109001 0.63749083 + 54000 0.45951971 -2.1155704 0.05958078 -1.5968529 0.81426779 + 55000 0.45588645 -2.1128869 0.060361673 -1.5970187 0.70242718 + 56000 0.44752186 -2.0917439 0.058352116 -1.5862429 0.89773952 + 57000 0.44921415 -2.115356 0.05318821 -1.613328 0.81456406 + 58000 0.44046295 -2.1119294 0.063384551 -1.6084489 0.59683679 + 59000 0.4349702 -2.0981796 0.059156694 -1.6044152 0.71438644 + 60000 0.4568814 -2.1060323 0.06038074 -1.5891509 0.70442841 +Loop time of 2.49332 on 4 procs for 60000 steps with 1200 atoms + +Performance: 10395764.892 tau/day, 24064.271 timesteps/s +97.9% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.1638 | 1.2432 | 1.3093 | 4.7 | 49.86 +Bond | 0.055561 | 0.063918 | 0.072427 | 2.4 | 2.56 +Neigh | 0.45107 | 0.45366 | 0.45616 | 0.3 | 18.20 +Comm | 0.40982 | 0.48044 | 0.56933 | 8.4 | 19.27 +Output | 0.00072122 | 0.0013784 | 0.0033441 | 3.1 | 0.06 +Modify | 0.14899 | 0.15204 | 0.15837 | 1.0 | 6.10 +Other | | 0.09871 | | | 3.96 + +Nlocal: 300 ave 307 max 288 min +Histogram: 1 0 0 0 0 0 0 2 0 1 +Nghost: 216 ave 222 max 212 min +Histogram: 1 1 0 0 0 1 0 0 0 1 +Neighs: 2391.75 ave 2543 max 2194 min +Histogram: 1 0 0 0 0 0 2 0 0 1 + +Total # of neighbors = 9567 +Ave neighs/atom = 7.9725 +Ave special neighs/atom = 0.5 +Neighbor list builds = 4889 +Dangerous builds = 0 +Total wall time: 0:00:02 From b6b0d0b30ef181ddfd3690fa3e6603d9715285e6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 16:43:09 -0400 Subject: [PATCH 161/243] minor whitespace cleanup commit to retrigger PR tests on github --- src/pair_table.cpp | 2 +- src/read_dump.cpp | 16 ++++++++-------- src/read_dump.h | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/pair_table.cpp b/src/pair_table.cpp index cf9e5c3bfb..b1b6f45eda 100644 --- a/src/pair_table.cpp +++ b/src/pair_table.cpp @@ -378,7 +378,7 @@ void PairTable::read_table(Table *tb, char *file, char *keyword) utils::sfgets(FLERR,line,MAXLINE,fp,file,error); // no match, skip section param_extract(tb,line); utils::sfgets(FLERR,line,MAXLINE,fp,file,error); - for (int i = 0; i < tb->ninput; i++) + for (int i = 0; i < tb->ninput; i++) utils::sfgets(FLERR,line,MAXLINE,fp,file,error); } diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 551cc63c9e..7a05f4b1b5 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -94,7 +94,7 @@ ReadDump::~ReadDump() memory->destroy(fields); memory->destroy(buf); - + for (int i = 0; i < nreader; i++) delete readers[i]; delete [] readers; delete [] nsnapatoms; @@ -359,7 +359,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) readers[i]->skip(); } - if (eofflag) + if (eofflag) error->one(FLERR,"Read dump parallel files " "do not all have same timestep"); } @@ -466,7 +466,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) readers[i]->skip(); } - if (eofflag) + if (eofflag) error->one(FLERR,"Read dump parallel files " "do not all have same timestep"); } @@ -724,7 +724,7 @@ void ReadDump::read_atoms() otherproc = 0; ofirst = (bigint) otherproc * nsnap/nprocs_cluster; olast = (bigint) (otherproc+1) * nsnap/nprocs_cluster; - if (olast-ofirst > MAXSMALLINT) + if (olast-ofirst > MAXSMALLINT) error->one(FLERR,"Read dump snapshot is too large for a proc"); nnew = static_cast (olast - ofirst); @@ -765,7 +765,7 @@ void ReadDump::read_atoms() } else { ofirst = (bigint) me_cluster * nsnap/nprocs_cluster; olast = (bigint) (me_cluster+1) * nsnap/nprocs_cluster; - if (olast-ofirst > MAXSMALLINT) + if (olast-ofirst > MAXSMALLINT) error->one(FLERR,"Read dump snapshot is too large for a proc"); nnew = static_cast (olast - ofirst); if (nnew > maxnew || maxnew == 0) { @@ -791,7 +791,7 @@ void ReadDump::read_atoms() bigint sum = 0; for (int i = 0; i < nreader; i++) sum += nsnapatoms[i]; - if (sum > MAXSMALLINT) + if (sum > MAXSMALLINT) error->one(FLERR,"Read dump snapshot is too large for a proc"); nnew = static_cast (sum); if (nnew > maxnew || maxnew == 0) { @@ -811,7 +811,7 @@ void ReadDump::read_atoms() } nnew += nsnap; } - } + } } /* ---------------------------------------------------------------------- @@ -943,7 +943,7 @@ void ReadDump::process_atoms() ntrim++; } else i++; } - + atom->nlocal = nlocal; bigint nblocal = atom->nlocal; MPI_Allreduce(&nblocal,&atom->natoms,1,MPI_LMP_BIGINT,MPI_SUM,world); diff --git a/src/read_dump.h b/src/read_dump.h index 73cb0a8995..de174c3df6 100644 --- a/src/read_dump.h +++ b/src/read_dump.h @@ -86,7 +86,7 @@ private: double xlo,xhi,ylo,yhi,zlo,zhi,xy,xz,yz; // dump snapshot box params double xprd,yprd,zprd; - bigint *nsnapatoms; // # of atoms in one snapshot from + bigint *nsnapatoms; // # of atoms in one snapshot from // one (parallel) dump file // nreader-length vector b/c a reader proc // may read from multiple parallel dump files From 1926c95625ffd8d24ae7f5782b933217bb11b236 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 19:08:58 -0400 Subject: [PATCH 162/243] correct micelle data file without overwriting the molecule ids --- examples/micelle/data.micelle | 3065 ++++++++--------- .../micelle/log.28Feb2019.micelle-rigid.g++.1 | 234 +- .../micelle/log.28Feb2019.micelle-rigid.g++.4 | 264 +- examples/micelle/log.28Feb2019.micelle.g++.1 | 233 +- examples/micelle/log.28Feb2019.micelle.g++.4 | 251 +- 5 files changed, 2026 insertions(+), 2021 deletions(-) diff --git a/examples/micelle/data.micelle b/examples/micelle/data.micelle index 4f6abae3ca..5ff6196bc6 100644 --- a/examples/micelle/data.micelle +++ b/examples/micelle/data.micelle @@ -1,1539 +1,1530 @@ -LAMMPS data file. CGCMM style. atom_style bond generated by VMD/TopoTools v1.7 on Tue Mar 26 16:13:26 EDT 2019 - 1200 atoms - 300 bonds - 0 angles - 0 dihedrals - 0 impropers - 4 atom types - 1 bond types - 0 angle types - 0 dihedral types - 0 improper types - -0.392930 35.463931 xlo xhi - -0.050929 35.805932 ylo yhi - -0.100000 0.100000 zlo zhi - -# Pair Coeffs -# -# 1 1 -# 2 2 -# 3 3 -# 4 4 - -# Bond Coeffs -# -# 1 1 - + LAMMPS 2d micelle data file + + 1200 atoms + 300 bonds + 0 angles + 0 dihedrals + 0 impropers + + 4 atom types + 1 bond types + 0 angle types + 0 dihedral types + 0 improper types + + 0.0000000E+00 35.85686 xlo xhi + 0.0000000E+00 35.85686 ylo yhi + -0.1000000 0.1000000 zlo zhi + Masses - - 1 1.000000 # 1 - 2 1.000000 # 2 - 3 1.000000 # 3 - 4 1.000000 # 4 - - Atoms # bond - -1 140 2 0.000000 0.000000 0.000000 # 2 -2 1 1 1.195000 0.000000 0.000000 # 1 -3 1 1 2.390000 0.000000 0.000000 # 1 -4 1 1 3.586000 0.000000 0.000000 # 1 -5 1 1 4.781000 0.000000 0.000000 # 1 -6 1 1 5.976000 0.000000 0.000000 # 1 -7 1 1 7.171000 0.000000 0.000000 # 1 -8 1 1 8.367000 0.000000 0.000000 # 1 -9 1 1 9.562000 0.000000 0.000000 # 1 -10 115 2 10.757000 0.000000 0.000000 # 2 -11 1 1 11.952000 0.000000 0.000000 # 1 -12 53 2 13.148000 0.000000 0.000000 # 2 -13 1 1 14.343000 0.000000 0.000000 # 1 -14 1 1 15.538000 0.000000 0.000000 # 1 -15 1 1 16.733000 0.000000 0.000000 # 1 -16 1 1 17.927999 0.000000 0.000000 # 1 -17 1 1 19.124001 0.000000 0.000000 # 1 -18 1 1 20.319000 0.000000 0.000000 # 1 -19 1 1 21.514000 0.000000 0.000000 # 1 -20 1 1 22.709000 0.000000 0.000000 # 1 -21 1 1 23.905001 0.000000 0.000000 # 1 -22 1 1 25.100000 0.000000 0.000000 # 1 -23 1 1 26.295000 0.000000 0.000000 # 1 -24 111 2 27.490000 0.000000 0.000000 # 2 -25 129 2 28.684999 35.856861 0.000000 # 2 -26 1 1 29.881001 0.000000 0.000000 # 1 -27 1 1 31.076000 0.000000 0.000000 # 1 -28 1 1 32.271000 0.000000 0.000000 # 1 -29 1 1 33.466000 0.000000 0.000000 # 1 -30 1 1 34.661999 0.000000 0.000000 # 1 -31 1 1 0.000000 1.195000 0.000000 # 1 -32 1 1 1.195000 1.195000 0.000000 # 1 -33 114 2 2.390000 1.195000 0.000000 # 2 -34 1 1 3.586000 1.195000 0.000000 # 1 -35 76 2 4.781000 1.195000 0.000000 # 2 -36 1 1 5.976000 1.195000 0.000000 # 1 -37 1 1 7.171000 1.195000 0.000000 # 1 -38 90 2 8.367000 1.195000 0.000000 # 2 -39 1 1 9.562000 1.195000 0.000000 # 1 -40 95 2 10.757000 1.195000 0.000000 # 2 -41 1 1 11.952000 1.195000 0.000000 # 1 -42 36 2 13.148000 1.195000 0.000000 # 2 -43 1 1 14.343000 1.195000 0.000000 # 1 -44 1 1 15.538000 1.195000 0.000000 # 1 -45 1 1 16.733000 1.195000 0.000000 # 1 -46 1 1 17.927999 1.195000 0.000000 # 1 -47 1 1 19.124001 1.195000 0.000000 # 1 -48 1 1 20.319000 1.195000 0.000000 # 1 -49 1 1 21.514000 1.195000 0.000000 # 1 -50 1 1 22.709000 1.195000 0.000000 # 1 -51 1 1 23.905001 1.195000 0.000000 # 1 -52 1 1 25.100000 1.195000 0.000000 # 1 -53 1 1 26.295000 1.195000 0.000000 # 1 -54 1 1 27.490000 1.195000 0.000000 # 1 -55 1 1 28.684999 1.195000 0.000000 # 1 -56 1 1 29.881001 1.195000 0.000000 # 1 -57 1 1 31.076000 1.195000 0.000000 # 1 -58 1 1 32.271000 1.195000 0.000000 # 1 -59 1 1 33.466000 1.195000 0.000000 # 1 -60 1 1 34.661999 1.195000 0.000000 # 1 -61 1 1 0.000000 2.390000 0.000000 # 1 -62 1 1 1.195000 2.390000 0.000000 # 1 -63 120 2 2.390000 2.390000 0.000000 # 2 -64 1 1 3.586000 2.390000 0.000000 # 1 -65 25 2 4.781000 2.390000 0.000000 # 2 -66 1 1 5.976000 2.390000 0.000000 # 1 -67 1 1 7.171000 2.390000 0.000000 # 1 -68 1 1 8.367000 2.390000 0.000000 # 1 -69 1 1 9.562000 2.390000 0.000000 # 1 -70 1 1 10.757000 2.390000 0.000000 # 1 -71 1 1 11.952000 2.390000 0.000000 # 1 -72 1 1 13.148000 2.390000 0.000000 # 1 -73 1 1 14.343000 2.390000 0.000000 # 1 -74 1 1 15.538000 2.390000 0.000000 # 1 -75 1 1 16.733000 2.390000 0.000000 # 1 -76 1 1 17.927999 2.390000 0.000000 # 1 -77 1 1 19.124001 2.390000 0.000000 # 1 -78 1 1 20.319000 2.390000 0.000000 # 1 -79 1 1 21.514000 2.390000 0.000000 # 1 -80 1 1 22.709000 2.390000 0.000000 # 1 -81 1 1 23.905001 2.390000 0.000000 # 1 -82 75 2 25.100000 2.390000 0.000000 # 2 -83 1 1 26.295000 2.390000 0.000000 # 1 -84 1 1 27.490000 2.390000 0.000000 # 1 -85 1 1 28.684999 2.390000 0.000000 # 1 -86 48 2 29.881001 2.390000 0.000000 # 2 -87 1 1 31.076000 2.390000 0.000000 # 1 -88 1 1 32.271000 2.390000 0.000000 # 1 -89 1 1 33.466000 2.390000 0.000000 # 1 -90 1 1 34.661999 2.390000 0.000000 # 1 -91 1 1 0.000000 3.586000 0.000000 # 1 -92 1 1 1.195000 3.586000 0.000000 # 1 -93 1 1 2.390000 3.586000 0.000000 # 1 -94 1 1 3.586000 3.586000 0.000000 # 1 -95 1 1 4.781000 3.586000 0.000000 # 1 -96 1 1 5.976000 3.586000 0.000000 # 1 -97 1 1 7.171000 3.586000 0.000000 # 1 -98 1 1 8.367000 3.586000 0.000000 # 1 -99 1 1 9.562000 3.586000 0.000000 # 1 -100 122 2 10.757000 3.586000 0.000000 # 2 -101 1 1 11.952000 3.586000 0.000000 # 1 -102 1 1 13.148000 3.586000 0.000000 # 1 -103 130 2 14.343000 3.586000 0.000000 # 2 -104 1 1 15.538000 3.586000 0.000000 # 1 -105 1 1 16.733000 3.586000 0.000000 # 1 -106 1 1 17.927999 3.586000 0.000000 # 1 -107 1 1 19.124001 3.586000 0.000000 # 1 -108 1 1 20.319000 3.586000 0.000000 # 1 -109 118 2 21.514000 3.586000 0.000000 # 2 -110 1 1 22.709000 3.586000 0.000000 # 1 -111 1 1 23.905001 3.586000 0.000000 # 1 -112 1 1 25.100000 3.586000 0.000000 # 1 -113 1 1 26.295000 3.586000 0.000000 # 1 -114 1 1 27.490000 3.586000 0.000000 # 1 -115 1 1 28.684999 3.586000 0.000000 # 1 -116 50 2 29.881001 3.586000 0.000000 # 2 -117 1 1 31.076000 3.586000 0.000000 # 1 -118 1 1 32.271000 3.586000 0.000000 # 1 -119 1 1 33.466000 3.586000 0.000000 # 1 -120 1 1 34.661999 3.586000 0.000000 # 1 -121 1 1 0.000000 4.781000 0.000000 # 1 -122 1 1 1.195000 4.781000 0.000000 # 1 -123 1 1 2.390000 4.781000 0.000000 # 1 -124 1 1 3.586000 4.781000 0.000000 # 1 -125 39 2 4.781000 4.781000 0.000000 # 2 -126 1 1 5.976000 4.781000 0.000000 # 1 -127 68 2 7.171000 4.781000 0.000000 # 2 -128 1 1 8.367000 4.781000 0.000000 # 1 -129 4 2 9.562000 4.781000 0.000000 # 2 -130 1 1 10.757000 4.781000 0.000000 # 1 -131 42 2 11.952000 4.781000 0.000000 # 2 -132 1 1 13.148000 4.781000 0.000000 # 1 -133 132 2 14.343000 4.781000 0.000000 # 2 -134 1 1 15.538000 4.781000 0.000000 # 1 -135 1 1 16.733000 4.781000 0.000000 # 1 -136 1 1 17.927999 4.781000 0.000000 # 1 -137 1 1 19.124001 4.781000 0.000000 # 1 -138 1 1 20.319000 4.781000 0.000000 # 1 -139 1 1 21.514000 4.781000 0.000000 # 1 -140 1 1 22.709000 4.781000 0.000000 # 1 -141 1 1 23.905001 4.781000 0.000000 # 1 -142 1 1 25.100000 4.781000 0.000000 # 1 -143 1 1 26.295000 4.781000 0.000000 # 1 -144 1 1 27.490000 4.781000 0.000000 # 1 -145 1 1 28.684999 4.781000 0.000000 # 1 -146 1 1 29.881001 4.781000 0.000000 # 1 -147 1 1 31.076000 4.781000 0.000000 # 1 -148 1 1 32.271000 4.781000 0.000000 # 1 -149 1 1 33.466000 4.781000 0.000000 # 1 -150 1 1 34.661999 4.781000 0.000000 # 1 -151 54 2 35.856861 5.976000 0.000000 # 2 -152 1 1 1.195000 5.976000 0.000000 # 1 -153 1 1 2.390000 5.976000 0.000000 # 1 -154 1 1 3.586000 5.976000 0.000000 # 1 -155 1 1 4.781000 5.976000 0.000000 # 1 -156 1 1 5.976000 5.976000 0.000000 # 1 -157 49 2 7.171000 5.976000 0.000000 # 2 -158 1 1 8.367000 5.976000 0.000000 # 1 -159 31 2 9.562000 5.976000 0.000000 # 2 -160 1 1 10.757000 5.976000 0.000000 # 1 -161 1 1 11.952000 5.976000 0.000000 # 1 -162 105 2 13.148000 5.976000 0.000000 # 2 -163 1 1 14.343000 5.976000 0.000000 # 1 -164 137 2 15.538000 5.976000 0.000000 # 2 -165 1 1 16.733000 5.976000 0.000000 # 1 -166 1 1 17.927999 5.976000 0.000000 # 1 -167 1 1 19.124001 5.976000 0.000000 # 1 -168 117 2 20.319000 5.976000 0.000000 # 2 -169 1 1 21.514000 5.976000 0.000000 # 1 -170 1 1 22.709000 5.976000 0.000000 # 1 -171 1 1 23.905001 5.976000 0.000000 # 1 -172 1 1 25.100000 5.976000 0.000000 # 1 -173 41 2 26.295000 5.976000 0.000000 # 2 -174 1 1 27.490000 5.976000 0.000000 # 1 -175 146 2 28.684999 5.976000 0.000000 # 2 -176 34 2 29.881001 5.976000 0.000000 # 2 -177 1 1 31.076000 5.976000 0.000000 # 1 -178 1 1 32.271000 5.976000 0.000000 # 1 -179 1 1 33.466000 5.976000 0.000000 # 1 -180 1 1 34.661999 5.976000 0.000000 # 1 -181 1 1 0.000000 7.171000 0.000000 # 1 -182 1 1 1.195000 7.171000 0.000000 # 1 -183 1 1 2.390000 7.171000 0.000000 # 1 -184 1 1 3.586000 7.171000 0.000000 # 1 -185 1 1 4.781000 7.171000 0.000000 # 1 -186 1 1 5.976000 7.171000 0.000000 # 1 -187 1 1 7.171000 7.171000 0.000000 # 1 -188 1 1 8.367000 7.171000 0.000000 # 1 -189 1 1 9.562000 7.171000 0.000000 # 1 -190 1 1 10.757000 7.171000 0.000000 # 1 -191 1 1 11.952000 7.171000 0.000000 # 1 -192 16 2 13.148000 7.171000 0.000000 # 2 -193 1 1 14.343000 7.171000 0.000000 # 1 -194 1 1 15.538000 7.171000 0.000000 # 1 -195 1 1 16.733000 7.171000 0.000000 # 1 -196 1 1 17.927999 7.171000 0.000000 # 1 -197 1 1 19.124001 7.171000 0.000000 # 1 -198 1 1 20.319000 7.171000 0.000000 # 1 -199 1 1 21.514000 7.171000 0.000000 # 1 -200 1 1 22.709000 7.171000 0.000000 # 1 -201 109 2 23.905001 7.171000 0.000000 # 2 -202 1 1 25.100000 7.171000 0.000000 # 1 -203 1 1 26.295000 7.171000 0.000000 # 1 -204 1 1 27.490000 7.171000 0.000000 # 1 -205 133 2 28.684999 7.171000 0.000000 # 2 -206 1 1 29.881001 7.171000 0.000000 # 1 -207 1 1 31.076000 7.171000 0.000000 # 1 -208 1 1 32.271000 7.171000 0.000000 # 1 -209 1 1 33.466000 7.171000 0.000000 # 1 -210 1 1 34.661999 7.171000 0.000000 # 1 -211 1 1 0.000000 8.367000 0.000000 # 1 -212 1 1 1.195000 8.367000 0.000000 # 1 -213 1 1 2.390000 8.367000 0.000000 # 1 -214 1 1 3.586000 8.367000 0.000000 # 1 -215 1 1 4.781000 8.367000 0.000000 # 1 -216 1 1 5.976000 8.367000 0.000000 # 1 -217 1 1 7.171000 8.367000 0.000000 # 1 -218 1 1 8.367000 8.367000 0.000000 # 1 -219 1 1 9.562000 8.367000 0.000000 # 1 -220 1 1 10.757000 8.367000 0.000000 # 1 -221 1 1 11.952000 8.367000 0.000000 # 1 -222 1 1 13.148000 8.367000 0.000000 # 1 -223 1 1 14.343000 8.367000 0.000000 # 1 -224 1 1 15.538000 8.367000 0.000000 # 1 -225 1 1 16.733000 8.367000 0.000000 # 1 -226 1 1 17.927999 8.367000 0.000000 # 1 -227 1 1 19.124001 8.367000 0.000000 # 1 -228 1 1 20.319000 8.367000 0.000000 # 1 -229 1 1 21.514000 8.367000 0.000000 # 1 -230 98 2 22.709000 8.367000 0.000000 # 2 -231 1 1 23.905001 8.367000 0.000000 # 1 -232 13 2 25.100000 8.367000 0.000000 # 2 -233 72 2 26.295000 8.367000 0.000000 # 2 -234 1 1 27.490000 8.367000 0.000000 # 1 -235 1 1 28.684999 8.367000 0.000000 # 1 -236 1 1 29.881001 8.367000 0.000000 # 1 -237 1 1 31.076000 8.367000 0.000000 # 1 -238 7 2 32.271000 8.367000 0.000000 # 2 -239 1 1 33.466000 8.367000 0.000000 # 1 -240 35 2 34.661999 8.367000 0.000000 # 2 -241 1 1 0.000000 9.562000 0.000000 # 1 -242 1 1 1.195000 9.562000 0.000000 # 1 -243 1 1 2.390000 9.562000 0.000000 # 1 -244 1 1 3.586000 9.562000 0.000000 # 1 -245 147 2 4.781000 9.562000 0.000000 # 2 -246 1 1 5.976000 9.562000 0.000000 # 1 -247 91 2 7.171000 9.562000 0.000000 # 2 -248 1 1 8.367000 9.562000 0.000000 # 1 -249 1 1 9.562000 9.562000 0.000000 # 1 -250 1 1 10.757000 9.562000 0.000000 # 1 -251 1 1 11.952000 9.562000 0.000000 # 1 -252 1 1 13.148000 9.562000 0.000000 # 1 -253 1 1 14.343000 9.562000 0.000000 # 1 -254 1 1 15.538000 9.562000 0.000000 # 1 -255 1 1 16.733000 9.562000 0.000000 # 1 -256 1 1 17.927999 9.562000 0.000000 # 1 -257 62 2 19.124001 9.562000 0.000000 # 2 -258 1 1 20.319000 9.562000 0.000000 # 1 -259 1 1 21.514000 9.562000 0.000000 # 1 -260 1 1 22.709000 9.562000 0.000000 # 1 -261 1 1 23.905001 9.562000 0.000000 # 1 -262 65 2 25.100000 9.562000 0.000000 # 2 -263 1 1 26.295000 9.562000 0.000000 # 1 -264 1 1 27.490000 9.562000 0.000000 # 1 -265 1 1 28.684999 9.562000 0.000000 # 1 -266 1 1 29.881001 9.562000 0.000000 # 1 -267 1 1 31.076000 9.562000 0.000000 # 1 -268 1 1 32.271000 9.562000 0.000000 # 1 -269 1 1 33.466000 9.562000 0.000000 # 1 -270 1 1 34.661999 9.562000 0.000000 # 1 -271 1 1 0.000000 10.757000 0.000000 # 1 -272 1 1 1.195000 10.757000 0.000000 # 1 -273 1 1 2.390000 10.757000 0.000000 # 1 -274 1 1 3.586000 10.757000 0.000000 # 1 -275 69 2 4.781000 10.757000 0.000000 # 2 -276 1 1 5.976000 10.757000 0.000000 # 1 -277 1 1 7.171000 10.757000 0.000000 # 1 -278 1 1 8.367000 10.757000 0.000000 # 1 -279 1 1 9.562000 10.757000 0.000000 # 1 -280 1 1 10.757000 10.757000 0.000000 # 1 -281 1 1 11.952000 10.757000 0.000000 # 1 -282 1 1 13.148000 10.757000 0.000000 # 1 -283 1 1 14.343000 10.757000 0.000000 # 1 -284 110 2 15.538000 10.757000 0.000000 # 2 -285 1 1 16.733000 10.757000 0.000000 # 1 -286 1 1 17.927999 10.757000 0.000000 # 1 -287 1 1 19.124001 10.757000 0.000000 # 1 -288 1 1 20.319000 10.757000 0.000000 # 1 -289 1 1 21.514000 10.757000 0.000000 # 1 -290 1 1 22.709000 10.757000 0.000000 # 1 -291 1 1 23.905001 10.757000 0.000000 # 1 -292 1 1 25.100000 10.757000 0.000000 # 1 -293 1 1 26.295000 10.757000 0.000000 # 1 -294 74 2 27.490000 10.757000 0.000000 # 2 -295 1 1 28.684999 10.757000 0.000000 # 1 -296 1 1 29.881001 10.757000 0.000000 # 1 -297 1 1 31.076000 10.757000 0.000000 # 1 -298 1 1 32.271000 10.757000 0.000000 # 1 -299 1 1 33.466000 10.757000 0.000000 # 1 -300 1 1 34.661999 10.757000 0.000000 # 1 -301 1 1 0.000000 11.952000 0.000000 # 1 -302 1 1 1.195000 11.952000 0.000000 # 1 -303 1 1 2.390000 11.952000 0.000000 # 1 -304 1 1 3.586000 11.952000 0.000000 # 1 -305 1 1 4.781000 11.952000 0.000000 # 1 -306 135 2 5.976000 11.952000 0.000000 # 2 -307 1 1 7.171000 11.952000 0.000000 # 1 -308 1 1 8.367000 11.952000 0.000000 # 1 -309 58 2 9.562000 11.952000 0.000000 # 2 -310 102 2 10.757000 11.952000 0.000000 # 2 -311 121 2 11.952000 11.952000 0.000000 # 2 -312 1 1 13.148000 11.952000 0.000000 # 1 -313 1 1 14.343000 11.952000 0.000000 # 1 -314 1 1 15.538000 11.952000 0.000000 # 1 -315 1 1 16.733000 11.952000 0.000000 # 1 -316 1 1 17.927999 11.952000 0.000000 # 1 -317 33 2 19.124001 11.952000 0.000000 # 2 -318 1 1 20.319000 11.952000 0.000000 # 1 -319 1 1 21.514000 11.952000 0.000000 # 1 -320 1 1 22.709000 11.952000 0.000000 # 1 -321 1 1 23.905001 11.952000 0.000000 # 1 -322 1 1 25.100000 11.952000 0.000000 # 1 -323 1 1 26.295000 11.952000 0.000000 # 1 -324 1 1 27.490000 11.952000 0.000000 # 1 -325 1 1 28.684999 11.952000 0.000000 # 1 -326 1 1 29.881001 11.952000 0.000000 # 1 -327 1 1 31.076000 11.952000 0.000000 # 1 -328 43 2 32.271000 11.952000 0.000000 # 2 -329 1 1 33.466000 11.952000 0.000000 # 1 -330 1 1 34.661999 11.952000 0.000000 # 1 -331 1 1 0.000000 13.148000 0.000000 # 1 -332 11 2 1.195000 13.148000 0.000000 # 2 -333 55 2 2.390000 13.148000 0.000000 # 2 -334 1 1 3.586000 13.148000 0.000000 # 1 -335 1 1 4.781000 13.148000 0.000000 # 1 -336 1 1 5.976000 13.148000 0.000000 # 1 -337 1 1 7.171000 13.148000 0.000000 # 1 -338 1 1 8.367000 13.148000 0.000000 # 1 -339 21 2 9.562000 13.148000 0.000000 # 2 -340 1 1 10.757000 13.148000 0.000000 # 1 -341 1 1 11.952000 13.148000 0.000000 # 1 -342 1 1 13.148000 13.148000 0.000000 # 1 -343 12 2 14.343000 13.148000 0.000000 # 2 -344 1 1 15.538000 13.148000 0.000000 # 1 -345 1 1 16.733000 13.148000 0.000000 # 1 -346 1 1 17.927999 13.148000 0.000000 # 1 -347 1 1 19.124001 13.148000 0.000000 # 1 -348 1 1 20.319000 13.148000 0.000000 # 1 -349 18 2 21.514000 13.148000 0.000000 # 2 -350 1 1 22.709000 13.148000 0.000000 # 1 -351 1 1 23.905001 13.148000 0.000000 # 1 -352 1 1 25.100000 13.148000 0.000000 # 1 -353 1 1 26.295000 13.148000 0.000000 # 1 -354 1 1 27.490000 13.148000 0.000000 # 1 -355 1 1 28.684999 13.148000 0.000000 # 1 -356 1 1 29.881001 13.148000 0.000000 # 1 -357 1 1 31.076000 13.148000 0.000000 # 1 -358 1 1 32.271000 13.148000 0.000000 # 1 -359 1 1 33.466000 13.148000 0.000000 # 1 -360 1 1 34.661999 13.148000 0.000000 # 1 -361 1 1 0.000000 14.343000 0.000000 # 1 -362 1 1 1.195000 14.343000 0.000000 # 1 -363 9 2 2.390000 14.343000 0.000000 # 2 -364 1 1 3.586000 14.343000 0.000000 # 1 -365 1 1 4.781000 14.343000 0.000000 # 1 -366 1 1 5.976000 14.343000 0.000000 # 1 -367 1 1 7.171000 14.343000 0.000000 # 1 -368 1 1 8.367000 14.343000 0.000000 # 1 -369 1 1 9.562000 14.343000 0.000000 # 1 -370 1 1 10.757000 14.343000 0.000000 # 1 -371 107 2 11.952000 14.343000 0.000000 # 2 -372 1 1 13.148000 14.343000 0.000000 # 1 -373 1 1 14.343000 14.343000 0.000000 # 1 -374 1 1 15.538000 14.343000 0.000000 # 1 -375 1 1 16.733000 14.343000 0.000000 # 1 -376 103 2 17.927999 14.343000 0.000000 # 2 -377 1 1 19.124001 14.343000 0.000000 # 1 -378 82 2 20.319000 14.343000 0.000000 # 2 -379 10 2 21.514000 14.343000 0.000000 # 2 -380 1 1 22.709000 14.343000 0.000000 # 1 -381 1 1 23.905001 14.343000 0.000000 # 1 -382 1 1 25.100000 14.343000 0.000000 # 1 -383 1 1 26.295000 14.343000 0.000000 # 1 -384 1 1 27.490000 14.343000 0.000000 # 1 -385 1 1 28.684999 14.343000 0.000000 # 1 -386 1 1 29.881001 14.343000 0.000000 # 1 -387 1 1 31.076000 14.343000 0.000000 # 1 -388 1 1 32.271000 14.343000 0.000000 # 1 -389 1 1 33.466000 14.343000 0.000000 # 1 -390 1 1 34.661999 14.343000 0.000000 # 1 -391 1 1 0.000000 15.538000 0.000000 # 1 -392 1 1 1.195000 15.538000 0.000000 # 1 -393 1 1 2.390000 15.538000 0.000000 # 1 -394 1 1 3.586000 15.538000 0.000000 # 1 -395 1 1 4.781000 15.538000 0.000000 # 1 -396 1 1 5.976000 15.538000 0.000000 # 1 -397 1 1 7.171000 15.538000 0.000000 # 1 -398 1 1 8.367000 15.538000 0.000000 # 1 -399 71 2 9.562000 15.538000 0.000000 # 2 -400 1 1 10.757000 15.538000 0.000000 # 1 -401 1 1 11.952000 15.538000 0.000000 # 1 -402 1 1 13.148000 15.538000 0.000000 # 1 -403 1 1 14.343000 15.538000 0.000000 # 1 -404 1 1 15.538000 15.538000 0.000000 # 1 -405 1 1 16.733000 15.538000 0.000000 # 1 -406 1 1 17.927999 15.538000 0.000000 # 1 -407 1 1 19.124001 15.538000 0.000000 # 1 -408 1 1 20.319000 15.538000 0.000000 # 1 -409 1 1 21.514000 15.538000 0.000000 # 1 -410 1 1 22.709000 15.538000 0.000000 # 1 -411 1 1 23.905001 15.538000 0.000000 # 1 -412 1 1 25.100000 15.538000 0.000000 # 1 -413 94 2 26.295000 15.538000 0.000000 # 2 -414 1 1 27.490000 15.538000 0.000000 # 1 -415 1 1 28.684999 15.538000 0.000000 # 1 -416 28 2 29.881001 15.538000 0.000000 # 2 -417 1 1 31.076000 15.538000 0.000000 # 1 -418 61 2 32.271000 15.538000 0.000000 # 2 -419 108 2 33.466000 15.538000 0.000000 # 2 -420 112 2 34.661999 15.538000 0.000000 # 2 -421 1 1 0.000000 16.733000 0.000000 # 1 -422 1 1 1.195000 16.733000 0.000000 # 1 -423 1 1 2.390000 16.733000 0.000000 # 1 -424 1 1 3.586000 16.733000 0.000000 # 1 -425 1 1 4.781000 16.733000 0.000000 # 1 -426 1 1 5.976000 16.733000 0.000000 # 1 -427 134 2 7.171000 16.733000 0.000000 # 2 -428 1 1 8.367000 16.733000 0.000000 # 1 -429 1 1 9.562000 16.733000 0.000000 # 1 -430 1 1 10.757000 16.733000 0.000000 # 1 -431 66 2 11.952000 16.733000 0.000000 # 2 -432 1 1 13.148000 16.733000 0.000000 # 1 -433 1 1 14.343000 16.733000 0.000000 # 1 -434 1 1 15.538000 16.733000 0.000000 # 1 -435 1 1 16.733000 16.733000 0.000000 # 1 -436 1 1 17.927999 16.733000 0.000000 # 1 -437 81 2 19.124001 16.733000 0.000000 # 2 -438 1 1 20.319000 16.733000 0.000000 # 1 -439 1 1 21.514000 16.733000 0.000000 # 1 -440 1 1 22.709000 16.733000 0.000000 # 1 -441 1 1 23.905001 16.733000 0.000000 # 1 -442 1 1 25.100000 16.733000 0.000000 # 1 -443 52 2 26.295000 16.733000 0.000000 # 2 -444 1 1 27.490000 16.733000 0.000000 # 1 -445 1 1 28.684999 16.733000 0.000000 # 1 -446 1 1 29.881001 16.733000 0.000000 # 1 -447 45 2 31.076000 16.733000 0.000000 # 2 -448 1 1 32.271000 16.733000 0.000000 # 1 -449 1 1 33.466000 16.733000 0.000000 # 1 -450 138 2 34.661999 16.733000 0.000000 # 2 -451 1 1 0.000000 17.927999 0.000000 # 1 -452 87 2 1.195000 17.927999 0.000000 # 2 -453 1 1 2.390000 17.927999 0.000000 # 1 -454 1 1 3.586000 17.927999 0.000000 # 1 -455 113 2 4.781000 17.927999 0.000000 # 2 -456 1 1 5.976000 17.927999 0.000000 # 1 -457 1 1 7.171000 17.927999 0.000000 # 1 -458 1 1 8.367000 17.927999 0.000000 # 1 -459 1 1 9.562000 17.927999 0.000000 # 1 -460 3 2 10.757000 17.927999 0.000000 # 2 -461 1 1 11.952000 17.927999 0.000000 # 1 -462 1 1 13.148000 17.927999 0.000000 # 1 -463 1 1 14.343000 17.927999 0.000000 # 1 -464 148 2 15.538000 17.927999 0.000000 # 2 -465 1 1 16.733000 17.927999 0.000000 # 1 -466 1 1 17.927999 17.927999 0.000000 # 1 -467 15 2 19.124001 17.927999 0.000000 # 2 -468 1 1 20.319000 17.927999 0.000000 # 1 -469 1 1 21.514000 17.927999 0.000000 # 1 -470 143 2 22.709000 17.927999 0.000000 # 2 -471 1 1 23.905001 17.927999 0.000000 # 1 -472 1 1 25.100000 17.927999 0.000000 # 1 -473 1 1 26.295000 17.927999 0.000000 # 1 -474 1 1 27.490000 17.927999 0.000000 # 1 -475 85 2 28.684999 17.927999 0.000000 # 2 -476 1 1 29.881001 17.927999 0.000000 # 1 -477 1 1 31.076000 17.927999 0.000000 # 1 -478 1 1 32.271000 17.927999 0.000000 # 1 -479 1 1 33.466000 17.927999 0.000000 # 1 -480 27 2 34.661999 17.927999 0.000000 # 2 -481 1 1 0.000000 19.124001 0.000000 # 1 -482 1 1 1.195000 19.124001 0.000000 # 1 -483 57 2 2.390000 19.124001 0.000000 # 2 -484 1 1 3.586000 19.124001 0.000000 # 1 -485 1 1 4.781000 19.124001 0.000000 # 1 -486 1 1 5.976000 19.124001 0.000000 # 1 -487 22 2 7.171000 19.124001 0.000000 # 2 -488 1 1 8.367000 19.124001 0.000000 # 1 -489 1 1 9.562000 19.124001 0.000000 # 1 -490 1 1 10.757000 19.124001 0.000000 # 1 -491 1 1 11.952000 19.124001 0.000000 # 1 -492 1 1 13.148000 19.124001 0.000000 # 1 -493 59 2 14.343000 19.124001 0.000000 # 2 -494 1 1 15.538000 19.124001 0.000000 # 1 -495 1 1 16.733000 19.124001 0.000000 # 1 -496 1 1 17.927999 19.124001 0.000000 # 1 -497 1 1 19.124001 19.124001 0.000000 # 1 -498 1 1 20.319000 19.124001 0.000000 # 1 -499 1 1 21.514000 19.124001 0.000000 # 1 -500 1 1 22.709000 19.124001 0.000000 # 1 -501 1 1 23.905001 19.124001 0.000000 # 1 -502 1 1 25.100000 19.124001 0.000000 # 1 -503 1 1 26.295000 19.124001 0.000000 # 1 -504 1 1 27.490000 19.124001 0.000000 # 1 -505 1 1 28.684999 19.124001 0.000000 # 1 -506 1 1 29.881001 19.124001 0.000000 # 1 -507 1 1 31.076000 19.124001 0.000000 # 1 -508 1 1 32.271000 19.124001 0.000000 # 1 -509 1 1 33.466000 19.124001 0.000000 # 1 -510 124 2 34.661999 19.124001 0.000000 # 2 -511 1 1 0.000000 20.319000 0.000000 # 1 -512 1 1 1.195000 20.319000 0.000000 # 1 -513 1 1 2.390000 20.319000 0.000000 # 1 -514 1 1 3.586000 20.319000 0.000000 # 1 -515 1 1 4.781000 20.319000 0.000000 # 1 -516 1 1 5.976000 20.319000 0.000000 # 1 -517 1 1 7.171000 20.319000 0.000000 # 1 -518 1 1 8.367000 20.319000 0.000000 # 1 -519 119 2 9.562000 20.319000 0.000000 # 2 -520 37 2 10.757000 20.319000 0.000000 # 2 -521 77 2 11.952000 20.319000 0.000000 # 2 -522 1 1 13.148000 20.319000 0.000000 # 1 -523 1 1 14.343000 20.319000 0.000000 # 1 -524 23 2 15.538000 20.319000 0.000000 # 2 -525 1 1 16.733000 20.319000 0.000000 # 1 -526 128 2 17.927999 20.319000 0.000000 # 2 -527 1 1 19.124001 20.319000 0.000000 # 1 -528 1 1 20.319000 20.319000 0.000000 # 1 -529 1 1 21.514000 20.319000 0.000000 # 1 -530 1 1 22.709000 20.319000 0.000000 # 1 -531 63 2 23.905001 20.319000 0.000000 # 2 -532 1 1 25.100000 20.319000 0.000000 # 1 -533 1 1 26.295000 20.319000 0.000000 # 1 -534 1 1 27.490000 20.319000 0.000000 # 1 -535 1 1 28.684999 20.319000 0.000000 # 1 -536 5 2 29.881001 20.319000 0.000000 # 2 -537 1 1 31.076000 20.319000 0.000000 # 1 -538 1 1 32.271000 20.319000 0.000000 # 1 -539 1 1 33.466000 20.319000 0.000000 # 1 -540 1 1 34.661999 20.319000 0.000000 # 1 -541 1 1 0.000000 21.514000 0.000000 # 1 -542 1 1 1.195000 21.514000 0.000000 # 1 -543 1 1 2.390000 21.514000 0.000000 # 1 -544 1 1 3.586000 21.514000 0.000000 # 1 -545 1 1 4.781000 21.514000 0.000000 # 1 -546 1 1 5.976000 21.514000 0.000000 # 1 -547 1 1 7.171000 21.514000 0.000000 # 1 -548 1 1 8.367000 21.514000 0.000000 # 1 -549 1 1 9.562000 21.514000 0.000000 # 1 -550 1 1 10.757000 21.514000 0.000000 # 1 -551 1 1 11.952000 21.514000 0.000000 # 1 -552 1 1 13.148000 21.514000 0.000000 # 1 -553 100 2 14.343000 21.514000 0.000000 # 2 -554 1 1 15.538000 21.514000 0.000000 # 1 -555 1 1 16.733000 21.514000 0.000000 # 1 -556 1 1 17.927999 21.514000 0.000000 # 1 -557 1 1 19.124001 21.514000 0.000000 # 1 -558 1 1 20.319000 21.514000 0.000000 # 1 -559 1 1 21.514000 21.514000 0.000000 # 1 -560 2 2 22.709000 21.514000 0.000000 # 2 -561 131 2 23.905001 21.514000 0.000000 # 2 -562 1 1 25.100000 21.514000 0.000000 # 1 -563 1 1 26.295000 21.514000 0.000000 # 1 -564 1 1 27.490000 21.514000 0.000000 # 1 -565 80 2 28.684999 21.514000 0.000000 # 2 -566 1 1 29.881001 21.514000 0.000000 # 1 -567 1 1 31.076000 21.514000 0.000000 # 1 -568 1 1 32.271000 21.514000 0.000000 # 1 -569 1 1 33.466000 21.514000 0.000000 # 1 -570 1 1 34.661999 21.514000 0.000000 # 1 -571 1 1 0.000000 22.709000 0.000000 # 1 -572 1 1 1.195000 22.709000 0.000000 # 1 -573 1 1 2.390000 22.709000 0.000000 # 1 -574 1 1 3.586000 22.709000 0.000000 # 1 -575 1 1 4.781000 22.709000 0.000000 # 1 -576 1 1 5.976000 22.709000 0.000000 # 1 -577 1 1 7.171000 22.709000 0.000000 # 1 -578 1 1 8.367000 22.709000 0.000000 # 1 -579 1 1 9.562000 22.709000 0.000000 # 1 -580 1 1 10.757000 22.709000 0.000000 # 1 -581 1 1 11.952000 22.709000 0.000000 # 1 -582 1 1 13.148000 22.709000 0.000000 # 1 -583 1 1 14.343000 22.709000 0.000000 # 1 -584 1 1 15.538000 22.709000 0.000000 # 1 -585 1 1 16.733000 22.709000 0.000000 # 1 -586 1 1 17.927999 22.709000 0.000000 # 1 -587 101 2 19.124001 22.709000 0.000000 # 2 -588 1 1 20.319000 22.709000 0.000000 # 1 -589 1 1 21.514000 22.709000 0.000000 # 1 -590 1 1 22.709000 22.709000 0.000000 # 1 -591 1 1 23.905001 22.709000 0.000000 # 1 -592 1 1 25.100000 22.709000 0.000000 # 1 -593 127 2 26.295000 22.709000 0.000000 # 2 -594 1 1 27.490000 22.709000 0.000000 # 1 -595 1 1 28.684999 22.709000 0.000000 # 1 -596 1 1 29.881001 22.709000 0.000000 # 1 -597 1 1 31.076000 22.709000 0.000000 # 1 -598 1 1 32.271000 22.709000 0.000000 # 1 -599 1 1 33.466000 22.709000 0.000000 # 1 -600 1 1 34.661999 22.709000 0.000000 # 1 -601 1 1 0.000000 23.905001 0.000000 # 1 -602 1 1 1.195000 23.905001 0.000000 # 1 -603 1 1 2.390000 23.905001 0.000000 # 1 -604 38 2 3.586000 23.905001 0.000000 # 2 -605 1 1 4.781000 23.905001 0.000000 # 1 -606 141 2 5.976000 23.905001 0.000000 # 2 -607 1 1 7.171000 23.905001 0.000000 # 1 -608 1 1 8.367000 23.905001 0.000000 # 1 -609 1 1 9.562000 23.905001 0.000000 # 1 -610 1 1 10.757000 23.905001 0.000000 # 1 -611 1 1 11.952000 23.905001 0.000000 # 1 -612 1 1 13.148000 23.905001 0.000000 # 1 -613 1 1 14.343000 23.905001 0.000000 # 1 -614 1 1 15.538000 23.905001 0.000000 # 1 -615 1 1 16.733000 23.905001 0.000000 # 1 -616 1 1 17.927999 23.905001 0.000000 # 1 -617 1 1 19.124001 23.905001 0.000000 # 1 -618 1 1 20.319000 23.905001 0.000000 # 1 -619 1 1 21.514000 23.905001 0.000000 # 1 -620 1 1 22.709000 23.905001 0.000000 # 1 -621 1 1 23.905001 23.905001 0.000000 # 1 -622 1 1 25.100000 23.905001 0.000000 # 1 -623 1 1 26.295000 23.905001 0.000000 # 1 -624 1 1 27.490000 23.905001 0.000000 # 1 -625 1 1 28.684999 23.905001 0.000000 # 1 -626 142 2 29.881001 23.905001 0.000000 # 2 -627 1 1 31.076000 23.905001 0.000000 # 1 -628 1 1 32.271000 23.905001 0.000000 # 1 -629 1 1 33.466000 23.905001 0.000000 # 1 -630 1 1 34.661999 23.905001 0.000000 # 1 -631 149 2 35.856861 25.100000 0.000000 # 2 -632 1 1 1.195000 25.100000 0.000000 # 1 -633 1 1 2.390000 25.100000 0.000000 # 1 -634 1 1 3.586000 25.100000 0.000000 # 1 -635 1 1 4.781000 25.100000 0.000000 # 1 -636 1 1 5.976000 25.100000 0.000000 # 1 -637 1 1 7.171000 25.100000 0.000000 # 1 -638 1 1 8.367000 25.100000 0.000000 # 1 -639 40 2 9.562000 25.100000 0.000000 # 2 -640 1 1 10.757000 25.100000 0.000000 # 1 -641 1 1 11.952000 25.100000 0.000000 # 1 -642 1 1 13.148000 25.100000 0.000000 # 1 -643 70 2 14.343000 25.100000 0.000000 # 2 -644 1 1 15.538000 25.100000 0.000000 # 1 -645 1 1 16.733000 25.100000 0.000000 # 1 -646 144 2 17.927999 25.100000 0.000000 # 2 -647 99 2 19.124001 25.100000 0.000000 # 2 -648 1 1 20.319000 25.100000 0.000000 # 1 -649 32 2 21.514000 25.100000 0.000000 # 2 -650 139 2 22.709000 25.100000 0.000000 # 2 -651 1 1 23.905001 25.100000 0.000000 # 1 -652 1 1 25.100000 25.100000 0.000000 # 1 -653 1 1 26.295000 25.100000 0.000000 # 1 -654 1 1 27.490000 25.100000 0.000000 # 1 -655 1 1 28.684999 25.100000 0.000000 # 1 -656 1 1 29.881001 25.100000 0.000000 # 1 -657 1 1 31.076000 25.100000 0.000000 # 1 -658 1 1 32.271000 25.100000 0.000000 # 1 -659 1 1 33.466000 25.100000 0.000000 # 1 -660 1 1 34.661999 25.100000 0.000000 # 1 -661 1 1 0.000000 26.295000 0.000000 # 1 -662 1 1 1.195000 26.295000 0.000000 # 1 -663 1 1 2.390000 26.295000 0.000000 # 1 -664 1 1 3.586000 26.295000 0.000000 # 1 -665 1 1 4.781000 26.295000 0.000000 # 1 -666 1 1 5.976000 26.295000 0.000000 # 1 -667 1 1 7.171000 26.295000 0.000000 # 1 -668 1 1 8.367000 26.295000 0.000000 # 1 -669 1 1 9.562000 26.295000 0.000000 # 1 -670 125 2 10.757000 26.295000 0.000000 # 2 -671 1 1 11.952000 26.295000 0.000000 # 1 -672 1 1 13.148000 26.295000 0.000000 # 1 -673 1 1 14.343000 26.295000 0.000000 # 1 -674 1 1 15.538000 26.295000 0.000000 # 1 -675 1 1 16.733000 26.295000 0.000000 # 1 -676 1 1 17.927999 26.295000 0.000000 # 1 -677 1 1 19.124001 26.295000 0.000000 # 1 -678 1 1 20.319000 26.295000 0.000000 # 1 -679 17 2 21.514000 26.295000 0.000000 # 2 -680 1 1 22.709000 26.295000 0.000000 # 1 -681 1 1 23.905001 26.295000 0.000000 # 1 -682 1 1 25.100000 26.295000 0.000000 # 1 -683 1 1 26.295000 26.295000 0.000000 # 1 -684 1 1 27.490000 26.295000 0.000000 # 1 -685 1 1 28.684999 26.295000 0.000000 # 1 -686 1 1 29.881001 26.295000 0.000000 # 1 -687 1 1 31.076000 26.295000 0.000000 # 1 -688 1 1 32.271000 26.295000 0.000000 # 1 -689 1 1 33.466000 26.295000 0.000000 # 1 -690 1 1 34.661999 26.295000 0.000000 # 1 -691 1 1 0.000000 27.490000 0.000000 # 1 -692 1 1 1.195000 27.490000 0.000000 # 1 -693 1 1 2.390000 27.490000 0.000000 # 1 -694 1 1 3.586000 27.490000 0.000000 # 1 -695 1 1 4.781000 27.490000 0.000000 # 1 -696 1 1 5.976000 27.490000 0.000000 # 1 -697 1 1 7.171000 27.490000 0.000000 # 1 -698 1 1 8.367000 27.490000 0.000000 # 1 -699 1 1 9.562000 27.490000 0.000000 # 1 -700 1 1 10.757000 27.490000 0.000000 # 1 -701 1 1 11.952000 27.490000 0.000000 # 1 -702 1 1 13.148000 27.490000 0.000000 # 1 -703 67 2 14.343000 27.490000 0.000000 # 2 -704 1 1 15.538000 27.490000 0.000000 # 1 -705 1 1 16.733000 27.490000 0.000000 # 1 -706 1 1 17.927999 27.490000 0.000000 # 1 -707 1 1 19.124001 27.490000 0.000000 # 1 -708 136 2 20.319000 27.490000 0.000000 # 2 -709 1 1 21.514000 27.490000 0.000000 # 1 -710 1 1 22.709000 27.490000 0.000000 # 1 -711 1 1 23.905001 27.490000 0.000000 # 1 -712 1 1 25.100000 27.490000 0.000000 # 1 -713 1 1 26.295000 27.490000 0.000000 # 1 -714 106 2 27.490000 27.490000 0.000000 # 2 -715 1 1 28.684999 27.490000 0.000000 # 1 -716 1 1 29.881001 27.490000 0.000000 # 1 -717 1 1 31.076000 27.490000 0.000000 # 1 -718 1 1 32.271000 27.490000 0.000000 # 1 -719 1 1 33.466000 27.490000 0.000000 # 1 -720 1 1 34.661999 27.490000 0.000000 # 1 -721 96 2 0.000000 28.684999 0.000000 # 2 -722 1 1 1.195000 28.684999 0.000000 # 1 -723 116 2 2.390000 28.684999 0.000000 # 2 -724 1 1 3.586000 28.684999 0.000000 # 1 -725 1 1 4.781000 28.684999 0.000000 # 1 -726 79 2 5.976000 28.684999 0.000000 # 2 -727 1 1 7.171000 28.684999 0.000000 # 1 -728 1 1 8.367000 28.684999 0.000000 # 1 -729 1 1 9.562000 28.684999 0.000000 # 1 -730 1 1 10.757000 28.684999 0.000000 # 1 -731 1 1 11.952000 28.684999 0.000000 # 1 -732 97 2 13.148000 28.684999 0.000000 # 2 -733 1 1 14.343000 28.684999 0.000000 # 1 -734 1 1 15.538000 28.684999 0.000000 # 1 -735 1 1 16.733000 28.684999 0.000000 # 1 -736 83 2 17.927999 28.684999 0.000000 # 2 -737 1 1 19.124001 28.684999 0.000000 # 1 -738 1 1 20.319000 28.684999 0.000000 # 1 -739 1 1 21.514000 28.684999 0.000000 # 1 -740 1 1 22.709000 28.684999 0.000000 # 1 -741 1 1 23.905001 28.684999 0.000000 # 1 -742 1 1 25.100000 28.684999 0.000000 # 1 -743 1 1 26.295000 28.684999 0.000000 # 1 -744 1 1 27.490000 28.684999 0.000000 # 1 -745 1 1 28.684999 28.684999 0.000000 # 1 -746 1 1 29.881001 28.684999 0.000000 # 1 -747 1 1 31.076000 28.684999 0.000000 # 1 -748 1 1 32.271000 28.684999 0.000000 # 1 -749 1 1 33.466000 28.684999 0.000000 # 1 -750 1 1 34.661999 28.684999 0.000000 # 1 -751 1 1 0.000000 29.881001 0.000000 # 1 -752 1 1 1.195000 29.881001 0.000000 # 1 -753 1 1 2.390000 29.881001 0.000000 # 1 -754 1 1 3.586000 29.881001 0.000000 # 1 -755 1 1 4.781000 29.881001 0.000000 # 1 -756 73 2 5.976000 29.881001 0.000000 # 2 -757 1 1 7.171000 29.881001 0.000000 # 1 -758 1 1 8.367000 29.881001 0.000000 # 1 -759 1 1 9.562000 29.881001 0.000000 # 1 -760 1 1 10.757000 29.881001 0.000000 # 1 -761 1 1 11.952000 29.881001 0.000000 # 1 -762 64 2 13.148000 29.881001 0.000000 # 2 -763 1 1 14.343000 29.881001 0.000000 # 1 -764 1 1 15.538000 29.881001 0.000000 # 1 -765 1 1 16.733000 29.881001 0.000000 # 1 -766 1 1 17.927999 29.881001 0.000000 # 1 -767 1 1 19.124001 29.881001 0.000000 # 1 -768 1 1 20.319000 29.881001 0.000000 # 1 -769 14 2 21.514000 29.881001 0.000000 # 2 -770 6 2 22.709000 29.881001 0.000000 # 2 -771 1 1 23.905001 29.881001 0.000000 # 1 -772 89 2 25.100000 29.881001 0.000000 # 2 -773 1 1 26.295000 29.881001 0.000000 # 1 -774 30 2 27.490000 29.881001 0.000000 # 2 -775 1 1 28.684999 29.881001 0.000000 # 1 -776 1 1 29.881001 29.881001 0.000000 # 1 -777 1 1 31.076000 29.881001 0.000000 # 1 -778 1 1 32.271000 29.881001 0.000000 # 1 -779 1 1 33.466000 29.881001 0.000000 # 1 -780 1 1 34.661999 29.881001 0.000000 # 1 -781 1 1 0.000000 31.076000 0.000000 # 1 -782 1 1 1.195000 31.076000 0.000000 # 1 -783 150 2 2.390000 31.076000 0.000000 # 2 -784 1 1 3.586000 31.076000 0.000000 # 1 -785 47 2 4.781000 31.076000 0.000000 # 2 -786 1 1 5.976000 31.076000 0.000000 # 1 -787 1 1 7.171000 31.076000 0.000000 # 1 -788 1 1 8.367000 31.076000 0.000000 # 1 -789 1 1 9.562000 31.076000 0.000000 # 1 -790 1 1 10.757000 31.076000 0.000000 # 1 -791 1 1 11.952000 31.076000 0.000000 # 1 -792 1 1 13.148000 31.076000 0.000000 # 1 -793 1 1 14.343000 31.076000 0.000000 # 1 -794 1 1 15.538000 31.076000 0.000000 # 1 -795 1 1 16.733000 31.076000 0.000000 # 1 -796 1 1 17.927999 31.076000 0.000000 # 1 -797 1 1 19.124001 31.076000 0.000000 # 1 -798 1 1 20.319000 31.076000 0.000000 # 1 -799 1 1 21.514000 31.076000 0.000000 # 1 -800 1 1 22.709000 31.076000 0.000000 # 1 -801 1 1 23.905001 31.076000 0.000000 # 1 -802 1 1 25.100000 31.076000 0.000000 # 1 -803 1 1 26.295000 31.076000 0.000000 # 1 -804 1 1 27.490000 31.076000 0.000000 # 1 -805 1 1 28.684999 31.076000 0.000000 # 1 -806 1 1 29.881001 31.076000 0.000000 # 1 -807 1 1 31.076000 31.076000 0.000000 # 1 -808 1 1 32.271000 31.076000 0.000000 # 1 -809 1 1 33.466000 31.076000 0.000000 # 1 -810 1 1 34.661999 31.076000 0.000000 # 1 -811 1 1 0.000000 32.271000 0.000000 # 1 -812 1 1 1.195000 32.271000 0.000000 # 1 -813 93 2 2.390000 32.271000 0.000000 # 2 -814 1 1 3.586000 32.271000 0.000000 # 1 -815 1 1 4.781000 32.271000 0.000000 # 1 -816 1 1 5.976000 32.271000 0.000000 # 1 -817 1 1 7.171000 32.271000 0.000000 # 1 -818 1 1 8.367000 32.271000 0.000000 # 1 -819 92 2 9.562000 32.271000 0.000000 # 2 -820 1 1 10.757000 32.271000 0.000000 # 1 -821 1 1 11.952000 32.271000 0.000000 # 1 -822 1 1 13.148000 32.271000 0.000000 # 1 -823 1 1 14.343000 32.271000 0.000000 # 1 -824 1 1 15.538000 32.271000 0.000000 # 1 -825 1 1 16.733000 32.271000 0.000000 # 1 -826 8 2 17.927999 32.271000 0.000000 # 2 -827 1 1 19.124001 32.271000 0.000000 # 1 -828 1 1 20.319000 32.271000 0.000000 # 1 -829 1 1 21.514000 32.271000 0.000000 # 1 -830 1 1 22.709000 32.271000 0.000000 # 1 -831 84 2 23.905001 32.271000 0.000000 # 2 -832 1 1 25.100000 32.271000 0.000000 # 1 -833 1 1 26.295000 32.271000 0.000000 # 1 -834 88 2 27.490000 32.271000 0.000000 # 2 -835 1 1 28.684999 32.271000 0.000000 # 1 -836 1 1 29.881001 32.271000 0.000000 # 1 -837 1 1 31.076000 32.271000 0.000000 # 1 -838 1 1 32.271000 32.271000 0.000000 # 1 -839 1 1 33.466000 32.271000 0.000000 # 1 -840 1 1 34.661999 32.271000 0.000000 # 1 -841 26 2 0.000000 33.466000 0.000000 # 2 -842 151 2 1.195000 33.466000 0.000000 # 2 -843 1 1 2.390000 33.466000 0.000000 # 1 -844 1 1 3.586000 33.466000 0.000000 # 1 -845 1 1 4.781000 33.466000 0.000000 # 1 -846 20 2 5.976000 33.466000 0.000000 # 2 -847 1 1 7.171000 33.466000 0.000000 # 1 -848 1 1 8.367000 33.466000 0.000000 # 1 -849 1 1 9.562000 33.466000 0.000000 # 1 -850 1 1 10.757000 33.466000 0.000000 # 1 -851 1 1 11.952000 33.466000 0.000000 # 1 -852 1 1 13.148000 33.466000 0.000000 # 1 -853 1 1 14.343000 33.466000 0.000000 # 1 -854 78 2 15.538000 33.466000 0.000000 # 2 -855 126 2 16.733000 33.466000 0.000000 # 2 -856 1 1 17.927999 33.466000 0.000000 # 1 -857 1 1 19.124001 33.466000 0.000000 # 1 -858 1 1 20.319000 33.466000 0.000000 # 1 -859 104 2 21.514000 33.466000 0.000000 # 2 -860 29 2 22.709000 33.466000 0.000000 # 2 -861 1 1 23.905001 33.466000 0.000000 # 1 -862 1 1 25.100000 33.466000 0.000000 # 1 -863 1 1 26.295000 33.466000 0.000000 # 1 -864 1 1 27.490000 33.466000 0.000000 # 1 -865 1 1 28.684999 33.466000 0.000000 # 1 -866 1 1 29.881001 33.466000 0.000000 # 1 -867 145 2 31.076000 33.466000 0.000000 # 2 -868 86 2 32.271000 33.466000 0.000000 # 2 -869 44 2 33.466000 33.466000 0.000000 # 2 -870 1 1 34.661999 33.466000 0.000000 # 1 -871 1 1 0.000000 34.661999 0.000000 # 1 -872 1 1 1.195000 34.661999 0.000000 # 1 -873 1 1 2.390000 34.661999 0.000000 # 1 -874 1 1 3.586000 34.661999 0.000000 # 1 -875 1 1 4.781000 34.661999 0.000000 # 1 -876 60 2 5.976000 34.661999 0.000000 # 2 -877 1 1 7.171000 34.661999 0.000000 # 1 -878 123 2 8.367000 34.661999 0.000000 # 2 -879 1 1 9.562000 34.661999 0.000000 # 1 -880 19 2 10.757000 34.661999 0.000000 # 2 -881 46 2 11.952000 34.661999 0.000000 # 2 -882 1 1 13.148000 34.661999 0.000000 # 1 -883 1 1 14.343000 34.661999 0.000000 # 1 -884 1 1 15.538000 34.661999 0.000000 # 1 -885 1 1 16.733000 34.661999 0.000000 # 1 -886 1 1 17.927999 34.661999 0.000000 # 1 -887 1 1 19.124001 34.661999 0.000000 # 1 -888 1 1 20.319000 34.661999 0.000000 # 1 -889 1 1 21.514000 34.661999 0.000000 # 1 -890 1 1 22.709000 34.661999 0.000000 # 1 -891 1 1 23.905001 34.661999 0.000000 # 1 -892 1 1 25.100000 34.661999 0.000000 # 1 -893 1 1 26.295000 34.661999 0.000000 # 1 -894 56 2 27.490000 34.661999 0.000000 # 2 -895 1 1 28.684999 34.661999 0.000000 # 1 -896 1 1 29.881001 34.661999 0.000000 # 1 -897 24 2 31.076000 34.661999 0.000000 # 2 -898 1 1 32.271000 34.661999 0.000000 # 1 -899 1 1 33.466000 34.661999 0.000000 # 1 -900 51 2 34.661999 34.661999 0.000000 # 2 -901 2 3 23.445999 21.656000 0.000000 # 3 -902 2 4 24.181999 21.798000 0.000000 # 4 -903 3 3 10.203000 17.423000 0.000000 # 3 -904 3 4 9.649000 16.917999 0.000000 # 4 -905 4 3 8.904000 4.421000 0.000000 # 3 -906 4 4 8.245000 4.062000 0.000000 # 4 -907 5 3 30.011999 21.056999 0.000000 # 3 -908 5 4 30.143999 21.796000 0.000000 # 4 -909 6 3 21.972000 29.746000 0.000000 # 3 -910 6 4 21.233999 29.611000 0.000000 # 4 -911 7 3 32.971001 8.637000 0.000000 # 3 -912 7 4 33.669998 8.907000 0.000000 # 4 -913 8 3 18.650999 32.471001 0.000000 # 3 -914 8 4 19.374001 32.671001 0.000000 # 4 -915 9 3 2.971000 14.818000 0.000000 # 3 -916 9 4 3.551000 15.293000 0.000000 # 4 -917 10 3 20.785000 14.519000 0.000000 # 3 -918 10 4 20.056000 14.695000 0.000000 # 4 -919 11 3 1.764000 12.658000 0.000000 # 3 -920 11 4 2.332000 12.169000 0.000000 # 4 -921 12 3 14.987000 12.763000 0.000000 # 3 -922 12 4 15.630000 12.378000 0.000000 # 4 -923 13 3 24.552000 8.879000 0.000000 # 3 -924 13 4 24.004000 9.391000 0.000000 # 4 -925 14 3 20.962999 29.372000 0.000000 # 3 -926 14 4 20.412001 28.864000 0.000000 # 4 -927 15 3 19.031000 18.673000 0.000000 # 3 -928 15 4 18.938999 19.417000 0.000000 # 4 -929 16 3 12.725000 6.552000 0.000000 # 3 -930 16 4 12.302000 5.933000 0.000000 # 4 -931 17 3 21.105000 25.667000 0.000000 # 3 -932 17 4 20.695000 25.038000 0.000000 # 4 -933 18 3 22.261999 13.198000 0.000000 # 3 -934 18 4 23.011000 13.249000 0.000000 # 4 -935 19 3 11.459000 34.398998 0.000000 # 3 -936 19 4 12.162000 34.136002 0.000000 # 4 -937 20 3 5.247000 33.289001 0.000000 # 3 -938 20 4 4.519000 33.112000 0.000000 # 4 -939 21 3 9.628000 12.400000 0.000000 # 3 -940 21 4 9.694000 11.653000 0.000000 # 4 -941 22 3 7.454000 19.819000 0.000000 # 3 -942 22 4 7.736000 20.513000 0.000000 # 4 -943 23 3 16.281000 20.219000 0.000000 # 3 -944 23 4 17.025000 20.118999 0.000000 # 4 -945 24 3 30.370001 34.916000 0.000000 # 3 -946 24 4 29.665001 35.169998 0.000000 # 4 -947 25 3 5.151000 1.738000 0.000000 # 3 -948 25 4 5.521000 1.086000 0.000000 # 4 -949 26 3 0.677000 33.143002 0.000000 # 3 -950 26 4 1.353000 32.819000 0.000000 # 4 -951 27 3 35.070999 18.556999 0.000000 # 3 -952 27 4 35.480000 19.186001 0.000000 # 4 -953 28 3 29.131001 15.504000 0.000000 # 3 -954 28 4 28.382000 15.470000 0.000000 # 4 -955 29 3 23.455999 33.395000 0.000000 # 3 -956 29 4 24.202000 33.323002 0.000000 # 4 -957 30 3 27.681999 29.156000 0.000000 # 3 -958 30 4 27.872999 28.430000 0.000000 # 4 -959 31 3 8.964000 5.523000 0.000000 # 3 -960 31 4 8.366000 5.071000 0.000000 # 4 -961 32 3 20.874001 24.709999 0.000000 # 3 -962 32 4 20.233000 24.320000 0.000000 # 4 -963 33 3 18.691999 11.339000 0.000000 # 3 -964 33 4 18.260000 10.726000 0.000000 # 4 -965 34 3 29.827999 6.724000 0.000000 # 3 -966 34 4 29.775999 7.472000 0.000000 # 4 -967 35 3 34.865002 9.089000 0.000000 # 3 -968 35 4 35.068001 9.811000 0.000000 # 4 -969 36 3 13.797000 0.821000 0.000000 # 3 -970 36 4 14.447000 0.446000 0.000000 # 4 -971 37 3 11.184000 20.934999 0.000000 # 3 -972 37 4 11.611000 21.552000 0.000000 # 4 -973 38 3 3.927000 23.237000 0.000000 # 3 -974 38 4 4.268000 22.569000 0.000000 # 4 -975 39 3 4.589000 5.506000 0.000000 # 3 -976 39 4 4.396000 6.231000 0.000000 # 4 -977 40 3 10.244000 24.788000 0.000000 # 3 -978 40 4 10.926000 24.476999 0.000000 # 4 -979 41 3 26.754999 5.384000 0.000000 # 3 -980 41 4 27.215000 4.792000 0.000000 # 4 -981 42 3 12.578000 4.368000 0.000000 # 3 -982 42 4 13.204000 3.955000 0.000000 # 4 -983 43 3 32.759998 12.521000 0.000000 # 3 -984 43 4 33.250000 13.089000 0.000000 # 4 -985 44 3 33.337002 34.205002 0.000000 # 3 -986 44 4 33.208000 34.944000 0.000000 # 4 -987 45 3 30.490000 17.201000 0.000000 # 3 -988 45 4 29.903000 17.669001 0.000000 # 4 -989 46 3 11.350000 34.215000 0.000000 # 3 -990 46 4 10.747000 33.768002 0.000000 # 4 -991 47 3 4.207000 31.559000 0.000000 # 3 -992 47 4 3.633000 32.042000 0.000000 # 4 -993 48 3 29.131001 2.378000 0.000000 # 3 -994 48 4 28.381001 2.365000 0.000000 # 4 -995 49 3 6.841000 5.303000 0.000000 # 3 -996 49 4 6.510000 4.630000 0.000000 # 4 -997 50 3 30.612000 3.421000 0.000000 # 3 -998 50 4 31.344000 3.255000 0.000000 # 4 -999 51 3 33.917999 34.761002 0.000000 # 3 -1000 51 4 33.174999 34.860001 0.000000 # 4 -1001 52 3 25.725000 17.219999 0.000000 # 3 -1002 52 4 25.153999 17.707001 0.000000 # 4 -1003 53 3 12.684000 0.590000 0.000000 # 3 -1004 53 4 12.220000 1.179000 0.000000 # 4 -1005 54 3 35.272999 6.447000 0.000000 # 3 -1006 54 4 34.689999 6.918000 0.000000 # 4 -1007 55 3 2.829000 13.756000 0.000000 # 3 -1008 55 4 3.268000 14.364000 0.000000 # 4 -1009 56 3 26.740000 34.672001 0.000000 # 3 -1010 56 4 25.990000 34.681999 0.000000 # 4 -1011 57 3 2.771000 18.476999 0.000000 # 3 -1012 57 4 3.151000 17.830999 0.000000 # 4 -1013 58 3 9.635000 12.699000 0.000000 # 3 -1014 58 4 9.708000 13.445000 0.000000 # 4 -1015 59 3 13.791000 19.631001 0.000000 # 3 -1016 59 4 13.239000 20.139000 0.000000 # 4 -1017 60 3 5.234000 34.554001 0.000000 # 3 -1018 60 4 4.492000 34.446999 0.000000 # 4 -1019 61 3 33.007000 15.392000 0.000000 # 3 -1020 61 4 33.743000 15.246000 0.000000 # 4 -1021 62 3 19.707001 10.034000 0.000000 # 3 -1022 62 4 20.289000 10.506000 0.000000 # 4 -1023 63 3 24.177999 19.620001 0.000000 # 3 -1024 63 4 24.451000 18.922001 0.000000 # 4 -1025 64 3 13.735000 30.347000 0.000000 # 3 -1026 64 4 14.323000 30.813000 0.000000 # 4 -1027 65 3 25.743000 9.947000 0.000000 # 3 -1028 65 4 26.386999 10.333000 0.000000 # 4 -1029 66 3 12.610000 17.093000 0.000000 # 3 -1030 66 4 13.268000 17.452999 0.000000 # 4 -1031 67 3 14.320000 26.740999 0.000000 # 3 -1032 67 4 14.297000 25.990999 0.000000 # 4 -1033 68 3 6.831000 5.449000 0.000000 # 3 -1034 68 4 6.490000 6.117000 0.000000 # 4 -1035 69 3 5.518000 10.617000 0.000000 # 3 -1036 69 4 6.255000 10.478000 0.000000 # 4 -1037 70 3 13.604000 25.229000 0.000000 # 3 -1038 70 4 12.865000 25.358999 0.000000 # 4 -1039 71 3 8.831000 15.371000 0.000000 # 3 -1040 71 4 8.099000 15.205000 0.000000 # 4 -1041 72 3 25.740999 8.873000 0.000000 # 3 -1042 72 4 25.188000 9.379000 0.000000 # 4 -1043 73 3 5.314000 30.232000 0.000000 # 3 -1044 73 4 4.651000 30.583000 0.000000 # 4 -1045 74 3 27.864000 11.407000 0.000000 # 3 -1046 74 4 28.238001 12.057000 0.000000 # 4 -1047 75 3 25.724001 2.806000 0.000000 # 3 -1048 75 4 26.349001 3.221000 0.000000 # 4 -1049 76 3 5.357000 0.715000 0.000000 # 3 -1050 76 4 5.934000 0.235000 0.000000 # 4 -1051 77 3 11.355000 20.771999 0.000000 # 3 -1052 77 4 10.757000 21.225000 0.000000 # 4 -1053 78 3 15.439000 32.723000 0.000000 # 3 -1054 78 4 15.341000 31.979000 0.000000 # 4 -1055 79 3 6.689000 28.919001 0.000000 # 3 -1056 79 4 7.401000 29.153000 0.000000 # 4 -1057 80 3 28.299999 20.871000 0.000000 # 3 -1058 80 4 27.915001 20.226999 0.000000 # 4 -1059 81 3 19.267000 15.997000 0.000000 # 3 -1060 81 4 19.410000 15.261000 0.000000 # 4 -1061 82 3 20.292999 15.092000 0.000000 # 3 -1062 82 4 20.267000 15.842000 0.000000 # 4 -1063 83 3 18.458000 29.216000 0.000000 # 3 -1064 83 4 18.988001 29.747000 0.000000 # 4 -1065 84 3 23.375999 32.803001 0.000000 # 3 -1066 84 4 22.847000 33.334999 0.000000 # 4 -1067 85 3 27.938000 17.868999 0.000000 # 3 -1068 85 4 27.190001 17.809000 0.000000 # 4 -1069 86 3 33.021000 33.460999 0.000000 # 3 -1070 86 4 33.771000 33.455002 0.000000 # 4 -1071 87 3 0.552000 18.315001 0.000000 # 3 -1072 87 4 -0.785861 18.701000 0.000000 # 4 -1073 88 3 28.025999 32.796001 0.000000 # 3 -1074 88 4 28.562000 33.320999 0.000000 # 4 -1075 89 3 24.351000 29.924999 0.000000 # 3 -1076 89 4 23.601999 29.968000 0.000000 # 4 -1077 90 3 7.621000 1.112000 0.000000 # 3 -1078 90 4 6.876000 1.029000 0.000000 # 4 -1079 91 3 7.084000 10.307000 0.000000 # 3 -1080 91 4 6.997000 11.052000 0.000000 # 4 -1081 92 3 8.815000 32.201000 0.000000 # 3 -1082 92 4 8.068000 32.132000 0.000000 # 4 -1083 93 3 3.044000 31.903000 0.000000 # 3 -1084 93 4 3.697000 31.534000 0.000000 # 4 -1085 94 3 26.170000 16.278000 0.000000 # 3 -1086 94 4 26.046000 17.017000 0.000000 # 4 -1087 95 3 10.380000 0.547000 0.000000 # 3 -1088 95 4 10.003000 -0.101859 0.000000 # 4 -1089 96 3 0.419000 29.308001 0.000000 # 3 -1090 96 4 0.837000 29.930000 0.000000 # 4 -1091 97 3 13.712000 28.191000 0.000000 # 3 -1092 97 4 14.276000 27.697001 0.000000 # 4 -1093 98 3 22.218000 7.800000 0.000000 # 3 -1094 98 4 21.726999 7.233000 0.000000 # 4 -1095 99 3 18.382999 25.219999 0.000000 # 3 -1096 99 4 17.643000 25.340000 0.000000 # 4 -1097 100 3 13.873000 20.929001 0.000000 # 3 -1098 100 4 13.404000 20.344000 0.000000 # 4 -1099 101 3 19.837999 22.480000 0.000000 # 3 -1100 101 4 20.552000 22.252001 0.000000 # 4 -1101 102 3 10.516000 12.663000 0.000000 # 3 -1102 102 4 10.275000 13.373000 0.000000 # 4 -1103 103 3 17.336000 14.803000 0.000000 # 3 -1104 103 4 16.743999 15.263000 0.000000 # 4 -1105 104 3 21.530001 32.716999 0.000000 # 3 -1106 104 4 21.547001 31.966999 0.000000 # 4 -1107 105 3 13.517000 6.629000 0.000000 # 3 -1108 105 4 13.886000 7.282000 0.000000 # 4 -1109 106 3 28.226999 27.629000 0.000000 # 3 -1110 106 4 28.964001 27.768999 0.000000 # 4 -1111 107 3 12.490000 14.866000 0.000000 # 3 -1112 107 4 13.028000 15.388000 0.000000 # 4 -1113 108 3 32.889999 16.018000 0.000000 # 3 -1114 108 4 32.313999 16.499001 0.000000 # 4 -1115 109 3 23.344999 6.672000 0.000000 # 3 -1116 109 4 22.785999 6.172000 0.000000 # 4 -1117 110 3 16.215000 10.435000 0.000000 # 3 -1118 110 4 16.893000 10.113000 0.000000 # 4 -1119 111 3 26.961000 0.531000 0.000000 # 3 -1120 111 4 26.431000 1.062000 0.000000 # 4 -1121 112 3 33.931999 15.366000 0.000000 # 3 -1122 112 4 33.202000 15.193000 0.000000 # 4 -1123 113 3 5.463000 17.615999 0.000000 # 3 -1124 113 4 6.145000 17.304001 0.000000 # 4 -1125 114 3 1.707000 1.505000 0.000000 # 3 -1126 114 4 1.025000 1.815000 0.000000 # 4 -1127 115 3 11.142000 0.643000 0.000000 # 3 -1128 115 4 11.528000 1.287000 0.000000 # 4 -1129 116 3 2.236000 29.419001 0.000000 # 3 -1130 116 4 2.082000 30.153000 0.000000 # 4 -1131 117 3 20.514000 5.252000 0.000000 # 3 -1132 117 4 20.709999 4.528000 0.000000 # 4 -1133 118 3 21.836000 2.908000 0.000000 # 3 -1134 118 4 22.159000 2.231000 0.000000 # 4 -1135 119 3 9.519000 21.068001 0.000000 # 3 -1136 119 4 9.476000 21.816000 0.000000 # 4 -1137 120 3 2.875000 1.818000 0.000000 # 3 -1138 120 4 3.359000 1.245000 0.000000 # 4 -1139 121 3 11.204000 11.996000 0.000000 # 3 -1140 121 4 10.455000 12.040000 0.000000 # 4 -1141 122 3 10.817000 4.333000 0.000000 # 3 -1142 122 4 10.877000 5.081000 0.000000 # 4 -1143 123 3 7.965000 34.028000 0.000000 # 3 -1144 123 4 7.564000 33.394001 0.000000 # 4 -1145 124 3 34.366001 18.434999 0.000000 # 3 -1146 124 4 34.069000 17.745001 0.000000 # 4 -1147 125 3 10.053000 26.554001 0.000000 # 3 -1148 125 4 9.350000 26.813999 0.000000 # 4 -1149 126 3 16.150999 32.993999 0.000000 # 3 -1150 126 4 15.568000 32.521000 0.000000 # 4 -1151 127 3 26.788000 22.143999 0.000000 # 3 -1152 127 4 27.280001 21.577999 0.000000 # 4 -1153 128 3 17.615000 19.638000 0.000000 # 3 -1154 128 4 17.302000 18.955999 0.000000 # 4 -1155 129 3 29.412001 35.671001 0.000000 # 3 -1156 129 4 30.139000 35.486000 0.000000 # 4 -1157 130 3 13.808000 3.060000 0.000000 # 3 -1158 130 4 13.274000 2.533000 0.000000 # 4 -1159 131 3 24.601000 21.792000 0.000000 # 3 -1160 131 4 25.298000 22.070000 0.000000 # 4 -1161 132 3 14.805000 5.371000 0.000000 # 3 -1162 132 4 15.268000 5.962000 0.000000 # 4 -1163 133 3 28.138000 6.659000 0.000000 # 3 -1164 133 4 27.590000 6.147000 0.000000 # 4 -1165 134 3 7.913000 16.622000 0.000000 # 3 -1166 134 4 8.655000 16.511000 0.000000 # 4 -1167 135 3 6.561000 11.483000 0.000000 # 3 -1168 135 4 7.146000 11.013000 0.000000 # 4 -1169 136 3 21.056999 27.625999 0.000000 # 3 -1170 136 4 21.794001 27.761000 0.000000 # 4 -1171 137 3 15.201000 5.306000 0.000000 # 3 -1172 137 4 14.863000 4.637000 0.000000 # 4 -1173 138 3 34.687000 17.483000 0.000000 # 3 -1174 138 4 34.713001 18.232000 0.000000 # 4 -1175 139 3 23.371000 24.747000 0.000000 # 3 -1176 139 4 24.033001 24.393999 0.000000 # 4 -1177 140 3 0.161000 0.733000 0.000000 # 3 -1178 140 4 0.321000 1.465000 0.000000 # 4 -1179 141 3 6.715000 24.032000 0.000000 # 3 -1180 141 4 7.454000 24.160000 0.000000 # 4 -1181 142 3 30.509001 24.315001 0.000000 # 3 -1182 142 4 31.136000 24.725000 0.000000 # 4 -1183 143 3 23.433001 18.125000 0.000000 # 3 -1184 143 4 24.157000 18.322001 0.000000 # 4 -1185 144 3 17.679001 25.806999 0.000000 # 3 -1186 144 4 17.430000 26.514999 0.000000 # 4 -1187 145 3 30.332001 33.373001 0.000000 # 3 -1188 145 4 29.587999 33.279999 0.000000 # 4 -1189 146 3 27.947001 6.108000 0.000000 # 3 -1190 146 4 27.209000 6.240000 0.000000 # 4 -1191 147 3 4.081000 9.292000 0.000000 # 3 -1192 147 4 3.381000 9.022000 0.000000 # 4 -1193 148 3 15.306000 18.641001 0.000000 # 3 -1194 148 4 15.073000 19.355000 0.000000 # 4 -1195 149 3 35.230999 25.514000 0.000000 # 3 -1196 149 4 34.605999 25.927999 0.000000 # 4 -1197 150 3 2.992000 30.628000 0.000000 # 3 -1198 150 4 3.593000 30.179001 0.000000 # 4 -1199 151 3 1.855000 33.110001 0.000000 # 3 -1200 151 4 2.516000 32.754002 0.000000 # 4 - + + 1 1.000000 + 2 1.000000 + 3 1.000000 + 4 1.000000 + + Atoms + + 1 139 2 0.000 0.000 0.000 + 2 0 1 1.195 0.000 0.000 + 3 0 1 2.390 0.000 0.000 + 4 0 1 3.586 0.000 0.000 + 5 0 1 4.781 0.000 0.000 + 6 0 1 5.976 0.000 0.000 + 7 0 1 7.171 0.000 0.000 + 8 0 1 8.367 0.000 0.000 + 9 0 1 9.562 0.000 0.000 + 10 114 2 10.757 0.000 0.000 + 11 0 1 11.952 0.000 0.000 + 12 52 2 13.148 0.000 0.000 + 13 0 1 14.343 0.000 0.000 + 14 0 1 15.538 0.000 0.000 + 15 0 1 16.733 0.000 0.000 + 16 0 1 17.928 0.000 0.000 + 17 0 1 19.124 0.000 0.000 + 18 0 1 20.319 0.000 0.000 + 19 0 1 21.514 0.000 0.000 + 20 0 1 22.709 0.000 0.000 + 21 0 1 23.905 0.000 0.000 + 22 0 1 25.100 0.000 0.000 + 23 0 1 26.295 0.000 0.000 + 24 110 2 27.490 0.000 0.000 + 25 128 2 28.685 35.85686 0.000 + 26 0 1 29.881 0.000 0.000 + 27 0 1 31.076 0.000 0.000 + 28 0 1 32.271 0.000 0.000 + 29 0 1 33.466 0.000 0.000 + 30 0 1 34.662 0.000 0.000 + 31 0 1 0.000 1.195 0.000 + 32 0 1 1.195 1.195 0.000 + 33 113 2 2.390 1.195 0.000 + 34 0 1 3.586 1.195 0.000 + 35 75 2 4.781 1.195 0.000 + 36 0 1 5.976 1.195 0.000 + 37 0 1 7.171 1.195 0.000 + 38 89 2 8.367 1.195 0.000 + 39 0 1 9.562 1.195 0.000 + 40 94 2 10.757 1.195 0.000 + 41 0 1 11.952 1.195 0.000 + 42 35 2 13.148 1.195 0.000 + 43 0 1 14.343 1.195 0.000 + 44 0 1 15.538 1.195 0.000 + 45 0 1 16.733 1.195 0.000 + 46 0 1 17.928 1.195 0.000 + 47 0 1 19.124 1.195 0.000 + 48 0 1 20.319 1.195 0.000 + 49 0 1 21.514 1.195 0.000 + 50 0 1 22.709 1.195 0.000 + 51 0 1 23.905 1.195 0.000 + 52 0 1 25.100 1.195 0.000 + 53 0 1 26.295 1.195 0.000 + 54 0 1 27.490 1.195 0.000 + 55 0 1 28.685 1.195 0.000 + 56 0 1 29.881 1.195 0.000 + 57 0 1 31.076 1.195 0.000 + 58 0 1 32.271 1.195 0.000 + 59 0 1 33.466 1.195 0.000 + 60 0 1 34.662 1.195 0.000 + 61 0 1 0.000 2.390 0.000 + 62 0 1 1.195 2.390 0.000 + 63 119 2 2.390 2.390 0.000 + 64 0 1 3.586 2.390 0.000 + 65 24 2 4.781 2.390 0.000 + 66 0 1 5.976 2.390 0.000 + 67 0 1 7.171 2.390 0.000 + 68 0 1 8.367 2.390 0.000 + 69 0 1 9.562 2.390 0.000 + 70 0 1 10.757 2.390 0.000 + 71 0 1 11.952 2.390 0.000 + 72 0 1 13.148 2.390 0.000 + 73 0 1 14.343 2.390 0.000 + 74 0 1 15.538 2.390 0.000 + 75 0 1 16.733 2.390 0.000 + 76 0 1 17.928 2.390 0.000 + 77 0 1 19.124 2.390 0.000 + 78 0 1 20.319 2.390 0.000 + 79 0 1 21.514 2.390 0.000 + 80 0 1 22.709 2.390 0.000 + 81 0 1 23.905 2.390 0.000 + 82 74 2 25.100 2.390 0.000 + 83 0 1 26.295 2.390 0.000 + 84 0 1 27.490 2.390 0.000 + 85 0 1 28.685 2.390 0.000 + 86 47 2 29.881 2.390 0.000 + 87 0 1 31.076 2.390 0.000 + 88 0 1 32.271 2.390 0.000 + 89 0 1 33.466 2.390 0.000 + 90 0 1 34.662 2.390 0.000 + 91 0 1 0.000 3.586 0.000 + 92 0 1 1.195 3.586 0.000 + 93 0 1 2.390 3.586 0.000 + 94 0 1 3.586 3.586 0.000 + 95 0 1 4.781 3.586 0.000 + 96 0 1 5.976 3.586 0.000 + 97 0 1 7.171 3.586 0.000 + 98 0 1 8.367 3.586 0.000 + 99 0 1 9.562 3.586 0.000 + 100 121 2 10.757 3.586 0.000 + 101 0 1 11.952 3.586 0.000 + 102 0 1 13.148 3.586 0.000 + 103 129 2 14.343 3.586 0.000 + 104 0 1 15.538 3.586 0.000 + 105 0 1 16.733 3.586 0.000 + 106 0 1 17.928 3.586 0.000 + 107 0 1 19.124 3.586 0.000 + 108 0 1 20.319 3.586 0.000 + 109 117 2 21.514 3.586 0.000 + 110 0 1 22.709 3.586 0.000 + 111 0 1 23.905 3.586 0.000 + 112 0 1 25.100 3.586 0.000 + 113 0 1 26.295 3.586 0.000 + 114 0 1 27.490 3.586 0.000 + 115 0 1 28.685 3.586 0.000 + 116 49 2 29.881 3.586 0.000 + 117 0 1 31.076 3.586 0.000 + 118 0 1 32.271 3.586 0.000 + 119 0 1 33.466 3.586 0.000 + 120 0 1 34.662 3.586 0.000 + 121 0 1 0.000 4.781 0.000 + 122 0 1 1.195 4.781 0.000 + 123 0 1 2.390 4.781 0.000 + 124 0 1 3.586 4.781 0.000 + 125 38 2 4.781 4.781 0.000 + 126 0 1 5.976 4.781 0.000 + 127 67 2 7.171 4.781 0.000 + 128 0 1 8.367 4.781 0.000 + 129 3 2 9.562 4.781 0.000 + 130 0 1 10.757 4.781 0.000 + 131 41 2 11.952 4.781 0.000 + 132 0 1 13.148 4.781 0.000 + 133 131 2 14.343 4.781 0.000 + 134 0 1 15.538 4.781 0.000 + 135 0 1 16.733 4.781 0.000 + 136 0 1 17.928 4.781 0.000 + 137 0 1 19.124 4.781 0.000 + 138 0 1 20.319 4.781 0.000 + 139 0 1 21.514 4.781 0.000 + 140 0 1 22.709 4.781 0.000 + 141 0 1 23.905 4.781 0.000 + 142 0 1 25.100 4.781 0.000 + 143 0 1 26.295 4.781 0.000 + 144 0 1 27.490 4.781 0.000 + 145 0 1 28.685 4.781 0.000 + 146 0 1 29.881 4.781 0.000 + 147 0 1 31.076 4.781 0.000 + 148 0 1 32.271 4.781 0.000 + 149 0 1 33.466 4.781 0.000 + 150 0 1 34.662 4.781 0.000 + 151 53 2 35.85686 5.976 0.000 + 152 0 1 1.195 5.976 0.000 + 153 0 1 2.390 5.976 0.000 + 154 0 1 3.586 5.976 0.000 + 155 0 1 4.781 5.976 0.000 + 156 0 1 5.976 5.976 0.000 + 157 48 2 7.171 5.976 0.000 + 158 0 1 8.367 5.976 0.000 + 159 30 2 9.562 5.976 0.000 + 160 0 1 10.757 5.976 0.000 + 161 0 1 11.952 5.976 0.000 + 162 104 2 13.148 5.976 0.000 + 163 0 1 14.343 5.976 0.000 + 164 136 2 15.538 5.976 0.000 + 165 0 1 16.733 5.976 0.000 + 166 0 1 17.928 5.976 0.000 + 167 0 1 19.124 5.976 0.000 + 168 116 2 20.319 5.976 0.000 + 169 0 1 21.514 5.976 0.000 + 170 0 1 22.709 5.976 0.000 + 171 0 1 23.905 5.976 0.000 + 172 0 1 25.100 5.976 0.000 + 173 40 2 26.295 5.976 0.000 + 174 0 1 27.490 5.976 0.000 + 175 145 2 28.685 5.976 0.000 + 176 33 2 29.881 5.976 0.000 + 177 0 1 31.076 5.976 0.000 + 178 0 1 32.271 5.976 0.000 + 179 0 1 33.466 5.976 0.000 + 180 0 1 34.662 5.976 0.000 + 181 0 1 0.000 7.171 0.000 + 182 0 1 1.195 7.171 0.000 + 183 0 1 2.390 7.171 0.000 + 184 0 1 3.586 7.171 0.000 + 185 0 1 4.781 7.171 0.000 + 186 0 1 5.976 7.171 0.000 + 187 0 1 7.171 7.171 0.000 + 188 0 1 8.367 7.171 0.000 + 189 0 1 9.562 7.171 0.000 + 190 0 1 10.757 7.171 0.000 + 191 0 1 11.952 7.171 0.000 + 192 15 2 13.148 7.171 0.000 + 193 0 1 14.343 7.171 0.000 + 194 0 1 15.538 7.171 0.000 + 195 0 1 16.733 7.171 0.000 + 196 0 1 17.928 7.171 0.000 + 197 0 1 19.124 7.171 0.000 + 198 0 1 20.319 7.171 0.000 + 199 0 1 21.514 7.171 0.000 + 200 0 1 22.709 7.171 0.000 + 201 108 2 23.905 7.171 0.000 + 202 0 1 25.100 7.171 0.000 + 203 0 1 26.295 7.171 0.000 + 204 0 1 27.490 7.171 0.000 + 205 132 2 28.685 7.171 0.000 + 206 0 1 29.881 7.171 0.000 + 207 0 1 31.076 7.171 0.000 + 208 0 1 32.271 7.171 0.000 + 209 0 1 33.466 7.171 0.000 + 210 0 1 34.662 7.171 0.000 + 211 0 1 0.000 8.367 0.000 + 212 0 1 1.195 8.367 0.000 + 213 0 1 2.390 8.367 0.000 + 214 0 1 3.586 8.367 0.000 + 215 0 1 4.781 8.367 0.000 + 216 0 1 5.976 8.367 0.000 + 217 0 1 7.171 8.367 0.000 + 218 0 1 8.367 8.367 0.000 + 219 0 1 9.562 8.367 0.000 + 220 0 1 10.757 8.367 0.000 + 221 0 1 11.952 8.367 0.000 + 222 0 1 13.148 8.367 0.000 + 223 0 1 14.343 8.367 0.000 + 224 0 1 15.538 8.367 0.000 + 225 0 1 16.733 8.367 0.000 + 226 0 1 17.928 8.367 0.000 + 227 0 1 19.124 8.367 0.000 + 228 0 1 20.319 8.367 0.000 + 229 0 1 21.514 8.367 0.000 + 230 97 2 22.709 8.367 0.000 + 231 0 1 23.905 8.367 0.000 + 232 12 2 25.100 8.367 0.000 + 233 71 2 26.295 8.367 0.000 + 234 0 1 27.490 8.367 0.000 + 235 0 1 28.685 8.367 0.000 + 236 0 1 29.881 8.367 0.000 + 237 0 1 31.076 8.367 0.000 + 238 6 2 32.271 8.367 0.000 + 239 0 1 33.466 8.367 0.000 + 240 34 2 34.662 8.367 0.000 + 241 0 1 0.000 9.562 0.000 + 242 0 1 1.195 9.562 0.000 + 243 0 1 2.390 9.562 0.000 + 244 0 1 3.586 9.562 0.000 + 245 146 2 4.781 9.562 0.000 + 246 0 1 5.976 9.562 0.000 + 247 90 2 7.171 9.562 0.000 + 248 0 1 8.367 9.562 0.000 + 249 0 1 9.562 9.562 0.000 + 250 0 1 10.757 9.562 0.000 + 251 0 1 11.952 9.562 0.000 + 252 0 1 13.148 9.562 0.000 + 253 0 1 14.343 9.562 0.000 + 254 0 1 15.538 9.562 0.000 + 255 0 1 16.733 9.562 0.000 + 256 0 1 17.928 9.562 0.000 + 257 61 2 19.124 9.562 0.000 + 258 0 1 20.319 9.562 0.000 + 259 0 1 21.514 9.562 0.000 + 260 0 1 22.709 9.562 0.000 + 261 0 1 23.905 9.562 0.000 + 262 64 2 25.100 9.562 0.000 + 263 0 1 26.295 9.562 0.000 + 264 0 1 27.490 9.562 0.000 + 265 0 1 28.685 9.562 0.000 + 266 0 1 29.881 9.562 0.000 + 267 0 1 31.076 9.562 0.000 + 268 0 1 32.271 9.562 0.000 + 269 0 1 33.466 9.562 0.000 + 270 0 1 34.662 9.562 0.000 + 271 0 1 0.000 10.757 0.000 + 272 0 1 1.195 10.757 0.000 + 273 0 1 2.390 10.757 0.000 + 274 0 1 3.586 10.757 0.000 + 275 68 2 4.781 10.757 0.000 + 276 0 1 5.976 10.757 0.000 + 277 0 1 7.171 10.757 0.000 + 278 0 1 8.367 10.757 0.000 + 279 0 1 9.562 10.757 0.000 + 280 0 1 10.757 10.757 0.000 + 281 0 1 11.952 10.757 0.000 + 282 0 1 13.148 10.757 0.000 + 283 0 1 14.343 10.757 0.000 + 284 109 2 15.538 10.757 0.000 + 285 0 1 16.733 10.757 0.000 + 286 0 1 17.928 10.757 0.000 + 287 0 1 19.124 10.757 0.000 + 288 0 1 20.319 10.757 0.000 + 289 0 1 21.514 10.757 0.000 + 290 0 1 22.709 10.757 0.000 + 291 0 1 23.905 10.757 0.000 + 292 0 1 25.100 10.757 0.000 + 293 0 1 26.295 10.757 0.000 + 294 73 2 27.490 10.757 0.000 + 295 0 1 28.685 10.757 0.000 + 296 0 1 29.881 10.757 0.000 + 297 0 1 31.076 10.757 0.000 + 298 0 1 32.271 10.757 0.000 + 299 0 1 33.466 10.757 0.000 + 300 0 1 34.662 10.757 0.000 + 301 0 1 0.000 11.952 0.000 + 302 0 1 1.195 11.952 0.000 + 303 0 1 2.390 11.952 0.000 + 304 0 1 3.586 11.952 0.000 + 305 0 1 4.781 11.952 0.000 + 306 134 2 5.976 11.952 0.000 + 307 0 1 7.171 11.952 0.000 + 308 0 1 8.367 11.952 0.000 + 309 57 2 9.562 11.952 0.000 + 310 101 2 10.757 11.952 0.000 + 311 120 2 11.952 11.952 0.000 + 312 0 1 13.148 11.952 0.000 + 313 0 1 14.343 11.952 0.000 + 314 0 1 15.538 11.952 0.000 + 315 0 1 16.733 11.952 0.000 + 316 0 1 17.928 11.952 0.000 + 317 32 2 19.124 11.952 0.000 + 318 0 1 20.319 11.952 0.000 + 319 0 1 21.514 11.952 0.000 + 320 0 1 22.709 11.952 0.000 + 321 0 1 23.905 11.952 0.000 + 322 0 1 25.100 11.952 0.000 + 323 0 1 26.295 11.952 0.000 + 324 0 1 27.490 11.952 0.000 + 325 0 1 28.685 11.952 0.000 + 326 0 1 29.881 11.952 0.000 + 327 0 1 31.076 11.952 0.000 + 328 42 2 32.271 11.952 0.000 + 329 0 1 33.466 11.952 0.000 + 330 0 1 34.662 11.952 0.000 + 331 0 1 0.000 13.148 0.000 + 332 10 2 1.195 13.148 0.000 + 333 54 2 2.390 13.148 0.000 + 334 0 1 3.586 13.148 0.000 + 335 0 1 4.781 13.148 0.000 + 336 0 1 5.976 13.148 0.000 + 337 0 1 7.171 13.148 0.000 + 338 0 1 8.367 13.148 0.000 + 339 20 2 9.562 13.148 0.000 + 340 0 1 10.757 13.148 0.000 + 341 0 1 11.952 13.148 0.000 + 342 0 1 13.148 13.148 0.000 + 343 11 2 14.343 13.148 0.000 + 344 0 1 15.538 13.148 0.000 + 345 0 1 16.733 13.148 0.000 + 346 0 1 17.928 13.148 0.000 + 347 0 1 19.124 13.148 0.000 + 348 0 1 20.319 13.148 0.000 + 349 17 2 21.514 13.148 0.000 + 350 0 1 22.709 13.148 0.000 + 351 0 1 23.905 13.148 0.000 + 352 0 1 25.100 13.148 0.000 + 353 0 1 26.295 13.148 0.000 + 354 0 1 27.490 13.148 0.000 + 355 0 1 28.685 13.148 0.000 + 356 0 1 29.881 13.148 0.000 + 357 0 1 31.076 13.148 0.000 + 358 0 1 32.271 13.148 0.000 + 359 0 1 33.466 13.148 0.000 + 360 0 1 34.662 13.148 0.000 + 361 0 1 0.000 14.343 0.000 + 362 0 1 1.195 14.343 0.000 + 363 8 2 2.390 14.343 0.000 + 364 0 1 3.586 14.343 0.000 + 365 0 1 4.781 14.343 0.000 + 366 0 1 5.976 14.343 0.000 + 367 0 1 7.171 14.343 0.000 + 368 0 1 8.367 14.343 0.000 + 369 0 1 9.562 14.343 0.000 + 370 0 1 10.757 14.343 0.000 + 371 106 2 11.952 14.343 0.000 + 372 0 1 13.148 14.343 0.000 + 373 0 1 14.343 14.343 0.000 + 374 0 1 15.538 14.343 0.000 + 375 0 1 16.733 14.343 0.000 + 376 102 2 17.928 14.343 0.000 + 377 0 1 19.124 14.343 0.000 + 378 81 2 20.319 14.343 0.000 + 379 9 2 21.514 14.343 0.000 + 380 0 1 22.709 14.343 0.000 + 381 0 1 23.905 14.343 0.000 + 382 0 1 25.100 14.343 0.000 + 383 0 1 26.295 14.343 0.000 + 384 0 1 27.490 14.343 0.000 + 385 0 1 28.685 14.343 0.000 + 386 0 1 29.881 14.343 0.000 + 387 0 1 31.076 14.343 0.000 + 388 0 1 32.271 14.343 0.000 + 389 0 1 33.466 14.343 0.000 + 390 0 1 34.662 14.343 0.000 + 391 0 1 0.000 15.538 0.000 + 392 0 1 1.195 15.538 0.000 + 393 0 1 2.390 15.538 0.000 + 394 0 1 3.586 15.538 0.000 + 395 0 1 4.781 15.538 0.000 + 396 0 1 5.976 15.538 0.000 + 397 0 1 7.171 15.538 0.000 + 398 0 1 8.367 15.538 0.000 + 399 70 2 9.562 15.538 0.000 + 400 0 1 10.757 15.538 0.000 + 401 0 1 11.952 15.538 0.000 + 402 0 1 13.148 15.538 0.000 + 403 0 1 14.343 15.538 0.000 + 404 0 1 15.538 15.538 0.000 + 405 0 1 16.733 15.538 0.000 + 406 0 1 17.928 15.538 0.000 + 407 0 1 19.124 15.538 0.000 + 408 0 1 20.319 15.538 0.000 + 409 0 1 21.514 15.538 0.000 + 410 0 1 22.709 15.538 0.000 + 411 0 1 23.905 15.538 0.000 + 412 0 1 25.100 15.538 0.000 + 413 93 2 26.295 15.538 0.000 + 414 0 1 27.490 15.538 0.000 + 415 0 1 28.685 15.538 0.000 + 416 27 2 29.881 15.538 0.000 + 417 0 1 31.076 15.538 0.000 + 418 60 2 32.271 15.538 0.000 + 419 107 2 33.466 15.538 0.000 + 420 111 2 34.662 15.538 0.000 + 421 0 1 0.000 16.733 0.000 + 422 0 1 1.195 16.733 0.000 + 423 0 1 2.390 16.733 0.000 + 424 0 1 3.586 16.733 0.000 + 425 0 1 4.781 16.733 0.000 + 426 0 1 5.976 16.733 0.000 + 427 133 2 7.171 16.733 0.000 + 428 0 1 8.367 16.733 0.000 + 429 0 1 9.562 16.733 0.000 + 430 0 1 10.757 16.733 0.000 + 431 65 2 11.952 16.733 0.000 + 432 0 1 13.148 16.733 0.000 + 433 0 1 14.343 16.733 0.000 + 434 0 1 15.538 16.733 0.000 + 435 0 1 16.733 16.733 0.000 + 436 0 1 17.928 16.733 0.000 + 437 80 2 19.124 16.733 0.000 + 438 0 1 20.319 16.733 0.000 + 439 0 1 21.514 16.733 0.000 + 440 0 1 22.709 16.733 0.000 + 441 0 1 23.905 16.733 0.000 + 442 0 1 25.100 16.733 0.000 + 443 51 2 26.295 16.733 0.000 + 444 0 1 27.490 16.733 0.000 + 445 0 1 28.685 16.733 0.000 + 446 0 1 29.881 16.733 0.000 + 447 44 2 31.076 16.733 0.000 + 448 0 1 32.271 16.733 0.000 + 449 0 1 33.466 16.733 0.000 + 450 137 2 34.662 16.733 0.000 + 451 0 1 0.000 17.928 0.000 + 452 86 2 1.195 17.928 0.000 + 453 0 1 2.390 17.928 0.000 + 454 0 1 3.586 17.928 0.000 + 455 112 2 4.781 17.928 0.000 + 456 0 1 5.976 17.928 0.000 + 457 0 1 7.171 17.928 0.000 + 458 0 1 8.367 17.928 0.000 + 459 0 1 9.562 17.928 0.000 + 460 2 2 10.757 17.928 0.000 + 461 0 1 11.952 17.928 0.000 + 462 0 1 13.148 17.928 0.000 + 463 0 1 14.343 17.928 0.000 + 464 147 2 15.538 17.928 0.000 + 465 0 1 16.733 17.928 0.000 + 466 0 1 17.928 17.928 0.000 + 467 14 2 19.124 17.928 0.000 + 468 0 1 20.319 17.928 0.000 + 469 0 1 21.514 17.928 0.000 + 470 142 2 22.709 17.928 0.000 + 471 0 1 23.905 17.928 0.000 + 472 0 1 25.100 17.928 0.000 + 473 0 1 26.295 17.928 0.000 + 474 0 1 27.490 17.928 0.000 + 475 84 2 28.685 17.928 0.000 + 476 0 1 29.881 17.928 0.000 + 477 0 1 31.076 17.928 0.000 + 478 0 1 32.271 17.928 0.000 + 479 0 1 33.466 17.928 0.000 + 480 26 2 34.662 17.928 0.000 + 481 0 1 0.000 19.124 0.000 + 482 0 1 1.195 19.124 0.000 + 483 56 2 2.390 19.124 0.000 + 484 0 1 3.586 19.124 0.000 + 485 0 1 4.781 19.124 0.000 + 486 0 1 5.976 19.124 0.000 + 487 21 2 7.171 19.124 0.000 + 488 0 1 8.367 19.124 0.000 + 489 0 1 9.562 19.124 0.000 + 490 0 1 10.757 19.124 0.000 + 491 0 1 11.952 19.124 0.000 + 492 0 1 13.148 19.124 0.000 + 493 58 2 14.343 19.124 0.000 + 494 0 1 15.538 19.124 0.000 + 495 0 1 16.733 19.124 0.000 + 496 0 1 17.928 19.124 0.000 + 497 0 1 19.124 19.124 0.000 + 498 0 1 20.319 19.124 0.000 + 499 0 1 21.514 19.124 0.000 + 500 0 1 22.709 19.124 0.000 + 501 0 1 23.905 19.124 0.000 + 502 0 1 25.100 19.124 0.000 + 503 0 1 26.295 19.124 0.000 + 504 0 1 27.490 19.124 0.000 + 505 0 1 28.685 19.124 0.000 + 506 0 1 29.881 19.124 0.000 + 507 0 1 31.076 19.124 0.000 + 508 0 1 32.271 19.124 0.000 + 509 0 1 33.466 19.124 0.000 + 510 123 2 34.662 19.124 0.000 + 511 0 1 0.000 20.319 0.000 + 512 0 1 1.195 20.319 0.000 + 513 0 1 2.390 20.319 0.000 + 514 0 1 3.586 20.319 0.000 + 515 0 1 4.781 20.319 0.000 + 516 0 1 5.976 20.319 0.000 + 517 0 1 7.171 20.319 0.000 + 518 0 1 8.367 20.319 0.000 + 519 118 2 9.562 20.319 0.000 + 520 36 2 10.757 20.319 0.000 + 521 76 2 11.952 20.319 0.000 + 522 0 1 13.148 20.319 0.000 + 523 0 1 14.343 20.319 0.000 + 524 22 2 15.538 20.319 0.000 + 525 0 1 16.733 20.319 0.000 + 526 127 2 17.928 20.319 0.000 + 527 0 1 19.124 20.319 0.000 + 528 0 1 20.319 20.319 0.000 + 529 0 1 21.514 20.319 0.000 + 530 0 1 22.709 20.319 0.000 + 531 62 2 23.905 20.319 0.000 + 532 0 1 25.100 20.319 0.000 + 533 0 1 26.295 20.319 0.000 + 534 0 1 27.490 20.319 0.000 + 535 0 1 28.685 20.319 0.000 + 536 4 2 29.881 20.319 0.000 + 537 0 1 31.076 20.319 0.000 + 538 0 1 32.271 20.319 0.000 + 539 0 1 33.466 20.319 0.000 + 540 0 1 34.662 20.319 0.000 + 541 0 1 0.000 21.514 0.000 + 542 0 1 1.195 21.514 0.000 + 543 0 1 2.390 21.514 0.000 + 544 0 1 3.586 21.514 0.000 + 545 0 1 4.781 21.514 0.000 + 546 0 1 5.976 21.514 0.000 + 547 0 1 7.171 21.514 0.000 + 548 0 1 8.367 21.514 0.000 + 549 0 1 9.562 21.514 0.000 + 550 0 1 10.757 21.514 0.000 + 551 0 1 11.952 21.514 0.000 + 552 0 1 13.148 21.514 0.000 + 553 99 2 14.343 21.514 0.000 + 554 0 1 15.538 21.514 0.000 + 555 0 1 16.733 21.514 0.000 + 556 0 1 17.928 21.514 0.000 + 557 0 1 19.124 21.514 0.000 + 558 0 1 20.319 21.514 0.000 + 559 0 1 21.514 21.514 0.000 + 560 1 2 22.709 21.514 0.000 + 561 130 2 23.905 21.514 0.000 + 562 0 1 25.100 21.514 0.000 + 563 0 1 26.295 21.514 0.000 + 564 0 1 27.490 21.514 0.000 + 565 79 2 28.685 21.514 0.000 + 566 0 1 29.881 21.514 0.000 + 567 0 1 31.076 21.514 0.000 + 568 0 1 32.271 21.514 0.000 + 569 0 1 33.466 21.514 0.000 + 570 0 1 34.662 21.514 0.000 + 571 0 1 0.000 22.709 0.000 + 572 0 1 1.195 22.709 0.000 + 573 0 1 2.390 22.709 0.000 + 574 0 1 3.586 22.709 0.000 + 575 0 1 4.781 22.709 0.000 + 576 0 1 5.976 22.709 0.000 + 577 0 1 7.171 22.709 0.000 + 578 0 1 8.367 22.709 0.000 + 579 0 1 9.562 22.709 0.000 + 580 0 1 10.757 22.709 0.000 + 581 0 1 11.952 22.709 0.000 + 582 0 1 13.148 22.709 0.000 + 583 0 1 14.343 22.709 0.000 + 584 0 1 15.538 22.709 0.000 + 585 0 1 16.733 22.709 0.000 + 586 0 1 17.928 22.709 0.000 + 587 100 2 19.124 22.709 0.000 + 588 0 1 20.319 22.709 0.000 + 589 0 1 21.514 22.709 0.000 + 590 0 1 22.709 22.709 0.000 + 591 0 1 23.905 22.709 0.000 + 592 0 1 25.100 22.709 0.000 + 593 126 2 26.295 22.709 0.000 + 594 0 1 27.490 22.709 0.000 + 595 0 1 28.685 22.709 0.000 + 596 0 1 29.881 22.709 0.000 + 597 0 1 31.076 22.709 0.000 + 598 0 1 32.271 22.709 0.000 + 599 0 1 33.466 22.709 0.000 + 600 0 1 34.662 22.709 0.000 + 601 0 1 0.000 23.905 0.000 + 602 0 1 1.195 23.905 0.000 + 603 0 1 2.390 23.905 0.000 + 604 37 2 3.586 23.905 0.000 + 605 0 1 4.781 23.905 0.000 + 606 140 2 5.976 23.905 0.000 + 607 0 1 7.171 23.905 0.000 + 608 0 1 8.367 23.905 0.000 + 609 0 1 9.562 23.905 0.000 + 610 0 1 10.757 23.905 0.000 + 611 0 1 11.952 23.905 0.000 + 612 0 1 13.148 23.905 0.000 + 613 0 1 14.343 23.905 0.000 + 614 0 1 15.538 23.905 0.000 + 615 0 1 16.733 23.905 0.000 + 616 0 1 17.928 23.905 0.000 + 617 0 1 19.124 23.905 0.000 + 618 0 1 20.319 23.905 0.000 + 619 0 1 21.514 23.905 0.000 + 620 0 1 22.709 23.905 0.000 + 621 0 1 23.905 23.905 0.000 + 622 0 1 25.100 23.905 0.000 + 623 0 1 26.295 23.905 0.000 + 624 0 1 27.490 23.905 0.000 + 625 0 1 28.685 23.905 0.000 + 626 141 2 29.881 23.905 0.000 + 627 0 1 31.076 23.905 0.000 + 628 0 1 32.271 23.905 0.000 + 629 0 1 33.466 23.905 0.000 + 630 0 1 34.662 23.905 0.000 + 631 148 2 35.85686 25.100 0.000 + 632 0 1 1.195 25.100 0.000 + 633 0 1 2.390 25.100 0.000 + 634 0 1 3.586 25.100 0.000 + 635 0 1 4.781 25.100 0.000 + 636 0 1 5.976 25.100 0.000 + 637 0 1 7.171 25.100 0.000 + 638 0 1 8.367 25.100 0.000 + 639 39 2 9.562 25.100 0.000 + 640 0 1 10.757 25.100 0.000 + 641 0 1 11.952 25.100 0.000 + 642 0 1 13.148 25.100 0.000 + 643 69 2 14.343 25.100 0.000 + 644 0 1 15.538 25.100 0.000 + 645 0 1 16.733 25.100 0.000 + 646 143 2 17.928 25.100 0.000 + 647 98 2 19.124 25.100 0.000 + 648 0 1 20.319 25.100 0.000 + 649 31 2 21.514 25.100 0.000 + 650 138 2 22.709 25.100 0.000 + 651 0 1 23.905 25.100 0.000 + 652 0 1 25.100 25.100 0.000 + 653 0 1 26.295 25.100 0.000 + 654 0 1 27.490 25.100 0.000 + 655 0 1 28.685 25.100 0.000 + 656 0 1 29.881 25.100 0.000 + 657 0 1 31.076 25.100 0.000 + 658 0 1 32.271 25.100 0.000 + 659 0 1 33.466 25.100 0.000 + 660 0 1 34.662 25.100 0.000 + 661 0 1 0.000 26.295 0.000 + 662 0 1 1.195 26.295 0.000 + 663 0 1 2.390 26.295 0.000 + 664 0 1 3.586 26.295 0.000 + 665 0 1 4.781 26.295 0.000 + 666 0 1 5.976 26.295 0.000 + 667 0 1 7.171 26.295 0.000 + 668 0 1 8.367 26.295 0.000 + 669 0 1 9.562 26.295 0.000 + 670 124 2 10.757 26.295 0.000 + 671 0 1 11.952 26.295 0.000 + 672 0 1 13.148 26.295 0.000 + 673 0 1 14.343 26.295 0.000 + 674 0 1 15.538 26.295 0.000 + 675 0 1 16.733 26.295 0.000 + 676 0 1 17.928 26.295 0.000 + 677 0 1 19.124 26.295 0.000 + 678 0 1 20.319 26.295 0.000 + 679 16 2 21.514 26.295 0.000 + 680 0 1 22.709 26.295 0.000 + 681 0 1 23.905 26.295 0.000 + 682 0 1 25.100 26.295 0.000 + 683 0 1 26.295 26.295 0.000 + 684 0 1 27.490 26.295 0.000 + 685 0 1 28.685 26.295 0.000 + 686 0 1 29.881 26.295 0.000 + 687 0 1 31.076 26.295 0.000 + 688 0 1 32.271 26.295 0.000 + 689 0 1 33.466 26.295 0.000 + 690 0 1 34.662 26.295 0.000 + 691 0 1 0.000 27.490 0.000 + 692 0 1 1.195 27.490 0.000 + 693 0 1 2.390 27.490 0.000 + 694 0 1 3.586 27.490 0.000 + 695 0 1 4.781 27.490 0.000 + 696 0 1 5.976 27.490 0.000 + 697 0 1 7.171 27.490 0.000 + 698 0 1 8.367 27.490 0.000 + 699 0 1 9.562 27.490 0.000 + 700 0 1 10.757 27.490 0.000 + 701 0 1 11.952 27.490 0.000 + 702 0 1 13.148 27.490 0.000 + 703 66 2 14.343 27.490 0.000 + 704 0 1 15.538 27.490 0.000 + 705 0 1 16.733 27.490 0.000 + 706 0 1 17.928 27.490 0.000 + 707 0 1 19.124 27.490 0.000 + 708 135 2 20.319 27.490 0.000 + 709 0 1 21.514 27.490 0.000 + 710 0 1 22.709 27.490 0.000 + 711 0 1 23.905 27.490 0.000 + 712 0 1 25.100 27.490 0.000 + 713 0 1 26.295 27.490 0.000 + 714 105 2 27.490 27.490 0.000 + 715 0 1 28.685 27.490 0.000 + 716 0 1 29.881 27.490 0.000 + 717 0 1 31.076 27.490 0.000 + 718 0 1 32.271 27.490 0.000 + 719 0 1 33.466 27.490 0.000 + 720 0 1 34.662 27.490 0.000 + 721 95 2 0.000 28.685 0.000 + 722 0 1 1.195 28.685 0.000 + 723 115 2 2.390 28.685 0.000 + 724 0 1 3.586 28.685 0.000 + 725 0 1 4.781 28.685 0.000 + 726 78 2 5.976 28.685 0.000 + 727 0 1 7.171 28.685 0.000 + 728 0 1 8.367 28.685 0.000 + 729 0 1 9.562 28.685 0.000 + 730 0 1 10.757 28.685 0.000 + 731 0 1 11.952 28.685 0.000 + 732 96 2 13.148 28.685 0.000 + 733 0 1 14.343 28.685 0.000 + 734 0 1 15.538 28.685 0.000 + 735 0 1 16.733 28.685 0.000 + 736 82 2 17.928 28.685 0.000 + 737 0 1 19.124 28.685 0.000 + 738 0 1 20.319 28.685 0.000 + 739 0 1 21.514 28.685 0.000 + 740 0 1 22.709 28.685 0.000 + 741 0 1 23.905 28.685 0.000 + 742 0 1 25.100 28.685 0.000 + 743 0 1 26.295 28.685 0.000 + 744 0 1 27.490 28.685 0.000 + 745 0 1 28.685 28.685 0.000 + 746 0 1 29.881 28.685 0.000 + 747 0 1 31.076 28.685 0.000 + 748 0 1 32.271 28.685 0.000 + 749 0 1 33.466 28.685 0.000 + 750 0 1 34.662 28.685 0.000 + 751 0 1 0.000 29.881 0.000 + 752 0 1 1.195 29.881 0.000 + 753 0 1 2.390 29.881 0.000 + 754 0 1 3.586 29.881 0.000 + 755 0 1 4.781 29.881 0.000 + 756 72 2 5.976 29.881 0.000 + 757 0 1 7.171 29.881 0.000 + 758 0 1 8.367 29.881 0.000 + 759 0 1 9.562 29.881 0.000 + 760 0 1 10.757 29.881 0.000 + 761 0 1 11.952 29.881 0.000 + 762 63 2 13.148 29.881 0.000 + 763 0 1 14.343 29.881 0.000 + 764 0 1 15.538 29.881 0.000 + 765 0 1 16.733 29.881 0.000 + 766 0 1 17.928 29.881 0.000 + 767 0 1 19.124 29.881 0.000 + 768 0 1 20.319 29.881 0.000 + 769 13 2 21.514 29.881 0.000 + 770 5 2 22.709 29.881 0.000 + 771 0 1 23.905 29.881 0.000 + 772 88 2 25.100 29.881 0.000 + 773 0 1 26.295 29.881 0.000 + 774 29 2 27.490 29.881 0.000 + 775 0 1 28.685 29.881 0.000 + 776 0 1 29.881 29.881 0.000 + 777 0 1 31.076 29.881 0.000 + 778 0 1 32.271 29.881 0.000 + 779 0 1 33.466 29.881 0.000 + 780 0 1 34.662 29.881 0.000 + 781 0 1 0.000 31.076 0.000 + 782 0 1 1.195 31.076 0.000 + 783 149 2 2.390 31.076 0.000 + 784 0 1 3.586 31.076 0.000 + 785 46 2 4.781 31.076 0.000 + 786 0 1 5.976 31.076 0.000 + 787 0 1 7.171 31.076 0.000 + 788 0 1 8.367 31.076 0.000 + 789 0 1 9.562 31.076 0.000 + 790 0 1 10.757 31.076 0.000 + 791 0 1 11.952 31.076 0.000 + 792 0 1 13.148 31.076 0.000 + 793 0 1 14.343 31.076 0.000 + 794 0 1 15.538 31.076 0.000 + 795 0 1 16.733 31.076 0.000 + 796 0 1 17.928 31.076 0.000 + 797 0 1 19.124 31.076 0.000 + 798 0 1 20.319 31.076 0.000 + 799 0 1 21.514 31.076 0.000 + 800 0 1 22.709 31.076 0.000 + 801 0 1 23.905 31.076 0.000 + 802 0 1 25.100 31.076 0.000 + 803 0 1 26.295 31.076 0.000 + 804 0 1 27.490 31.076 0.000 + 805 0 1 28.685 31.076 0.000 + 806 0 1 29.881 31.076 0.000 + 807 0 1 31.076 31.076 0.000 + 808 0 1 32.271 31.076 0.000 + 809 0 1 33.466 31.076 0.000 + 810 0 1 34.662 31.076 0.000 + 811 0 1 0.000 32.271 0.000 + 812 0 1 1.195 32.271 0.000 + 813 92 2 2.390 32.271 0.000 + 814 0 1 3.586 32.271 0.000 + 815 0 1 4.781 32.271 0.000 + 816 0 1 5.976 32.271 0.000 + 817 0 1 7.171 32.271 0.000 + 818 0 1 8.367 32.271 0.000 + 819 91 2 9.562 32.271 0.000 + 820 0 1 10.757 32.271 0.000 + 821 0 1 11.952 32.271 0.000 + 822 0 1 13.148 32.271 0.000 + 823 0 1 14.343 32.271 0.000 + 824 0 1 15.538 32.271 0.000 + 825 0 1 16.733 32.271 0.000 + 826 7 2 17.928 32.271 0.000 + 827 0 1 19.124 32.271 0.000 + 828 0 1 20.319 32.271 0.000 + 829 0 1 21.514 32.271 0.000 + 830 0 1 22.709 32.271 0.000 + 831 83 2 23.905 32.271 0.000 + 832 0 1 25.100 32.271 0.000 + 833 0 1 26.295 32.271 0.000 + 834 87 2 27.490 32.271 0.000 + 835 0 1 28.685 32.271 0.000 + 836 0 1 29.881 32.271 0.000 + 837 0 1 31.076 32.271 0.000 + 838 0 1 32.271 32.271 0.000 + 839 0 1 33.466 32.271 0.000 + 840 0 1 34.662 32.271 0.000 + 841 25 2 0.000 33.466 0.000 + 842 150 2 1.195 33.466 0.000 + 843 0 1 2.390 33.466 0.000 + 844 0 1 3.586 33.466 0.000 + 845 0 1 4.781 33.466 0.000 + 846 19 2 5.976 33.466 0.000 + 847 0 1 7.171 33.466 0.000 + 848 0 1 8.367 33.466 0.000 + 849 0 1 9.562 33.466 0.000 + 850 0 1 10.757 33.466 0.000 + 851 0 1 11.952 33.466 0.000 + 852 0 1 13.148 33.466 0.000 + 853 0 1 14.343 33.466 0.000 + 854 77 2 15.538 33.466 0.000 + 855 125 2 16.733 33.466 0.000 + 856 0 1 17.928 33.466 0.000 + 857 0 1 19.124 33.466 0.000 + 858 0 1 20.319 33.466 0.000 + 859 103 2 21.514 33.466 0.000 + 860 28 2 22.709 33.466 0.000 + 861 0 1 23.905 33.466 0.000 + 862 0 1 25.100 33.466 0.000 + 863 0 1 26.295 33.466 0.000 + 864 0 1 27.490 33.466 0.000 + 865 0 1 28.685 33.466 0.000 + 866 0 1 29.881 33.466 0.000 + 867 144 2 31.076 33.466 0.000 + 868 85 2 32.271 33.466 0.000 + 869 43 2 33.466 33.466 0.000 + 870 0 1 34.662 33.466 0.000 + 871 0 1 0.000 34.662 0.000 + 872 0 1 1.195 34.662 0.000 + 873 0 1 2.390 34.662 0.000 + 874 0 1 3.586 34.662 0.000 + 875 0 1 4.781 34.662 0.000 + 876 59 2 5.976 34.662 0.000 + 877 0 1 7.171 34.662 0.000 + 878 122 2 8.367 34.662 0.000 + 879 0 1 9.562 34.662 0.000 + 880 18 2 10.757 34.662 0.000 + 881 45 2 11.952 34.662 0.000 + 882 0 1 13.148 34.662 0.000 + 883 0 1 14.343 34.662 0.000 + 884 0 1 15.538 34.662 0.000 + 885 0 1 16.733 34.662 0.000 + 886 0 1 17.928 34.662 0.000 + 887 0 1 19.124 34.662 0.000 + 888 0 1 20.319 34.662 0.000 + 889 0 1 21.514 34.662 0.000 + 890 0 1 22.709 34.662 0.000 + 891 0 1 23.905 34.662 0.000 + 892 0 1 25.100 34.662 0.000 + 893 0 1 26.295 34.662 0.000 + 894 55 2 27.490 34.662 0.000 + 895 0 1 28.685 34.662 0.000 + 896 0 1 29.881 34.662 0.000 + 897 23 2 31.076 34.662 0.000 + 898 0 1 32.271 34.662 0.000 + 899 0 1 33.466 34.662 0.000 + 900 50 2 34.662 34.662 0.000 + 901 1 3 23.446 21.656 0.000 + 902 1 4 24.182 21.798 0.000 + 903 2 3 10.203 17.423 0.000 + 904 2 4 9.649 16.918 0.000 + 905 3 3 8.904 4.421 0.000 + 906 3 4 8.245 4.062 0.000 + 907 4 3 30.012 21.057 0.000 + 908 4 4 30.144 21.796 0.000 + 909 5 3 21.972 29.746 0.000 + 910 5 4 21.234 29.611 0.000 + 911 6 3 32.971 8.637 0.000 + 912 6 4 33.670 8.907 0.000 + 913 7 3 18.651 32.471 0.000 + 914 7 4 19.374 32.671 0.000 + 915 8 3 2.971 14.818 0.000 + 916 8 4 3.551 15.293 0.000 + 917 9 3 20.785 14.519 0.000 + 918 9 4 20.056 14.695 0.000 + 919 10 3 1.764 12.658 0.000 + 920 10 4 2.332 12.169 0.000 + 921 11 3 14.987 12.763 0.000 + 922 11 4 15.630 12.378 0.000 + 923 12 3 24.552 8.879 0.000 + 924 12 4 24.004 9.391 0.000 + 925 13 3 20.963 29.372 0.000 + 926 13 4 20.412 28.864 0.000 + 927 14 3 19.031 18.673 0.000 + 928 14 4 18.939 19.417 0.000 + 929 15 3 12.725 6.552 0.000 + 930 15 4 12.302 5.933 0.000 + 931 16 3 21.105 25.667 0.000 + 932 16 4 20.695 25.038 0.000 + 933 17 3 22.262 13.198 0.000 + 934 17 4 23.011 13.249 0.000 + 935 18 3 11.459 34.399 0.000 + 936 18 4 12.162 34.136 0.000 + 937 19 3 5.247 33.289 0.000 + 938 19 4 4.519 33.112 0.000 + 939 20 3 9.628 12.400 0.000 + 940 20 4 9.694 11.653 0.000 + 941 21 3 7.454 19.819 0.000 + 942 21 4 7.736 20.513 0.000 + 943 22 3 16.281 20.219 0.000 + 944 22 4 17.025 20.119 0.000 + 945 23 3 30.370 34.916 0.000 + 946 23 4 29.665 35.170 0.000 + 947 24 3 5.151 1.738 0.000 + 948 24 4 5.521 1.086 0.000 + 949 25 3 0.677 33.143 0.000 + 950 25 4 1.353 32.819 0.000 + 951 26 3 35.071 18.557 0.000 + 952 26 4 35.48000 19.186 0.000 + 953 27 3 29.131 15.504 0.000 + 954 27 4 28.382 15.470 0.000 + 955 28 3 23.456 33.395 0.000 + 956 28 4 24.202 33.323 0.000 + 957 29 3 27.682 29.156 0.000 + 958 29 4 27.873 28.430 0.000 + 959 30 3 8.964 5.523 0.000 + 960 30 4 8.366 5.071 0.000 + 961 31 3 20.874 24.710 0.000 + 962 31 4 20.233 24.320 0.000 + 963 32 3 18.692 11.339 0.000 + 964 32 4 18.260 10.726 0.000 + 965 33 3 29.828 6.724 0.000 + 966 33 4 29.776 7.472 0.000 + 967 34 3 34.865 9.089 0.000 + 968 34 4 35.068 9.811 0.000 + 969 35 3 13.797 0.821 0.000 + 970 35 4 14.447 0.446 0.000 + 971 36 3 11.184 20.935 0.000 + 972 36 4 11.611 21.552 0.000 + 973 37 3 3.927 23.237 0.000 + 974 37 4 4.268 22.569 0.000 + 975 38 3 4.589 5.506 0.000 + 976 38 4 4.396 6.231 0.000 + 977 39 3 10.244 24.788 0.000 + 978 39 4 10.926 24.477 0.000 + 979 40 3 26.755 5.384 0.000 + 980 40 4 27.215 4.792 0.000 + 981 41 3 12.578 4.368 0.000 + 982 41 4 13.204 3.955 0.000 + 983 42 3 32.760 12.521 0.000 + 984 42 4 33.250 13.089 0.000 + 985 43 3 33.337 34.205 0.000 + 986 43 4 33.208 34.944 0.000 + 987 44 3 30.490 17.201 0.000 + 988 44 4 29.903 17.669 0.000 + 989 45 3 11.350 34.215 0.000 + 990 45 4 10.747 33.768 0.000 + 991 46 3 4.207 31.559 0.000 + 992 46 4 3.633 32.042 0.000 + 993 47 3 29.131 2.378 0.000 + 994 47 4 28.381 2.365 0.000 + 995 48 3 6.841 5.303 0.000 + 996 48 4 6.510 4.630 0.000 + 997 49 3 30.612 3.421 0.000 + 998 49 4 31.344 3.255 0.000 + 999 50 3 33.918 34.761 0.000 + 1000 50 4 33.175 34.860 0.000 + 1001 51 3 25.725 17.220 0.000 + 1002 51 4 25.154 17.707 0.000 + 1003 52 3 12.684 0.590 0.000 + 1004 52 4 12.220 1.179 0.000 + 1005 53 3 35.273 6.447 0.000 + 1006 53 4 34.690 6.918 0.000 + 1007 54 3 2.829 13.756 0.000 + 1008 54 4 3.268 14.364 0.000 + 1009 55 3 26.740 34.672 0.000 + 1010 55 4 25.990 34.682 0.000 + 1011 56 3 2.771 18.477 0.000 + 1012 56 4 3.151 17.831 0.000 + 1013 57 3 9.635 12.699 0.000 + 1014 57 4 9.708 13.445 0.000 + 1015 58 3 13.791 19.631 0.000 + 1016 58 4 13.239 20.139 0.000 + 1017 59 3 5.234 34.554 0.000 + 1018 59 4 4.492 34.447 0.000 + 1019 60 3 33.007 15.392 0.000 + 1020 60 4 33.743 15.246 0.000 + 1021 61 3 19.707 10.034 0.000 + 1022 61 4 20.289 10.506 0.000 + 1023 62 3 24.178 19.620 0.000 + 1024 62 4 24.451 18.922 0.000 + 1025 63 3 13.735 30.347 0.000 + 1026 63 4 14.323 30.813 0.000 + 1027 64 3 25.743 9.947 0.000 + 1028 64 4 26.387 10.333 0.000 + 1029 65 3 12.610 17.093 0.000 + 1030 65 4 13.268 17.453 0.000 + 1031 66 3 14.320 26.741 0.000 + 1032 66 4 14.297 25.991 0.000 + 1033 67 3 6.831 5.449 0.000 + 1034 67 4 6.490 6.117 0.000 + 1035 68 3 5.518 10.617 0.000 + 1036 68 4 6.255 10.478 0.000 + 1037 69 3 13.604 25.229 0.000 + 1038 69 4 12.865 25.359 0.000 + 1039 70 3 8.831 15.371 0.000 + 1040 70 4 8.099 15.205 0.000 + 1041 71 3 25.741 8.873 0.000 + 1042 71 4 25.188 9.379 0.000 + 1043 72 3 5.314 30.232 0.000 + 1044 72 4 4.651 30.583 0.000 + 1045 73 3 27.864 11.407 0.000 + 1046 73 4 28.238 12.057 0.000 + 1047 74 3 25.724 2.806 0.000 + 1048 74 4 26.349 3.221 0.000 + 1049 75 3 5.357 0.715 0.000 + 1050 75 4 5.934 0.235 0.000 + 1051 76 3 11.355 20.772 0.000 + 1052 76 4 10.757 21.225 0.000 + 1053 77 3 15.439 32.723 0.000 + 1054 77 4 15.341 31.979 0.000 + 1055 78 3 6.689 28.919 0.000 + 1056 78 4 7.401 29.153 0.000 + 1057 79 3 28.300 20.871 0.000 + 1058 79 4 27.915 20.227 0.000 + 1059 80 3 19.267 15.997 0.000 + 1060 80 4 19.410 15.261 0.000 + 1061 81 3 20.293 15.092 0.000 + 1062 81 4 20.267 15.842 0.000 + 1063 82 3 18.458 29.216 0.000 + 1064 82 4 18.988 29.747 0.000 + 1065 83 3 23.376 32.803 0.000 + 1066 83 4 22.847 33.335 0.000 + 1067 84 3 27.938 17.869 0.000 + 1068 84 4 27.190 17.809 0.000 + 1069 85 3 33.021 33.461 0.000 + 1070 85 4 33.771 33.455 0.000 + 1071 86 3 0.552 18.315 0.000 + 1072 86 4 -0.09086 18.701 0.000 + 1073 87 3 28.026 32.796 0.000 + 1074 87 4 28.562 33.321 0.000 + 1075 88 3 24.351 29.925 0.000 + 1076 88 4 23.602 29.968 0.000 + 1077 89 3 7.621 1.112 0.000 + 1078 89 4 6.876 1.029 0.000 + 1079 90 3 7.084 10.307 0.000 + 1080 90 4 6.997 11.052 0.000 + 1081 91 3 8.815 32.201 0.000 + 1082 91 4 8.068 32.132 0.000 + 1083 92 3 3.044 31.903 0.000 + 1084 92 4 3.697 31.534 0.000 + 1085 93 3 26.170 16.278 0.000 + 1086 93 4 26.046 17.017 0.000 + 1087 94 3 10.380 0.547 0.000 + 1088 94 4 10.003 -0.10186 0.000 + 1089 95 3 0.419 29.308 0.000 + 1090 95 4 0.837 29.930 0.000 + 1091 96 3 13.712 28.191 0.000 + 1092 96 4 14.276 27.697 0.000 + 1093 97 3 22.218 7.800 0.000 + 1094 97 4 21.727 7.233 0.000 + 1095 98 3 18.383 25.220 0.000 + 1096 98 4 17.643 25.340 0.000 + 1097 99 3 13.873 20.929 0.000 + 1098 99 4 13.404 20.344 0.000 + 1099 100 3 19.838 22.480 0.000 + 1100 100 4 20.552 22.252 0.000 + 1101 101 3 10.516 12.663 0.000 + 1102 101 4 10.275 13.373 0.000 + 1103 102 3 17.336 14.803 0.000 + 1104 102 4 16.744 15.263 0.000 + 1105 103 3 21.530 32.717 0.000 + 1106 103 4 21.547 31.967 0.000 + 1107 104 3 13.517 6.629 0.000 + 1108 104 4 13.886 7.282 0.000 + 1109 105 3 28.227 27.629 0.000 + 1110 105 4 28.964 27.769 0.000 + 1111 106 3 12.490 14.866 0.000 + 1112 106 4 13.028 15.388 0.000 + 1113 107 3 32.890 16.018 0.000 + 1114 107 4 32.314 16.499 0.000 + 1115 108 3 23.345 6.672 0.000 + 1116 108 4 22.786 6.172 0.000 + 1117 109 3 16.215 10.435 0.000 + 1118 109 4 16.893 10.113 0.000 + 1119 110 3 26.961 0.531 0.000 + 1120 110 4 26.431 1.062 0.000 + 1121 111 3 33.932 15.366 0.000 + 1122 111 4 33.202 15.193 0.000 + 1123 112 3 5.463 17.616 0.000 + 1124 112 4 6.145 17.304 0.000 + 1125 113 3 1.707 1.505 0.000 + 1126 113 4 1.025 1.815 0.000 + 1127 114 3 11.142 0.643 0.000 + 1128 114 4 11.528 1.287 0.000 + 1129 115 3 2.236 29.419 0.000 + 1130 115 4 2.082 30.153 0.000 + 1131 116 3 20.514 5.252 0.000 + 1132 116 4 20.710 4.528 0.000 + 1133 117 3 21.836 2.908 0.000 + 1134 117 4 22.159 2.231 0.000 + 1135 118 3 9.519 21.068 0.000 + 1136 118 4 9.476 21.816 0.000 + 1137 119 3 2.875 1.818 0.000 + 1138 119 4 3.359 1.245 0.000 + 1139 120 3 11.204 11.996 0.000 + 1140 120 4 10.455 12.040 0.000 + 1141 121 3 10.817 4.333 0.000 + 1142 121 4 10.877 5.081 0.000 + 1143 122 3 7.965 34.028 0.000 + 1144 122 4 7.564 33.394 0.000 + 1145 123 3 34.366 18.435 0.000 + 1146 123 4 34.069 17.745 0.000 + 1147 124 3 10.053 26.554 0.000 + 1148 124 4 9.350 26.814 0.000 + 1149 125 3 16.151 32.994 0.000 + 1150 125 4 15.568 32.521 0.000 + 1151 126 3 26.788 22.144 0.000 + 1152 126 4 27.280 21.578 0.000 + 1153 127 3 17.615 19.638 0.000 + 1154 127 4 17.302 18.956 0.000 + 1155 128 3 29.412 35.671 0.000 + 1156 128 4 30.139 35.486 0.000 + 1157 129 3 13.808 3.060 0.000 + 1158 129 4 13.274 2.533 0.000 + 1159 130 3 24.601 21.792 0.000 + 1160 130 4 25.298 22.070 0.000 + 1161 131 3 14.805 5.371 0.000 + 1162 131 4 15.268 5.962 0.000 + 1163 132 3 28.138 6.659 0.000 + 1164 132 4 27.590 6.147 0.000 + 1165 133 3 7.913 16.622 0.000 + 1166 133 4 8.655 16.511 0.000 + 1167 134 3 6.561 11.483 0.000 + 1168 134 4 7.146 11.013 0.000 + 1169 135 3 21.057 27.626 0.000 + 1170 135 4 21.794 27.761 0.000 + 1171 136 3 15.201 5.306 0.000 + 1172 136 4 14.863 4.637 0.000 + 1173 137 3 34.687 17.483 0.000 + 1174 137 4 34.713 18.232 0.000 + 1175 138 3 23.371 24.747 0.000 + 1176 138 4 24.033 24.394 0.000 + 1177 139 3 0.161 0.733 0.000 + 1178 139 4 0.321 1.465 0.000 + 1179 140 3 6.715 24.032 0.000 + 1180 140 4 7.454 24.160 0.000 + 1181 141 3 30.509 24.315 0.000 + 1182 141 4 31.136 24.725 0.000 + 1183 142 3 23.433 18.125 0.000 + 1184 142 4 24.157 18.322 0.000 + 1185 143 3 17.679 25.807 0.000 + 1186 143 4 17.430 26.515 0.000 + 1187 144 3 30.332 33.373 0.000 + 1188 144 4 29.588 33.280 0.000 + 1189 145 3 27.947 6.108 0.000 + 1190 145 4 27.209 6.240 0.000 + 1191 146 3 4.081 9.292 0.000 + 1192 146 4 3.381 9.022 0.000 + 1193 147 3 15.306 18.641 0.000 + 1194 147 4 15.073 19.355 0.000 + 1195 148 3 35.231 25.514 0.000 + 1196 148 4 34.606 25.928 0.000 + 1197 149 3 2.992 30.628 0.000 + 1198 149 4 3.593 30.179 0.000 + 1199 150 3 1.855 33.110 0.000 + 1200 150 4 2.516 32.754 0.000 + Bonds - -1 1 1 1177 -2 1 10 1127 -3 1 12 1003 -4 1 24 1119 -5 1 25 1155 -6 1 33 1125 -7 1 35 1049 -8 1 38 1077 -9 1 40 1087 -10 1 42 969 -11 1 63 1137 -12 1 65 947 -13 1 82 1047 -14 1 86 993 -15 1 100 1141 -16 1 103 1157 -17 1 109 1133 -18 1 116 997 -19 1 125 975 -20 1 127 1033 -21 1 129 905 -22 1 131 981 -23 1 133 1161 -24 1 151 1005 -25 1 157 995 -26 1 159 959 -27 1 162 1107 -28 1 164 1171 -29 1 168 1131 -30 1 173 979 -31 1 175 1189 -32 1 176 965 -33 1 192 929 -34 1 201 1115 -35 1 205 1163 -36 1 230 1093 -37 1 232 923 -38 1 233 1041 -39 1 238 911 -40 1 240 967 -41 1 245 1191 -42 1 247 1079 -43 1 257 1021 -44 1 262 1027 -45 1 275 1035 -46 1 284 1117 -47 1 294 1045 -48 1 306 1167 -49 1 309 1013 -50 1 310 1101 -51 1 311 1139 -52 1 317 963 -53 1 328 983 -54 1 332 919 -55 1 333 1007 -56 1 339 939 -57 1 343 921 -58 1 349 933 -59 1 363 915 -60 1 371 1111 -61 1 376 1103 -62 1 378 1061 -63 1 379 917 -64 1 399 1039 -65 1 413 1085 -66 1 416 953 -67 1 418 1019 -68 1 419 1113 -69 1 420 1121 -70 1 427 1165 -71 1 431 1029 -72 1 437 1059 -73 1 443 1001 -74 1 447 987 -75 1 450 1173 -76 1 452 1071 -77 1 455 1123 -78 1 460 903 -79 1 464 1193 -80 1 467 927 -81 1 470 1183 -82 1 475 1067 -83 1 480 951 -84 1 483 1011 -85 1 487 941 -86 1 493 1015 -87 1 510 1145 -88 1 519 1135 -89 1 520 971 -90 1 521 1051 -91 1 524 943 -92 1 526 1153 -93 1 531 1023 -94 1 536 907 -95 1 553 1097 -96 1 560 901 -97 1 561 1159 -98 1 565 1057 -99 1 587 1099 -100 1 593 1151 -101 1 604 973 -102 1 606 1179 -103 1 626 1181 -104 1 631 1195 -105 1 639 977 -106 1 643 1037 -107 1 646 1185 -108 1 647 1095 -109 1 649 961 -110 1 650 1175 -111 1 670 1147 -112 1 679 931 -113 1 703 1031 -114 1 708 1169 -115 1 714 1109 -116 1 721 1089 -117 1 723 1129 -118 1 726 1055 -119 1 732 1091 -120 1 736 1063 -121 1 756 1043 -122 1 762 1025 -123 1 769 925 -124 1 770 909 -125 1 772 1075 -126 1 774 957 -127 1 783 1197 -128 1 785 991 -129 1 813 1083 -130 1 819 1081 -131 1 826 913 -132 1 831 1065 -133 1 834 1073 -134 1 841 949 -135 1 842 1199 -136 1 846 937 -137 1 854 1053 -138 1 855 1149 -139 1 859 1105 -140 1 860 955 -141 1 867 1187 -142 1 868 1069 -143 1 869 985 -144 1 876 1017 -145 1 878 1143 -146 1 880 935 -147 1 881 989 -148 1 894 1009 -149 1 897 945 -150 1 900 999 -151 1 901 902 -152 1 903 904 -153 1 905 906 -154 1 907 908 -155 1 909 910 -156 1 911 912 -157 1 913 914 -158 1 915 916 -159 1 917 918 -160 1 919 920 -161 1 921 922 -162 1 923 924 -163 1 925 926 -164 1 927 928 -165 1 929 930 -166 1 931 932 -167 1 933 934 -168 1 935 936 -169 1 937 938 -170 1 939 940 -171 1 941 942 -172 1 943 944 -173 1 945 946 -174 1 947 948 -175 1 949 950 -176 1 951 952 -177 1 953 954 -178 1 955 956 -179 1 957 958 -180 1 959 960 -181 1 961 962 -182 1 963 964 -183 1 965 966 -184 1 967 968 -185 1 969 970 -186 1 971 972 -187 1 973 974 -188 1 975 976 -189 1 977 978 -190 1 979 980 -191 1 981 982 -192 1 983 984 -193 1 985 986 -194 1 987 988 -195 1 989 990 -196 1 991 992 -197 1 993 994 -198 1 995 996 -199 1 997 998 -200 1 999 1000 -201 1 1001 1002 -202 1 1003 1004 -203 1 1005 1006 -204 1 1007 1008 -205 1 1009 1010 -206 1 1011 1012 -207 1 1013 1014 -208 1 1015 1016 -209 1 1017 1018 -210 1 1019 1020 -211 1 1021 1022 -212 1 1023 1024 -213 1 1025 1026 -214 1 1027 1028 -215 1 1029 1030 -216 1 1031 1032 -217 1 1033 1034 -218 1 1035 1036 -219 1 1037 1038 -220 1 1039 1040 -221 1 1041 1042 -222 1 1043 1044 -223 1 1045 1046 -224 1 1047 1048 -225 1 1049 1050 -226 1 1051 1052 -227 1 1053 1054 -228 1 1055 1056 -229 1 1057 1058 -230 1 1059 1060 -231 1 1061 1062 -232 1 1063 1064 -233 1 1065 1066 -234 1 1067 1068 -235 1 1069 1070 -236 1 1071 1072 -237 1 1073 1074 -238 1 1075 1076 -239 1 1077 1078 -240 1 1079 1080 -241 1 1081 1082 -242 1 1083 1084 -243 1 1085 1086 -244 1 1087 1088 -245 1 1089 1090 -246 1 1091 1092 -247 1 1093 1094 -248 1 1095 1096 -249 1 1097 1098 -250 1 1099 1100 -251 1 1101 1102 -252 1 1103 1104 -253 1 1105 1106 -254 1 1107 1108 -255 1 1109 1110 -256 1 1111 1112 -257 1 1113 1114 -258 1 1115 1116 -259 1 1117 1118 -260 1 1119 1120 -261 1 1121 1122 -262 1 1123 1124 -263 1 1125 1126 -264 1 1127 1128 -265 1 1129 1130 -266 1 1131 1132 -267 1 1133 1134 -268 1 1135 1136 -269 1 1137 1138 -270 1 1139 1140 -271 1 1141 1142 -272 1 1143 1144 -273 1 1145 1146 -274 1 1147 1148 -275 1 1149 1150 -276 1 1151 1152 -277 1 1153 1154 -278 1 1155 1156 -279 1 1157 1158 -280 1 1159 1160 -281 1 1161 1162 -282 1 1163 1164 -283 1 1165 1166 -284 1 1167 1168 -285 1 1169 1170 -286 1 1171 1172 -287 1 1173 1174 -288 1 1175 1176 -289 1 1177 1178 -290 1 1179 1180 -291 1 1181 1182 -292 1 1183 1184 -293 1 1185 1186 -294 1 1187 1188 -295 1 1189 1190 -296 1 1191 1192 -297 1 1193 1194 -298 1 1195 1196 -299 1 1197 1198 -300 1 1199 1200 - + + 1 1 560 901 + 2 1 901 902 + 3 1 460 903 + 4 1 903 904 + 5 1 129 905 + 6 1 905 906 + 7 1 536 907 + 8 1 907 908 + 9 1 770 909 + 10 1 909 910 + 11 1 238 911 + 12 1 911 912 + 13 1 826 913 + 14 1 913 914 + 15 1 363 915 + 16 1 915 916 + 17 1 379 917 + 18 1 917 918 + 19 1 332 919 + 20 1 919 920 + 21 1 343 921 + 22 1 921 922 + 23 1 232 923 + 24 1 923 924 + 25 1 769 925 + 26 1 925 926 + 27 1 467 927 + 28 1 927 928 + 29 1 192 929 + 30 1 929 930 + 31 1 679 931 + 32 1 931 932 + 33 1 349 933 + 34 1 933 934 + 35 1 880 935 + 36 1 935 936 + 37 1 846 937 + 38 1 937 938 + 39 1 339 939 + 40 1 939 940 + 41 1 487 941 + 42 1 941 942 + 43 1 524 943 + 44 1 943 944 + 45 1 897 945 + 46 1 945 946 + 47 1 65 947 + 48 1 947 948 + 49 1 841 949 + 50 1 949 950 + 51 1 480 951 + 52 1 951 952 + 53 1 416 953 + 54 1 953 954 + 55 1 860 955 + 56 1 955 956 + 57 1 774 957 + 58 1 957 958 + 59 1 159 959 + 60 1 959 960 + 61 1 649 961 + 62 1 961 962 + 63 1 317 963 + 64 1 963 964 + 65 1 176 965 + 66 1 965 966 + 67 1 240 967 + 68 1 967 968 + 69 1 42 969 + 70 1 969 970 + 71 1 520 971 + 72 1 971 972 + 73 1 604 973 + 74 1 973 974 + 75 1 125 975 + 76 1 975 976 + 77 1 639 977 + 78 1 977 978 + 79 1 173 979 + 80 1 979 980 + 81 1 131 981 + 82 1 981 982 + 83 1 328 983 + 84 1 983 984 + 85 1 869 985 + 86 1 985 986 + 87 1 447 987 + 88 1 987 988 + 89 1 881 989 + 90 1 989 990 + 91 1 785 991 + 92 1 991 992 + 93 1 86 993 + 94 1 993 994 + 95 1 157 995 + 96 1 995 996 + 97 1 116 997 + 98 1 997 998 + 99 1 900 999 + 100 1 999 1000 + 101 1 443 1001 + 102 1 1001 1002 + 103 1 12 1003 + 104 1 1003 1004 + 105 1 151 1005 + 106 1 1005 1006 + 107 1 333 1007 + 108 1 1007 1008 + 109 1 894 1009 + 110 1 1009 1010 + 111 1 483 1011 + 112 1 1011 1012 + 113 1 309 1013 + 114 1 1013 1014 + 115 1 493 1015 + 116 1 1015 1016 + 117 1 876 1017 + 118 1 1017 1018 + 119 1 418 1019 + 120 1 1019 1020 + 121 1 257 1021 + 122 1 1021 1022 + 123 1 531 1023 + 124 1 1023 1024 + 125 1 762 1025 + 126 1 1025 1026 + 127 1 262 1027 + 128 1 1027 1028 + 129 1 431 1029 + 130 1 1029 1030 + 131 1 703 1031 + 132 1 1031 1032 + 133 1 127 1033 + 134 1 1033 1034 + 135 1 275 1035 + 136 1 1035 1036 + 137 1 643 1037 + 138 1 1037 1038 + 139 1 399 1039 + 140 1 1039 1040 + 141 1 233 1041 + 142 1 1041 1042 + 143 1 756 1043 + 144 1 1043 1044 + 145 1 294 1045 + 146 1 1045 1046 + 147 1 82 1047 + 148 1 1047 1048 + 149 1 35 1049 + 150 1 1049 1050 + 151 1 521 1051 + 152 1 1051 1052 + 153 1 854 1053 + 154 1 1053 1054 + 155 1 726 1055 + 156 1 1055 1056 + 157 1 565 1057 + 158 1 1057 1058 + 159 1 437 1059 + 160 1 1059 1060 + 161 1 378 1061 + 162 1 1061 1062 + 163 1 736 1063 + 164 1 1063 1064 + 165 1 831 1065 + 166 1 1065 1066 + 167 1 475 1067 + 168 1 1067 1068 + 169 1 868 1069 + 170 1 1069 1070 + 171 1 452 1071 + 172 1 1071 1072 + 173 1 834 1073 + 174 1 1073 1074 + 175 1 772 1075 + 176 1 1075 1076 + 177 1 38 1077 + 178 1 1077 1078 + 179 1 247 1079 + 180 1 1079 1080 + 181 1 819 1081 + 182 1 1081 1082 + 183 1 813 1083 + 184 1 1083 1084 + 185 1 413 1085 + 186 1 1085 1086 + 187 1 40 1087 + 188 1 1087 1088 + 189 1 721 1089 + 190 1 1089 1090 + 191 1 732 1091 + 192 1 1091 1092 + 193 1 230 1093 + 194 1 1093 1094 + 195 1 647 1095 + 196 1 1095 1096 + 197 1 553 1097 + 198 1 1097 1098 + 199 1 587 1099 + 200 1 1099 1100 + 201 1 310 1101 + 202 1 1101 1102 + 203 1 376 1103 + 204 1 1103 1104 + 205 1 859 1105 + 206 1 1105 1106 + 207 1 162 1107 + 208 1 1107 1108 + 209 1 714 1109 + 210 1 1109 1110 + 211 1 371 1111 + 212 1 1111 1112 + 213 1 419 1113 + 214 1 1113 1114 + 215 1 201 1115 + 216 1 1115 1116 + 217 1 284 1117 + 218 1 1117 1118 + 219 1 24 1119 + 220 1 1119 1120 + 221 1 420 1121 + 222 1 1121 1122 + 223 1 455 1123 + 224 1 1123 1124 + 225 1 33 1125 + 226 1 1125 1126 + 227 1 10 1127 + 228 1 1127 1128 + 229 1 723 1129 + 230 1 1129 1130 + 231 1 168 1131 + 232 1 1131 1132 + 233 1 109 1133 + 234 1 1133 1134 + 235 1 519 1135 + 236 1 1135 1136 + 237 1 63 1137 + 238 1 1137 1138 + 239 1 311 1139 + 240 1 1139 1140 + 241 1 100 1141 + 242 1 1141 1142 + 243 1 878 1143 + 244 1 1143 1144 + 245 1 510 1145 + 246 1 1145 1146 + 247 1 670 1147 + 248 1 1147 1148 + 249 1 855 1149 + 250 1 1149 1150 + 251 1 593 1151 + 252 1 1151 1152 + 253 1 526 1153 + 254 1 1153 1154 + 255 1 25 1155 + 256 1 1155 1156 + 257 1 103 1157 + 258 1 1157 1158 + 259 1 561 1159 + 260 1 1159 1160 + 261 1 133 1161 + 262 1 1161 1162 + 263 1 205 1163 + 264 1 1163 1164 + 265 1 427 1165 + 266 1 1165 1166 + 267 1 306 1167 + 268 1 1167 1168 + 269 1 708 1169 + 270 1 1169 1170 + 271 1 164 1171 + 272 1 1171 1172 + 273 1 450 1173 + 274 1 1173 1174 + 275 1 650 1175 + 276 1 1175 1176 + 277 1 1 1177 + 278 1 1177 1178 + 279 1 606 1179 + 280 1 1179 1180 + 281 1 626 1181 + 282 1 1181 1182 + 283 1 470 1183 + 284 1 1183 1184 + 285 1 646 1185 + 286 1 1185 1186 + 287 1 867 1187 + 288 1 1187 1188 + 289 1 175 1189 + 290 1 1189 1190 + 291 1 245 1191 + 292 1 1191 1192 + 293 1 464 1193 + 294 1 1193 1194 + 295 1 631 1195 + 296 1 1195 1196 + 297 1 783 1197 + 298 1 1197 1198 + 299 1 842 1199 + 300 1 1199 1200 diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 b/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 index ce9547408c..ec0079818d 100644 --- a/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 +++ b/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 @@ -1,5 +1,5 @@ LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # 2d micelle simulation @@ -13,7 +13,7 @@ atom_style bond # Soft potential push-off read_data data.micelle - orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) 1 by 1 by 1 MPI processor grid reading atoms ... 1200 atoms @@ -25,9 +25,12 @@ read_data data.micelle 1 = max # of 1-3 neighbors 1 = max # of 1-4 neighbors 2 = max # of special neighbors + special bonds CPU = 0.000271559 secs + read_data CPU = 0.00115585 secs special_bonds fene 2 = max # of 1-2 neighbors 2 = max # of special neighbors + special bonds CPU = 8.39233e-05 secs pair_style soft 1.12246 pair_coeff * * 0.0 1.12246 @@ -60,54 +63,54 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 - 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 - 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 - 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 - 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 - 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 - 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 - 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 - 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 - 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 - 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 - 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 - 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 - 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 - 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 - 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 - 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 - 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 - 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 - 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 - 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 -Loop time of 0.108068 on 1 procs for 1000 steps with 1200 atoms + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.107201 on 1 procs for 1000 steps with 1200 atoms -Performance: 3997492.279 tau/day, 9253.454 timesteps/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4029800.456 tau/day, 9328.242 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.071711 | 0.071711 | 0.071711 | 0.0 | 66.36 -Bond | 0.0039465 | 0.0039465 | 0.0039465 | 0.0 | 3.65 -Neigh | 0.01743 | 0.01743 | 0.01743 | 0.0 | 16.13 -Comm | 0.0018625 | 0.0018625 | 0.0018625 | 0.0 | 1.72 -Output | 0.00015855 | 0.00015855 | 0.00015855 | 0.0 | 0.15 -Modify | 0.01058 | 0.01058 | 0.01058 | 0.0 | 9.79 -Other | | 0.00238 | | | 2.20 +Pair | 0.072035 | 0.072035 | 0.072035 | 0.0 | 67.20 +Bond | 0.0039918 | 0.0039918 | 0.0039918 | 0.0 | 3.72 +Neigh | 0.016078 | 0.016078 | 0.016078 | 0.0 | 15.00 +Comm | 0.0018375 | 0.0018375 | 0.0018375 | 0.0 | 1.71 +Output | 0.00016379 | 0.00016379 | 0.00016379 | 0.0 | 0.15 +Modify | 0.010665 | 0.010665 | 0.010665 | 0.0 | 9.95 +Other | | 0.002429 | | | 2.27 Nlocal: 1200 ave 1200 max 1200 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 206 ave 206 max 206 min +Nghost: 195 ave 195 max 195 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3191 ave 3191 max 3191 min +Neighs: 3136 ave 3136 max 3136 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3191 -Ave neighs/atom = 2.65917 +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 Ave special neighs/atom = 0.5 -Neighbor list builds = 99 +Neighbor list builds = 92 Dangerous builds = 0 unfix 3 @@ -150,16 +153,16 @@ thermo 1000 reset_timestep 0 group solvent molecule 0 -0 atoms in group solvent +750 atoms in group solvent group solute subtract all solvent -1200 atoms in group solute +450 atoms in group solute unfix 1 unfix 2 unfix 4 fix 1 solvent nve fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 -151 rigid bodies with 1200 atoms +150 rigid bodies with 450 atoms fix 4 all enforce2d run 20000 Neighbor list info ... @@ -176,111 +179,112 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 5.274 | 5.274 | 5.274 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.43824398 -1.7061976 0.094144249 -1.5297 35.328657 - 1000 0.44980495 -1.7618752 0.094144249 -1.5832051 -0.78239121 - 2000 0.4080548 -1.7592744 0.094144249 -1.5884498 3.7941359 - 3000 0.43543409 -1.7704837 0.094144249 -1.5945142 2.0801732 - 4000 0.43624218 -1.7752975 0.094144249 -1.5991761 5.3401997 - 5000 0.44526204 -1.7627039 0.094144249 -1.5848875 1.8074242 - 6000 0.45601171 -1.7578409 0.094144249 -1.5780044 3.6999235 - 7000 0.45000311 -1.7707158 0.094144249 -1.5920085 14.198063 - 8000 0.49199853 -1.7647643 0.094144249 -1.5781653 1.1767602 - 9000 0.42662498 -1.7719397 0.094144249 -1.5976255 1.8316615 - 10000 0.44225069 -1.7704012 0.094144249 -1.5931507 4.2515329 - 11000 0.54415369 -1.7634927 0.094144249 -1.5670929 7.626065 - 12000 0.42501235 -1.7698463 0.094144249 -1.5958351 1.4118043 - 13000 0.48382538 -1.7497323 0.094144249 -1.5646692 2.2441707 - 14000 0.4376704 -1.7658795 0.094144249 -1.5894897 2.7170856 - 15000 0.42644426 -1.758103 0.094144249 -1.5838228 5.6129465 - 16000 0.37371943 -1.7881668 0.094144249 -1.6237944 4.0731922 - 17000 0.42320956 -1.7831129 0.094144249 -1.6094406 -4.2042077 - 18000 0.47319029 -1.7642512 0.094144249 -1.5811866 1.8859862 - 19000 0.45117547 -1.7736983 0.094144249 -1.5947706 -1.3566752 - 20000 0.48993295 -1.7820573 0.094144249 -1.5958465 -0.63347623 -Loop time of 3.56168 on 1 procs for 20000 steps with 1200 atoms + 0 0.44603578 -1.7056163 0.08808163 -1.2555023 3.4039736 + 1000 0.46008168 -1.9040837 0.08808163 -1.4425691 0.93225457 + 2000 0.44520658 -1.9317253 0.08808163 -1.4822843 3.8192896 + 3000 0.43988556 -1.945898 0.08808163 -1.5007759 3.0371634 + 4000 0.4646519 -1.9753553 0.08808163 -1.5101312 -1.8041178 + 5000 0.4362993 -1.9763715 0.08808163 -1.5341603 1.5037284 + 6000 0.47007384 -1.9833154 0.08808163 -1.5136905 2.1227653 + 7000 0.44854623 -1.9914288 0.08808163 -1.5392772 3.9458099 + 8000 0.43841372 -1.9779603 0.08808163 -1.5340328 -4.5429769 + 9000 0.4518303 -1.9834387 0.08808163 -1.5286215 4.4230447 + 10000 0.43562904 -2.001471 0.08808163 -1.5598038 1.8919582 + 11000 0.44014575 -1.9820611 0.08808163 -1.5367278 -2.1189418 + 12000 0.44466956 -2.0134014 0.08808163 -1.5643963 -2.5218497 + 13000 0.45274369 -2.021443 0.08808163 -1.5658844 2.4795173 + 14000 0.44742645 -2.011108 0.08808163 -1.5598653 -0.74697767 + 15000 0.4674843 -2.024737 0.08808163 -1.5572139 -1.9539999 + 16000 0.45610154 -2.0401029 0.08808163 -1.5818189 -0.53082066 + 17000 0.44679292 -2.0365577 0.08808163 -1.5858291 -6.5040295 + 18000 0.44279107 -2.0500326 0.08808163 -1.6025522 -0.051597102 + 19000 0.45603993 -2.0306289 0.08808163 -1.5723948 1.0986608 + 20000 0.44519606 -2.0412229 0.08808163 -1.5917904 -1.0406746 +Loop time of 3.68102 on 1 procs for 20000 steps with 1200 atoms -Performance: 2425823.418 tau/day, 5615.332 timesteps/s +Performance: 2347175.802 tau/day, 5433.277 timesteps/s 99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.7048 | 1.7048 | 1.7048 | 0.0 | 47.86 -Bond | 0.079658 | 0.079658 | 0.079658 | 0.0 | 2.24 -Neigh | 0.36319 | 0.36319 | 0.36319 | 0.0 | 10.20 -Comm | 0.042085 | 0.042085 | 0.042085 | 0.0 | 1.18 -Output | 0.00021696 | 0.00021696 | 0.00021696 | 0.0 | 0.01 -Modify | 1.3169 | 1.3169 | 1.3169 | 0.0 | 36.97 -Other | | 0.05485 | | | 1.54 +Pair | 1.7349 | 1.7349 | 1.7349 | 0.0 | 47.13 +Bond | 0.079483 | 0.079483 | 0.079483 | 0.0 | 2.16 +Neigh | 0.49063 | 0.49063 | 0.49063 | 0.0 | 13.33 +Comm | 0.049093 | 0.049093 | 0.049093 | 0.0 | 1.33 +Output | 0.00022578 | 0.00022578 | 0.00022578 | 0.0 | 0.01 +Modify | 1.273 | 1.273 | 1.273 | 0.0 | 34.58 +Other | | 0.05369 | | | 1.46 Nlocal: 1200 ave 1200 max 1200 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 414 ave 414 max 414 min +Nghost: 395 ave 395 max 395 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 8824 ave 8824 max 8824 min +Neighs: 8915 ave 8915 max 8915 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 8824 -Ave neighs/atom = 7.35333 +Total # of neighbors = 8915 +Ave neighs/atom = 7.42917 Ave special neighs/atom = 0.5 -Neighbor list builds = 1148 +Neighbor list builds = 1580 Dangerous builds = 0 unfix 5 unfix 4 fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 -151 rigid bodies with 1200 atoms - 25.2208 = max distance from body owner to body atom + create bodies CPU = 0.00012517 secs +150 rigid bodies with 450 atoms + 1.04536 = max distance from body owner to body atom fix 4 all enforce2d run 20000 -Per MPI rank memory allocation (min/avg/max) = 8.642 | 8.642 | 8.642 Mbytes +Per MPI rank memory allocation (min/avg/max) = 8.633 | 8.633 | 8.633 Mbytes Step Temp E_pair E_mol TotEng Press - 20000 0.48993295 -1.7820573 0.094144249 -1.5958465 3.267595 - 21000 0.42136691 -1.7767171 0.094144249 -1.6033909 1.1186996 - 22000 0.42456205 -1.7606471 0.094144249 -1.5867205 2.8866506 - 23000 0.48026533 -1.7693864 0.094144249 -1.5849923 7.3708907 - 24000 0.51908347 -1.7748052 0.094144249 -1.5831165 -0.88177558 - 25000 0.46033763 -1.7615973 0.094144249 -1.580948 7.0803034 - 26000 0.48667124 -1.7625783 0.094144249 -1.5769804 -11.557404 - 27000 0.45085745 -1.7833193 0.094144249 -1.6044514 6.5390499 - 28000 0.47333185 -1.7561049 0.094144249 -1.5730137 -3.2587604 - 29000 0.46380712 -1.7830962 0.094144249 -1.6017949 7.1120026 - 30000 0.41845082 -1.7808054 0.094144249 -1.6080272 3.6435588 - 31000 0.510966 -1.7649896 0.094144249 -1.5748263 1.4979844 - 32000 0.42169482 -1.7623593 0.094144249 -1.5889716 2.6130718 - 33000 0.43724881 -1.769415 0.094144249 -1.5931044 1.1205627 - 34000 0.43753147 -1.7878022 0.094144249 -1.6114385 9.0463054 - 35000 0.44230686 -1.7554417 0.094144249 -1.5781806 3.776513 - 36000 0.39564972 -1.7614398 0.094144249 -1.5929464 4.6243057 - 37000 0.39176208 -1.7586072 0.094144249 -1.5908443 -2.1444581 - 38000 0.4601972 -1.7727349 0.094144249 -1.5921119 9.513042 - 39000 0.42107042 -1.7703643 0.094144249 -1.5970939 5.3409161 - 40000 0.45100889 -1.7794839 0.094144249 -1.6005876 -8.2877164 -Loop time of 3.5613 on 1 procs for 20000 steps with 1200 atoms + 20000 0.44519606 -2.0412229 0.08808163 -1.5917904 1.3058893 + 21000 0.4353376 -2.0483342 0.08808163 -1.6069035 0.53023317 + 22000 0.44034324 -2.0416876 0.08808163 -1.5961941 4.0327077 + 23000 0.4685403 -2.05295 0.08808163 -1.5845698 3.6792349 + 24000 0.44872075 -2.0320623 0.08808163 -1.579769 -2.0476923 + 25000 0.46829594 -2.0671408 0.08808163 -1.5989589 2.180811 + 26000 0.45257544 -2.0418792 0.08808163 -1.5864572 3.3924018 + 27000 0.44269664 -2.0409905 0.08808163 -1.5935868 -0.17012673 + 28000 0.46961216 -2.0552479 0.08808163 -1.5859978 -7.2870888 + 29000 0.46683129 -2.0438334 0.08808163 -1.5768404 3.0583141 + 30000 0.44262228 -2.036737 0.08808163 -1.5893937 0.087520915 + 31000 0.43517227 -2.0479672 0.08808163 -1.6066708 -0.3426009 + 32000 0.44543779 -2.0538031 0.08808163 -1.6041744 -0.2093148 + 33000 0.44629079 -2.0409901 0.08808163 -1.5906691 3.310113 + 34000 0.43058831 -2.0713827 0.08808163 -1.6338069 0.14128843 + 35000 0.44546512 -2.0427068 0.08808163 -1.593056 -3.1386697 + 36000 0.42971129 -2.0527435 0.08808163 -1.6158795 -2.7334963 + 37000 0.44707969 -2.0461803 0.08808163 -1.595219 -3.8777678 + 38000 0.43150818 -2.0435276 0.08808163 -1.6052052 0.2905487 + 39000 0.44463343 -2.0522113 0.08808163 -1.6032355 3.543123 + 40000 0.44582593 -2.052213 0.08808163 -1.6022693 1.1486536 +Loop time of 3.69012 on 1 procs for 20000 steps with 1200 atoms -Performance: 2426077.738 tau/day, 5615.921 timesteps/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2341388.948 tau/day, 5419.882 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.7113 | 1.7113 | 1.7113 | 0.0 | 48.05 -Bond | 0.079594 | 0.079594 | 0.079594 | 0.0 | 2.23 -Neigh | 0.36249 | 0.36249 | 0.36249 | 0.0 | 10.18 -Comm | 0.042057 | 0.042057 | 0.042057 | 0.0 | 1.18 -Output | 0.00020933 | 0.00020933 | 0.00020933 | 0.0 | 0.01 -Modify | 1.3102 | 1.3102 | 1.3102 | 0.0 | 36.79 -Other | | 0.05553 | | | 1.56 +Pair | 1.756 | 1.756 | 1.756 | 0.0 | 47.59 +Bond | 0.079221 | 0.079221 | 0.079221 | 0.0 | 2.15 +Neigh | 0.49085 | 0.49085 | 0.49085 | 0.0 | 13.30 +Comm | 0.048317 | 0.048317 | 0.048317 | 0.0 | 1.31 +Output | 0.0002315 | 0.0002315 | 0.0002315 | 0.0 | 0.01 +Modify | 1.2616 | 1.2616 | 1.2616 | 0.0 | 34.19 +Other | | 0.05386 | | | 1.46 Nlocal: 1200 ave 1200 max 1200 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 405 ave 405 max 405 min +Nghost: 393 ave 393 max 393 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 8806 ave 8806 max 8806 min +Neighs: 9091 ave 9091 max 9091 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 8806 -Ave neighs/atom = 7.33833 +Total # of neighbors = 9091 +Ave neighs/atom = 7.57583 Ave special neighs/atom = 0.5 -Neighbor list builds = 1149 +Neighbor list builds = 1582 Dangerous builds = 0 Total wall time: 0:00:07 diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 b/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 index 40ffc1c3f8..a6687a3c00 100644 --- a/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 +++ b/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 @@ -1,5 +1,5 @@ LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # 2d micelle simulation @@ -13,7 +13,7 @@ atom_style bond # Soft potential push-off read_data data.micelle - orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) 2 by 2 by 1 MPI processor grid reading atoms ... 1200 atoms @@ -25,9 +25,12 @@ read_data data.micelle 1 = max # of 1-3 neighbors 1 = max # of 1-4 neighbors 2 = max # of special neighbors + special bonds CPU = 0.000175714 secs + read_data CPU = 0.00145626 secs special_bonds fene 2 = max # of 1-2 neighbors 2 = max # of special neighbors + special bonds CPU = 7.22408e-05 secs pair_style soft 1.12246 pair_coeff * * 0.0 1.12246 @@ -58,56 +61,56 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/2d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.758 | 3.758 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 - 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 - 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 - 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 - 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 - 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 - 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 - 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 - 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 - 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 - 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 - 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 - 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 - 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 - 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 - 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 - 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 - 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 - 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 - 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 - 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 -Loop time of 0.0372003 on 4 procs for 1000 steps with 1200 atoms + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.0389124 on 4 procs for 1000 steps with 1200 atoms -Performance: 11612799.682 tau/day, 26881.481 timesteps/s -97.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 11101855.138 tau/day, 25698.739 timesteps/s +95.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.016521 | 0.017472 | 0.018793 | 0.6 | 46.97 -Bond | 0.00099087 | 0.0011039 | 0.0012043 | 0.2 | 2.97 -Neigh | 0.004885 | 0.0049515 | 0.0050163 | 0.1 | 13.31 -Comm | 0.0060358 | 0.007614 | 0.0085688 | 1.1 | 20.47 -Output | 0.00021625 | 0.00048053 | 0.0012674 | 0.0 | 1.29 -Modify | 0.0035112 | 0.0037069 | 0.0038922 | 0.2 | 9.96 -Other | | 0.001872 | | | 5.03 +Pair | 0.016776 | 0.017405 | 0.018435 | 0.5 | 44.73 +Bond | 0.0010033 | 0.0011995 | 0.0015519 | 0.6 | 3.08 +Neigh | 0.0044944 | 0.0045093 | 0.0045218 | 0.0 | 11.59 +Comm | 0.0080328 | 0.0093863 | 0.010242 | 0.9 | 24.12 +Output | 0.00021577 | 0.00027579 | 0.00045323 | 0.0 | 0.71 +Modify | 0.0034575 | 0.0036355 | 0.0040002 | 0.4 | 9.34 +Other | | 0.002501 | | | 6.43 -Nlocal: 300 ave 305 max 295 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Nghost: 105.5 ave 109 max 102 min -Histogram: 1 1 0 0 0 0 0 0 1 1 -Neighs: 797.75 ave 810 max 792 min -Histogram: 2 0 1 0 0 0 0 0 0 1 +Nlocal: 300 ave 305 max 292 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 100.25 ave 108 max 93 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Neighs: 784 ave 815 max 739 min +Histogram: 1 0 0 0 0 0 1 1 0 1 -Total # of neighbors = 3191 -Ave neighs/atom = 2.65917 +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 Ave special neighs/atom = 0.5 -Neighbor list builds = 99 +Neighbor list builds = 92 Dangerous builds = 0 unfix 3 @@ -150,16 +153,16 @@ thermo 1000 reset_timestep 0 group solvent molecule 0 -0 atoms in group solvent +750 atoms in group solvent group solute subtract all solvent -1200 atoms in group solute +450 atoms in group solute unfix 1 unfix 2 unfix 4 fix 1 solvent nve fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 -151 rigid bodies with 1200 atoms +150 rigid bodies with 450 atoms fix 4 all enforce2d run 20000 Neighbor list info ... @@ -174,113 +177,114 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/2d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 5.251 | 5.251 | 5.251 Mbytes +Per MPI rank memory allocation (min/avg/max) = 5.251 | 5.282 | 5.374 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.43824398 -1.7061976 0.094144249 -1.5297 35.328657 - 1000 0.44980495 -1.7618752 0.094144249 -1.5832051 -0.78239121 - 2000 0.40805491 -1.7592744 0.094144249 -1.5884498 3.794136 - 3000 0.43543405 -1.770484 0.094144249 -1.5945145 2.0801519 - 4000 0.43643917 -1.7753492 0.094144249 -1.5991908 5.3403198 - 5000 0.45205579 -1.7629096 0.094144249 -1.5838165 1.9144765 - 6000 0.44220306 -1.7576322 0.094144249 -1.5803906 3.6971068 - 7000 0.4462785 -1.7647165 0.094144249 -1.586709 14.683449 - 8000 0.50268339 -1.7617766 0.094144249 -1.5731698 0.60117188 - 9000 0.4185915 -1.7725393 0.094144249 -1.5997347 1.5667222 - 10000 0.41970397 -1.7644115 0.094144249 -1.5913979 3.8986052 - 11000 0.51816323 -1.766257 0.094144249 -1.5747412 7.1402513 - 12000 0.42512195 -1.7744735 0.094144249 -1.6004418 1.4082461 - 13000 0.47476574 -1.7409224 0.094144249 -1.5575618 2.340655 - 14000 0.42835873 -1.7615597 0.094144249 -1.5869197 2.3617147 - 15000 0.44020572 -1.7540214 0.094144249 -1.5771552 6.6780537 - 16000 0.40238891 -1.795345 0.094144249 -1.6255852 3.9488478 - 17000 0.45191638 -1.7874875 0.094144249 -1.6084206 -4.6290962 - 18000 0.49064485 -1.7647644 0.094144249 -1.5784198 1.7453052 - 19000 0.46160705 -1.7769365 0.094144249 -1.5960486 -1.1662864 - 20000 0.47959574 -1.7800673 0.094144249 -1.595799 -0.98697816 -Loop time of 1.7116 on 4 procs for 20000 steps with 1200 atoms + 0 0.44603578 -1.7056163 0.08808163 -1.2555023 3.4039736 + 1000 0.46008163 -1.9040835 0.08808163 -1.4425689 0.93225869 + 2000 0.44943348 -1.9355135 0.08808163 -1.4826417 3.8399671 + 3000 0.4448437 -1.9480307 0.08808163 -1.4988842 2.5506553 + 4000 0.46013872 -1.9783821 0.08808163 -1.5168212 -1.8963215 + 5000 0.45520233 -1.9659462 0.08808163 -1.5083921 1.9238897 + 6000 0.44942049 -1.9663403 0.08808163 -1.513479 3.0633512 + 7000 0.45975758 -1.988462 0.08808163 -1.5272105 4.8267309 + 8000 0.45125238 -1.9913522 0.08808163 -1.5370041 -4.6644852 + 9000 0.45863606 -1.9792375 0.08808163 -1.5188962 4.3655071 + 10000 0.46264541 -1.9864611 0.08808163 -1.5228656 2.2176464 + 11000 0.45048361 -1.9907235 0.08808163 -1.5369994 -0.055360699 + 12000 0.44536719 -2.012875 0.08808163 -1.5633037 -0.2583823 + 13000 0.44212663 -2.0060111 0.08808163 -1.55907 3.3616171 + 14000 0.44984353 -2.0335408 0.08808163 -1.5803361 -0.21585645 + 15000 0.44896672 -2.0385265 0.08808163 -1.5860335 -4.6186206 + 16000 0.46694997 -2.032795 0.08808163 -1.5657056 0.53443281 + 17000 0.43208201 -2.0272255 0.08808163 -1.5884373 -6.5239975 + 18000 0.43281873 -2.0331268 0.08808163 -1.5937406 -0.048319943 + 19000 0.44704527 -2.0286742 0.08808163 -1.5777408 1.6356417 + 20000 0.44279735 -2.0443561 0.08808163 -1.5968706 -3.8337952 +Loop time of 1.71924 on 4 procs for 20000 steps with 1200 atoms -Performance: 5047917.690 tau/day, 11684.995 timesteps/s -97.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 5025468.853 tau/day, 11633.030 timesteps/s +98.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.37681 | 0.38516 | 0.39458 | 1.0 | 22.50 -Bond | 0.020415 | 0.021627 | 0.022797 | 0.7 | 1.26 -Neigh | 0.10577 | 0.10609 | 0.10629 | 0.1 | 6.20 -Comm | 0.13426 | 0.14677 | 0.15824 | 2.6 | 8.58 -Output | 0.0002625 | 0.00055283 | 0.0014203 | 0.0 | 0.03 -Modify | 0.98032 | 0.99445 | 1.0072 | 1.0 | 58.10 -Other | | 0.05693 | | | 3.33 +Pair | 0.39864 | 0.40873 | 0.42192 | 1.6 | 23.77 +Bond | 0.02118 | 0.021816 | 0.022785 | 0.4 | 1.27 +Neigh | 0.13931 | 0.14031 | 0.14117 | 0.2 | 8.16 +Comm | 0.13974 | 0.15328 | 0.16884 | 3.3 | 8.92 +Output | 0.00026131 | 0.00044435 | 0.00099206 | 0.0 | 0.03 +Modify | 0.93275 | 0.94138 | 0.95072 | 0.7 | 54.76 +Other | | 0.05327 | | | 3.10 -Nlocal: 300 ave 303 max 297 min -Histogram: 2 0 0 0 0 0 0 0 0 2 -Nghost: 218.25 ave 220 max 216 min -Histogram: 1 0 0 0 0 1 0 1 0 1 -Neighs: 2200 ave 2256 max 2100 min -Histogram: 1 0 0 0 0 0 1 0 0 2 +Nlocal: 300 ave 303 max 298 min +Histogram: 1 0 1 0 1 0 0 0 0 1 +Nghost: 218.5 ave 226 max 215 min +Histogram: 2 1 0 0 0 0 0 0 0 1 +Neighs: 2258.75 ave 2283 max 2216 min +Histogram: 1 0 0 0 0 0 1 0 1 1 -Total # of neighbors = 8800 -Ave neighs/atom = 7.33333 +Total # of neighbors = 9035 +Ave neighs/atom = 7.52917 Ave special neighs/atom = 0.5 -Neighbor list builds = 1151 +Neighbor list builds = 1580 Dangerous builds = 0 unfix 5 unfix 4 fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 -151 rigid bodies with 1200 atoms - 25.2208 = max distance from body owner to body atom + create bodies CPU = 5.43594e-05 secs +150 rigid bodies with 450 atoms + 0.916597 = max distance from body owner to body atom fix 4 all enforce2d run 20000 -Per MPI rank memory allocation (min/avg/max) = 8.565 | 8.566 | 8.567 Mbytes +Per MPI rank memory allocation (min/avg/max) = 8.568 | 8.6 | 8.691 Mbytes Step Temp E_pair E_mol TotEng Press - 20000 0.47959574 -1.7800673 0.094144249 -1.595799 2.1834568 - 21000 0.45192649 -1.7677564 0.094144249 -1.5886876 5.0300353 - 22000 0.48175977 -1.7671661 0.094144249 -1.5824911 2.3411062 - 23000 0.46753063 -1.7602689 0.094144249 -1.5782678 5.8757813 - 24000 0.45718166 -1.7635844 0.094144249 -1.5835281 -1.1327974 - 25000 0.45674572 -1.7712591 0.094144249 -1.5912847 -6.0018365 - 26000 0.44622761 -1.7601243 0.094144249 -1.5821264 5.1254356 - 27000 0.41586479 -1.7807035 0.094144249 -1.6084114 -5.3810671 - 28000 0.41308577 -1.7679534 0.094144249 -1.5961835 0.71052669 - 29000 0.43702439 -1.7690454 0.094144249 -1.592777 1.9213508 - 30000 0.43066072 -1.7724511 0.094144249 -1.5973785 2.4355851 - 31000 0.48969168 -1.7625278 0.094144249 -1.5763624 5.7700505 - 32000 0.39884729 -1.7714506 0.094144249 -1.6023563 11.053577 - 33000 0.4347186 -1.7737143 0.094144249 -1.5978792 -2.6480619 - 34000 0.44709286 -1.7661896 0.094144249 -1.5880292 6.5468593 - 35000 0.45546222 -1.7718546 0.094144249 -1.5921214 0.52103696 - 36000 0.48138774 -1.770575 0.094144249 -1.58597 1.1512536 - 37000 0.42613993 -1.7639698 0.094144249 -1.5897468 1.9532262 - 38000 0.45269407 -1.7624131 0.094144249 -1.5832001 4.9018622 - 39000 0.47640838 -1.7756583 0.094144249 -1.591989 0.3741248 - 40000 0.50397124 -1.7866289 0.094144249 -1.59778 1.704803 -Loop time of 1.21517 on 4 procs for 20000 steps with 1200 atoms + 20000 0.44279735 -2.0443561 0.08808163 -1.5968706 -1.033643 + 21000 0.4529129 -2.049461 0.08808163 -1.5937651 0.93160285 + 22000 0.45039188 -2.0530092 0.08808163 -1.5993595 -0.10608965 + 23000 0.45261583 -2.0336042 0.08808163 -1.5781494 -2.5769871 + 24000 0.4608331 -2.0404645 0.08808163 -1.57834 3.1931675 + 25000 0.43479001 -2.0617104 0.08808163 -1.6207242 2.8190122 + 26000 0.47009651 -2.0754873 0.08808163 -1.605844 -0.9158501 + 27000 0.45002704 -2.0782104 0.08808163 -1.6248568 0.98629661 + 28000 0.45126136 -2.0592619 0.08808163 -1.6049065 0.03305448 + 29000 0.44355328 -2.0572858 0.08808163 -1.6091868 -6.0797989 + 30000 0.45053899 -2.0530953 0.08808163 -1.5993261 0.38382951 + 31000 0.46931923 -2.0718827 0.08808163 -1.6028703 2.2346891 + 32000 0.45348857 -2.0744024 0.08808163 -1.6182393 4.5028966 + 33000 0.44767742 -2.0597127 0.08808163 -1.6082662 -2.8021641 + 34000 0.45287544 -2.0857303 0.08808163 -1.6300648 -5.384091 + 35000 0.44743898 -2.0927246 0.08808163 -1.6414717 1.4800508 + 36000 0.45627028 -2.0720546 0.08808163 -1.6136336 -2.9961696 + 37000 0.4641334 -2.0701098 0.08808163 -1.6053065 8.4186854 + 38000 0.45922901 -2.0962331 0.08808163 -1.6354106 0.38361763 + 39000 0.4692834 -2.0573815 0.08808163 -1.5883982 -2.2177345 + 40000 0.46206931 -2.057851 0.08808163 -1.5947231 -1.0405727 +Loop time of 1.25476 on 4 procs for 20000 steps with 1200 atoms -Performance: 7110090.321 tau/day, 16458.542 timesteps/s +Performance: 6885775.862 tau/day, 15939.296 timesteps/s 98.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.38099 | 0.38923 | 0.40336 | 1.4 | 32.03 -Bond | 0.020087 | 0.021536 | 0.022812 | 0.7 | 1.77 -Neigh | 0.10813 | 0.10901 | 0.10931 | 0.2 | 8.97 -Comm | 0.12643 | 0.14414 | 0.15438 | 3.0 | 11.86 -Output | 0.00025606 | 0.00054097 | 0.0013928 | 0.0 | 0.04 -Modify | 0.50525 | 0.50958 | 0.52151 | 1.0 | 41.93 -Other | | 0.04114 | | | 3.39 +Pair | 0.40627 | 0.43037 | 0.45515 | 2.6 | 34.30 +Bond | 0.020504 | 0.021573 | 0.022739 | 0.5 | 1.72 +Neigh | 0.14337 | 0.14438 | 0.1453 | 0.2 | 11.51 +Comm | 0.13776 | 0.16647 | 0.19351 | 5.0 | 13.27 +Output | 0.00025082 | 0.00052994 | 0.0013635 | 0.0 | 0.04 +Modify | 0.45467 | 0.45822 | 0.46259 | 0.5 | 36.52 +Other | | 0.03321 | | | 2.65 -Nlocal: 300 ave 303 max 296 min -Histogram: 1 0 0 0 1 0 0 0 1 1 -Nghost: 216 ave 221 max 212 min -Histogram: 1 0 0 1 1 0 0 0 0 1 -Neighs: 2205 ave 2277 max 2105 min -Histogram: 1 0 0 0 0 0 2 0 0 1 +Nlocal: 300 ave 304 max 293 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 215.25 ave 217 max 213 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Neighs: 2340 ave 2378 max 2290 min +Histogram: 1 0 0 1 0 0 0 0 0 2 -Total # of neighbors = 8820 -Ave neighs/atom = 7.35 +Total # of neighbors = 9360 +Ave neighs/atom = 7.8 Ave special neighs/atom = 0.5 -Neighbor list builds = 1150 +Neighbor list builds = 1579 Dangerous builds = 0 -Total wall time: 0:00:02 +Total wall time: 0:00:03 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.1 b/examples/micelle/log.28Feb2019.micelle.g++.1 index d407a9a854..c2bbc7cde4 100644 --- a/examples/micelle/log.28Feb2019.micelle.g++.1 +++ b/examples/micelle/log.28Feb2019.micelle.g++.1 @@ -1,5 +1,5 @@ LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # 2d micelle simulation @@ -13,7 +13,7 @@ atom_style bond # Soft potential push-off read_data data.micelle - orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) 1 by 1 by 1 MPI processor grid reading atoms ... 1200 atoms @@ -25,9 +25,12 @@ read_data data.micelle 1 = max # of 1-3 neighbors 1 = max # of 1-4 neighbors 2 = max # of special neighbors + special bonds CPU = 0.000394821 secs + read_data CPU = 0.00212336 secs special_bonds fene 2 = max # of 1-2 neighbors 2 = max # of special neighbors + special bonds CPU = 0.00018549 secs pair_style soft 1.12246 pair_coeff * * 0.0 1.12246 @@ -60,54 +63,54 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 - 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 - 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 - 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 - 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 - 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 - 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 - 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 - 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 - 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 - 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 - 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 - 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 - 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 - 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 - 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 - 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 - 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 - 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 - 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 - 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 -Loop time of 0.10837 on 1 procs for 1000 steps with 1200 atoms + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.113919 on 1 procs for 1000 steps with 1200 atoms -Performance: 3986358.208 tau/day, 9227.681 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 3792167.464 tau/day, 8778.165 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.071949 | 0.071949 | 0.071949 | 0.0 | 66.39 -Bond | 0.0039806 | 0.0039806 | 0.0039806 | 0.0 | 3.67 -Neigh | 0.01737 | 0.01737 | 0.01737 | 0.0 | 16.03 -Comm | 0.0019217 | 0.0019217 | 0.0019217 | 0.0 | 1.77 -Output | 0.00016022 | 0.00016022 | 0.00016022 | 0.0 | 0.15 -Modify | 0.010607 | 0.010607 | 0.010607 | 0.0 | 9.79 -Other | | 0.002382 | | | 2.20 +Pair | 0.076825 | 0.076825 | 0.076825 | 0.0 | 67.44 +Bond | 0.0041864 | 0.0041864 | 0.0041864 | 0.0 | 3.67 +Neigh | 0.017061 | 0.017061 | 0.017061 | 0.0 | 14.98 +Comm | 0.0019042 | 0.0019042 | 0.0019042 | 0.0 | 1.67 +Output | 0.00017285 | 0.00017285 | 0.00017285 | 0.0 | 0.15 +Modify | 0.011218 | 0.011218 | 0.011218 | 0.0 | 9.85 +Other | | 0.002551 | | | 2.24 Nlocal: 1200 ave 1200 max 1200 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 206 ave 206 max 206 min +Nghost: 195 ave 195 max 195 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3191 ave 3191 max 3191 min +Neighs: 3136 ave 3136 max 3136 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3191 -Ave neighs/atom = 2.65917 +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 Ave special neighs/atom = 0.5 -Neighbor list builds = 99 +Neighbor list builds = 92 Dangerous builds = 0 unfix 3 @@ -164,93 +167,93 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 4.024 | 4.024 | 4.024 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7061976 0.094144249 -1.1624283 3.8015113 - 1000 0.45 -1.9656133 0.065736052 -1.4502522 1.8870315 - 2000 0.45917162 -1.9677772 0.06512989 -1.4438584 1.6197525 - 3000 0.45029543 -1.9993287 0.060436068 -1.4889724 1.6749521 - 4000 0.44658614 -2.0150793 0.070735372 -1.49813 1.4982834 - 5000 0.45 -2.0317981 0.06873808 -1.513435 1.375846 - 6000 0.46323984 -2.0135007 0.067698691 -1.4829482 1.3342928 - 7000 0.46154055 -2.0268144 0.064313941 -1.5013445 1.2936811 - 8000 0.45911863 -2.032873 0.058832094 -1.5153049 1.1717652 - 9000 0.46126695 -2.0435575 0.060645049 -1.5220299 1.1810833 - 10000 0.44212317 -2.0552317 0.066386857 -1.5470901 1.1217265 - 11000 0.46455191 -2.0852383 0.064035544 -1.557038 1.0722284 - 12000 0.45647983 -2.0711846 0.058592351 -1.5564929 1.1487056 - 13000 0.44296686 -2.0532457 0.059554979 -1.551093 1.1665292 - 14000 0.44154216 -2.045874 0.059814984 -1.5448848 1.1231544 - 15000 0.43921469 -2.0642415 0.057245543 -1.5681472 1.1342333 - 16000 0.44278133 -2.0696899 0.053114875 -1.5741627 1.0881442 - 17000 0.45 -2.0847259 0.060756733 -1.5743441 0.94801701 - 18000 0.45115973 -2.0899292 0.061273297 -1.5778721 0.86251832 - 19000 0.45210059 -2.0822877 0.061618471 -1.5689454 0.80428644 - 20000 0.44516679 -2.0789966 0.060221274 -1.5739795 0.98113308 - 21000 0.44850103 -2.0920747 0.060514536 -1.5834329 0.92324 - 22000 0.44679652 -2.0669569 0.067895097 -1.5526376 1.106608 - 23000 0.45651863 -2.0904722 0.06387795 -1.5704561 0.850672 - 24000 0.4584402 -2.0845866 0.062994228 -1.5635342 0.78607061 - 25000 0.45668297 -2.0867185 0.057694285 -1.5727218 0.85872516 - 26000 0.45509931 -2.0887933 0.057944017 -1.5761293 0.97591479 - 27000 0.44666043 -2.1050106 0.056793397 -1.601929 0.86053641 - 28000 0.44305811 -2.0986076 0.06061175 -1.595307 0.8337899 - 29000 0.43309506 -2.0797769 0.057836836 -1.5892059 0.781554 - 30000 0.45295672 -2.1062574 0.059985016 -1.5936931 0.82009912 - 31000 0.44732019 -2.097185 0.050654563 -1.599583 0.85301217 - 32000 0.44266582 -2.0953191 0.054789729 -1.5982324 0.71512496 - 33000 0.4453828 -2.0994714 0.060417004 -1.5940427 0.72747171 - 34000 0.46294819 -2.1152896 0.057702794 -1.5950244 0.76689535 - 35000 0.45151588 -2.1057688 0.067282487 -1.5873467 0.58239461 - 36000 0.43762794 -2.110522 0.064864579 -1.6083942 0.67640246 - 37000 0.45 -2.1238558 0.055080557 -1.6191502 0.66264135 - 38000 0.45242633 -2.090514 0.052892245 -1.5855725 0.82462117 - 39000 0.46220707 -2.1171223 0.066563814 -1.5887366 0.61579423 - 40000 0.46129497 -2.1127774 0.052158545 -1.5997083 0.7450628 - 41000 0.44910025 -2.1105051 0.055407892 -1.6063712 0.63060789 - 42000 0.43949477 -2.1111359 0.053274048 -1.6187333 0.7589387 - 43000 0.44780419 -2.1131157 0.064089346 -1.6015953 0.66207693 - 44000 0.45601736 -2.103811 0.05661822 -1.5915554 0.82031717 - 45000 0.4444893 -2.1288758 0.064280408 -1.6204765 0.63115787 - 46000 0.4412452 -2.126527 0.069196255 -1.6164532 0.5245319 - 47000 0.46558295 -2.1302034 0.061017021 -1.6039914 0.47795265 - 48000 0.4447318 -2.10327 0.051780625 -1.6071281 0.56768661 - 49000 0.45152907 -2.1159427 0.052803985 -1.6119859 0.79924946 - 50000 0.43009519 -2.1080874 0.067204222 -1.6111465 0.85332392 - 51000 0.46317379 -2.1123268 0.058408991 -1.59113 0.72230777 - 52000 0.45417978 -2.1200771 0.065575223 -1.6007006 0.7742118 - 53000 0.43662759 -2.0916043 0.061621629 -1.593719 0.80656554 - 54000 0.44985568 -2.1167148 0.063414372 -1.6038197 0.63989449 - 55000 0.44499083 -2.1104573 0.056857917 -1.6089794 0.73153307 - 56000 0.44760788 -2.1162558 0.061556514 -1.6074644 0.62340704 - 57000 0.43753788 -2.1127115 0.05633761 -1.6192006 0.7012971 - 58000 0.46476788 -2.121983 0.057525001 -1.6000774 0.64993478 - 59000 0.45 -2.1329625 0.069789212 -1.6135483 0.63819024 - 60000 0.44526017 -2.1213789 0.071976974 -1.6045128 0.71055045 -Loop time of 7.83001 on 1 procs for 60000 steps with 1200 atoms + 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 + 1000 0.45 -1.9727644 0.05860769 -1.4645317 1.9982326 + 2000 0.46143408 -1.9889684 0.058103225 -1.4698156 1.7806269 + 3000 0.44459291 -1.9997961 0.068724164 -1.4868496 1.4369618 + 4000 0.46939549 -2.0330437 0.073499424 -1.4905399 1.3780016 + 5000 0.44411088 -2.0339936 0.05862049 -1.5316323 1.2544164 + 6000 0.44034597 -2.0265475 0.066481992 -1.5200864 1.2362891 + 7000 0.45097378 -2.0331083 0.058467565 -1.5240428 1.2762333 + 8000 0.45797632 -2.0330255 0.060048036 -1.5153828 1.3862396 + 9000 0.45297811 -2.0383417 0.067056519 -1.5186845 1.2762554 + 10000 0.45 -2.0628269 0.065650067 -1.5475518 1.0566213 + 11000 0.44466757 -2.0593977 0.06190999 -1.5531907 1.1452469 + 12000 0.46743534 -2.0684295 0.061056278 -1.5403274 1.0824225 + 13000 0.45601091 -2.0689708 0.054868536 -1.5584713 0.96703283 + 14000 0.44111882 -2.0553174 0.058249816 -1.5563164 1.0986427 + 15000 0.43894405 -2.0866829 0.064117804 -1.5839869 0.90031836 + 16000 0.43856814 -2.0879319 0.056024166 -1.593705 0.96387323 + 17000 0.45977841 -2.103188 0.058097306 -1.5856955 0.83352919 + 18000 0.43423341 -2.0813151 0.066623991 -1.5808196 0.98157638 + 19000 0.44245939 -2.0851261 0.057637655 -1.5853978 0.84228341 + 20000 0.43144678 -2.0895403 0.06536727 -1.5930858 0.88177768 + 21000 0.45014968 -2.106686 0.059137572 -1.5977739 0.89408935 + 22000 0.4575126 -2.1024115 0.063013023 -1.5822672 0.84886734 + 23000 0.45 -2.10897 0.06724784 -1.5920971 0.66205013 + 24000 0.43055602 -2.0894725 0.061566464 -1.5977089 0.81764789 + 25000 0.4366384 -2.0926743 0.059609321 -1.5967905 0.85549875 + 26000 0.4521714 -2.0963996 0.062031863 -1.5825731 0.80137118 + 27000 0.45734834 -2.1060987 0.061712636 -1.5874188 0.82899415 + 28000 0.44803467 -2.0859226 0.061871856 -1.5763894 0.97007526 + 29000 0.45 -2.1106243 0.063825481 -1.5971738 0.63798376 + 30000 0.44932806 -2.1006036 0.053053934 -1.598596 0.63907113 + 31000 0.44713779 -2.1096164 0.066470416 -1.5963808 0.66832708 + 32000 0.4373357 -2.0941237 0.058871613 -1.5982808 0.78176106 + 33000 0.44030485 -2.105644 0.058804306 -1.6069017 0.66286458 + 34000 0.43781175 -2.1233209 0.064611206 -1.6212628 0.56342584 + 35000 0.45670132 -2.1059408 0.053049584 -1.5965705 0.73992396 + 36000 0.45555427 -2.1149877 0.057627709 -1.6021854 0.85854939 + 37000 0.44134236 -2.1106202 0.064444306 -1.6052013 0.74674603 + 38000 0.44812623 -2.1003681 0.057266258 -1.5953491 0.78239359 + 39000 0.44167062 -2.11141 0.055354 -1.6147534 0.7066385 + 40000 0.46103176 -2.1166687 0.062155412 -1.5938657 0.73620955 + 41000 0.44537102 -2.0993898 0.05631213 -1.5980778 0.87348756 + 42000 0.44752506 -2.1115212 0.057506521 -1.6068625 0.72999561 + 43000 0.4483886 -2.1184719 0.066943915 -1.6035131 0.78112063 + 44000 0.45944897 -2.0916657 0.055242781 -1.5773568 0.98660473 + 45000 0.46238513 -2.1163075 0.0530031 -1.6013046 0.74416054 + 46000 0.45979064 -2.1165545 0.060657581 -1.5964895 0.63516974 + 47000 0.45936546 -2.1140678 0.049931919 -1.6051532 0.76425182 + 48000 0.45424613 -2.1122681 0.061885599 -1.5965149 0.71981142 + 49000 0.44449524 -2.1147361 0.06626748 -1.6043438 0.78720467 + 50000 0.4641185 -2.1114668 0.055104874 -1.5926302 0.70195865 + 51000 0.44220655 -2.1075773 0.0589109 -1.6068283 0.73806859 + 52000 0.43097906 -2.1189493 0.061502241 -1.6268271 0.69622593 + 53000 0.45 -2.137688 0.053631829 -1.6344311 0.48269158 + 54000 0.43777118 -2.1089246 0.047098534 -1.6244197 0.70423814 + 55000 0.46061985 -2.1129502 0.062520353 -1.5901938 0.72492307 + 56000 0.4524841 -2.1195648 0.06580089 -1.6016569 0.52709892 + 57000 0.44914574 -2.1041993 0.061040876 -1.594387 0.7979988 + 58000 0.46446286 -2.1181238 0.055741995 -1.598306 0.51009146 + 59000 0.4632674 -2.1169321 0.050672678 -1.6033781 0.83110911 + 60000 0.46340478 -2.122846 0.058485209 -1.6013422 0.69966471 +Loop time of 8.01683 on 1 procs for 60000 steps with 1200 atoms -Performance: 3310339.921 tau/day, 7662.824 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 3233199.903 tau/day, 7484.259 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.2292 | 5.2292 | 5.2292 | 0.0 | 66.78 -Bond | 0.23627 | 0.23627 | 0.23627 | 0.0 | 3.02 -Neigh | 1.5068 | 1.5068 | 1.5068 | 0.0 | 19.24 -Comm | 0.14386 | 0.14386 | 0.14386 | 0.0 | 1.84 -Output | 0.00068521 | 0.00068521 | 0.00068521 | 0.0 | 0.01 -Modify | 0.56151 | 0.56151 | 0.56151 | 0.0 | 7.17 -Other | | 0.1516 | | | 1.94 +Pair | 5.4027 | 5.4027 | 5.4027 | 0.0 | 67.39 +Bond | 0.23585 | 0.23585 | 0.23585 | 0.0 | 2.94 +Neigh | 1.5188 | 1.5188 | 1.5188 | 0.0 | 18.95 +Comm | 0.14452 | 0.14452 | 0.14452 | 0.0 | 1.80 +Output | 0.00060487 | 0.00060487 | 0.00060487 | 0.0 | 0.01 +Modify | 0.56352 | 0.56352 | 0.56352 | 0.0 | 7.03 +Other | | 0.1508 | | | 1.88 Nlocal: 1200 ave 1200 max 1200 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 374 ave 374 max 374 min +Nghost: 395 ave 395 max 395 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 9604 ave 9604 max 9604 min +Neighs: 9652 ave 9652 max 9652 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 9604 -Ave neighs/atom = 8.00333 +Total # of neighbors = 9652 +Ave neighs/atom = 8.04333 Ave special neighs/atom = 0.5 -Neighbor list builds = 4881 +Neighbor list builds = 4886 Dangerous builds = 0 -Total wall time: 0:00:07 +Total wall time: 0:00:08 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.4 b/examples/micelle/log.28Feb2019.micelle.g++.4 index a4ffc7942b..6af9051ed2 100644 --- a/examples/micelle/log.28Feb2019.micelle.g++.4 +++ b/examples/micelle/log.28Feb2019.micelle.g++.4 @@ -1,5 +1,5 @@ LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # 2d micelle simulation @@ -13,7 +13,7 @@ atom_style bond # Soft potential push-off read_data data.micelle - orthogonal box = (-0.39293 -0.050929 -0.1) to (35.4639 35.8059 0.1) + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) 2 by 2 by 1 MPI processor grid reading atoms ... 1200 atoms @@ -25,9 +25,12 @@ read_data data.micelle 1 = max # of 1-3 neighbors 1 = max # of 1-4 neighbors 2 = max # of special neighbors + special bonds CPU = 0.000130415 secs + read_data CPU = 0.00132132 secs special_bonds fene 2 = max # of 1-2 neighbors 2 = max # of special neighbors + special bonds CPU = 4.76837e-05 secs pair_style soft 1.12246 pair_coeff * * 0.0 1.12246 @@ -58,56 +61,56 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/2d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.758 | 3.758 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40179153 0.017198847 0.86861538 0.75625658 - 50 0.4900086 0.67873245 0.060027837 1.2283605 1.3564879 - 100 0.45 0.73189198 0.056737309 1.2382543 2.321972 - 150 0.67879051 0.72086182 0.047167282 1.446254 2.8618146 - 200 0.45 0.78767975 0.079977445 1.3172822 3.0463605 - 250 0.66920583 0.70051688 0.080338407 1.4495034 3.6886758 - 300 0.45 0.76847924 0.069944127 1.2880484 3.7420091 - 350 0.68081034 0.62208465 0.07485122 1.3771789 4.2772161 - 400 0.45 0.69469019 0.094115526 1.2384307 4.4786122 - 450 0.58484619 0.64001545 0.080279506 1.3046538 4.7171436 - 500 0.45 0.64066675 0.080351857 1.1706436 4.7965076 - 550 0.56464426 0.57619219 0.080291646 1.2206576 4.926662 - 600 0.45 0.58371075 0.088545932 1.1218817 5.0963739 - 650 0.53299132 0.54564667 0.084628459 1.1628223 5.2932897 - 700 0.45 0.5394553 0.10365542 1.0927357 5.3370157 - 750 0.55102913 0.48080137 0.093062502 1.1244338 5.3005553 - 800 0.45 0.51563293 0.1030928 1.0683507 5.5156219 - 850 0.51623625 0.4768524 0.10367899 1.0963375 5.5799809 - 900 0.45 0.4758065 0.098479812 1.0239113 5.6783722 - 950 0.49518604 0.45196847 0.10031719 1.047059 5.8438261 - 1000 0.45 0.45306784 0.094144249 0.99683709 5.8485623 -Loop time of 0.038061 on 4 procs for 1000 steps with 1200 atoms + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.0377742 on 4 procs for 1000 steps with 1200 atoms -Performance: 11350211.981 tau/day, 26273.639 timesteps/s -96.0% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 11436375.633 tau/day, 26473.092 timesteps/s +96.6% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.016952 | 0.017563 | 0.018236 | 0.3 | 46.14 -Bond | 0.00098968 | 0.0010636 | 0.0011351 | 0.2 | 2.79 -Neigh | 0.0048919 | 0.0049396 | 0.0049865 | 0.1 | 12.98 -Comm | 0.0075874 | 0.0083745 | 0.0094497 | 0.7 | 22.00 -Output | 0.00021791 | 0.00024784 | 0.00033474 | 0.0 | 0.65 -Modify | 0.0035474 | 0.0036926 | 0.0038188 | 0.2 | 9.70 -Other | | 0.00218 | | | 5.73 +Pair | 0.016871 | 0.017299 | 0.018185 | 0.4 | 45.80 +Bond | 0.0010128 | 0.0010633 | 0.001116 | 0.1 | 2.81 +Neigh | 0.004832 | 0.0048565 | 0.0048807 | 0.0 | 12.86 +Comm | 0.0066509 | 0.0077528 | 0.0084352 | 0.8 | 20.52 +Output | 0.00022054 | 0.00028259 | 0.00046587 | 0.0 | 0.75 +Modify | 0.0035386 | 0.0036086 | 0.0036943 | 0.1 | 9.55 +Other | | 0.002912 | | | 7.71 -Nlocal: 300 ave 305 max 295 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Nghost: 105.5 ave 109 max 102 min -Histogram: 1 1 0 0 0 0 0 0 1 1 -Neighs: 797.75 ave 810 max 792 min -Histogram: 2 0 1 0 0 0 0 0 0 1 +Nlocal: 300 ave 305 max 292 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 100.25 ave 108 max 93 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Neighs: 784 ave 815 max 739 min +Histogram: 1 0 0 0 0 0 1 1 0 1 -Total # of neighbors = 3191 -Ave neighs/atom = 2.65917 +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 Ave special neighs/atom = 0.5 -Neighbor list builds = 99 +Neighbor list builds = 92 Dangerous builds = 0 unfix 3 @@ -162,95 +165,95 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/2d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.001 | 4.001 Mbytes +Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.032 | 4.124 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7061976 0.094144249 -1.1624283 3.8015113 - 1000 0.45 -1.9656272 0.065737702 -1.4502645 1.8869504 - 2000 0.45643021 -1.9804979 0.06069692 -1.4637511 1.7840488 - 3000 0.45 -2.0069774 0.063273903 -1.4940785 1.5344808 - 4000 0.46877185 -2.0118089 0.063511162 -1.4799165 1.5112039 - 5000 0.45037477 -2.0202928 0.064675812 -1.5056176 1.5614253 - 6000 0.46516417 -2.041891 0.0633751 -1.5137393 1.302917 - 7000 0.43402321 -2.0309525 0.080389027 -1.5169019 1.2526669 - 8000 0.44698877 -2.0438825 0.056384491 -1.5408818 1.2320847 - 9000 0.46716896 -2.0490995 0.055185945 -1.5271339 1.1323067 - 10000 0.45585592 -2.0534599 0.059172717 -1.5388112 1.2103699 - 11000 0.44678446 -2.0702287 0.064814108 -1.5590025 0.93753889 - 12000 0.46238947 -2.0533635 0.061899722 -1.5294596 1.039375 - 13000 0.44497125 -2.0582622 0.055753243 -1.5579085 1.105247 - 14000 0.46197842 -2.0700459 0.061177996 -1.5472745 1.0365751 - 15000 0.45391975 -2.0698433 0.071128012 -1.5451738 0.94060338 - 16000 0.44617128 -2.0921643 0.064669811 -1.5816951 0.96199988 - 17000 0.45205591 -2.0892946 0.073532323 -1.5640831 0.72042835 - 18000 0.44742647 -2.0667234 0.066469731 -1.5532 1.0881956 - 19000 0.45154441 -2.0603669 0.0589846 -1.5502142 1.1682254 - 20000 0.44930673 -2.0699762 0.060197 -1.5608469 0.93709988 - 21000 0.44952144 -2.0787365 0.054909176 -1.5746805 0.91906714 - 22000 0.45094085 -2.1027668 0.05970659 -1.5924952 0.76875966 - 23000 0.45653288 -2.0752194 0.057879405 -1.5611875 0.90288603 - 24000 0.45659718 -2.1051589 0.061071012 -1.5878712 0.67941553 - 25000 0.44943892 -2.0785434 0.063137757 -1.5663412 0.91848225 - 26000 0.46662896 -2.0912992 0.060997699 -1.5640614 0.84321344 - 27000 0.45990587 -2.0872861 0.062249833 -1.5655136 0.7970408 - 28000 0.44904041 -2.0887241 0.067592763 -1.5724651 0.83063368 - 29000 0.44840621 -2.082931 0.063504343 -1.5713941 0.85259731 - 30000 0.45 -2.1005553 0.061020694 -1.5899096 0.85076517 - 31000 0.43293607 -2.0834216 0.062211326 -1.588635 0.87798767 - 32000 0.45 -2.1041864 0.056583773 -1.5979776 0.74721991 - 33000 0.45483731 -2.0843819 0.064702707 -1.5652209 0.72878185 - 34000 0.45 -2.0946388 0.056465271 -1.5885485 0.81958535 - 35000 0.45561477 -2.0962413 0.058642378 -1.5823639 0.86190757 - 36000 0.46372156 -2.0819766 0.061679429 -1.556962 0.92734228 - 37000 0.46602014 -2.0978422 0.05861007 -1.5736003 0.87514767 - 38000 0.45496066 -2.0993783 0.054914099 -1.5898827 0.7885952 - 39000 0.45215206 -2.0997742 0.061140603 -1.5868584 0.83434324 - 40000 0.43961538 -2.095479 0.061779306 -1.5944507 0.79151814 - 41000 0.45065436 -2.0992641 0.058334617 -1.5906507 0.84329542 - 42000 0.44063989 -2.0911919 0.058682846 -1.5922364 0.83653642 - 43000 0.45090762 -2.1109187 0.056792395 -1.6035945 0.66699616 - 44000 0.43620597 -2.1163977 0.068503171 -1.6120521 0.72985642 - 45000 0.4536995 -2.1169236 0.06222035 -1.6013818 0.6724514 - 46000 0.44961963 -2.0949168 0.056381135 -1.5892907 0.85934269 - 47000 0.45429621 -2.0982372 0.05977093 -1.5845486 0.78798948 - 48000 0.45889422 -2.1042317 0.062692038 -1.5830278 0.80652424 - 49000 0.44973607 -2.1107622 0.05251269 -1.6088882 0.80305097 - 50000 0.45422606 -2.1083846 0.05061301 -1.603924 0.81750837 - 51000 0.45545299 -2.1154627 0.053581638 -1.6068076 0.77970255 - 52000 0.46382715 -2.1001689 0.053408569 -1.5833197 0.77034515 - 53000 0.44707619 -2.1134818 0.055878089 -1.6109001 0.63749083 - 54000 0.45951971 -2.1155704 0.05958078 -1.5968529 0.81426779 - 55000 0.45588645 -2.1128869 0.060361673 -1.5970187 0.70242718 - 56000 0.44752186 -2.0917439 0.058352116 -1.5862429 0.89773952 - 57000 0.44921415 -2.115356 0.05318821 -1.613328 0.81456406 - 58000 0.44046295 -2.1119294 0.063384551 -1.6084489 0.59683679 - 59000 0.4349702 -2.0981796 0.059156694 -1.6044152 0.71438644 - 60000 0.4568814 -2.1060323 0.06038074 -1.5891509 0.70442841 -Loop time of 2.49332 on 4 procs for 60000 steps with 1200 atoms + 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 + 1000 0.45 -1.9727652 0.058608073 -1.4645321 1.9982444 + 2000 0.44428815 -1.9902282 0.064240544 -1.4820698 1.7051263 + 3000 0.46641766 -1.9856844 0.065017468 -1.4546379 1.6939772 + 4000 0.45734058 -2.0242583 0.070494626 -1.4968042 1.3474276 + 5000 0.44904747 -2.0086954 0.058801142 -1.501221 1.4632351 + 6000 0.44961405 -2.0334509 0.05721299 -1.5269985 1.3093586 + 7000 0.45474928 -2.0453645 0.064725006 -1.5262692 1.1581035 + 8000 0.44274767 -2.0375379 0.062216035 -1.5329431 1.312914 + 9000 0.46176571 -2.0473031 0.065581966 -1.5203402 1.2013868 + 10000 0.45046977 -2.0540466 0.065402724 -1.5385495 0.95819581 + 11000 0.45016671 -2.0610028 0.056993955 -1.5542172 1.0433435 + 12000 0.43823039 -2.073155 0.065171939 -1.5701178 1.1400059 + 13000 0.44482161 -2.0678338 0.063901045 -1.5594819 0.97993813 + 14000 0.45 -2.0892562 0.061753632 -1.5778776 0.89841778 + 15000 0.44328626 -2.0859346 0.059956258 -1.5830615 0.90664821 + 16000 0.45666508 -2.0859262 0.059582346 -1.5700593 0.9702235 + 17000 0.44832038 -2.0762124 0.059153394 -1.5691122 0.93020504 + 18000 0.4555831 -2.0844959 0.057986324 -1.5713062 0.87398232 + 19000 0.45257867 -2.0671736 0.062190389 -1.5527816 0.89208496 + 20000 0.44010419 -2.1020944 0.062053708 -1.6003033 0.84140973 + 21000 0.45239369 -2.0820308 0.060981799 -1.5690323 0.98502522 + 22000 0.44607468 -2.0820602 0.051731316 -1.5846259 0.86120529 + 23000 0.45088473 -2.0865286 0.05727778 -1.5787418 1.1479844 + 24000 0.45526919 -2.1086678 0.057378327 -1.5963997 0.86944138 + 25000 0.46536624 -2.1055425 0.05665328 -1.5839108 0.72895438 + 26000 0.46716668 -2.1035267 0.057498747 -1.5792505 0.85105386 + 27000 0.44374699 -2.0932213 0.060937242 -1.5889069 0.93200759 + 28000 0.45944001 -2.0968869 0.053052954 -1.5847768 0.78909249 + 29000 0.4543632 -2.10493 0.061511018 -1.5894345 0.85862527 + 30000 0.44987776 -2.0942536 0.062431086 -1.5823197 0.7349894 + 31000 0.43829016 -2.0951259 0.060245682 -1.5969553 0.86702973 + 32000 0.45416601 -2.0991679 0.055978905 -1.5894015 0.75777153 + 33000 0.4605079 -2.1118364 0.058205688 -1.5935066 0.86041104 + 34000 0.43638213 -2.0925345 0.067533519 -1.5889825 0.85100425 + 35000 0.46912252 -2.1082718 0.051646432 -1.5878938 0.73613751 + 36000 0.45 -2.0966442 0.052507159 -1.5945121 0.88722487 + 37000 0.44970507 -2.1029685 0.065454263 -1.588184 0.76033821 + 38000 0.44910233 -2.097751 0.05767009 -1.5913528 0.95830923 + 39000 0.4322161 -2.1060426 0.062453704 -1.611733 0.74681695 + 40000 0.46143858 -2.1328575 0.057333011 -1.6144704 0.58326322 + 41000 0.43180549 -2.1070656 0.064150563 -1.6114694 0.82842684 + 42000 0.46738909 -2.1067947 0.058017036 -1.5817781 0.73292362 + 43000 0.43699124 -2.1171964 0.062817262 -1.6177521 0.73354741 + 44000 0.45262916 -2.1281307 0.055228619 -1.6206502 0.64167946 + 45000 0.43905419 -2.088789 0.055597999 -1.5945027 0.8002542 + 46000 0.44485569 -2.1035061 0.067828181 -1.5911929 0.71861494 + 47000 0.44496824 -2.0968296 0.0632326 -1.5889996 0.75202899 + 48000 0.46567244 -2.1235948 0.061032118 -1.5972783 0.64094556 + 49000 0.43202506 -2.0986097 0.053464022 -1.6134806 0.83857984 + 50000 0.45454698 -2.1263344 0.058119708 -1.6140465 0.67030037 + 51000 0.43702766 -2.1292347 0.074047424 -1.6185238 0.52896462 + 52000 0.46367081 -2.1177288 0.06726625 -1.5871781 0.74343227 + 53000 0.45 -2.1341074 0.062769314 -1.6217131 0.51130365 + 54000 0.44862492 -2.1272108 0.057723381 -1.6212364 0.54735429 + 55000 0.44926027 -2.1350444 0.066186625 -1.6199719 0.66821299 + 56000 0.4544227 -2.1325537 0.065298628 -1.6132111 0.63597556 + 57000 0.45697003 -2.1323238 0.053312855 -1.6224218 0.55572633 + 58000 0.45698902 -2.1043208 0.055835989 -1.5918766 0.63502658 + 59000 0.4425306 -2.1120353 0.056617261 -1.6132563 0.65681272 + 60000 0.44319296 -2.1171981 0.058330294 -1.6160442 0.63602511 +Loop time of 2.63918 on 4 procs for 60000 steps with 1200 atoms -Performance: 10395764.892 tau/day, 24064.271 timesteps/s -97.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 9821248.084 tau/day, 22734.371 timesteps/s +97.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.1638 | 1.2432 | 1.3093 | 4.7 | 49.86 -Bond | 0.055561 | 0.063918 | 0.072427 | 2.4 | 2.56 -Neigh | 0.45107 | 0.45366 | 0.45616 | 0.3 | 18.20 -Comm | 0.40982 | 0.48044 | 0.56933 | 8.4 | 19.27 -Output | 0.00072122 | 0.0013784 | 0.0033441 | 3.1 | 0.06 -Modify | 0.14899 | 0.15204 | 0.15837 | 1.0 | 6.10 -Other | | 0.09871 | | | 3.96 +Pair | 1.1742 | 1.278 | 1.3471 | 5.9 | 48.43 +Bond | 0.046621 | 0.06565 | 0.081322 | 5.1 | 2.49 +Neigh | 0.46642 | 0.46917 | 0.47105 | 0.3 | 17.78 +Comm | 0.47295 | 0.55928 | 0.67758 | 10.5 | 21.19 +Output | 0.00073624 | 0.00173 | 0.0047016 | 4.1 | 0.07 +Modify | 0.14511 | 0.15226 | 0.15887 | 1.5 | 5.77 +Other | | 0.1131 | | | 4.28 -Nlocal: 300 ave 307 max 288 min -Histogram: 1 0 0 0 0 0 0 2 0 1 -Nghost: 216 ave 222 max 212 min -Histogram: 1 1 0 0 0 1 0 0 0 1 -Neighs: 2391.75 ave 2543 max 2194 min -Histogram: 1 0 0 0 0 0 2 0 0 1 +Nlocal: 300 ave 309 max 281 min +Histogram: 1 0 0 0 0 0 0 1 0 2 +Nghost: 232.75 ave 234 max 231 min +Histogram: 1 0 0 1 0 0 0 0 0 2 +Neighs: 2450.25 ave 2576 max 2179 min +Histogram: 1 0 0 0 0 0 0 0 1 2 -Total # of neighbors = 9567 -Ave neighs/atom = 7.9725 +Total # of neighbors = 9801 +Ave neighs/atom = 8.1675 Ave special neighs/atom = 0.5 -Neighbor list builds = 4889 +Neighbor list builds = 4887 Dangerous builds = 0 Total wall time: 0:00:02 From 77e323d28c913d487f37b72bcb261210671d9b39 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 21:55:07 -0400 Subject: [PATCH 163/243] prefix option in install.py not needed --- python/install.py | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/python/install.py b/python/install.py index 9f23e5a896..7f7062103a 100644 --- a/python/install.py +++ b/python/install.py @@ -23,11 +23,8 @@ parser.add_argument("-l", "--lib", required=True, parser.add_argument("-v", "--version", required=True, help="path to the LAMMPS version.h header file") -pgroup = parser.add_mutually_exclusive_group() -pgroup.add_argument("-d","--dir", - help="Legacy custom installation folder for module and library") -pgroup.add_argument("-p","--prefix", - help="Installation prefix for module and library") +parser.add_argument("-d","--dir", + help="Legacy custom installation folder selection for module and library") args = parser.parse_args() @@ -65,14 +62,6 @@ if args.dir: else: args.dir = os.path.abspath(args.dir) -if args.prefix: - if not os.path.isdir(args.prefix): - print( "ERROR: Installation prefix folder %s does not exist" % args.prefix) - parser.print_help() - sys.exit(1) - else: - args.prefix = os.path.abspath(args.prefix) - # if a custom directory is given, we copy the files directly # without any special processing or additional steps to that folder @@ -108,10 +97,7 @@ import site tryuser=False try: - if args.prefix: - sys.argv = ["setup.py","install","--prefix=%s" % args.prefix] # as if had run "python setup.py install --prefix=XXX" - else: - sys.argv = ["setup.py","install"] # as if had run "python setup.py install" + sys.argv = ["setup.py","install"] # as if had run "python setup.py install" setup(name = "lammps", version = verstr, author = "Steve Plimpton", @@ -120,7 +106,7 @@ try: description = "LAMMPS Molecular Dynamics Python module", license = "GPL", py_modules = ["lammps"], - data_files = [(get_python_lib(prefix=args.prefix), [args.lib])]) + data_files = [(get_python_lib(), [args.lib])]) except: tryuser=True print ("Installation into global site-packages folder failed.\nTrying user folder %s now." % site.USER_SITE) From 3867972ae8e99f76356492df00e51d778337bcb1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 22:08:53 -0400 Subject: [PATCH 164/243] make PYTHON_INSTDIR a cached variable and implement changes suggested by @junghans --- cmake/CMakeLists.txt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 2bb40a6e88..fb1cf58250 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1482,7 +1482,7 @@ install( ############################################################################### if(BUILD_LIB AND BUILD_SHARED_LIBS) find_package(PythonInterp) - if (${PYTHONINTERP_FOUND}) + if (PYTHONINTERP_FOUND) add_custom_target( install-python ${PYTHON_EXECUTABLE} install.py -v ${LAMMPS_SOURCE_DIR}/version.h @@ -1493,12 +1493,12 @@ if(BUILD_LIB AND BUILD_SHARED_LIBS) else() add_custom_target( install-python - echo "Must have Python installed to install the LAMMPS Python module") + ${CMAKE_COMMAND} -E echo "Must have Python installed to install the LAMMPS Python module") endif() else() add_custom_target( install-python - echo "Must build LAMMPS as a shared library to use the Python module") + ${CMAKE_COMMAND} -E echo "Must build LAMMPS as a shared library to use the Python module") endif() ############################################################################### @@ -1508,12 +1508,11 @@ endif() ############################################################################### if((BUILD_LIB AND BUILD_SHARED_LIBS) OR (PKG_PYTHON)) find_package(PythonInterp) - if (${PYTHONINTERP_FOUND}) - if(NOT PYTHON_INSTDIR) - execute_process(COMMAND ${PYTHON_EXECUTABLE} - -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" - OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() + if (PYTHONINTERP_FOUND) + execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" + OUTPUT_VARIABLE PYTHON_DEFAULT_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) + set(PYTHON_INSTDIR ${PYTHON_DEFAULT_INSTDIR} CACHE PATH "Installation folder for LAMMPS Python module") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) endif() endif() From 9d22f82ba7dc69c31d7d1300e69c2ca6eba58b02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 22:42:09 -0400 Subject: [PATCH 165/243] update PyLAMMPS documentation/tutorial for CMake and the refactored installation process --- doc/src/Howto_pylammps.txt | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/doc/src/Howto_pylammps.txt b/doc/src/Howto_pylammps.txt index b731a8e31a..54f17d912a 100644 --- a/doc/src/Howto_pylammps.txt +++ b/doc/src/Howto_pylammps.txt @@ -57,6 +57,17 @@ library is then loaded by the Python interface. In this example we enable the MOLECULE package and compile LAMMPS with C++ exceptions, PNG, JPEG and FFMPEG output support enabled. +Step 1a: For the CMake based build system, the steps are: + +mkdir $LAMMPS_DIR/build-shared +cd $LAMMPS_DIR/build-shared :pre + +# MPI, PNG, Jpeg, FFMPEG are auto-detected +cmake ../cmake -DPKG_MOLECULE=yes -DLAMMPS_EXCEPTIONS=yes -DBUILD_LIB=yes -DBUILD_SHARED_LIBS=yes +make :pre + +Step 1b: For the legacy, make based build system, the steps are: + cd $LAMMPS_DIR/src :pre # add packages if necessary @@ -68,10 +79,9 @@ make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG -DLAMMPS Step 2: Installing the LAMMPS Python package :h6 PyLammps is part of the lammps Python package. To install it simply install -that package into your current Python installation. +that package into your current Python installation with: -cd $LAMMPS_DIR/python -python install.py :pre +make install-python :pre NOTE: Recompiling the shared library requires re-installing the Python package @@ -94,14 +104,21 @@ apt-get install python-virtualenv :pre Creating a virtualenv with lammps installed :h6 -# create virtualenv name 'testing' :pre +# create virtualenv named 'testing' +virtualenv $HOME/python/testing :pre # activate 'testing' environment -source testing/bin/activate :pre +source $HOME/python/testing/bin/activate :pre + +Now configure and compile the LAMMPS shared library as outlined above. +When using CMake and the shared library has already been build, you +need to re-run CMake to update the location of the python executable +to the location in the virtual environment with: + +cmake . -DPYTHON_EXECUTABLE=$(which python) :pre # install LAMMPS package in virtualenv -(testing) cd $LAMMPS_DIR/python -(testing) python install.py :pre +(testing) make install-python :pre # install other useful packages (testing) pip install matplotlib jupyter mpi4py :pre From 03e86c4d17b4272c90e1f95f68d4bbfa8bb37fc6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 22:49:21 -0400 Subject: [PATCH 166/243] update python module installation instructions --- doc/src/Python_install.txt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/src/Python_install.txt b/doc/src/Python_install.txt index f1a280931f..2c134974f5 100644 --- a/doc/src/Python_install.txt +++ b/doc/src/Python_install.txt @@ -18,7 +18,7 @@ The python source code in lammps.py is the Python wrapper on the LAMMPS library interface. The liblammps.so or liblammps.dylib file is the shared LAMMPS library that Python loads dynamically. -You can insure Python can find these files in one of two ways: +You can achieve that Python can find these files in one of two ways: set two environment variables pointing to the location in the source tree run "make install-python" or run the python/install.py script explicitly :ul @@ -27,7 +27,8 @@ When calling "make install-python" LAMMPS will try to install the python module and the shared library into the python site-packages folders; either the system-wide ones, or the local users ones (in case of insufficient permissions for the global install). Python will then find the module -and shared library file automatically. +and shared library file automatically. The exact location of these folders +depends on your python version and your operating system. If you set the paths to these files as environment variables, you only have to do it once. For the csh or tcsh shells, add something like @@ -52,12 +53,12 @@ you can invoke install.py from the python directory manually as The -m flag points to the lammps.py python module file to be installed, the -l flag points to the LAMMPS shared library file to be installed, -the -v flag points to the version.h file in the LAMMPS source and the -optional -d flag to the desired installation folder, if you don't want -the Python specific site-packages folder. If you want to copy these files to -non-standard locations, you will need to set your PYTHONPATH and -LD_LIBRARY_PATH (and DYLD_LIBRARY_PATH) environment variables -accordingly, as described above. +the -v flag points to the version.h file in the LAMMPS source +and the optional -d flag to a custom (legacy) installation folder :ul + +If you use a legacy installation folder, you will need to set your +PYTHONPATH and LD_LIBRARY_PATH (and/or DYLD_LIBRARY_PATH) environment +variables accordingly, as described above. Note that if you want Python to be able to load different versions of the LAMMPS shared library (see "this section"_Python_shlib.html), you will From af8f06141f3fb284ede0602ae85fbc58063a5b2f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 23:02:07 -0400 Subject: [PATCH 167/243] Step version string for next patch release --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index af0a2681ab..126ba7f3e6 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@ :line LAMMPS Documentation :c,h1 -28 Feb 2019 version :c,h2 +28 Mar 2019 version :c,h2 "What is a LAMMPS version?"_Manual_version.html diff --git a/src/version.h b/src/version.h index 0539f757c9..8031f3e787 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "28 Feb 2019" +#define LAMMPS_VERSION "28 Mar 2019" From 8ba1d7605551a0a804251be90023ab8a7562f782 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Mar 2019 05:38:41 -0400 Subject: [PATCH 168/243] some dead code removal and more whitespace cleanup --- src/RIGID/fix_rigid_small.cpp | 2 +- src/RIGID/fix_shake.cpp | 82 +++++++++++++++++------------------ src/comm.cpp | 8 +--- src/hashlittle.cpp | 3 +- src/special.cpp | 2 - 5 files changed, 43 insertions(+), 54 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index ce44fb4e93..54fb83f0aa 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1629,7 +1629,7 @@ int FixRigidSmall::rendezvous_body(int n, char *inbuf, int &rflag, int *&proclist, char *&outbuf, void *ptr) { - int i,j,m; + int i,m; double delx,dely,delz,rsq; int *iclose; tagint *idclose; diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 6293028090..1e8414d321 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -694,10 +694,9 @@ int FixShake::dof(int igroup) void FixShake::find_clusters() { int i,j,m,n,imol,iatom; - int flag,flag_all,nbuf,size; + int flag,flag_all; tagint tagprev; double massone; - tagint *buf; if (me == 0 && screen) { if (!rattle) fprintf(screen,"Finding SHAKE clusters ...\n"); @@ -794,7 +793,7 @@ void FixShake::find_clusters() // ----------------------------------------------------- partner_info(npartner,partner_tag,partner_mask,partner_type, - partner_massflag,partner_bondtype); + partner_massflag,partner_bondtype); // error check for unfilled partner info // if partner_type not set, is an error @@ -1083,8 +1082,8 @@ void FixShake::atom_owners() ------------------------------------------------------------------------- */ void FixShake::partner_info(int *npartner, tagint **partner_tag, - int **partner_mask, int **partner_type, - int **partner_massflag, int **partner_bondtype) + int **partner_mask, int **partner_type, + int **partner_massflag, int **partner_bondtype) { int i,j,m,n; int nlocal = atom->nlocal; @@ -1144,29 +1143,29 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, n = bondtype_findset(m,tag[i],partner_tag[i][j],0); if (n) partner_bondtype[i][j] = n; } - + } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; - inbuf[nsend].partnerID = tag[i]; - inbuf[nsend].mask = mask[i]; - inbuf[nsend].type = type[i]; + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].mask = mask[i]; + inbuf[nsend].type = type[i]; if (nmass) { if (rmass) massone = rmass[i]; else massone = mass[type[i]]; - inbuf[nsend].massflag = masscheck(massone); + inbuf[nsend].massflag = masscheck(massone); } else inbuf[nsend].massflag = 0; - // my atom may own bond, in which case set partner_bondtype - // else receiver of this datum will own the bond and return the value - + // my atom may own bond, in which case set partner_bondtype + // else receiver of this datum will own the bond and return the value + n = bondtype_findset(i,tag[i],partner_tag[i][j],0); if (n) { - partner_bondtype[i][j] = n; - inbuf[nsend].bondtype = n; - } else inbuf[nsend].bondtype = 0; - - nsend++; + partner_bondtype[i][j] = n; + inbuf[nsend].bondtype = n; + } else inbuf[nsend].bondtype = 0; + + nsend++; } } } @@ -1213,9 +1212,9 @@ void FixShake::partner_info(int *npartner, tagint **partner_tag, ------------------------------------------------------------------------- */ void FixShake::nshake_info(int *npartner, tagint **partner_tag, - int **partner_nshake) + int **partner_nshake) { - int i,j,m,n; + int i,j,m; int nlocal = atom->nlocal; // nsend = # of my datums to send @@ -1251,11 +1250,11 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, if (m >= 0 && m < nlocal) { partner_nshake[i][j] = nshake[m]; } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; - inbuf[nsend].partnerID = tag[i]; - inbuf[nsend].nshake = nshake[i]; - nsend++; + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; + inbuf[nsend].partnerID = tag[i]; + inbuf[nsend].nshake = nshake[i]; + nsend++; } } } @@ -1292,9 +1291,9 @@ void FixShake::nshake_info(int *npartner, tagint **partner_tag, ------------------------------------------------------------------------- */ void FixShake::shake_info(int *npartner, tagint **partner_tag, - int **partner_shake) + int **partner_shake) { - int i,j,m,n; + int i,j,m; int nlocal = atom->nlocal; // nsend = # of my datums to send @@ -1338,8 +1337,8 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, shake_type[m][2] = shake_type[i][2]; } else { - proclist[nsend] = partner_tag[i][j] % nprocs; - inbuf[nsend].atomID = partner_tag[i][j]; + proclist[nsend] = partner_tag[i][j] % nprocs; + inbuf[nsend].atomID = partner_tag[i][j]; inbuf[nsend].shake_flag = shake_flag[i]; inbuf[nsend].shake_atom[0] = shake_atom[i][0]; inbuf[nsend].shake_atom[1] = shake_atom[i][1]; @@ -1348,7 +1347,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, inbuf[nsend].shake_type[0] = shake_type[i][0]; inbuf[nsend].shake_type[1] = shake_type[i][1]; inbuf[nsend].shake_type[2] = shake_type[i][2]; - nsend++; + nsend++; } } } @@ -1391,8 +1390,8 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, ------------------------------------------------------------------------- */ int FixShake::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) + int &flag, int *&proclist, char *&outbuf, + void *ptr) { FixShake *fsptr = (FixShake *) ptr; Memory *memory = fsptr->memory; @@ -1429,8 +1428,8 @@ int FixShake::rendezvous_ids(int n, char *inbuf, ------------------------------------------------------------------------- */ int FixShake::rendezvous_partners_info(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) + int &flag, int *&proclist, char *&outbuf, + void *ptr) { int i,m; @@ -1458,9 +1457,6 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, int *procowner = fsptr->procowner; memory->create(proclist,n,"shake:proclist"); - double massone; - int nmass = fsptr->nmass; - for (i = 0; i < n; i++) { m = atom->map(in[i].atomID); proclist[i] = procowner[m]; @@ -1487,10 +1483,10 @@ int FixShake::rendezvous_partners_info(int n, char *inbuf, ------------------------------------------------------------------------- */ int FixShake::rendezvous_nshake(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) + int &flag, int *&proclist, char *&outbuf, + void *ptr) { - int i,j,m; + int i,m; FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; @@ -1544,7 +1540,7 @@ int FixShake::rendezvous_shake(int n, char *inbuf, int &flag, int *&proclist, char *&outbuf, void *ptr) { - int i,j,m; + int i,m; FixShake *fsptr = (FixShake *) ptr; Atom *atom = fsptr->atom; diff --git a/src/comm.cpp b/src/comm.cpp index dc117d2631..8389e4993d 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -1121,9 +1121,7 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, size_out_all/outsize,1.0*size_out_all/nprocs/outsize, size_out_max/outsize,size_out_min/outsize); else - fprintf(screen," output datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - 0,0.0,0,0); + fprintf(screen," output datum count: %d %g %d %d\n",0,0.0,0,0); fprintf(screen," output data (MB): %g %g %g %g\n", 1.0*size_out_all/mbytes,1.0*size_out_all/nprocs/mbytes, 1.0*size_out_max/mbytes,1.0*size_out_min/mbytes); @@ -1140,9 +1138,7 @@ void Comm::rendezvous_stats(int n, int nout, int nrvous, int nrvous_out, size_outrvous_all/outsize,1.0*size_outrvous_all/nprocs/outsize, size_outrvous_max/outsize,size_outrvous_min/outsize); else - fprintf(screen," output rvous datum count: " - BIGINT_FORMAT " %g " BIGINT_FORMAT " " BIGINT_FORMAT "\n", - 0,0.0,0,0); + fprintf(screen," output rvous datum count: %d %g %d %d\n",0,0.0,0,0); fprintf(screen," output rvous data (MB): %g %g %g %g\n", 1.0*size_outrvous_all/mbytes,1.0*size_outrvous_all/nprocs/mbytes, 1.0*size_outrvous_max/mbytes,1.0*size_outrvous_min/mbytes); diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index b6932efa8d..0abcd2bcc5 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -155,7 +155,6 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) u.ptr = key; if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) { const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */ - const uint8_t *k8; /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */ while (length > 12) @@ -199,7 +198,7 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) #else /* make valgrind happy */ - k8 = (const uint8_t *)k; + const uint8_t *k8 = (const uint8_t *)k; switch(length) { case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; diff --git a/src/special.cpp b/src/special.cpp index ed505ff957..22022519a2 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -334,7 +334,6 @@ void Special::onethree_build() { int i,j,k,m,proc; - tagint *tag = atom->tag; int **nspecial = atom->nspecial; int nlocal = atom->nlocal; @@ -440,7 +439,6 @@ void Special::onefour_build() { int i,j,k,m,proc; - tagint *tag = atom->tag; int **nspecial = atom->nspecial; int nlocal = atom->nlocal; From 8a384df5c38aa75c51cc0a908f0797dbd1852145 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Mar 2019 06:19:42 -0400 Subject: [PATCH 169/243] use utils::strmatch() instead of strncmp() --- src/modify.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modify.cpp b/src/modify.cpp index 0a03bb6804..7f43f035d2 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -28,6 +28,7 @@ #include "variable.h" #include "memory.h" #include "error.h" +#include "utils.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -1058,7 +1059,7 @@ int Modify::check_rigid_group_overlap(int groupbit) int n = 0; for (int ifix = 0; ifix < nfix; ifix++) { - if (strncmp("rigid",fix[ifix]->style,5) == 0) { + if (utils::strmatch(fix[ifix]->style,"^rigid")) { const int * const body = (const int *)fix[ifix]->extract("body",dim); if ((body == NULL) || (dim != 1)) break; From c4fd658e9d823698154d93c64bf3271296763cb2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Mar 2019 11:07:14 -0400 Subject: [PATCH 170/243] rename micelle-rigid to micelle.rigid --- examples/micelle/{in.micelle-rigid => in.micelle.rigid} | 0 ...2019.micelle-rigid.g++.1 => log.28Feb2019.micelle.rigid.g++.1} | 0 ...2019.micelle-rigid.g++.4 => log.28Feb2019.micelle.rigid.g++.4} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename examples/micelle/{in.micelle-rigid => in.micelle.rigid} (100%) rename examples/micelle/{log.28Feb2019.micelle-rigid.g++.1 => log.28Feb2019.micelle.rigid.g++.1} (100%) rename examples/micelle/{log.28Feb2019.micelle-rigid.g++.4 => log.28Feb2019.micelle.rigid.g++.4} (100%) diff --git a/examples/micelle/in.micelle-rigid b/examples/micelle/in.micelle.rigid similarity index 100% rename from examples/micelle/in.micelle-rigid rename to examples/micelle/in.micelle.rigid diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.1 b/examples/micelle/log.28Feb2019.micelle.rigid.g++.1 similarity index 100% rename from examples/micelle/log.28Feb2019.micelle-rigid.g++.1 rename to examples/micelle/log.28Feb2019.micelle.rigid.g++.1 diff --git a/examples/micelle/log.28Feb2019.micelle-rigid.g++.4 b/examples/micelle/log.28Feb2019.micelle.rigid.g++.4 similarity index 100% rename from examples/micelle/log.28Feb2019.micelle-rigid.g++.4 rename to examples/micelle/log.28Feb2019.micelle.rigid.g++.4 From b685a0a7b8687a2bd1ce4554c070b28f8c6a9809 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Mar 2019 15:47:14 -0400 Subject: [PATCH 171/243] need to use fabs() when computing deltas when checking image flags for consistency --- src/domain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/domain.cpp b/src/domain.cpp index beaf5fc08e..86c4eb2c02 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -763,9 +763,9 @@ void Domain::image_check() continue; } - delx = unwrap[i][0] - unwrap[k][0]; - dely = unwrap[i][1] - unwrap[k][1]; - delz = unwrap[i][2] - unwrap[k][2]; + delx = fabs(unwrap[i][0] - unwrap[k][0]); + dely = fabs(unwrap[i][1] - unwrap[k][1]); + delz = fabs(unwrap[i][2] - unwrap[k][2]); if (xperiodic && delx > xprd_half) flag = 1; if (yperiodic && dely > yprd_half) flag = 1; From 6b09f6d49032364b5cc0f4607a7a6c97d5955e0a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 27 Mar 2019 15:51:10 -0600 Subject: [PATCH 172/243] bug fix for tiled communication at cutoffs near box size --- src/balance.cpp | 16 ++++++++-------- src/comm_tiled.cpp | 2 +- src/fix_balance.cpp | 9 +++++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/balance.cpp b/src/balance.cpp index 2a953caf47..61ac895467 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -1255,14 +1255,14 @@ void Balance::dumpout(bigint tstep) int m = 0; for (int i = 0; i < nprocs; i++) { domain->lamda_box_corners(&boxall[i][0],&boxall[i][3]); - fprintf(fp,"%d %d %g %g %g\n",m+1,1,bc[0][0],bc[0][1],bc[0][1]); - fprintf(fp,"%d %d %g %g %g\n",m+2,1,bc[1][0],bc[1][1],bc[1][1]); - fprintf(fp,"%d %d %g %g %g\n",m+3,1,bc[2][0],bc[2][1],bc[2][1]); - fprintf(fp,"%d %d %g %g %g\n",m+4,1,bc[3][0],bc[3][1],bc[3][1]); - fprintf(fp,"%d %d %g %g %g\n",m+5,1,bc[4][0],bc[4][1],bc[4][1]); - fprintf(fp,"%d %d %g %g %g\n",m+6,1,bc[5][0],bc[5][1],bc[5][1]); - fprintf(fp,"%d %d %g %g %g\n",m+7,1,bc[6][0],bc[6][1],bc[6][1]); - fprintf(fp,"%d %d %g %g %g\n",m+8,1,bc[7][0],bc[7][1],bc[7][1]); + fprintf(fp,"%d %d %g %g %g\n",m+1,1,bc[0][0],bc[0][1],bc[0][2]); + fprintf(fp,"%d %d %g %g %g\n",m+2,1,bc[1][0],bc[1][1],bc[1][2]); + fprintf(fp,"%d %d %g %g %g\n",m+3,1,bc[2][0],bc[2][1],bc[2][2]); + fprintf(fp,"%d %d %g %g %g\n",m+4,1,bc[3][0],bc[3][1],bc[3][2]); + fprintf(fp,"%d %d %g %g %g\n",m+5,1,bc[4][0],bc[4][1],bc[4][2]); + fprintf(fp,"%d %d %g %g %g\n",m+6,1,bc[5][0],bc[5][1],bc[5][2]); + fprintf(fp,"%d %d %g %g %g\n",m+7,1,bc[6][0],bc[6][1],bc[6][2]); + fprintf(fp,"%d %d %g %g %g\n",m+8,1,bc[7][0],bc[7][1],bc[7][2]); m += 8; } } diff --git a/src/comm_tiled.cpp b/src/comm_tiled.cpp index d7d2e4725d..d1d625445a 100644 --- a/src/comm_tiled.cpp +++ b/src/comm_tiled.cpp @@ -512,7 +512,7 @@ void CommTiled::forward_comm(int /*dummy*/) MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]); } if (sendother[iswap]) { - for (i = 0; i < nsendproc[iswap]; i++) { + for (i = 0; i < nsend; i++) { n = avec->pack_comm(sendnum[iswap][i],sendlist[iswap][i], buf_send,pbc_flag[iswap][i],pbc[iswap][i]); MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap][i],0,world); diff --git a/src/fix_balance.cpp b/src/fix_balance.cpp index 8995a57afe..ddaf42b49d 100644 --- a/src/fix_balance.cpp +++ b/src/fix_balance.cpp @@ -274,10 +274,6 @@ void FixBalance::rebalance() comm->layout = Comm::LAYOUT_TILED; } - // output of new decomposition - - if (balance->outflag) balance->dumpout(update->ntimestep); - // reset proc sub-domains // check and warn if any proc's subbox is smaller than neigh skin // since may lead to lost atoms in comm->exchange() @@ -286,12 +282,17 @@ void FixBalance::rebalance() domain->set_local_box(); domain->subbox_too_small_check(neighbor->skin); + // output of new decomposition + + if (balance->outflag) balance->dumpout(update->ntimestep); + // move atoms to new processors via irregular() // for non-RCB only needed if migrate_check() says an atom moves too far // else allow caller's comm->exchange() to do it // set disable = 0, so weights migrate with atoms // important to delay disable = 1 until after pre_neighbor imbfinal calc // b/c atoms may migrate again in comm->exchange() + // NOTE: for reproducible debug runs, set 1st arg of migrate_atoms() to 1 if (domain->triclinic) domain->x2lamda(atom->nlocal); if (wtflag) balance->fixstore->disable = 0; From 5210c4c3a4e21e63036ca51554fc8f49ceb88274 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 27 Mar 2019 16:58:14 -0600 Subject: [PATCH 173/243] cosmetic reformatting of new GRANULAR files --- doc/src/fix_wall_gran.txt | 53 +- doc/src/fix_wall_gran_region.txt | 59 +- doc/src/pair_granular.txt | 571 ++++++++++------- src/GRANULAR/fix_wall_gran.cpp | 746 ++++++++++++----------- src/GRANULAR/fix_wall_gran.h | 17 +- src/GRANULAR/fix_wall_gran_region.cpp | 19 +- src/GRANULAR/pair_gran_hooke_history.cpp | 4 +- src/GRANULAR/pair_gran_hooke_history.h | 3 +- src/GRANULAR/pair_granular.cpp | 419 ++++++++----- src/GRANULAR/pair_granular.h | 12 +- src/fix_neigh_history.cpp | 6 +- src/pair.h | 2 +- 12 files changed, 1086 insertions(+), 825 deletions(-) diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt index 198b22aa3f..b517d48cca 100644 --- a/doc/src/fix_wall_gran.txt +++ b/doc/src/fix_wall_gran.txt @@ -59,31 +59,32 @@ close enough to touch it. The nature of the wall/particle interactions are determined by the {fstyle} setting. It can be any of the styles defined by the -"pair_style gran/*"_pair_gran.html or the more general "pair_style granular"_pair_granular.html" -commands. Currently the options are {hooke}, {hooke/history}, or {hertz/history} for the former, -and {granular} with all the possible options of the associated {pair_coeff} command -for the latter. The equation for the -force between the wall and particles touching it is the same as the -corresponding equation on the "pair_style gran/*"_pair_gran.html -and "pair_style_granular"_pair_granular.html doc -pages, in the limit of one of the two particles going to infinite -radius and mass (flat wall). Specifically, delta = radius - r = -overlap of particle with wall, m_eff = mass of particle, and the -effective radius of contact = RiRj/Ri+Rj is set to the radius -of the particle. +"pair_style gran/*"_pair_gran.html or the more general "pair_style +granular"_pair_granular.html" commands. Currently the options are +{hooke}, {hooke/history}, or {hertz/history} for the former, and +{granular} with all the possible options of the associated +{pair_coeff} command for the latter. The equation for the force +between the wall and particles touching it is the same as the +corresponding equation on the "pair_style gran/*"_pair_gran.html and +"pair_style_granular"_pair_granular.html doc pages, in the limit of +one of the two particles going to infinite radius and mass (flat +wall). Specifically, delta = radius - r = overlap of particle with +wall, m_eff = mass of particle, and the effective radius of contact = +RiRj/Ri+Rj is set to the radius of the particle. The parameters {Kn}, {Kt}, {gamma_n}, {gamma_t}, {xmu} and {dampflag} have the same meaning and units as those specified with the -"pair_style gran/*"_pair_gran.html commands. This means a NULL can -be used for either {Kt} or {gamma_t} as described on that page. If a +"pair_style gran/*"_pair_gran.html commands. This means a NULL can be +used for either {Kt} or {gamma_t} as described on that page. If a NULL is used for {Kt}, then a default value is used where {Kt} = 2/7 {Kn}. If a NULL is used for {gamma_t}, then a default value is used where {gamma_t} = 1/2 {gamma_n}. -All the model choices for cohesion, tangential friction, rolling friction -and twisting friction supported by the "pair_style granular"_pair_granular.html -through its {pair_coeff} command are also supported for walls. These are discussed -in greater detail on the doc page for "pair_style granular"_pair_granular.html. +All the model choices for cohesion, tangential friction, rolling +friction and twisting friction supported by the "pair_style +granular"_pair_granular.html through its {pair_coeff} command are also +supported for walls. These are discussed in greater detail on the doc +page for "pair_style granular"_pair_granular.html. Note that you can choose a different force styles and/or different values for the wall/particle coefficients than for particle/particle @@ -121,14 +122,14 @@ Optionally, the wall can be moving, if the {wiggle} or {shear} keywords are appended. Both keywords cannot be used together. For the {wiggle} keyword, the wall oscillates sinusoidally, similar to -the oscillations of particles which can be specified by the -"fix move"_fix_move.html command. This is useful in packing -simulations of granular particles. The arguments to the {wiggle} -keyword specify a dimension for the motion, as well as it's -{amplitude} and {period}. Note that if the dimension is in the plane -of the wall, this is effectively a shearing motion. If the dimension -is perpendicular to the wall, it is more of a shaking motion. A -{zcylinder} wall can only be wiggled in the z dimension. +the oscillations of particles which can be specified by the "fix +move"_fix_move.html command. This is useful in packing simulations of +granular particles. The arguments to the {wiggle} keyword specify a +dimension for the motion, as well as it's {amplitude} and {period}. +Note that if the dimension is in the plane of the wall, this is +effectively a shearing motion. If the dimension is perpendicular to +the wall, it is more of a shaking motion. A {zcylinder} wall can only +be wiggled in the z dimension. Each timestep, the position of a wiggled wall in the appropriate {dim} is set according to this equation: diff --git a/doc/src/fix_wall_gran_region.txt b/doc/src/fix_wall_gran_region.txt index d54b3dc009..8a39d6b642 100644 --- a/doc/src/fix_wall_gran_region.txt +++ b/doc/src/fix_wall_gran_region.txt @@ -48,8 +48,8 @@ Here are snapshots of example models using this command. Corresponding input scripts can be found in examples/granregion. Click on the images to see a bigger picture. Movies of these simulations are "here on the Movies -page"_http://lammps.sandia.gov/movies.html#granregion of the -LAMMPS web site. +page"_http://lammps.sandia.gov/movies.html#granregion of the LAMMPS +web site. :image(JPG/gran_funnel_small.jpg,JPG/gran_funnel.png) :image(JPG/gran_mixer_small.jpg,JPG/gran_mixer.png) @@ -129,15 +129,16 @@ to make the two faces differ by epsilon in their position. The nature of the wall/particle interactions are determined by the {fstyle} setting. It can be any of the styles defined by the -"pair_style gran/*"_pair_gran.html or the more general "pair_style granular"_pair_granular.html" -commands. Currently the options are {hooke}, {hooke/history}, or {hertz/history} for the former, -and {granular} with all the possible options of the associated {pair_coeff} command -for the latter. The equation for the -force between the wall and particles touching it is the same as the -corresponding equation on the "pair_style gran/*"_pair_gran.html -and "pair_style_granular"_pair_granular.html doc -pages, but the effective radius is calculated using the radius of the -particle and the radius of curvature of the wall at the contact point. +"pair_style gran/*"_pair_gran.html or the more general "pair_style +granular"_pair_granular.html" commands. Currently the options are +{hooke}, {hooke/history}, or {hertz/history} for the former, and +{granular} with all the possible options of the associated +{pair_coeff} command for the latter. The equation for the force +between the wall and particles touching it is the same as the +corresponding equation on the "pair_style gran/*"_pair_gran.html and +"pair_style_granular"_pair_granular.html doc pages, but the effective +radius is calculated using the radius of the particle and the radius +of curvature of the wall at the contact point. Specifically, delta = radius - r = overlap of particle with wall, m_eff = mass of particle, and RiRj/Ri+Rj is the effective radius, with @@ -150,17 +151,17 @@ particle. The parameters {Kn}, {Kt}, {gamma_n}, {gamma_t}, {xmu} and {dampflag} have the same meaning and units as those specified with the -"pair_style gran/*"_pair_gran.html commands. This means a NULL can -be used for either {Kt} or {gamma_t} as described on that page. If a +"pair_style gran/*"_pair_gran.html commands. This means a NULL can be +used for either {Kt} or {gamma_t} as described on that page. If a NULL is used for {Kt}, then a default value is used where {Kt} = 2/7 {Kn}. If a NULL is used for {gamma_t}, then a default value is used where {gamma_t} = 1/2 {gamma_n}. - -All the model choices for cohesion, tangential friction, rolling friction -and twisting friction supported by the "pair_style granular"_pair_granular.html -through its {pair_coeff} command are also supported for walls. These are discussed -in greater detail on the doc page for "pair_style granular"_pair_granular.html. +All the model choices for cohesion, tangential friction, rolling +friction and twisting friction supported by the "pair_style +granular"_pair_granular.html through its {pair_coeff} command are also +supported for walls. These are discussed in greater detail on the doc +page for "pair_style granular"_pair_granular.html. Note that you can choose a different force styles and/or different values for the 6 wall/particle coefficients than for particle/particle @@ -169,9 +170,9 @@ material. [Restart, fix_modify, output, run start/stop, minimize info:] -Similar to "fix wall/gran"_fix_wall_gran.html command, this fix -writes the shear friction state of atoms interacting with the wall to -"binary restart files"_restart.html, so that a simulation can continue +Similar to "fix wall/gran"_fix_wall_gran.html command, this fix writes +the shear friction state of atoms interacting with the wall to "binary +restart files"_restart.html, so that a simulation can continue correctly if granular potentials with shear "history" effects are being used. This fix also includes info about a moving region in the restart file. See the "read_restart"_read_restart.html command for @@ -185,14 +186,14 @@ So you must re-define your region and if it is a moving region, define its motion attributes in a way that is consistent with the simulation that wrote the restart file. In particular, if you want to change the region motion attributes (e.g. its velocity), then you should ensure -the position/orientation of the region at the initial restart -timestep is the same as it was on the timestep the restart file was -written. If this is not possible, you may need to ignore info in the -restart file by defining a new fix wall/gran/region command in your -restart script, e.g. with a different fix ID. Or if you want to keep -the shear history info but discard the region motion information, you -can use the same fix ID for fix wall/gran/region, but assign it a -region with a different region ID. +the position/orientation of the region at the initial restart timestep +is the same as it was on the timestep the restart file was written. +If this is not possible, you may need to ignore info in the restart +file by defining a new fix wall/gran/region command in your restart +script, e.g. with a different fix ID. Or if you want to keep the +shear history info but discard the region motion information, you can +use the same fix ID for fix wall/gran/region, but assign it a region +with a different region ID. None of the "fix_modify"_fix_modify.html options are relevant to this fix. No global or per-atom quantities are stored by this fix for diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 73c2bbdd3b..e4b9bb3250 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -19,8 +19,7 @@ pair_style granular command :h3 pair_style granular cutoff :pre -cutoff = global cutoff (optional). See discussion below. :l -:ule +cutoff = global cutoff (optional). See discussion below. :l [Examples:] @@ -44,29 +43,39 @@ pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sd [Description:] -The {granular} styles support a variety of options for the normal, tangential, rolling and twisting -forces resulting from contact between two granular particles. This expands on the options offered -by the "pair gran/*"_pair_gran.html pair styles. The total computed forces and torques are the -sum of various models selected for the normal, tangential, rolling and twisting modes of motion. +The {granular} styles support a variety of options for the normal, +tangential, rolling and twisting forces resulting from contact between +two granular particles. This expands on the options offered by the +"pair gran/*"_pair_gran.html pair styles. The total computed forces +and torques are the sum of various models selected for the normal, +tangential, rolling and twisting modes of motion. -All model choices and parameters are entered in the "pair_coeff"_pair_coeff.html command, as described below. -Unlike e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not global, but can be set to different values for -different combinations of particle types, as determined by the "pair_coeff"_pair_coeff.html command. -If the contact model choice is the same for two particle types, the mixing for the cross-coefficients can be carried out -automatically. This is shown in the second example, where model choices are the same for type 1 - type 1 as for type 2 - type2 -interactions, but coefficients are different. In this case, the coefficients for type 2 - type interactions can be -determined from mixing rules discussed below. -For additional flexibility, coefficients as well as model forms can vary between particle types, -as shown in the third example: -type 1- type 1 interactions are based on a Hertzian normal contact model and 2-2 interactions are based on a DMT cohesive model (see below). -In that example, 1-1 and 2-2 interactions have different model forms, in which case -mixing of coefficients cannot be determined, so 1-2 interactions must be explicitly defined via the -{pair_coeff 1 2} command, otherwise an error would result. +All model choices and parameters are entered in the +"pair_coeff"_pair_coeff.html command, as described below. Unlike +e.g. "pair gran/hooke"_pair_gran.html, coefficient values are not +global, but can be set to different values for different combinations +of particle types, as determined by the "pair_coeff"_pair_coeff.html +command. If the contact model choice is the same for two particle +types, the mixing for the cross-coefficients can be carried out +automatically. This is shown in the second example, where model +choices are the same for type 1 - type 1 as for type 2 - type2 +interactions, but coefficients are different. In this case, the +coefficients for type 2 - type interactions can be determined from +mixing rules discussed below. For additional flexibility, +coefficients as well as model forms can vary between particle types, +as shown in the third example: type 1- type 1 interactions are based +on a Hertzian normal contact model and 2-2 interactions are based on a +DMT cohesive model (see below). In that example, 1-1 and 2-2 +interactions have different model forms, in which case mixing of +coefficients cannot be determined, so 1-2 interactions must be +explicitly defined via the {pair_coeff 1 2} command, otherwise an +error would result. :line -The first required keyword for the {pair_coeff} command is the normal contact model. Currently supported options -for normal contact models and their required arguments are: +The first required keyword for the {pair_coeff} command is the normal +contact model. Currently supported options for normal contact models +and their required arguments are: {hooke} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) {hertz} : \(k_n\), \(\eta_\{n0\}\) (or \(e\)) @@ -74,137 +83,165 @@ for normal contact models and their required arguments are: {dmt} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) {jkr} : E, \(\eta_\{n0\}\) (or \(e\)), \(\nu\), \(\gamma\) :ol -Here, \(k_n\) is spring stiffness (with units that depend on model choice, see below); -\(\eta_\{n0\}\) is a damping prefactor (or, in its place a coefficient of restitution -\(e\), depending on the choice of damping mode, see below); E is Young's modulus -in units of {force}/{length}^2, i.e. {pressure}; \(\nu\) is Poisson's ratio -and \(\gamma\) is a surface energy density, in units of {energy}/{length}^2. +Here, \(k_n\) is spring stiffness (with units that depend on model +choice, see below); \(\eta_\{n0\}\) is a damping prefactor (or, in its +place a coefficient of restitution \(e\), depending on the choice of +damping mode, see below); E is Young's modulus in units of +{force}/{length}^2, i.e. {pressure}; \(\nu\) is Poisson's ratio and +\(\gamma\) is a surface energy density, in units of +{energy}/{length}^2. + +For the {hooke} model, the normal, elastic component of force acting +on particle {i} due to contact with particle {j} is given by: -For the {hooke} model, the normal, elastic component of force acting on particle {i} due to -contact with particle {j} is given by: \begin\{equation\} \mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} \end\{equation\} -Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, -\(R_i, R_j\) are the particle radii, -\(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the -two particle centers (note the i-j ordering so that \(F_\{ne\}\) is positive for repulsion), -and \(\mathbf\{n\} = \frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). -Therefore, for {hooke}, the units of the spring constant \(k_n\) are {force}/{distance}, -or equivalently {mass}/{time^2}. +Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle +overlap, \(R_i, R_j\) are the particle radii, \(\mathbf\{r\}_\{ij\} = +\mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the two +particle centers (note the i-j ordering so that \(F_\{ne\}\) is +positive for repulsion), and \(\mathbf\{n\} = +\frac\{\mathbf\{r\}_\{ij\}\}\{\|\mathbf\{r\}_\{ij\}\|\}\). Therefore, +for {hooke}, the units of the spring constant \(k_n\) are +{force}/{distance}, or equivalently {mass}/{time^2}. For the {hertz} model, the normal component of force is given by: + \begin\{equation\} \mathbf\{F\}_\{ne, Hertz\} = k_N R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} \end\{equation\} -Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective radius, denoted for simplicity as {R} from here on. -For {hertz}, the units of the spring constant \(k_n\) are {force}/{length}^2, or equivalently -{pressure}. +Here, \(R_\{eff\} = \frac\{R_i R_j\}\{R_i + R_j\}\) is the effective +radius, denoted for simplicity as {R} from here on. For {hertz}, the +units of the spring constant \(k_n\) are {force}/{length}^2, or +equivalently {pressure}. For the {hertz/material} model, the force is given by: + \begin\{equation\} \mathbf\{F\}_\{ne, Hertz/material\} = \frac\{4\}\{3\} E_\{eff\} R_\{eff\}^\{1/2\}\delta_\{ij\}^\{3/2\} \mathbf\{n\} \end\{equation\} -Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) -is the effective Young's modulus, -with \(\nu_i, \nu_j \) the Poisson ratios of the particles of types {i} and {j}. Note that -if the elastic modulus and the shear modulus of the two particles are the same, the {hertz/material} -model is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) +Here, \(E_\{eff\} = E = \left(\frac\{1-\nu_i^2\}\{E_i\} + +\frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\}\) is the effective Young's +modulus, with \(\nu_i, \nu_j \) the Poisson ratios of the particles of +types {i} and {j}. Note that if the elastic modulus and the shear +modulus of the two particles are the same, the {hertz/material} model +is equivalent to the {hertz} model with \(k_N = 4/3 E_\{eff\}\) + +The {dmt} model corresponds to the +"(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, where the force +is simply Hertz with an additional attractive cohesion term: -The {dmt} model corresponds to the "(Derjaguin-Muller-Toporov)"_#DMT1975 cohesive model, -where the force is simply Hertz with an additional attractive cohesion term: \begin\{equation\} \mathbf\{F\}_\{ne, dmt\} = \left(\frac\{4\}\{3\} E R^\{1/2\}\delta_\{ij\}^\{3/2\} - 4\pi\gamma R\right)\mathbf\{n\} \end\{equation\} -The {jkr} model is the "(Johnson-Kendall-Roberts)"_#JKR1971 model, where the force is computed as: +The {jkr} model is the "(Johnson-Kendall-Roberts)"_#JKR1971 model, +where the force is computed as: + \begin\{equation\} \label\{eq:force_jkr\} \mathbf\{F\}_\{ne, jkr\} = \left(\frac\{4Ea^3\}\{3R\} - 2\pi a^2\sqrt\{\frac\{4\gamma E\}\{\pi a\}\}\right)\mathbf\{n\} \end\{equation\} -Here, {a} is the radius of the contact zone, related to the overlap \(\delta\) according to: +Here, {a} is the radius of the contact zone, related to the overlap +\(\delta\) according to: + \begin\{equation\} \delta = a^2/R - 2\sqrt\{\pi \gamma a/E\} \end\{equation\} -LAMMPS internally inverts the equation above to solve for {a} in terms of \(\delta\), then solves for -the force in the previous equation. Additionally, note that the JKR model allows for a tensile force beyond -contact (i.e. for \(\delta < 0\)), up to a maximum of \(3\pi\gamma R\) (also known as -the 'pull-off' force). -Note that this is a hysteretic effect, where particles that are not contacting initially -will not experience force until they come into contact \(\delta \geq 0\); as they move apart -and (\(\delta < 0\)), they experience a tensile force up to \(3\pi\gamma R\), -at which point they lose contact. +LAMMPS internally inverts the equation above to solve for {a} in terms +of \(\delta\), then solves for the force in the previous +equation. Additionally, note that the JKR model allows for a tensile +force beyond contact (i.e. for \(\delta < 0\)), up to a maximum of +\(3\pi\gamma R\) (also known as the 'pull-off' force). Note that this +is a hysteretic effect, where particles that are not contacting +initially will not experience force until they come into contact +\(\delta \geq 0\); as they move apart and (\(\delta < 0\)), they +experience a tensile force up to \(3\pi\gamma R\), at which point they +lose contact. :line -In addition, the normal force is augmented by a damping term of the following -general form: +In addition, the normal force is augmented by a damping term of the +following general form: \begin\{equation\} \mathbf\{F\}_\{n,damp\} = -\eta_n \mathbf\{v\}_\{n,rel\} \end\{equation\} -Here, \(\mathbf\{v\}_\{n,rel\} = (\mathbf\{v\}_j - \mathbf\{v\}_i) \cdot \mathbf\{n\}\) -is the component of relative velocity along \(\mathbf\{n\}\). +Here, \(\mathbf\{v\}_\{n,rel\} = (\mathbf\{v\}_j - \mathbf\{v\}_i) +\cdot \mathbf\{n\}\) is the component of relative velocity along +\(\mathbf\{n\}\). -The optional {damping} keyword to the {pair_coeff} command followed by a keyword -determines the model form of the damping factor \(\eta_n\), and the interpretation -of the \(\eta_\{n0\}\) or \(e\) coefficients specified as part of the normal contact -model settings. The {damping} keyword and corresponding -model form selection may be appended anywhere in the {pair coeff} command. -Note that the choice of damping model affects both the -normal and tangential damping (and depending on other settings, potentially also the twisting damping). -The options for the damping model currently supported are: +The optional {damping} keyword to the {pair_coeff} command followed by +a keyword determines the model form of the damping factor \(\eta_n\), +and the interpretation of the \(\eta_\{n0\}\) or \(e\) coefficients +specified as part of the normal contact model settings. The {damping} +keyword and corresponding model form selection may be appended +anywhere in the {pair coeff} command. Note that the choice of damping +model affects both the normal and tangential damping (and depending on +other settings, potentially also the twisting damping). The options +for the damping model currently supported are: {velocity} {viscoelastic} {tsuji} :ol -If the {damping} keyword is not specified, the {viscoelastic} model is used by default. +If the {damping} keyword is not specified, the {viscoelastic} model is +used by default. -For {damping velocity}, the normal damping is simply equal to the user-specified damping -coefficient in the {normal} model: +For {damping velocity}, the normal damping is simply equal to the +user-specified damping coefficient in the {normal} model: \begin\{equation\} \eta_n = \eta_\{n0\}\ \end\{equation\} -Here, \(\gamma_n\) is the damping coefficient specified for the normal contact model, in units of {mass}/{time}, +Here, \(\gamma_n\) is the damping coefficient specified for the normal +contact model, in units of {mass}/{time}, + +The {damping viscoelastic} model is based on the viscoelastic +treatment of "(Brilliantov et al)"_#Brill1996, where the normal +damping is given by: -The {damping viscoelastic} model is based on the viscoelastic treatment of "(Brilliantov et al)"_#Brill1996, -where the normal damping is given by: \begin\{equation\} \eta_n = \eta_\{n0\}\ a m_\{eff\} \end\{equation\} -Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\) -for all models except {jkr}, for which it is given implicitly according to \(delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). -In this case, \eta_\{n0\}\ is in units of 1/({time}*{distance}). +Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a} +is the contact radius, given by \(a =\sqrt\{R\delta\}\) for all models +except {jkr}, for which it is given implicitly according to \(delta = +a^2/R - 2\sqrt\{\pi \gamma a/E\}\). In this case, \eta_\{n0\}\ is in +units of 1/({time}*{distance}). -The {tsuji} model is based on the work of "(Tsuji et al)"_#Tsuji1992. Here, the -damping coefficient specified as part of the normal model is interpreted -as a restitution coefficient \(e\). The damping constant \(\eta_n\) is given by: +The {tsuji} model is based on the work of "(Tsuji et +al)"_#Tsuji1992. Here, the damping coefficient specified as part of +the normal model is interpreted as a restitution coefficient +\(e\). The damping constant \(\eta_n\) is given by: \begin\{equation\} \eta_n = \alpha (m_\{eff\}k_n)^\{1/2\} \end\{equation\} -For normal contact models based on material parameters, \(k_n = 4/3Ea\). -The parameter \(\alpha\) is related to the restitution coefficient {e} according to: +For normal contact models based on material parameters, \(k_n = +4/3Ea\). The parameter \(\alpha\) is related to the restitution +coefficient {e} according to: \begin\{equation\} \alpha = 1.2728-4.2783e+11.087e^2-22.348e^3+27.467e^4-18.022e^5+4.8218e^6 \end\{equation\} -The dimensionless coefficient of restitution \(e\) specified as part of the normal contact model -parameters should be between 0 and 1, but no error check is performed on this. +The dimensionless coefficient of restitution \(e\) specified as part +of the normal contact model parameters should be between 0 and 1, but +no error check is performed on this. -The total normal force is computed as the sum of the elastic and damping components: +The total normal force is computed as the sum of the elastic and +damping components: \begin\{equation\} \mathbf\{F\}_n = \mathbf\{F\}_\{ne\} + \mathbf\{F\}_\{n,damp\} @@ -212,24 +249,24 @@ The total normal force is computed as the sum of the elastic and damping compone :line -The {pair_coeff} command also requires specification -of the tangential contact model. The required keyword {tangential} is expected, followed by the model -choice and associated parameters. Currently supported tangential model choices and their -expected parameters are as follows: +The {pair_coeff} command also requires specification of the tangential +contact model. The required keyword {tangential} is expected, followed +by the model choice and associated parameters. Currently supported +tangential model choices and their expected parameters are as follows: {linear_nohistory} : \(x_\{\gamma,t\}\), \(\mu_s\) {linear_history} : \(k_t\), \(x_\{\gamma,t\}\), \(\mu_s\) {mindlin} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) {mindlin_rescale} : \(k_t\) or NULL, \(x_\{\gamma,t\}\), \(\mu_s\) :ol -Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal damping \(\eta_n\) -that determines the magnitude of the -tangential damping, \(\mu_t\) is the tangential (or sliding) friction +Here, \(x_\{\gamma,t\}\) is a dimensionless multiplier for the normal +damping \(\eta_n\) that determines the magnitude of the tangential +damping, \(\mu_t\) is the tangential (or sliding) friction coefficient, and \(k_t\) is the tangential stiffness coefficient. -For {tangential linear_nohistory}, a simple velocity-dependent Coulomb friction criterion is used, -which mimics the behavior -of the {pair gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: +For {tangential linear_nohistory}, a simple velocity-dependent Coulomb +friction criterion is used, which mimics the behavior of the {pair +gran/hooke} style. The tangential force (\mathbf\{F\}_t\) is given by: \begin\{equation\} \mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|\mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} @@ -241,41 +278,52 @@ The tangential damping force \(\mathbf\{F\}_\mathrm\{t,damp\}\) is given by: \mathbf\{F\}_\mathrm\{t,damp\} = -\eta_t \mathbf\{v\}_\{t,rel\} \end\{equation\} -The tangential damping prefactor \(\eta_t\) is calculated by scaling the normal damping \(\eta_n\) (see above): +The tangential damping prefactor \(\eta_t\) is calculated by scaling +the normal damping \(\eta_n\) (see above): + \begin\{equation\} \eta_t = -x_\{\gamma,t\} \eta_n \end\{equation\} -The normal damping prefactor \(\eta_n\) is determined by the choice of the {damping} keyword, as discussed above. -Thus, the {damping} keyword also affects the tangential damping. -The parameter \(x_\{\gamma,t\}\) is a scaling coefficient. Several works in the literature use -\(x_\{\gamma,t\} = 1\) ("Marshall"_#Marshall2009, "Tsuji et al"_#Tsuji1992, "Silbert et al"_#Silbert2001). -The relative tangential velocity at the point of contact is given by -\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + R_j\Omega_j) \times \mathbf\{n\}\), -where \(\mathbf\{v\}_\{t\} = \mathbf\{v\}_r - \mathbf\{v\}_r\cdot\mathbf\{n\}\), -\(\mathbf\{v\}_r = \mathbf\{v\}_j - \mathbf\{v\}_i\). The direction of the applied force is -\(\mathbf\{t\} = \mathbf\{v_\{t,rel\}\}/\|\mathbf\{v_\{t,rel\}\}\|\). +The normal damping prefactor \(\eta_n\) is determined by the choice of +the {damping} keyword, as discussed above. Thus, the {damping} +keyword also affects the tangential damping. The parameter +\(x_\{\gamma,t\}\) is a scaling coefficient. Several works in the +literature use \(x_\{\gamma,t\} = 1\) ("Marshall"_#Marshall2009, +"Tsuji et al"_#Tsuji1992, "Silbert et al"_#Silbert2001). The relative +tangential velocity at the point of contact is given by +\(\mathbf\{v\}_\{t, rel\} = \mathbf\{v\}_\{t\} - (R_i\Omega_i + +R_j\Omega_j) \times \mathbf\{n\}\), where \(\mathbf\{v\}_\{t\} = +\mathbf\{v\}_r - \mathbf\{v\}_r\cdot\mathbf\{n\}\), \(\mathbf\{v\}_r = +\mathbf\{v\}_j - \mathbf\{v\}_i\). The direction of the applied force +is \(\mathbf\{t\} = +\mathbf\{v_\{t,rel\}\}/\|\mathbf\{v_\{t,rel\}\}\|\). The normal force value \(F_\{n0\}\) used to compute the critical force depends on the form of the contact model. For non-cohesive models -({hertz}, {hertz/material}, {hooke}), it is given by the magnitude of the normal force: +({hertz}, {hertz/material}, {hooke}), it is given by the magnitude of +the normal force: \begin\{equation\} F_\{n0\} = \|\mathbf\{F\}_n\| \end\{equation\} -For cohesive models such as {jkr} and {dmt}, the critical force is adjusted so that the critical tangential -force approaches \(\mu_t F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and "Thornton"_#Thornton1991. -For both models, \(F_\{n0\}\) takes the form: +For cohesive models such as {jkr} and {dmt}, the critical force is +adjusted so that the critical tangential force approaches \(\mu_t +F_\{pulloff\}\), see "Marshall"_#Marshall2009, equation 43, and +"Thornton"_#Thornton1991. For both models, \(F_\{n0\}\) takes the +form: \begin\{equation\} F_\{n0\} = \|\mathbf\{F\}_ne + 2 F_\{pulloff\}\| \end\{equation\} -Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and \(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. +Where \(F_\{pulloff\} = 3\pi \gamma R \) for {jkr}, and +\(F_\{pulloff\} = 4\pi \gamma R \) for {dmt}. -The remaining tangential options all use accumulated tangential displacement (i.e. contact history). This -is discussed below in the context of the {linear_history} option, but the same treatment of the +The remaining tangential options all use accumulated tangential +displacement (i.e. contact history). This is discussed below in the +context of the {linear_history} option, but the same treatment of the accumulated displacement applies to the other options as well. For {tangential linear_history}, the tangential force is given by: @@ -284,49 +332,55 @@ For {tangential linear_history}, the tangential force is given by: \mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t\mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} \end\{equation\} -Here, \(\mathbf\{\xi\}\) is the tangential displacement accumulated during the entire -duration of the contact: +Here, \(\mathbf\{\xi\}\) is the tangential displacement accumulated +during the entire duration of the contact: \begin\{equation\} \mathbf\{\xi\} = \int_\{t0\}^t \mathbf\{v\}_\{t,rel\}(\tau) \mathrm\{d\}\tau \end\{equation\} -This accumulated tangential displacement must be adjusted to account for changes -in the frame of reference -of the contacting pair of particles during contact. This occurs due to the overall motion of the contacting particles -in a rigid-body-like fashion during the duration of the contact. There are two modes of motion -that are relevant: the 'tumbling' rotation of the contacting pair, which changes the orientation of the -plane in which tangential displacement occurs; and 'spinning' rotation of the contacting pair -about the vector connecting their centers of mass (\(\mathbf\{n\}\)). -Corrections due to the former mode of motion are -made by rotating the accumulated displacement into the plane that is tangential -to the contact vector at each step, -or equivalently removing any component of the tangential displacement -that lies along \(\mathbf\{n\}\), and rescaling to preserve the magnitude. -This follows the discussion in "Luding"_#Luding2008, see equation 17 and -relevant discussion in that work: +This accumulated tangential displacement must be adjusted to account +for changes in the frame of reference of the contacting pair of +particles during contact. This occurs due to the overall motion of the +contacting particles in a rigid-body-like fashion during the duration +of the contact. There are two modes of motion that are relevant: the +'tumbling' rotation of the contacting pair, which changes the +orientation of the plane in which tangential displacement occurs; and +'spinning' rotation of the contacting pair about the vector connecting +their centers of mass (\(\mathbf\{n\}\)). Corrections due to the +former mode of motion are made by rotating the accumulated +displacement into the plane that is tangential to the contact vector +at each step, or equivalently removing any component of the tangential +displacement that lies along \(\mathbf\{n\}\), and rescaling to +preserve the magnitude. This follows the discussion in +"Luding"_#Luding2008, see equation 17 and relevant discussion in that +work: \begin\{equation\} \mathbf\{\xi\} = \left(\mathbf\{\xi'\} - (\mathbf\{n\} \cdot \mathbf\{\xi'\})\mathbf\{n\}\right) \frac\{\|\mathbf\{\xi'\}\|\}\{\|\mathbf\{\xi'\}\| - \mathbf\{n\}\cdot\mathbf\{\xi'\}\} \label\{eq:rotate_displacements\} \end\{equation\} -Here, \(\mathbf\{\xi'\}\) is the accumulated displacement prior to the current time step and -\(\mathbf\{\xi\}\) is the corrected displacement. Corrections to the displacement -due to the second mode of motion described above (rotations about \(\mathbf\{n\}\)) -are not currently implemented, but are expected to be minor for most simulations. +Here, \(\mathbf\{\xi'\}\) is the accumulated displacement prior to the +current time step and \(\mathbf\{\xi\}\) is the corrected +displacement. Corrections to the displacement due to the second mode +of motion described above (rotations about \(\mathbf\{n\}\)) are not +currently implemented, but are expected to be minor for most +simulations. -Furthermore, when the tangential force exceeds the critical force, -the tangential displacement is re-scaled to match the value for the critical force (see "Luding"_#Luding2008, -equation 20 and related discussion): +Furthermore, when the tangential force exceeds the critical force, the +tangential displacement is re-scaled to match the value for the +critical force (see "Luding"_#Luding2008, equation 20 and related +discussion): \begin\{equation\} \mathbf\{\xi\} = -\frac\{1\}\{k_t\}\left(\mu_t F_\{n0\}\mathbf\{t\} + \mathbf\{F\}_\{t,damp\}\right) \end\{equation\} -The tangential force is added to the total normal force (elastic plus damping) to produce the total force -on the particle. The tangential force also acts at the contact point (defined as the center of the overlap region) -to induce a torque on each particle according to: +The tangential force is added to the total normal force (elastic plus +damping) to produce the total force on the particle. The tangential +force also acts at the contact point (defined as the center of the +overlap region) to induce a torque on each particle according to: \begin\{equation\} \mathbf\{\tau\}_i = -(R_i - 0.5 \delta) \mathbf\{n\} \times \mathbf\{F\}_t @@ -343,72 +397,90 @@ option by an additional factor of {a}, the radius of the contact region. The tan \mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t a \mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} \end\{equation\} -Here, {a} is the radius of the contact region, given by \(a = \delta R\) for all normal contact models, -except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), -see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where -\(G\) is the shear modulus, related to Young's modulus \(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) -is Poisson's ratio. This can also be achieved by specifying {NULL} for \(k_t\), in which case -a normal contact model that specifies material parameters \(E\) and \(\nu\) is required (e.g. {hertz/material}, -{dmt} or {jkr}). In this case, mixing of the shear modulus for different particle types {i} and {j} is done according -to: +Here, {a} is the radius of the contact region, given by \(a = \delta +R\) for all normal contact models, except for {jkr}, where it is given +implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), see +discussion above. To match the Mindlin solution, one should set \(k_t += 8G\), where \(G\) is the shear modulus, related to Young's modulus +\(E\) by \(G = E/(2(1+\nu))\), where \(\nu\) is Poisson's ratio. This +can also be achieved by specifying {NULL} for \(k_t\), in which case a +normal contact model that specifies material parameters \(E\) and +\(\nu\) is required (e.g. {hertz/material}, {dmt} or {jkr}). In this +case, mixing of the shear modulus for different particle types {i} and +{j} is done according to: + \begin\{equation\} 1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j \end\{equation\} -The {mindlin_rescale} option uses the same form as {mindlin}, but the magnitude of the tangential -displacement is re-scaled as the contact unloads, i.e. if \(a < a_\{t_\{n-1\}\}\): +The {mindlin_rescale} option uses the same form as {mindlin}, but the +magnitude of the tangential displacement is re-scaled as the contact +unloads, i.e. if \(a < a_\{t_\{n-1\}\}\): + \begin\{equation\} \mathbf\{\xi\} = \mathbf\{\xi_\{t_\{n-1\}\}\} \frac\{a\}\{a_\{t_\{n-1\}\}\} \end\{equation\} -Here, \(t_\{n-1\}\) indicates the value at the previous time step. This rescaling -accounts for the fact that a decrease in the contact area upon unloading leads to the contact -being unable to support the previous tangential loading, and spurious energy is created -without the rescaling above ("Walton"_#WaltonPC ). See also discussion in "Thornton et al, 2013"_#Thornton2013 -, particularly equation 18(b) of that work and associated discussion. +Here, \(t_\{n-1\}\) indicates the value at the previous time +step. This rescaling accounts for the fact that a decrease in the +contact area upon unloading leads to the contact being unable to +support the previous tangential loading, and spurious energy is +created without the rescaling above ("Walton"_#WaltonPC ). See also +discussion in "Thornton et al, 2013"_#Thornton2013 , particularly +equation 18(b) of that work and associated discussion. :line -The optional {rolling} keyword enables rolling friction, which resists pure rolling -motion of particles. The options currently supported are: +The optional {rolling} keyword enables rolling friction, which resists +pure rolling motion of particles. The options currently supported are: {none} {sds} : \(k_\{roll\}\), \(\gamma_\{roll\}\), \(\mu_\{roll\}\) :ol If the {rolling} keyword is not specified, the model defaults to {none}. -For {rolling sds}, rolling friction is computed via a spring-dashpot-slider, using a -'pseudo-force' formulation, as detailed by "Luding"_#Luding2008. Unlike the formulation -in "Marshall"_#Marshall2009, this allows for the required adjustment of -rolling displacement due to changes in the frame of reference of the contacting pair. -The rolling pseudo-force is computed analogously to the tangential force: +For {rolling sds}, rolling friction is computed via a +spring-dashpot-slider, using a 'pseudo-force' formulation, as detailed +by "Luding"_#Luding2008. Unlike the formulation in +"Marshall"_#Marshall2009, this allows for the required adjustment of +rolling displacement due to changes in the frame of reference of the +contacting pair. The rolling pseudo-force is computed analogously to +the tangential force: \begin\{equation\} \mathbf\{F\}_\{roll,0\} = k_\{roll\} \mathbf\{\xi\}_\{roll\} - \gamma_\{roll\} \mathbf\{v\}_\{roll\} \end\{equation\} -Here, \(\mathbf\{v\}_\{roll\} = -R(\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \times \mathbf\{n\}\) is the -relative rolling velocity, as given in "Wang et al"_#Wang2015 and "Luding"_#Luding2008. This differs -from the expressions given by "Kuhn and Bagi"_#Kuhn2004 and used in "Marshall"_#Marshall2009; -see "Wang et al"_#Wang2015 for details. The rolling displacement is given by: +Here, \(\mathbf\{v\}_\{roll\} = -R(\mathbf\{\Omega\}_i - +\mathbf\{\Omega\}_j) \times \mathbf\{n\}\) is the relative rolling +velocity, as given in "Wang et al"_#Wang2015 and +"Luding"_#Luding2008. This differs from the expressions given by "Kuhn +and Bagi"_#Kuhn2004 and used in "Marshall"_#Marshall2009; see "Wang et +al"_#Wang2015 for details. The rolling displacement is given by: \begin\{equation\} \mathbf\{\xi\}_\{roll\} = \int_\{t_0\}^t \mathbf\{v\}_\{roll\} (\tau) \mathrm\{d\} \tau \end\{equation\} -A Coulomb friction criterion truncates the rolling pseudo-force if it exceeds a critical value: +A Coulomb friction criterion truncates the rolling pseudo-force if it +exceeds a critical value: + \begin\{equation\} \mathbf\{F\}_\{roll\} = min(\mu_\{roll\} F_\{n,0\}, \|\mathbf\{F\}_\{roll,0\}\|)\mathbf\{k\} \end\{equation\} -Here, \(\mathbf\{k\} = \mathbf\{v\}_\{roll\}/\|\mathbf\{v\}_\{roll\}\|\) is the direction of the pseudo-force. -As with tangential displacement, the rolling displacement is rescaled when the critical -force is exceeded, so that the spring length corresponds the critical force. Additionally, the -displacement is adjusted to account for rotations of the frame of reference of the two -contacting particles in a manner analogous to the tangential displacement. +Here, \(\mathbf\{k\} = +\mathbf\{v\}_\{roll\}/\|\mathbf\{v\}_\{roll\}\|\) is the direction of +the pseudo-force. As with tangential displacement, the rolling +displacement is rescaled when the critical force is exceeded, so that +the spring length corresponds the critical force. Additionally, the +displacement is adjusted to account for rotations of the frame of +reference of the two contacting particles in a manner analogous to the +tangential displacement. -The rolling pseudo-force does not contribute to the total force on either particle (hence 'pseudo'), -but acts only to induce an equal and opposite torque on each particle, according to: +The rolling pseudo-force does not contribute to the total force on +either particle (hence 'pseudo'), but acts only to induce an equal and +opposite torque on each particle, according to: \begin\{equation\} \tau_\{roll,i\} = R_\{eff\} \mathbf\{n\} \times \mathbf\{F\}_\{roll\} @@ -420,9 +492,10 @@ but acts only to induce an equal and opposite torque on each particle, according :line -The optional {twisting} keyword enables twisting friction, which resists -rotation of two contacting particles about the vector \(\mathbf\{n\}\) that connects their -centers. The options currently supported are: +The optional {twisting} keyword enables twisting friction, which +resists rotation of two contacting particles about the vector +\(\mathbf\{n\}\) that connects their centers. The options currently +supported are: {none} {sds} : \(k_\{twist\}\), \(\gamma_\{twist\}\), \(\mu_\{twist\}\) @@ -430,36 +503,42 @@ centers. The options currently supported are: If the {twisting} keyword is not specified, the model defaults to {none}. -For both {twisting sds} and {twisting marshall}, a history-dependent spring-dashpot-slider is used to compute the twisting -torque. Because twisting displacement is a scalar, there is no need to adjust for changes -in the frame of reference due to rotations of the particle pair. The formulation in -"Marshall"_#Marshall2009 therefore provides the most straightforward treatment: +For both {twisting sds} and {twisting marshall}, a history-dependent +spring-dashpot-slider is used to compute the twisting torque. Because +twisting displacement is a scalar, there is no need to adjust for +changes in the frame of reference due to rotations of the particle +pair. The formulation in "Marshall"_#Marshall2009 therefore provides +the most straightforward treatment: \begin\{equation\} \tau_\{twist,0\} = -k_\{twist\}\xi_\{twist\} - \gamma_\{twist\}\Omega_\{twist\} \end\{equation\} -Here \(\xi_\{twist\} = \int_\{t_0\}^t \Omega_\{twist\} (\tau) \mathrm\{d\}\tau\) is the twisting -angular displacement, and \(\Omega_\{twist\} = (\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \cdot \mathbf\{n\}\) -is the relative twisting angular velocity. The torque is then truncated according to: +Here \(\xi_\{twist\} = \int_\{t_0\}^t \Omega_\{twist\} (\tau) +\mathrm\{d\}\tau\) is the twisting angular displacement, and +\(\Omega_\{twist\} = (\mathbf\{\Omega\}_i - \mathbf\{\Omega\}_j) \cdot +\mathbf\{n\}\) is the relative twisting angular velocity. The torque +is then truncated according to: \begin\{equation\} \tau_\{twist\} = min(\mu_\{twist\} F_\{n,0\}, \tau_\{twist,0\}) \end\{equation\} -Similar to the sliding and rolling displacement, the angular displacement is -rescaled so that it corresponds to the critical value if the twisting torque -exceeds this critical value: +Similar to the sliding and rolling displacement, the angular +displacement is rescaled so that it corresponds to the critical value +if the twisting torque exceeds this critical value: \begin\{equation\} \xi_\{twist\} = \frac\{1\}\{k_\{twist\}\} (\mu_\{twist\} F_\{n,0\}sgn(\Omega_\{twist\}) - \gamma_\{twist\}\Omega_\{twist\}) \end\{equation\} -For {twisting sds}, the coefficients \(k_\{twist\}, \gamma_\{twist\}\) and \(\mu_\{twist\}\) are -simply the user input parameters that follow the {twisting sds} keywords in the {pair_coeff} command. +For {twisting sds}, the coefficients \(k_\{twist\}, \gamma_\{twist\}\) +and \(\mu_\{twist\}\) are simply the user input parameters that follow +the {twisting sds} keywords in the {pair_coeff} command. -For {twisting_marshall}, the coefficients are expressed in terms of sliding friction coefficients, -as discussed in "Marshall"_#Marshall2009 (see equations 32 and 33 of that work): +For {twisting_marshall}, the coefficients are expressed in terms of +sliding friction coefficients, as discussed in +"Marshall"_#Marshall2009 (see equations 32 and 33 of that work): \begin\{equation\} k_\{twist\} = 0.5k_ta^2 @@ -485,19 +564,25 @@ Finally, the twisting torque on each particle is given by: :line -LAMMPS automatically sets pairwise cutoff values for {pair_style granular} based on particle radii (and in the case -of {jkr} pull-off distances). In the vast majority of situations, this is adequate. -However, a cutoff value can optionally be appended to the {pair_style granular} command to specify -a global cutoff (i.e. a cutoff for all atom types). Additionally, the optional {cutoff} keyword -can be passed to the {pair_coeff} command, followed by a cutoff value. -This will set a pairwise cutoff for the atom types in the {pair_coeff} command. -These options may be useful in some rare cases where the automatic cutoff determination is not sufficient, e.g. -if particle diameters are being modified via the {fix adapt} command. In that case, the global cutoff -specified as part of the {pair_style granular} command is applied to all atom types, unless it is -overridden for a given atom type combination by the {cutoff} value specified in the {pair coeff} command. -If {cutoff} is only specified in the {pair coeff} command and no global -cutoff is appended to the {pair_style granular} command, then LAMMPS will use that cutoff for the specified -atom type combination, and automatically set pairwise cutoffs for the remaining atom types. +LAMMPS automatically sets pairwise cutoff values for {pair_style +granular} based on particle radii (and in the case of {jkr} pull-off +distances). In the vast majority of situations, this is adequate. +However, a cutoff value can optionally be appended to the {pair_style +granular} command to specify a global cutoff (i.e. a cutoff for all +atom types). Additionally, the optional {cutoff} keyword can be passed +to the {pair_coeff} command, followed by a cutoff value. This will +set a pairwise cutoff for the atom types in the {pair_coeff} command. +These options may be useful in some rare cases where the automatic +cutoff determination is not sufficient, e.g. if particle diameters +are being modified via the {fix adapt} command. In that case, the +global cutoff specified as part of the {pair_style granular} command +is applied to all atom types, unless it is overridden for a given atom +type combination by the {cutoff} value specified in the {pair coeff} +command. If {cutoff} is only specified in the {pair coeff} command +and no global cutoff is appended to the {pair_style granular} command, +then LAMMPS will use that cutoff for the specified atom type +combination, and automatically set pairwise cutoffs for the remaining +atom types. :line @@ -529,20 +614,21 @@ The "pair_modify"_pair_modify.html mix, shift, table, and tail options are not relevant for granular pair styles. Mixing of coefficients is carried out using geometric averaging for -most quantities, e.g. if friction coefficient for type 1-type 1 interactions -is set to \(\mu_1\), and friction coefficient for type 2-type 2 interactions -is set to \(\mu_2\), the friction coefficient for type1-type2 interactions -is computed as \(\sqrt\{\mu_1\mu_2\}\) (unless explicitly specified to -a different value by a {pair_coeff 1 2 ...} command. The exception to this is -elastic modulus, only applicable to {hertz/material}, {dmt} and {jkr} normal -contact models. In that case, the effective elastic modulus is computed as: +most quantities, e.g. if friction coefficient for type 1-type 1 +interactions is set to \(\mu_1\), and friction coefficient for type +2-type 2 interactions is set to \(\mu_2\), the friction coefficient +for type1-type2 interactions is computed as \(\sqrt\{\mu_1\mu_2\}\) +(unless explicitly specified to a different value by a {pair_coeff 1 2 +...} command. The exception to this is elastic modulus, only +applicable to {hertz/material}, {dmt} and {jkr} normal contact +models. In that case, the effective elastic modulus is computed as: \begin\{equation\} E_\{eff,ij\} = \left(\frac\{1-\nu_i^2\}\{E_i\} + \frac\{1-\nu_j^2\}\{E_j\}\right)^\{-1\} \end\{equation\} -If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are explicitly specified, -the effective modulus is computed as: +If the {i-j} coefficients \(E_\{ij\}\) and \(\nu_\{ij\}\) are +explicitly specified, the effective modulus is computed as: \begin\{equation\} E_\{eff,ij\} = \left(\frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\} + \frac\{1-\nu_\{ij\}^2\}\{E_\{ij\}\}\right)^\{-1\} @@ -610,57 +696,70 @@ compute depend on atom velocities. See the [Default:] -For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, {twisting none} +For the {pair_coeff} settings: {damping viscoelastic}, {rolling none}, +{twisting none}. [References:] :link(Brill1996) -[(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, J. M., & Poschel, T. (1996). -Model for collisions in granular gases. Physical review E, 53(5), 5382. +[(Brilliantov et al, 1996)] Brilliantov, N. V., Spahn, F., Hertzsch, +J. M., & Poschel, T. (1996). Model for collisions in granular +gases. Physical review E, 53(5), 5382. -:link(Tsuji1992) -[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, T. (1992). Lagrangian numerical simulation of plug flow of -cohesionless particles in a horizontal pipe. Powder technology, 71(3), 239-250. +:link(Tsuji1992) +[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida, +T. (1992). Lagrangian numerical simulation of plug flow of +cohesionless particles in a horizontal pipe. Powder technology, 71(3), +239-250. :link(JKR1971) -[(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, A. D. (1971). -Surface energy and the contact of elastic solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. +[(Johnson et al, 1971)] Johnson, K. L., Kendall, K., & Roberts, +A. D. (1971). Surface energy and the contact of elastic +solids. Proc. R. Soc. Lond. A, 324(1558), 301-313. :link(DMT1975) -[Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, Y. P. (1975). Effect of contact deformations on the -adhesion of particles. Journal of Colloid and interface science, 53(2), 314-326. +[Derjaguin et al, 1975)] Derjaguin, B. V., Muller, V. M., & Toporov, +Y. P. (1975). Effect of contact deformations on the adhesion of +particles. Journal of Colloid and interface science, 53(2), 314-326. :link(Luding2008) -[(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: contact models for tension. Granular matter, 10(4), 235. +[(Luding, 2008)] Luding, S. (2008). Cohesive, frictional powders: +contact models for tension. Granular matter, 10(4), 235. :link(Marshall2009) -[(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling of particulate aerosol flows. -Journal of Computational Physics, 228(5), 1541-1561. +[(Marshall, 2009)] Marshall, J. S. (2009). Discrete-element modeling +of particulate aerosol flows. Journal of Computational Physics, +228(5), 1541-1561. :link(Silbert2001) -[(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, T. C., Levine, D., & Plimpton, S. J. (2001). -Granular flow down an inclined plane: Bagnold scaling and rheology. Physical Review E, 64(5), 051302. +[(Silbert, 2001)] Silbert, L. E., Ertas, D., Grest, G. S., Halsey, +T. C., Levine, D., & Plimpton, S. J. (2001). Granular flow down an +inclined plane: Bagnold scaling and rheology. Physical Review E, +64(5), 051302. :link(Kuhn2004) -[(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact rolling and deformation in granular media. -International journal of solids and structures, 41(21), 5793-5820. +[(Kuhn and Bagi, 2005)] Kuhn, M. R., & Bagi, K. (2004). Contact +rolling and deformation in granular media. International journal of +solids and structures, 41(21), 5793-5820. :link(Wang2015) -[(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, W. W. (2015). -Rolling and sliding in 3-D discrete element models. Particuology, 23, 49-55. +[(Wang et al, 2015)] Wang, Y., Alonso-Marroquin, F., & Guo, +W. W. (2015). Rolling and sliding in 3-D discrete element +models. Particuology, 23, 49-55. :link(Thornton1991) -[(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the presence of adhesion. -J. Phys. D: Appl. Phys. 24 1942 +[(Thornton, 1991)] Thornton, C. (1991). Interparticle sliding in the +presence of adhesion. J. Phys. D: Appl. Phys. 24 1942 :link(Mindlin1949) -[(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies in contact. -J. Appl. Mech., ASME 16, 259-268. +[(Mindlin, 1949)] Mindlin, R. D. (1949). Compliance of elastic bodies +in contact. J. Appl. Mech., ASME 16, 259-268. :link(Thornton2013) -[(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, P. W. (2013). -An investigation of the comparative behaviour of alternative contact force models -during inelastic collisions. Powder Technology, 233, 30-46. +[(Thornton et al, 2013)] Thornton, C., Cummins, S. J., & Cleary, +P. W. (2013). An investigation of the comparative behaviour of +alternative contact force models during inelastic collisions. Powder +Technology, 233, 30-46. :link(WaltonPC) [(Otis R. Walton)] Walton, O.R., Personal Communication diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index c63a2c0ba8..9925c37e4b 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -124,21 +124,27 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : roll_model = twist_model = NONE; while (iarg < narg) { if (strcmp(arg[iarg], "hooke") == 0) { - if (iarg + 2 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hooke option"); + if (iarg + 2 >= narg) + error->all(FLERR,"Illegal fix wall/gran command, " + "not enough parameters provided for Hooke option"); normal_model = NORMAL_HOOKE; normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + if (iarg + num_coeffs >= narg) + error->all(FLERR,"Illegal fix wall/gran command, " + "not enough parameters provided for Hertz option"); normal_model = NORMAL_HERTZ; normal_coeffs[0] = force->numeric(FLERR,arg[iarg+1]); //kn normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + if (iarg + num_coeffs >= narg) + error->all(FLERR,"Illegal fix wall/gran command, " + "not enough parameters provided for Hertz option"); normal_model = HERTZ_MATERIAL; Emod = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -147,7 +153,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[2] = poiss; iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal fix wall/gran command, not enough parameters provided for Hertz option"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal fix wall/gran command, " + "not enough parameters provided for Hertz option"); normal_model = DMT; Emod = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping @@ -157,7 +165,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for JKR option"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal wall/gran command, " + "not enough parameters provided for JKR option"); beyond_contact = 1; normal_model = JKR; Emod = force->numeric(FLERR,arg[iarg+1]); //E @@ -168,7 +178,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "damping") == 0) { - if (iarg+1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters provided for damping model"); + if (iarg+1 >= narg) + error->all(FLERR, "Illegal wall/gran command, " + "not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0) { damping_model = VELOCITY; iarg += 1; @@ -178,58 +190,80 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg+1], "tsuji") == 0) { damping_model = TSUJI; iarg += 1; - } else error->all(FLERR, "Illegal wall/gran command, unrecognized damping model"); + } else error->all(FLERR, "Illegal wall/gran command, " + "unrecognized damping model"); iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0) { - if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); + if (iarg + 1 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "must specify tangential model after tangential keyword"); if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (iarg + 3 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for tangential model"); tangential_model = TANGENTIAL_NOHISTORY; tangential_coeffs[0] = 0; - tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + // gammat and friction coeff + tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); + tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+3]); iarg += 4; } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model = TANGENTIAL_HISTORY; - else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model = TANGENTIAL_MINDLIN; - else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model = TANGENTIAL_MINDLIN_RESCALE; - if ((tangential_model == TANGENTIAL_MINDLIN || tangential_model == TANGENTIAL_MINDLIN_RESCALE) && + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for tangential model"); + if (strcmp(arg[iarg+1], "linear_history") == 0) + tangential_model = TANGENTIAL_HISTORY; + else if (strcmp(arg[iarg+1], "mindlin") == 0) + tangential_model = TANGENTIAL_MINDLIN; + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) + tangential_model = TANGENTIAL_MINDLIN_RESCALE; + if ((tangential_model == TANGENTIAL_MINDLIN || + tangential_model == TANGENTIAL_MINDLIN_RESCALE) && (strcmp(arg[iarg+2], "NULL") == 0)) { if (normal_model == NORMAL_HERTZ || normal_model == NORMAL_HOOKE) { - error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); + error->all(FLERR, "NULL setting for Mindlin tangential " + "stiffness requires a normal contact model " + "that specifies material properties"); } tangential_coeffs[0] = 4*(2-poiss)*(1+poiss)/Emod; } else { tangential_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt } tangential_history = 1; - tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + // gammat and friction coeff + tangential_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); + tangential_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); iarg += 5; } else { - error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + error->all(FLERR, "Illegal pair_coeff command, " + "tangential model not recognized"); } } else if (strcmp(arg[iarg], "rolling") == 0) { - if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); + if (iarg + 1 >= narg) + error->all(FLERR, "Illegal wall/gran command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { roll_model = ROLL_NONE; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for rolling model"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal wall/gran command, " + "not enough parameters provided for rolling model"); roll_model = ROLL_SDS; roll_history = 1; - roll_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. + // kR, gammaR, rolling friction coeff + roll_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); + roll_coeffs[1] = force->numeric(FLERR,arg[iarg+3]); + roll_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); iarg += 5; } else { - error->all(FLERR, "Illegal wall/gran command, rolling friction model not recognized"); + error->all(FLERR, "Illegal wall/gran command, " + "rolling friction model not recognized"); } } else if (strcmp(arg[iarg], "twisting") == 0) { - if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); + if (iarg + 1 >= narg) + error->all(FLERR, "Illegal wall/gran command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { twist_model = TWIST_NONE; iarg += 2; @@ -238,7 +272,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : twist_history = 1; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, not enough parameters provided for twist model"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal wall/gran command, " + "not enough parameters provided for twist model"); twist_model = TWIST_SDS; twist_history = 1; twist_coeffs[0] = force->numeric(FLERR,arg[iarg+2]); //kt @@ -246,7 +282,8 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : twist_coeffs[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. iarg += 5; } else { - error->all(FLERR, "Illegal wall/gran command, twisting friction model not recognized"); + error->all(FLERR, "Illegal wall/gran command, " + "twisting friction model not recognized"); } } else if (strcmp(arg[iarg], "xplane") == 0 || strcmp(arg[iarg], "yplane") == 0 || @@ -472,8 +509,6 @@ void FixWallGran::init() 27.467*pow(cor,4)-18.022*pow(cor,5)+ 4.8218*pow(cor,6); } - - } /* ---------------------------------------------------------------------- */ @@ -616,7 +651,8 @@ void FixWallGran::post_force(int /*vflag*/) else { if (pairstyle == GRANULAR && normal_model == JKR && use_history) { if ((history_one[i][0] == 0) && (rsq > radius[i]*radius[i])) { - // Particles have not contacted yet, and are outside of contact distance + // Particles have not contacted yet, + // and are outside of contact distance for (j = 0; j < size_history; j++) history_one[i][j] = 0.0; continue; @@ -824,7 +860,8 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, history[1] += vtr2*dt; history[2] += vtr3*dt; } - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); // rotate shear displacements @@ -954,7 +991,8 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, history[1] += vtr2*dt; history[2] += vtr3*dt; } - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + history[2]*history[2]); // rotate history displacements @@ -1015,372 +1053,382 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, torque[2] -= radius*tor3; } +/* ---------------------------------------------------------------------- */ void FixWallGran::granular(double rsq, double dx, double dy, double dz, - double *vwall, double rwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double *history, - double *contact) + double *vwall, double rwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *history, + double *contact) { - double fx,fy,fz,nx,ny,nz; - double radsum,r,rinv; - double Reff, delta, dR, dR2; + double fx,fy,fz,nx,ny,nz; + double radsum,r,rinv; + double Reff, delta, dR, dR2; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double wr1,wr2,wr3; - double vtr1,vtr2,vtr3,vrel; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3; + double vtr1,vtr2,vtr3,vrel; - double knfac, damp_normal, damp_normal_prefactor; - double k_tangential, damp_tangential; - double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; - double fs, fs1, fs2, fs3; + double knfac, damp_normal, damp_normal_prefactor; + double k_tangential, damp_tangential; + double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; + double fs, fs1, fs2, fs3; - double tor1,tor2,tor3; - double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; + double tor1,tor2,tor3; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; - //For JKR - double R2, coh, F_pulloff, a, a2, E; - double t0, t1, t2, t3, t4, t5, t6; - double sqrt1, sqrt2, sqrt3; + // for JKR + double R2, coh, F_pulloff, a, a2, E; + double t0, t1, t2, t3, t4, t5, t6; + double sqrt1, sqrt2, sqrt3; - //Rolling - double k_roll, damp_roll; - double torroll1, torroll2, torroll3; - double rollmag, rolldotn, scalefac; - double fr, fr1, fr2, fr3; + // rolling + double k_roll, damp_roll; + double torroll1, torroll2, torroll3; + double rollmag, rolldotn, scalefac; + double fr, fr1, fr2, fr3; - //Twisting - double k_twist, damp_twist, mu_twist; - double signtwist, magtwist, magtortwist, Mtcrit; - double tortwist1, tortwist2, tortwist3; + // twisting + double k_twist, damp_twist, mu_twist; + double signtwist, magtwist, magtortwist, Mtcrit; + double tortwist1, tortwist2, tortwist3; - double shrmag,rsht; + double shrmag,rsht; - r = sqrt(rsq); - radsum = rwall + radius; + r = sqrt(rsq); + radsum = rwall + radius; - E = normal_coeffs[0]; + E = normal_coeffs[0]; - radsum = radius + rwall; - if (rwall == 0) Reff = radius; - else Reff = radius*rwall/(radius+rwall); + radsum = radius + rwall; + if (rwall == 0) Reff = radius; + else Reff = radius*rwall/(radius+rwall); - rinv = 1.0/r; + rinv = 1.0/r; - nx = dx*rinv; - ny = dy*rinv; - nz = dz*rinv; + nx = dx*rinv; + ny = dy*rinv; + nz = dz*rinv; - // relative translational velocity + // relative translational velocity - vr1 = v[0] - vwall[0]; - vr2 = v[1] - vwall[1]; - vr3 = v[2] - vwall[2]; + vr1 = v[0] - vwall[0]; + vr2 = v[1] - vwall[1]; + vr3 = v[2] - vwall[2]; - // normal component + // normal component - vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n - vn1 = nx*vnnr; - vn2 = ny*vnnr; - vn3 = nz*vnnr; + vnnr = vr1*nx + vr2*ny + vr3*nz; //v_R . n + vn1 = nx*vnnr; + vn2 = ny*vnnr; + vn3 = nz*vnnr; - delta = radsum - r; - dR = delta*Reff; - if (normal_model == JKR) { - history[0] = 1.0; - E *= THREEQUARTERS; - R2=Reff*Reff; - coh = normal_coeffs[3]; - dR2 = dR*dR; - t0 = coh*coh*R2*R2*E; - t1 = PI27SQ*t0; - t2 = 8*dR*dR2*E*E*E; - t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); - t5 = t3/t4 + t4/E; - sqrt2 = MAX(0, 2*dR + t5); - t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); - a = INVROOT6*(t6 + sqrt(sqrt3)); - a2 = a*a; - knfac = normal_coeffs[0]*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); - } - else{ - knfac = E; //Hooke - a = sqrt(dR); - if (normal_model != HOOKE) { - Fne *= a; - knfac *= a; - } - Fne = knfac*delta; - if (normal_model == DMT) - Fne -= 4*MY_PI*normal_coeffs[3]*Reff; - } + delta = radsum - r; + dR = delta*Reff; + if (normal_model == JKR) { + history[0] = 1.0; + E *= THREEQUARTERS; + R2=Reff*Reff; + coh = normal_coeffs[3]; + dR2 = dR*dR; + t0 = coh*coh*R2*R2*E; + t1 = PI27SQ*t0; + t2 = 8*dR*dR2*E*E*E; + t3 = 4*dR2*E; + sqrt1 = MAX(0, t0*(t1+2*t2)); // in case sqrt(0) < 0 due to precision issues + t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t5 = t3/t4 + t4/E; + sqrt2 = MAX(0, 2*dR + t5); + t6 = sqrt(sqrt2); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + a = INVROOT6*(t6 + sqrt(sqrt3)); + a2 = a*a; + knfac = normal_coeffs[0]*a; + Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + } + else{ + knfac = E; //Hooke + a = sqrt(dR); + if (normal_model != HOOKE) { + Fne *= a; + knfac *= a; + } + Fne = knfac*delta; + if (normal_model == DMT) + Fne -= 4*MY_PI*normal_coeffs[3]*Reff; + } - if (damping_model == VELOCITY) { - damp_normal = 1; - } - else if (damping_model == VISCOELASTIC) { - damp_normal = a*meff; - } - else if (damping_model == TSUJI) { - damp_normal = sqrt(meff*knfac); - } + if (damping_model == VELOCITY) { + damp_normal = 1; + } + else if (damping_model == VISCOELASTIC) { + damp_normal = a*meff; + } + else if (damping_model == TSUJI) { + damp_normal = sqrt(meff*knfac); + } - damp_normal_prefactor = normal_coeffs[1]*damp_normal; - Fdamp = -damp_normal_prefactor*vnnr; + damp_normal_prefactor = normal_coeffs[1]*damp_normal; + Fdamp = -damp_normal_prefactor*vnnr; - Fntot = Fne + Fdamp; + Fntot = Fne + Fdamp; - //**************************************** - //Tangential force, including history effects - //**************************************** + //**************************************** + // tangential force, including history effects + //**************************************** - // tangential component - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; + // tangential component + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; - // relative rotational velocity - wr1 = radius*omega[0] * rinv; - wr2 = radius*omega[1] * rinv; - wr3 = radius*omega[2] * rinv; + // relative rotational velocity + wr1 = radius*omega[0] * rinv; + wr2 = radius*omega[1] * rinv; + wr3 = radius*omega[2] * rinv; - // relative tangential velocities - vtr1 = vt1 - (nz*wr2-ny*wr3); - vtr2 = vt2 - (nx*wr3-nz*wr1); - vtr3 = vt3 - (ny*wr1-nx*wr2); - vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; - vrel = sqrt(vrel); + // relative tangential velocities + vtr1 = vt1 - (nz*wr2-ny*wr3); + vtr2 = vt2 - (nx*wr3-nz*wr1); + vtr3 = vt3 - (ny*wr1-nx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); - if (normal_model == JKR) { - F_pulloff = 3*M_PI*coh*Reff; - Fncrit = fabs(Fne + 2*F_pulloff); - } - else if (normal_model == DMT) { - F_pulloff = 4*M_PI*coh*Reff; - Fncrit = fabs(Fne + 2*F_pulloff); - } - else{ - Fncrit = fabs(Fntot); - } + if (normal_model == JKR) { + F_pulloff = 3*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); + } + else if (normal_model == DMT) { + F_pulloff = 4*M_PI*coh*Reff; + Fncrit = fabs(Fne + 2*F_pulloff); + } + else{ + Fncrit = fabs(Fntot); + } - //------------------------------ - //Tangential forces - //------------------------------ - k_tangential = tangential_coeffs[0]; - damp_tangential = tangential_coeffs[1]*damp_normal_prefactor; + //------------------------------ + // tangential forces + //------------------------------ - int thist0 = tangential_history_index; - int thist1 = thist0 + 1; - int thist2 = thist1 + 1; + k_tangential = tangential_coeffs[0]; + damp_tangential = tangential_coeffs[1]*damp_normal_prefactor; - if (tangential_history) { - if (tangential_model == TANGENTIAL_MINDLIN) { - k_tangential *= a; - } - else if (tangential_model == TANGENTIAL_MINDLIN_RESCALE) { - k_tangential *= a; - if (a < history[3]) { //On unloading, rescale the shear displacements - double factor = a/history[thist2+1]; - history[thist0] *= factor; - history[thist1] *= factor; - history[thist2] *= factor; - } - } - shrmag = sqrt(history[thist0]*history[thist0] + history[thist1]*history[thist1] + - history[thist2]*history[thist2]); + int thist0 = tangential_history_index; + int thist1 = thist0 + 1; + int thist2 = thist1 + 1; - // Rotate and update displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 - if (history_update) { - rsht = history[thist0]*nx + history[thist1]*ny + history[thist2]*nz; - if (fabs(rsht) < EPSILON) rsht = 0; - if (rsht > 0) { - scalefac = shrmag/(shrmag - rsht); //if rhst == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! - history[thist0] -= rsht*nx; - history[thist1] -= rsht*ny; - history[thist2] -= rsht*nz; - //Also rescale to preserve magnitude - history[thist0] *= scalefac; - history[thist1] *= scalefac; - history[thist2] *= scalefac; - } - //Update history - history[thist0] += vtr1*dt; - history[thist1] += vtr2*dt; - history[thist2] += vtr3*dt; - } + if (tangential_history) { + if (tangential_model == TANGENTIAL_MINDLIN) { + k_tangential *= a; + } + else if (tangential_model == TANGENTIAL_MINDLIN_RESCALE) { + k_tangential *= a; + if (a < history[3]) { //On unloading, rescale the shear displacements + double factor = a/history[thist2+1]; + history[thist0] *= factor; + history[thist1] *= factor; + history[thist2] *= factor; + } + } + shrmag = sqrt(history[thist0]*history[thist0] + + history[thist1]*history[thist1] + + history[thist2]*history[thist2]); - // tangential forces = history + tangential velocity damping - fs1 = -k_tangential*history[thist0] - damp_tangential*vtr1; - fs2 = -k_tangential*history[thist1] - damp_tangential*vtr2; - fs3 = -k_tangential*history[thist2] - damp_tangential*vtr3; + // rotate and update displacements. + // see e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + if (history_update) { + rsht = history[thist0]*nx + history[thist1]*ny + history[thist2]*nz; + if (fabs(rsht) < EPSILON) rsht = 0; + if (rsht > 0) { + // if rhst == shrmag, contacting pair has rotated 90 deg in one step, + // in which case you deserve a crash! + scalefac = shrmag/(shrmag - rsht); + history[thist0] -= rsht*nx; + history[thist1] -= rsht*ny; + history[thist2] -= rsht*nz; + // also rescale to preserve magnitude + history[thist0] *= scalefac; + history[thist1] *= scalefac; + history[thist2] *= scalefac; + } + // update history + history[thist0] += vtr1*dt; + history[thist1] += vtr2*dt; + history[thist2] += vtr3*dt; + } - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[2] * Fncrit; - fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - if (fs > Fscrit) { - if (shrmag != 0.0) { - history[thist0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[thist1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[thist2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); - fs1 *= Fscrit/fs; - fs2 *= Fscrit/fs; - fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; - } - } - else{ //Classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; - else Ft = 0.0; - fs1 = -Ft*vtr1; - fs2 = -Ft*vtr2; - fs3 = -Ft*vtr3; - } + // tangential forces = history + tangential velocity damping + fs1 = -k_tangential*history[thist0] - damp_tangential*vtr1; + fs2 = -k_tangential*history[thist1] - damp_tangential*vtr2; + fs3 = -k_tangential*history[thist2] - damp_tangential*vtr3; - //**************************************** - // Rolling resistance - //**************************************** + // rescale frictional displacements and forces if needed + Fscrit = tangential_coeffs[2] * Fncrit; + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + if (fs > Fscrit) { + if (shrmag != 0.0) { + history[thist0] = -1.0/k_tangential*(Fscrit*fs1/fs + + damp_tangential*vtr1); + history[thist1] = -1.0/k_tangential*(Fscrit*fs2/fs + + damp_tangential*vtr2); + history[thist2] = -1.0/k_tangential*(Fscrit*fs3/fs + + damp_tangential*vtr3); + fs1 *= Fscrit/fs; + fs2 *= Fscrit/fs; + fs3 *= Fscrit/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + } else { // classic pair gran/hooke (no history) + fs = meff*damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + else Ft = 0.0; + fs1 = -Ft*vtr1; + fs2 = -Ft*vtr2; + fs3 = -Ft*vtr3; + } - if (roll_model != ROLL_NONE) { - relrot1 = omega[0]; - relrot2 = omega[1]; - relrot3 = omega[2]; + //**************************************** + // rolling resistance + //**************************************** - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation - // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + if (roll_model != ROLL_NONE) { + relrot1 = omega[0]; + relrot2 = omega[1]; + relrot3 = omega[2]; - int rhist0 = roll_history_index; - int rhist1 = rhist0 + 1; - int rhist2 = rhist1 + 1; + // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // This is different from the Marshall papers, + // which use the Bagi/Kuhn formulation + // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; + vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; + vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; - // Rolling displacement - rollmag = sqrt(history[rhist0]*history[rhist0] + - history[rhist1]*history[rhist1] + - history[rhist2]*history[rhist2]); + int rhist0 = roll_history_index; + int rhist1 = rhist0 + 1; + int rhist2 = rhist1 + 1; - rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; + // rolling displacement + rollmag = sqrt(history[rhist0]*history[rhist0] + + history[rhist1]*history[rhist1] + + history[rhist2]*history[rhist2]); - if (history_update) { - if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0) { //Rotate into tangential plane - scalefac = rollmag/(rollmag - rolldotn); - history[rhist0] -= rolldotn*nx; - history[rhist1] -= rolldotn*ny; - history[rhist2] -= rolldotn*nz; - //Also rescale to preserve magnitude - history[rhist0] *= scalefac; - history[rhist1] *= scalefac; - history[rhist2] *= scalefac; - } - history[rhist0] += vrl1*dt; - history[rhist1] += vrl2*dt; - history[rhist2] += vrl3*dt; - } + rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; - k_roll = roll_coeffs[0]; - damp_roll = roll_coeffs[1]; - fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; - fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; - fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; + if (history_update) { + if (fabs(rolldotn) < EPSILON) rolldotn = 0; + if (rolldotn > 0) { // rotate into tangential plane + scalefac = rollmag/(rollmag - rolldotn); + history[rhist0] -= rolldotn*nx; + history[rhist1] -= rolldotn*ny; + history[rhist2] -= rolldotn*nz; + // also rescale to preserve magnitude + history[rhist0] *= scalefac; + history[rhist1] *= scalefac; + history[rhist2] *= scalefac; + } + history[rhist0] += vrl1*dt; + history[rhist1] += vrl2*dt; + history[rhist2] += vrl3*dt; + } - // rescale frictional displacements and forces if needed - Frcrit = roll_coeffs[2] * Fncrit; + k_roll = roll_coeffs[0]; + damp_roll = roll_coeffs[1]; + fr1 = -k_roll*history[rhist0] - damp_roll*vrl1; + fr2 = -k_roll*history[rhist1] - damp_roll*vrl2; + fr3 = -k_roll*history[rhist2] - damp_roll*vrl3; - fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); - if (fr > Frcrit) { - if (rollmag != 0.0) { - history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); - history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); - history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); - fr1 *= Frcrit/fr; - fr2 *= Frcrit/fr; - fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; - } - } + // rescale frictional displacements and forces if needed + Frcrit = roll_coeffs[2] * Fncrit; - //**************************************** - // Twisting torque, including history effects - //**************************************** - if (twist_model != TWIST_NONE) { - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) - if (twist_model == TWIST_MARSHALL) { - k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper - damp_twist = 0.5*damp_tangential*a*a; - mu_twist = TWOTHIRDS*a*tangential_coeffs[2]; - } - else{ - k_twist = twist_coeffs[0]; - damp_twist = twist_coeffs[1]; - mu_twist = twist_coeffs[2]; - } - if (history_update) { - history[twist_history_index] += magtwist*dt; - } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) - signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) - if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 - } - } - // Apply forces & torques + fr = sqrt(fr1*fr1 + fr2*fr2 + fr3*fr3); + if (fr > Frcrit) { + if (rollmag != 0.0) { + history[rhist0] = -1.0/k_roll*(Frcrit*fr1/fr + damp_roll*vrl1); + history[rhist1] = -1.0/k_roll*(Frcrit*fr2/fr + damp_roll*vrl2); + history[rhist2] = -1.0/k_roll*(Frcrit*fr3/fr + damp_roll*vrl3); + fr1 *= Frcrit/fr; + fr2 *= Frcrit/fr; + fr3 *= Frcrit/fr; + } else fr1 = fr2 = fr3 = 0.0; + } + } - fx = nx*Fntot + fs1; - fy = ny*Fntot + fs2; - fz = nz*Fntot + fs3; + //**************************************** + // twisting torque, including history effects + //**************************************** - if (peratom_flag) { - contact[1] = fx; - contact[2] = fy; - contact[3] = fz; - } + if (twist_model != TWIST_NONE) { + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + if (twist_model == TWIST_MARSHALL) { + k_twist = 0.5*k_tangential*a*a;; // eq 32 of Marshall paper + damp_twist = 0.5*damp_tangential*a*a; + mu_twist = TWOTHIRDS*a*tangential_coeffs[2]; + } + else{ + k_twist = twist_coeffs[0]; + damp_twist = twist_coeffs[1]; + mu_twist = twist_coeffs[2]; + } + if (history_update) { + history[twist_history_index] += magtwist*dt; + } + // M_t torque (eq 30) + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist; + signtwist = (magtwist > 0) - (magtwist < 0); + Mtcrit = mu_twist*Fncrit; // critical torque (eq 44) + if (fabs(magtortwist) > Mtcrit) { + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - + damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; // eq 34 + } + } - f[0] += fx; - f[1] += fy; - f[2] += fz; + // apply forces & torques - tor1 = ny*fs3 - nz*fs2; - tor2 = nz*fs1 - nx*fs3; - tor3 = nx*fs2 - ny*fs1; + fx = nx*Fntot + fs1; + fy = ny*Fntot + fs2; + fz = nz*Fntot + fs3; - torque[0] -= radius*tor1; - torque[1] -= radius*tor2; - torque[2] -= radius*tor3; + if (peratom_flag) { + contact[1] = fx; + contact[2] = fy; + contact[3] = fz; + } - if (twist_model != TWIST_NONE) { - tortwist1 = magtortwist * nx; - tortwist2 = magtortwist * ny; - tortwist3 = magtortwist * nz; + f[0] += fx; + f[1] += fy; + f[2] += fz; - torque[0] += tortwist1; - torque[1] += tortwist2; - torque[2] += tortwist3; - } + tor1 = ny*fs3 - nz*fs2; + tor2 = nz*fs1 - nx*fs3; + tor3 = nx*fs2 - ny*fs1; - if (roll_model != ROLL_NONE) { - torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr - torroll2 = Reff*(nz*fr1 - nx*fr3); - torroll3 = Reff*(nx*fr2 - ny*fr1); + torque[0] -= radius*tor1; + torque[1] -= radius*tor2; + torque[2] -= radius*tor3; - torque[0] += torroll1; - torque[1] += torroll2; - torque[2] += torroll3; - } + if (twist_model != TWIST_NONE) { + tortwist1 = magtortwist * nx; + tortwist2 = magtortwist * ny; + tortwist3 = magtortwist * nz; + + torque[0] += tortwist1; + torque[1] += tortwist2; + torque[2] += tortwist3; + } + + if (roll_model != ROLL_NONE) { + torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll2 = Reff*(nz*fr1 - nx*fr3); + torroll3 = Reff*(nx*fr2 - ny*fr1); + + torque[0] += torroll1; + torque[1] += torroll2; + torque[2] += torroll3; + } } - - /* ---------------------------------------------------------------------- memory usage of local atom-based arrays ------------------------------------------------------------------------- */ @@ -1389,9 +1437,10 @@ double FixWallGran::memory_usage() { int nmax = atom->nmax; double bytes = 0.0; - if (use_history) bytes += nmax*size_history * sizeof(double); // shear history - if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid - if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); //store contacts + if (use_history) bytes += nmax*size_history * sizeof(double); // shear history + if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid + // store contacts + if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); return bytes; } @@ -1401,7 +1450,8 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { - if (use_history) memory->grow(history_one,nmax,size_history,"fix_wall_gran:history_one"); + if (use_history) memory->grow(history_one,nmax,size_history, + "fix_wall_gran:history_one"); if (peratom_flag) { memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); } diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index a81cdcb6c8..ee81477ddb 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -66,26 +66,24 @@ class FixWallGran : public Fix { bigint time_origin; double kn,kt,gamman,gammat,xmu; - //For granular - //Model choices + // for granular model choices int normal_model, damping_model; int tangential_model, roll_model, twist_model; - int beyond_contact; - //History flags + // history flags int normal_history, tangential_history, roll_history, twist_history; - //Indices of history entries + // indices of history entries int normal_history_index; int tangential_history_index; int roll_history_index; int twist_history_index; - //Material coefficients + // material coefficients double Emod, poiss, Gmod; - //Contact model coefficients + // contact model coefficients double normal_coeffs[4]; double tangential_coeffs[3]; double roll_coeffs[3]; @@ -97,7 +95,7 @@ class FixWallGran : public Fix { char *idregion; int use_history; // if particle/wall interaction stores history - int history_update; // flag for whether shear history is updated + int history_update; // flag for whether shear history is updated int size_history; // # of shear history values per contact // shear history for single contact per particle @@ -110,7 +108,8 @@ class FixWallGran : public Fix { double *mass_rigid; // rigid mass for owned+ghost atoms int nmax; // allocated size of mass_rigid - // Store particle interactions + // store particle interactions + int store; }; diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index 95b34e0929..e6f8406be0 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -47,8 +47,9 @@ enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; /* ---------------------------------------------------------------------- */ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : - FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), ncontact(NULL), - walls(NULL), history_many(NULL), c2r(NULL) + FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), + ncontact(NULL), + walls(NULL), history_many(NULL), c2r(NULL) { restart_global = 1; motion_resetflag = 0; @@ -190,7 +191,8 @@ void FixWallGranRegion::post_force(int /*vflag*/) if (!region->match(x[i][0],x[i][1],x[i][2])) continue; if (pairstyle == GRANULAR && normal_model == JKR){ - nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]+pulloff_distance(radius[i])); + nc = region->surface(x[i][0],x[i][1],x[i][2], + radius[i]+pulloff_distance(radius[i])); } else{ nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]); @@ -278,8 +280,9 @@ void FixWallGranRegion::post_force(int /*vflag*/) v[i],f[i],omega[i],torque[i], radius[i],meff,history_many[i][c2r[ic]], contact); else if (pairstyle == GRANULAR) - granular(rsq,dx,dy,dz,vwall,region->contact[ic].radius, v[i],f[i],omega[i],torque[i], radius[i],meff,history_many[i][c2r[ic]], contact); - + granular(rsq,dx,dy,dz,vwall,region->contact[ic].radius, + v[i],f[i],omega[i],torque[i], + radius[i],meff,history_many[i][c2r[ic]],contact); } } } @@ -364,11 +367,11 @@ void FixWallGranRegion::grow_arrays(int nmax) if (use_history) { memory->grow(ncontact,nmax,"fix_wall_gran:ncontact"); memory->grow(walls,nmax,tmax,"fix_wall_gran:walls"); - memory->grow(history_many,nmax,tmax,size_history,"fix_wall_gran:history_many"); + memory->grow(history_many,nmax,tmax,size_history, + "fix_wall_gran:history_many"); } - if (peratom_flag){ + if (peratom_flag) memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); - } } /* ---------------------------------------------------------------------- diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 344e72f8ef..c86c2b0c90 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -59,7 +59,9 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) comm_forward = 1; - nondefault_history_transfer = 0; //keep default behavior of history[i][j] = -history[j][i] + // keep default behavior of history[i][j] = -history[j][i] + + nondefault_history_transfer = 0; } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index 2cb609fd82..b1bb212f89 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -26,6 +26,8 @@ namespace LAMMPS_NS { class PairGranHookeHistory : public Pair { public: + int nondefault_history_transfer; + PairGranHookeHistory(class LAMMPS *); virtual ~PairGranHookeHistory(); virtual void compute(int, int); @@ -42,7 +44,6 @@ class PairGranHookeHistory : public Pair { int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); double memory_usage(); - int nondefault_history_transfer; protected: double kn,kt,gamman,gammat,xmu; diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index b3046788e0..c8450c5434 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -11,9 +11,9 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- -Contributing authors: -Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) -Leo Silbert (SNL), Gary Grest (SNL) + Contributing authors: + Dan Bolintineanu (SNL), Ishan Srivastava (SNL), Jeremy Lechman(SNL) + Leo Silbert (SNL), Gary Grest (SNL) ----------------------------------------------------------------------- */ #include @@ -52,7 +52,8 @@ using namespace MathConst; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, + TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_SDS}; @@ -90,10 +91,10 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) nondefault_history_transfer = 0; tangential_history_index = 0; roll_history_index = twist_history_index = 0; - } /* ---------------------------------------------------------------------- */ + PairGranular::~PairGranular() { delete [] svector; @@ -118,16 +119,17 @@ PairGranular::~PairGranular() memory->destroy(roll_model); memory->destroy(twist_model); - - delete [] onerad_dynamic; delete [] onerad_frozen; delete [] maxrad_dynamic; delete [] maxrad_frozen; } + memory->destroy(mass_rigid); } +/* ---------------------------------------------------------------------- */ + void PairGranular::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; @@ -147,18 +149,18 @@ void PairGranular::compute(int eflag, int vflag) double mi,mj,meff; double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3; - // For JKR + // for JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3; - // Rolling + // rolling double k_roll, damp_roll; double torroll1, torroll2, torroll3; double rollmag, rolldotn, scalefac; double fr, fr1, fr2, fr3; - // Twisting + // twisting double k_twist, damp_twist, mu_twist; double signtwist, magtwist, magtortwist, Mtcrit; double tortwist1, tortwist2, tortwist3; @@ -317,7 +319,8 @@ void PairGranular::compute(int eflag, int vflag) t1 = PI27SQ*t0; t2 = 8*dR*dR2*E*E*E; t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + // in case sqrt(0) < 0 due to precision issues + sqrt1 = MAX(0, t0*(t1+2*t2)); t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); t5 = t3/t4 + t4/E; sqrt2 = MAX(0, 2*dR + t5); @@ -328,7 +331,7 @@ void PairGranular::compute(int eflag, int vflag) knfac = normal_coeffs[itype][jtype][0]*a; Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); } else { - knfac = E; //Hooke + knfac = E; // Hooke Fne = knfac*delta; a = sqrt(dR); if (normal_model[itype][jtype] != HOOKE) { @@ -339,7 +342,9 @@ void PairGranular::compute(int eflag, int vflag) Fne -= 4*MY_PI*normal_coeffs[itype][jtype][3]*Reff; } - //Consider restricting Hooke to only have 'velocity' as an option for damping? + // NOTE: consider restricting Hooke to only have + // 'velocity' as an option for damping? + if (damping_model[itype][jtype] == VELOCITY) { damp_normal = 1; } else if (damping_model[itype][jtype] == VISCOELASTIC) { @@ -354,7 +359,7 @@ void PairGranular::compute(int eflag, int vflag) Fntot = Fne + Fdamp; //**************************************** - //Tangential force, including history effects + // tangential force, including history effects //**************************************** // tangential component @@ -374,7 +379,7 @@ void PairGranular::compute(int eflag, int vflag) vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - // If any history is needed: + // if any history is needed if (use_history) { touch[jj] = 1; history = &allhistory[size_history*jj]; @@ -391,45 +396,51 @@ void PairGranular::compute(int eflag, int vflag) } //------------------------------ - //Tangential forces + // tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; - damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; + damp_tangential = tangential_coeffs[itype][jtype][1] * + damp_normal_prefactor; if (tangential_history) { if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN) { k_tangential *= a; - } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { + } else if (tangential_model[itype][jtype] == + TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - if (a < history[3]) { //On unloading, rescale the shear displacements + // on unloading, rescale the shear displacements + if (a < history[3]) { double factor = a/history[3]; history[0] *= factor; history[1] *= factor; history[2] *= factor; } } - // Rotate and update displacements. - // See e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 + // rotate and update displacements. + // see e.g. eq. 17 of Luding, Gran. Matter 2008, v10,p235 if (historyupdate) { rsht = history[0]*nx + history[1]*ny + history[2]*nz; if (fabs(rsht) < EPSILON) rsht = 0; if (rsht > 0) { shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); - scalefac = shrmag/(shrmag - rsht); //if rsht == shrmag, contacting pair has rotated 90 deg. in one step, in which case you deserve a crash! + // if rsht == shrmag, contacting pair has rotated 90 deg + // in one step, in which case you deserve a crash! + scalefac = shrmag/(shrmag - rsht); history[0] -= rsht*nx; history[1] -= rsht*ny; history[2] -= rsht*nz; - //Also rescale to preserve magnitude + // also rescale to preserve magnitude history[0] *= scalefac; history[1] *= scalefac; history[2] *= scalefac; } - //Update history + // update history history[0] += vtr1*dt; history[1] += vtr2*dt; history[2] += vtr3*dt; - if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) history[3] = a; + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) + history[3] = a; } // tangential forces = history + tangential velocity damping @@ -444,15 +455,18 @@ void PairGranular::compute(int eflag, int vflag) shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + + damp_tangential*vtr1); + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + + damp_tangential*vtr2); + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + + damp_tangential*vtr3); fs1 *= Fscrit/fs; fs2 *= Fscrit/fs; fs3 *= Fscrit/fs; } else fs1 = fs2 = fs3 = 0.0; } - } else{ //Classic pair gran/hooke (no history) + } else { // classic pair gran/hooke (no history) fs = meff*damp_tangential*vrel; if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; else Ft = 0.0; @@ -462,7 +476,7 @@ void PairGranular::compute(int eflag, int vflag) } //**************************************** - // Rolling resistance + // rolling resistance //**************************************** if (roll_model[itype][jtype] != ROLL_NONE) { @@ -470,12 +484,18 @@ void PairGranular::compute(int eflag, int vflag) relrot2 = omega[i][1] - omega[j][1]; relrot3 = omega[i][2] - omega[j][2]; - // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // rolling velocity, + // see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) + // this is different from the Marshall papers, + // which use the Bagi/Kuhn formulation // for rolling velocity (see Wang et al for why the latter is wrong) - vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; - vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; - vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; + // - 0.5*((radj-radi)/radsum)*vtr1; + // - 0.5*((radj-radi)/radsum)*vtr2; + // - 0.5*((radj-radi)/radsum)*vtr3; + + vrl1 = Reff*(relrot2*nz - relrot3*ny); + vrl2 = Reff*(relrot3*nx - relrot1*nz); + vrl3 = Reff*(relrot1*ny - relrot2*nx); int rhist0 = roll_history_index; int rhist1 = rhist0 + 1; @@ -484,7 +504,7 @@ void PairGranular::compute(int eflag, int vflag) rolldotn = history[rhist0]*nx + history[rhist1]*ny + history[rhist2]*nz; if (historyupdate) { if (fabs(rolldotn) < EPSILON) rolldotn = 0; - if (rolldotn > 0) { //Rotate into tangential plane + if (rolldotn > 0) { // rotate into tangential plane rollmag = sqrt(history[rhist0]*history[rhist0] + history[rhist1]*history[rhist1] + history[rhist2]*history[rhist2]); @@ -492,7 +512,7 @@ void PairGranular::compute(int eflag, int vflag) history[rhist0] -= rolldotn*nx; history[rhist1] -= rolldotn*ny; history[rhist2] -= rolldotn*nz; - //Also rescale to preserve magnitude + // also rescale to preserve magnitude history[rhist0] *= scalefac; history[rhist1] *= scalefac; history[rhist2] *= scalefac; @@ -528,12 +548,14 @@ void PairGranular::compute(int eflag, int vflag) } //**************************************** - // Twisting torque, including history effects + // twisting torque, including history effects //**************************************** + if (twist_model[itype][jtype] != TWIST_NONE) { - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + // omega_T (eq 29 of Marshall) + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; if (twist_model[itype][jtype] == TWIST_MARSHALL) { - k_twist = 0.5*k_tangential*a*a;; //eq 32 of Marshall paper + k_twist = 0.5*k_tangential*a*a;; // eq 32 of Marshall paper damp_twist = 0.5*damp_tangential*a*a; mu_twist = TWOTHIRDS*a*tangential_coeffs[itype][jtype][2]; } else { @@ -544,15 +566,18 @@ void PairGranular::compute(int eflag, int vflag) if (historyupdate) { history[twist_history_index] += magtwist*dt; } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + magtortwist = -k_twist*history[twist_history_index] - + damp_twist*magtwist; // M_t torque (eq 30) signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) + Mtcrit = mu_twist*Fncrit; // critical torque (eq 44) if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); - magtortwist = -Mtcrit * signtwist; //eq 34 + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - + damp_twist*magtwist); + magtortwist = -Mtcrit * signtwist; // eq 34 } } - // Apply forces & torques + + // apply forces & torques fx = nx*Fntot + fs1; fy = ny*Fntot + fs2; @@ -582,7 +607,7 @@ void PairGranular::compute(int eflag, int vflag) } if (roll_model[itype][jtype] != ROLL_NONE) { - torroll1 = Reff*(ny*fr3 - nz*fr2); //n cross fr + torroll1 = Reff*(ny*fr3 - nz*fr2); // n cross fr torroll2 = Reff*(nz*fr1 - nx*fr3); torroll3 = Reff*(nx*fr2 - ny*fr1); @@ -619,9 +644,8 @@ void PairGranular::compute(int eflag, int vflag) } } - /* ---------------------------------------------------------------------- -allocate all arrays + allocate all arrays ------------------------------------------------------------------------- */ void PairGranular::allocate() @@ -657,7 +681,7 @@ void PairGranular::allocate() } /* ---------------------------------------------------------------------- - global settings + global settings ------------------------------------------------------------------------- */ void PairGranular::settings(int narg, char **arg) @@ -665,7 +689,7 @@ void PairGranular::settings(int narg, char **arg) if (narg == 1) { cutoff_global = force->numeric(FLERR,arg[0]); } else { - cutoff_global = -1; //Will be set based on particle sizes, model choice + cutoff_global = -1; // will be set based on particle sizes, model choice } normal_history = tangential_history = 0; @@ -705,45 +729,57 @@ void PairGranular::coeff(int narg, char **arg) int iarg = 2; while (iarg < narg) { if (strcmp(arg[iarg], "hooke") == 0) { - if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hooke option"); + if (iarg + 2 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for Hooke option"); normal_model_one = HOOKE; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); // kn + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); // damping iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (iarg + num_coeffs >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for Hertz option"); normal_model_one = HERTZ; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //kn - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); // kn + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); // damping iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; - if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz/material option"); + if (iarg + num_coeffs >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for Hertz/material option"); normal_model_one = HERTZ_MATERIAL; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); // E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); // damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); // Poisson's ratio iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for Hertz option"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for Hertz option"); normal_model_one = DMT; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio - normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); // E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); // damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); // Poisson's ratio + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); // cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for JKR option"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for JKR option"); beyond_contact = 1; normal_model_one = JKR; - normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); //E - normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //damping - normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //Poisson's ratio - normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion + normal_coeffs_one[0] = force->numeric(FLERR,arg[iarg+1]); // E + normal_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); // damping + normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); // Poisson's ratio + normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); // cohesion iarg += 5; } else if (strcmp(arg[iarg], "damping") == 0) { - if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters provided for damping model"); + if (iarg+1 >= narg) + error->all(FLERR, "Illegal pair_coeff command, " + "not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0) { damping_model_one = VELOCITY; iarg += 1; @@ -753,58 +789,80 @@ void PairGranular::coeff(int narg, char **arg) } else if (strcmp(arg[iarg+1], "tsuji") == 0) { damping_model_one = TSUJI; iarg += 1; - } else error->all(FLERR, "Illegal pair_coeff command, unrecognized damping model"); + } else error->all(FLERR, "Illegal pair_coeff command, " + "unrecognized damping model"); iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0) { - if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify tangential model after 'tangential' keyword"); + if (iarg + 1 >= narg) + error->all(FLERR,"Illegal pair_coeff command, must specify " + "tangential model after tangential keyword"); if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { - if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); + if (iarg + 3 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for tangential model"); tangential_model_one = TANGENTIAL_NOHISTORY; tangential_coeffs_one[0] = 0; - tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); //gammat - tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); //friction coeff. + // gammat and friction coeff + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+2]); + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); iarg += 4; } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model_one = TANGENTIAL_HISTORY; - else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model_one = TANGENTIAL_MINDLIN; - else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for tangential model"); + if (strcmp(arg[iarg+1], "linear_history") == 0) + tangential_model_one = TANGENTIAL_HISTORY; + else if (strcmp(arg[iarg+1], "mindlin") == 0) + tangential_model_one = TANGENTIAL_MINDLIN; + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) + tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; tangential_history = 1; - if ((tangential_model_one == TANGENTIAL_MINDLIN || tangential_model_one == TANGENTIAL_MINDLIN_RESCALE) && + if ((tangential_model_one == TANGENTIAL_MINDLIN || + tangential_model_one == TANGENTIAL_MINDLIN_RESCALE) && (strcmp(arg[iarg+2], "NULL") == 0)) { if (normal_model_one == HERTZ || normal_model_one == HOOKE) { - error->all(FLERR, "NULL setting for Mindlin tangential stiffness requires a normal contact model that specifies material properties"); + error->all(FLERR, "NULL setting for Mindlin tangential " + "stiffness requires a normal contact model that " + "specifies material properties"); } tangential_coeffs_one[0] = -1; } else { - tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt + tangential_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); // kt } - tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + // gammat and friction coeff + tangential_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); + tangential_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); iarg += 5; } else { - error->all(FLERR, "Illegal pair_coeff command, tangential model not recognized"); + error->all(FLERR, "Illegal pair_coeff command, " + "tangential model not recognized"); } } else if (strcmp(arg[iarg], "rolling") == 0) { - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (iarg + 1 >= narg) + error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { roll_model_one = ROLL_NONE; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for rolling model"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for rolling model"); roll_model_one = ROLL_SDS; roll_history = 1; - roll_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kR - roll_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammaR - roll_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //rolling friction coeff. + // kR and gammaR and rolling friction coeff + roll_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); + roll_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); + roll_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); iarg += 5; } else { - error->all(FLERR, "Illegal pair_coeff command, rolling friction model not recognized"); + error->all(FLERR, "Illegal pair_coeff command, " + "rolling friction model not recognized"); } } else if (strcmp(arg[iarg], "twisting") == 0) { - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (iarg + 1 >= narg) + error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { twist_model_one = TWIST_NONE; iarg += 2; @@ -813,24 +871,31 @@ void PairGranular::coeff(int narg, char **arg) twist_history = 1; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, not enough parameters provided for twist model"); + if (iarg + 4 >= narg) + error->all(FLERR,"Illegal pair_coeff command, " + "not enough parameters provided for twist model"); twist_model_one = TWIST_SDS; twist_history = 1; - twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); //kt - twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); //gammat - twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); //friction coeff. + // kt and gammat and friction coeff + twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); + twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); + twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); iarg += 5; } else { - error->all(FLERR, "Illegal pair_coeff command, twisting friction model not recognized"); + error->all(FLERR, "Illegal pair_coeff command, " + "twisting friction model not recognized"); } } else if (strcmp(arg[iarg], "cutoff") == 0) { - if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); + if (iarg + 1 >= narg) + error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); cutoff_one = force->numeric(FLERR,arg[iarg+1]); } else error->all(FLERR, "Illegal pair coeff command"); } - //It is an error not to specify normal or tangential model - if ((normal_model_one < 0) || (tangential_model_one < 0)) error->all(FLERR, "Illegal pair coeff command, must specify normal contact model"); + // error not to specify normal or tangential model + if ((normal_model_one < 0) || (tangential_model_one < 0)) + error->all(FLERR, "Illegal pair coeff command, " + "must specify normal or tangential contact model"); int count = 0; double damp; @@ -849,7 +914,9 @@ void PairGranular::coeff(int narg, char **arg) if (normal_model_one != HERTZ && normal_model_one != HOOKE) { Emod[i][j] = Emod[j][i] = normal_coeffs_one[0]; poiss[i][j] = poiss[j][i] = normal_coeffs_one[2]; - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = FOURTHIRDS*mix_stiffnessE(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + FOURTHIRDS*mix_stiffnessE(Emod[i][j],Emod[i][j], + poiss[i][j],poiss[i][j]); } else { normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = normal_coeffs_one[0]; } @@ -860,12 +927,15 @@ void PairGranular::coeff(int narg, char **arg) tangential_model[i][j] = tangential_model[j][i] = tangential_model_one; if (tangential_coeffs_one[0] == -1) { - tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = 8*mix_stiffnessG(Emod[i][j], Emod[i][j], poiss[i][j], poiss[i][j]); + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = + 8*mix_stiffnessG(Emod[i][j],Emod[i][j],poiss[i][j],poiss[i][j]); } else { - tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = tangential_coeffs_one[0]; + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = + tangential_coeffs_one[0]; } for (int k = 1; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_one[k]; + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = + tangential_coeffs_one[k]; roll_model[i][j] = roll_model[j][i] = roll_model_one; if (roll_model_one != ROLL_NONE) @@ -877,13 +947,13 @@ void PairGranular::coeff(int narg, char **arg) for (int k = 0; k < 3; k++) twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = twist_coeffs_one[k]; - cutoff_type[i][j] = cutoff_type[j][i] = cutoff_one; setflag[i][j] = 1; count++; } } + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } @@ -902,17 +972,21 @@ void PairGranular::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - // Determine whether we need a granular neigh list, how large it needs to be - use_history = normal_history || tangential_history || roll_history || twist_history; + // determine whether we need a granular neigh list, how large it needs to be + + use_history = normal_history || tangential_history || + roll_history || twist_history; + + // for JKR, will need fix/neigh/history to keep track of touch arrays - //For JKR, will need fix/neigh/history to keep track of touch arrays for (int i = 1; i <= atom->ntypes; i++) for (int j = i; j <= atom->ntypes; j++) if (normal_model[i][j] == JKR) use_history = 1; size_history = 3*tangential_history + 3*roll_history + twist_history; - //Determine location of tangential/roll/twist histories in array + // determine location of tangential/roll/twist histories in array + if (roll_history) { if (tangential_history) roll_history_index = 3; else roll_history_index = 0; @@ -1036,7 +1110,7 @@ void PairGranular::init_style() } /* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i + init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ double PairGranular::init_one(int i, int j) @@ -1051,46 +1125,58 @@ double PairGranular::init_one(int i, int j) (twist_model[i][i] != twist_model[j][j])) { char str[512]; - sprintf(str,"Granular pair style functional forms are different, cannot mix coefficients for types %d and %d. \nThis combination must be set explicitly via pair_coeff command.",i,j); + sprintf(str,"Granular pair style functional forms are different, " + "cannot mix coefficients for types %d and %d. \n" + "This combination must be set explicitly " + "via pair_coeff command",i,j); error->one(FLERR,str); } if (normal_model[i][j] == HERTZ || normal_model[i][j] == HOOKE) - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); else - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(Emod[i][i], Emod[j][j], poiss[i][i], poiss[j][j]); + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + mix_stiffnessE(Emod[i][i], Emod[j][j], poiss[i][i], poiss[j][j]); - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = + mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal_model[i][j] == JKR) || (normal_model[i][j] == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = + mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = + mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); if (roll_model[i][j] != ROLL_NONE) { for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = + mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } if (twist_model[i][j] != TWIST_NONE && twist_model[i][j] != TWIST_MARSHALL) { for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = + mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } } - // It is possible that cut[i][j] at this point is still 0.0. This can happen when + // It is possible that cut[i][j] at this point is still 0.0. + // This can happen when // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size // To avoid this issue, for cases involving cut[i][j] = 0.0 (possible only // if there is no current information about radius/cutoff of type i and j). // we assign cutoff = max(cut[i][j]) for i,j such that cut[i][j] > 0.0. + double pulloff; if (cutoff_type[i][j] < 0 && cutoff_global < 0) { if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { // radius info about both i and j exist - + // radius info about both i and j exist + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; pulloff = 0.0; if (normal_model[i][j] == JKR) { @@ -1105,7 +1191,13 @@ double PairGranular::init_one(int i, int j) if (normal_model[i][j] == JKR) pulloff = pulloff_distance(maxrad_dynamic[i], maxrad_frozen[j], i, j); cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]+pulloff); - } else { // radius info about either i or j does not exist (i.e. not present and not about to get poured; set to largest value to not interfere with neighbor list) + + } else { + + // radius info about either i or j does not exist + // (i.e. not present and not about to get poured; + // set to largest value to not interfere with neighbor list) + double cutmax = 0.0; for (int k = 1; k <= atom->ntypes; k++) { cutmax = MAX(cutmax,2.0*maxrad_dynamic[k]); @@ -1123,8 +1215,8 @@ double PairGranular::init_one(int i, int j) } /* ---------------------------------------------------------------------- - proc 0 writes to restart file - ------------------------------------------------------------------------- */ + proc 0 writes to restart file +------------------------------------------------------------------------- */ void PairGranular::write_restart(FILE *fp) { @@ -1149,8 +1241,8 @@ void PairGranular::write_restart(FILE *fp) } /* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts - ------------------------------------------------------------------------- */ + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ void PairGranular::read_restart(FILE *fp) { @@ -1189,7 +1281,6 @@ void PairGranular::read_restart(FILE *fp) } } - /* ---------------------------------------------------------------------- */ void PairGranular::reset_dt() @@ -1216,18 +1307,17 @@ double PairGranular::single(int i, int j, int itype, int jtype, double Fne, Ft, Fdamp, Fntot, Fncrit, Fscrit, Frcrit; double fs, fs1, fs2, fs3; - //For JKR + // for JKR double R2, coh, F_pulloff, delta_pulloff, dist_pulloff, a, a2, E; double delta, t0, t1, t2, t3, t4, t5, t6; double sqrt1, sqrt2, sqrt3; - - //Rolling + // rolling double k_roll, damp_roll; double rollmag; double fr, fr1, fr2, fr3; - //Twisting + // twisting double k_twist, damp_twist, mu_twist; double signtwist, magtwist, magtortwist, Mtcrit; @@ -1338,7 +1428,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, t1 = PI27SQ*t0; t2 = 8*dR*dR2*E*E*E; t3 = 4*dR2*E; - sqrt1 = MAX(0, t0*(t1+2*t2)); //In case of sqrt(0) < 0 due to precision issues + // in case sqrt(0) < 0 due to precision issues + sqrt1 = MAX(0, t0*(t1+2*t2)); t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); t5 = t3/t4 + t4/E; sqrt2 = MAX(0, 2*dR + t5); @@ -1387,7 +1478,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } //**************************************** - //Tangential force, including history effects + // tangential force, including history effects //**************************************** // tangential component @@ -1418,7 +1509,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } //------------------------------ - //Tangential forces + // tangential forces //------------------------------ k_tangential = tangential_coeffs[itype][jtype][0]; damp_tangential = tangential_coeffs[itype][jtype][1]*damp_normal_prefactor; @@ -1428,7 +1519,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, k_tangential *= a; } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - if (a < history[3]) { //On unloading, rescale the shear displacements + // on unloading, rescale the shear displacements + if (a < history[3]) { double factor = a/history[3]; history[0] *= factor; history[1] *= factor; @@ -1457,7 +1549,9 @@ double PairGranular::single(int i, int j, int itype, int jtype, fs3 *= Fscrit/fs; } else fs1 = fs2 = fs3 = 0.0; } - } else { //Classic pair gran/hooke (no history) + + // classic pair gran/hooke (no history) + } else { fs = meff*damp_tangential*vrel; if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; else Ft = 0.0; @@ -1467,7 +1561,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } //**************************************** - // Rolling resistance + // rolling resistance //**************************************** if (roll_model[itype][jtype] != ROLL_NONE) { @@ -1476,8 +1570,10 @@ double PairGranular::single(int i, int j, int itype, int jtype, relrot3 = omega[i][2] - omega[j][2]; // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // This is different from the Marshall papers, which use the Bagi/Kuhn formulation + // this is different from the Marshall papers, + // which use the Bagi/Kuhn formulation // for rolling velocity (see Wang et al for why the latter is wrong) + vrl1 = Reff*(relrot2*nz - relrot3*ny); //- 0.5*((radj-radi)/radsum)*vtr1; vrl2 = Reff*(relrot3*nx - relrot1*nz); //- 0.5*((radj-radi)/radsum)*vtr2; vrl3 = Reff*(relrot1*ny - relrot2*nx); //- 0.5*((radj-radi)/radsum)*vtr3; @@ -1486,7 +1582,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, int rhist1 = rhist0 + 1; int rhist2 = rhist1 + 1; - // Rolling displacement + // rolling displacement rollmag = sqrt(history[rhist0]*history[rhist0] + history[rhist1]*history[rhist1] + history[rhist2]*history[rhist2]); @@ -1512,10 +1608,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, } //**************************************** - // Twisting torque, including history effects + // twisting torque, including history effects //**************************************** + if (twist_model[itype][jtype] != TWIST_NONE) { - magtwist = relrot1*nx + relrot2*ny + relrot3*nz; //Omega_T (eq 29 of Marshall) + // omega_T (eq 29 of Marshall) + magtwist = relrot1*nx + relrot2*ny + relrot3*nz; if (twist_model[itype][jtype] == TWIST_MARSHALL) { k_twist = 0.5*k_tangential*a*a;; //eq 32 damp_twist = 0.5*damp_tangential*a*a; @@ -1525,11 +1623,12 @@ double PairGranular::single(int i, int j, int itype, int jtype, damp_twist = twist_coeffs[itype][jtype][1]; mu_twist = twist_coeffs[itype][jtype][2]; } - magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist;//M_t torque (eq 30) + // M_t torque (eq 30) + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist; signtwist = (magtwist > 0) - (magtwist < 0); - Mtcrit = mu_twist*Fncrit;//critical torque (eq 44) + Mtcrit = mu_twist*Fncrit; // critical torque (eq 44) if (fabs(magtortwist) > Mtcrit) { - magtortwist = -Mtcrit * signtwist; //eq 34 + magtortwist = -Mtcrit * signtwist; // eq 34 } } @@ -1578,8 +1677,8 @@ void PairGranular::unpack_forward_comm(int n, int first, double *buf) } /* ---------------------------------------------------------------------- - memory usage of local atom-based arrays - ------------------------------------------------------------------------- */ + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ double PairGranular::memory_usage() { @@ -1588,25 +1687,27 @@ double PairGranular::memory_usage() } /* ---------------------------------------------------------------------- - mixing of Young's modulus (E) + mixing of Young's modulus (E) ------------------------------------------------------------------------- */ -double PairGranular::mix_stiffnessE(double Eii, double Ejj, double poisii, double poisjj) +double PairGranular::mix_stiffnessE(double Eii, double Ejj, + double poisii, double poisjj) { return 1/((1-poisii*poisii)/Eii+(1-poisjj*poisjj)/Ejj); } /* ---------------------------------------------------------------------- - mixing of shear modulus (G) + mixing of shear modulus (G) ------------------------------------------------------------------------ */ -double PairGranular::mix_stiffnessG(double Eii, double Ejj, double poisii, double poisjj) +double PairGranular::mix_stiffnessG(double Eii, double Ejj, + double poisii, double poisjj) { return 1/((2*(2-poisii)*(1+poisii)/Eii) + (2*(2-poisjj)*(1+poisjj)/Ejj)); } /* ---------------------------------------------------------------------- - mixing of everything else + mixing of everything else ------------------------------------------------------------------------- */ double PairGranular::mix_geom(double valii, double valjj) @@ -1616,10 +1717,11 @@ double PairGranular::mix_geom(double valii, double valjj) /* ---------------------------------------------------------------------- - Compute pull-off distance (beyond contact) for a given radius and atom type + compute pull-off distance (beyond contact) for a given radius and atom type ------------------------------------------------------------------------- */ -double PairGranular::pulloff_distance(double radi, double radj, int itype, int jtype) +double PairGranular::pulloff_distance(double radi, double radj, + int itype, int jtype) { double E, coh, a, Reff; Reff = radi*radj/(radi+radj); @@ -1631,11 +1733,12 @@ double PairGranular::pulloff_distance(double radi, double radj, int itype, int j } /* ---------------------------------------------------------------------- - Transfer history during fix/neigh/history exchange - Only needed if any history entries i-j are not just negative of j-i entries + transfer history during fix/neigh/history exchange + only needed if any history entries i-j are not just negative of j-i entries ------------------------------------------------------------------------- */ -void PairGranular::transfer_history(double* source, double* target) { + +void PairGranular::transfer_history(double* source, double* target) +{ for (int i = 0; i < size_history; i++) target[i] = history_transfer_factors[i]*source[i]; } - diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 4743d271f5..935e676487 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -66,29 +66,29 @@ class PairGranular : public Pair { int size_history; int *history_transfer_factors; - //Model choices + // model choices int **normal_model, **damping_model; int **tangential_model, **roll_model, **twist_model; - //History flags + // history flags int normal_history, tangential_history, roll_history, twist_history; - //Indices of history entries + // indices of history entries int normal_history_index; int tangential_history_index; int roll_history_index; int twist_history_index; - //Per-type material coefficients + // per-type material coefficients double **Emod, **poiss, **Gmod; - //Per-type coefficients, set in pair coeff command + // per-type coefficients, set in pair coeff command double ***normal_coeffs; double ***tangential_coeffs; double ***roll_coeffs; double ***twist_coeffs; - //Optional user-specified global cutoff, per-type user-specified cutoffs + // optional user-specified global cutoff, per-type user-specified cutoffs double **cutoff_type; double cutoff_global; diff --git a/src/fix_neigh_history.cpp b/src/fix_neigh_history.cpp index e33ebe57dc..207c409596 100644 --- a/src/fix_neigh_history.cpp +++ b/src/fix_neigh_history.cpp @@ -408,7 +408,8 @@ void FixNeighHistory::pre_exchange_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - if (pair->nondefault_history_transfer) pair->transfer_history(onevalues, jvalues); + if (pair->nondefault_history_transfer) + pair->transfer_history(onevalues,jvalues); else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } @@ -521,7 +522,8 @@ void FixNeighHistory::pre_exchange_no_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - if (pair->nondefault_history_transfer) pair->transfer_history(onevalues, jvalues); + if (pair->nondefault_history_transfer) + pair->transfer_history(onevalues, jvalues); else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } diff --git a/src/pair.h b/src/pair.h index 0911bff706..035ebc8773 100644 --- a/src/pair.h +++ b/src/pair.h @@ -98,7 +98,7 @@ class Pair : protected Pointers { enum{GEOMETRIC,ARITHMETIC,SIXTHPOWER}; // mixing options - int beyond_contact, nondefault_history_transfer; //for granular styles + int beyond_contact, nondefault_history_transfer; // for granular styles // KOKKOS host/device flag and data masks From 5d7c52e114cb1f51cb191efd943058814054bc23 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 11:23:37 -0400 Subject: [PATCH 174/243] clean up whitespace issues caused by commit 5210c4c3a4e21e63036ca51554fc8f49ceb88274 --- src/GRANULAR/fix_wall_gran.cpp | 50 +++++------ src/GRANULAR/fix_wall_gran_region.cpp | 2 +- src/GRANULAR/pair_gran_hooke_history.cpp | 2 +- src/GRANULAR/pair_granular.cpp | 102 +++++++++++------------ src/GRANULAR/pair_granular.h | 2 +- 5 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 9925c37e4b..650938fd7c 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -124,7 +124,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : roll_model = twist_model = NONE; while (iarg < narg) { if (strcmp(arg[iarg], "hooke") == 0) { - if (iarg + 2 >= narg) + if (iarg + 2 >= narg) error->all(FLERR,"Illegal fix wall/gran command, " "not enough parameters provided for Hooke option"); normal_model = NORMAL_HOOKE; @@ -133,7 +133,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; - if (iarg + num_coeffs >= narg) + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, " "not enough parameters provided for Hertz option"); normal_model = NORMAL_HERTZ; @@ -142,7 +142,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; - if (iarg + num_coeffs >= narg) + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal fix wall/gran command, " "not enough parameters provided for Hertz option"); normal_model = HERTZ_MATERIAL; @@ -153,7 +153,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[2] = poiss; iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal fix wall/gran command, " "not enough parameters provided for Hertz option"); normal_model = DMT; @@ -165,7 +165,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, " "not enough parameters provided for JKR option"); beyond_contact = 1; @@ -178,7 +178,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : normal_coeffs[3] = force->numeric(FLERR,arg[iarg+4]); //cohesion iarg += 5; } else if (strcmp(arg[iarg], "damping") == 0) { - if (iarg+1 >= narg) + if (iarg+1 >= narg) error->all(FLERR, "Illegal wall/gran command, " "not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0) { @@ -194,11 +194,11 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : "unrecognized damping model"); iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "must specify tangential model after tangential keyword"); if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { - if (iarg + 3 >= narg) + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for tangential model"); tangential_model = TANGENTIAL_NOHISTORY; @@ -210,16 +210,16 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "linear_history") == 0) + if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model = TANGENTIAL_HISTORY; - else if (strcmp(arg[iarg+1], "mindlin") == 0) + else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model = TANGENTIAL_MINDLIN; - else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model = TANGENTIAL_MINDLIN_RESCALE; - if ((tangential_model == TANGENTIAL_MINDLIN || + if ((tangential_model == TANGENTIAL_MINDLIN || tangential_model == TANGENTIAL_MINDLIN_RESCALE) && (strcmp(arg[iarg+2], "NULL") == 0)) { if (normal_model == NORMAL_HERTZ || normal_model == NORMAL_HOOKE) { @@ -241,13 +241,13 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : "tangential model not recognized"); } } else if (strcmp(arg[iarg], "rolling") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR, "Illegal wall/gran command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { roll_model = ROLL_NONE; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, " "not enough parameters provided for rolling model"); roll_model = ROLL_SDS; @@ -272,7 +272,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : twist_history = 1; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, " "not enough parameters provided for twist model"); twist_model = TWIST_SDS; @@ -860,7 +860,7 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, history[1] += vtr2*dt; history[2] += vtr3*dt; } - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); // rotate shear displacements @@ -991,7 +991,7 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, history[1] += vtr2*dt; history[2] += vtr3*dt; } - shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + + shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); // rotate history displacements @@ -1230,7 +1230,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, history[thist2] *= factor; } } - shrmag = sqrt(history[thist0]*history[thist0] + + shrmag = sqrt(history[thist0]*history[thist0] + history[thist1]*history[thist1] + history[thist2]*history[thist2]); @@ -1242,7 +1242,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, if (rsht > 0) { // if rhst == shrmag, contacting pair has rotated 90 deg in one step, // in which case you deserve a crash! - scalefac = shrmag/(shrmag - rsht); + scalefac = shrmag/(shrmag - rsht); history[thist0] -= rsht*nx; history[thist1] -= rsht*ny; history[thist2] -= rsht*nz; @@ -1267,11 +1267,11 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { - history[thist0] = -1.0/k_tangential*(Fscrit*fs1/fs + + history[thist0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[thist1] = -1.0/k_tangential*(Fscrit*fs2/fs + + history[thist1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[thist2] = -1.0/k_tangential*(Fscrit*fs3/fs + + history[thist2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); fs1 *= Fscrit/fs; fs2 *= Fscrit/fs; @@ -1378,7 +1378,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, signtwist = (magtwist > 0) - (magtwist < 0); Mtcrit = mu_twist*Fncrit; // critical torque (eq 44) if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); magtortwist = -Mtcrit * signtwist; // eq 34 } @@ -1440,7 +1440,7 @@ double FixWallGran::memory_usage() if (use_history) bytes += nmax*size_history * sizeof(double); // shear history if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid // store contacts - if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); + if (peratom_flag) bytes += nmax*size_peratom_cols*sizeof(double); return bytes; } diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index e6f8406be0..7702967504 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -47,7 +47,7 @@ enum {NORMAL_HOOKE, NORMAL_HERTZ, HERTZ_MATERIAL, DMT, JKR}; /* ---------------------------------------------------------------------- */ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : - FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), + FixWallGran(lmp, narg, arg), region(NULL), region_style(NULL), ncontact(NULL), walls(NULL), history_many(NULL), c2r(NULL) { diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index c86c2b0c90..27d2cf10a8 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -61,7 +61,7 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) // keep default behavior of history[i][j] = -history[j][i] - nondefault_history_transfer = 0; + nondefault_history_transfer = 0; } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index c8450c5434..7cc2348bbd 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -52,7 +52,7 @@ using namespace MathConst; enum {HOOKE, HERTZ, HERTZ_MATERIAL, DMT, JKR}; enum {VELOCITY, VISCOELASTIC, TSUJI}; -enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, +enum {TANGENTIAL_NOHISTORY, TANGENTIAL_HISTORY, TANGENTIAL_MINDLIN, TANGENTIAL_MINDLIN_RESCALE}; enum {TWIST_NONE, TWIST_SDS, TWIST_MARSHALL}; enum {ROLL_NONE, ROLL_SDS}; @@ -320,7 +320,7 @@ void PairGranular::compute(int eflag, int vflag) t2 = 8*dR*dR2*E*E*E; t3 = 4*dR2*E; // in case sqrt(0) < 0 due to precision issues - sqrt1 = MAX(0, t0*(t1+2*t2)); + sqrt1 = MAX(0, t0*(t1+2*t2)); t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); t5 = t3/t4 + t4/E; sqrt2 = MAX(0, 2*dR + t5); @@ -405,7 +405,7 @@ void PairGranular::compute(int eflag, int vflag) if (tangential_history) { if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN) { k_tangential *= a; - } else if (tangential_model[itype][jtype] == + } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; // on unloading, rescale the shear displacements @@ -439,7 +439,7 @@ void PairGranular::compute(int eflag, int vflag) history[0] += vtr1*dt; history[1] += vtr2*dt; history[2] += vtr3*dt; - if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) + if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) history[3] = a; } @@ -455,11 +455,11 @@ void PairGranular::compute(int eflag, int vflag) shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + history[2]*history[2]); if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + + history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + + history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + + history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); fs1 *= Fscrit/fs; fs2 *= Fscrit/fs; @@ -486,15 +486,15 @@ void PairGranular::compute(int eflag, int vflag) // rolling velocity, // see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // this is different from the Marshall papers, + // this is different from the Marshall papers, // which use the Bagi/Kuhn formulation // for rolling velocity (see Wang et al for why the latter is wrong) // - 0.5*((radj-radi)/radsum)*vtr1; // - 0.5*((radj-radi)/radsum)*vtr2; // - 0.5*((radj-radi)/radsum)*vtr3; - vrl1 = Reff*(relrot2*nz - relrot3*ny); - vrl2 = Reff*(relrot3*nx - relrot1*nz); + vrl1 = Reff*(relrot2*nz - relrot3*ny); + vrl2 = Reff*(relrot3*nx - relrot1*nz); vrl3 = Reff*(relrot1*ny - relrot2*nx); int rhist0 = roll_history_index; @@ -566,12 +566,12 @@ void PairGranular::compute(int eflag, int vflag) if (historyupdate) { history[twist_history_index] += magtwist*dt; } - magtortwist = -k_twist*history[twist_history_index] - + magtortwist = -k_twist*history[twist_history_index] - damp_twist*magtwist; // M_t torque (eq 30) signtwist = (magtwist > 0) - (magtwist < 0); Mtcrit = mu_twist*Fncrit; // critical torque (eq 44) if (fabs(magtortwist) > Mtcrit) { - history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - + history[twist_history_index] = 1.0/k_twist*(Mtcrit*signtwist - damp_twist*magtwist); magtortwist = -Mtcrit * signtwist; // eq 34 } @@ -729,7 +729,7 @@ void PairGranular::coeff(int narg, char **arg) int iarg = 2; while (iarg < narg) { if (strcmp(arg[iarg], "hooke") == 0) { - if (iarg + 2 >= narg) + if (iarg + 2 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for Hooke option"); normal_model_one = HOOKE; @@ -738,7 +738,7 @@ void PairGranular::coeff(int narg, char **arg) iarg += 3; } else if (strcmp(arg[iarg], "hertz") == 0) { int num_coeffs = 2; - if (iarg + num_coeffs >= narg) + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for Hertz option"); normal_model_one = HERTZ; @@ -747,7 +747,7 @@ void PairGranular::coeff(int narg, char **arg) iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "hertz/material") == 0) { int num_coeffs = 3; - if (iarg + num_coeffs >= narg) + if (iarg + num_coeffs >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for Hertz/material option"); normal_model_one = HERTZ_MATERIAL; @@ -756,7 +756,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[2] = force->numeric(FLERR,arg[iarg+3]); // Poisson's ratio iarg += num_coeffs+1; } else if (strcmp(arg[iarg], "dmt") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for Hertz option"); normal_model_one = DMT; @@ -766,7 +766,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); // cohesion iarg += 5; } else if (strcmp(arg[iarg], "jkr") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for JKR option"); beyond_contact = 1; @@ -777,7 +777,7 @@ void PairGranular::coeff(int narg, char **arg) normal_coeffs_one[3] = force->numeric(FLERR,arg[iarg+4]); // cohesion iarg += 5; } else if (strcmp(arg[iarg], "damping") == 0) { - if (iarg+1 >= narg) + if (iarg+1 >= narg) error->all(FLERR, "Illegal pair_coeff command, " "not enough parameters provided for damping model"); if (strcmp(arg[iarg+1], "velocity") == 0) { @@ -793,11 +793,11 @@ void PairGranular::coeff(int narg, char **arg) "unrecognized damping model"); iarg += 1; } else if (strcmp(arg[iarg], "tangential") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR,"Illegal pair_coeff command, must specify " "tangential model after tangential keyword"); if (strcmp(arg[iarg+1], "linear_nohistory") == 0) { - if (iarg + 3 >= narg) + if (iarg + 3 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for tangential model"); tangential_model_one = TANGENTIAL_NOHISTORY; @@ -809,17 +809,17 @@ void PairGranular::coeff(int narg, char **arg) } else if ((strcmp(arg[iarg+1], "linear_history") == 0) || (strcmp(arg[iarg+1], "mindlin") == 0) || (strcmp(arg[iarg+1], "mindlin_rescale") == 0)) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for tangential model"); - if (strcmp(arg[iarg+1], "linear_history") == 0) + if (strcmp(arg[iarg+1], "linear_history") == 0) tangential_model_one = TANGENTIAL_HISTORY; else if (strcmp(arg[iarg+1], "mindlin") == 0) tangential_model_one = TANGENTIAL_MINDLIN; - else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) + else if (strcmp(arg[iarg+1], "mindlin_rescale") == 0) tangential_model_one = TANGENTIAL_MINDLIN_RESCALE; tangential_history = 1; - if ((tangential_model_one == TANGENTIAL_MINDLIN || + if ((tangential_model_one == TANGENTIAL_MINDLIN || tangential_model_one == TANGENTIAL_MINDLIN_RESCALE) && (strcmp(arg[iarg+2], "NULL") == 0)) { if (normal_model_one == HERTZ || normal_model_one == HOOKE) { @@ -840,13 +840,13 @@ void PairGranular::coeff(int narg, char **arg) "tangential model not recognized"); } } else if (strcmp(arg[iarg], "rolling") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { roll_model_one = ROLL_NONE; iarg += 2; } else if (strcmp(arg[iarg+1], "sds") == 0) { - if (iarg + 4 >= narg) + if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for rolling model"); roll_model_one = ROLL_SDS; @@ -861,7 +861,7 @@ void PairGranular::coeff(int narg, char **arg) "rolling friction model not recognized"); } } else if (strcmp(arg[iarg], "twisting") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); if (strcmp(arg[iarg+1], "none") == 0) { twist_model_one = TWIST_NONE; @@ -886,14 +886,14 @@ void PairGranular::coeff(int narg, char **arg) "twisting friction model not recognized"); } } else if (strcmp(arg[iarg], "cutoff") == 0) { - if (iarg + 1 >= narg) + if (iarg + 1 >= narg) error->all(FLERR, "Illegal pair_coeff command, not enough parameters"); cutoff_one = force->numeric(FLERR,arg[iarg+1]); } else error->all(FLERR, "Illegal pair coeff command"); } // error not to specify normal or tangential model - if ((normal_model_one < 0) || (tangential_model_one < 0)) + if ((normal_model_one < 0) || (tangential_model_one < 0)) error->all(FLERR, "Illegal pair coeff command, " "must specify normal or tangential contact model"); @@ -914,7 +914,7 @@ void PairGranular::coeff(int narg, char **arg) if (normal_model_one != HERTZ && normal_model_one != HOOKE) { Emod[i][j] = Emod[j][i] = normal_coeffs_one[0]; poiss[i][j] = poiss[j][i] = normal_coeffs_one[2]; - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = FOURTHIRDS*mix_stiffnessE(Emod[i][j],Emod[i][j], poiss[i][j],poiss[i][j]); } else { @@ -927,14 +927,14 @@ void PairGranular::coeff(int narg, char **arg) tangential_model[i][j] = tangential_model[j][i] = tangential_model_one; if (tangential_coeffs_one[0] == -1) { - tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = 8*mix_stiffnessG(Emod[i][j],Emod[i][j],poiss[i][j],poiss[i][j]); } else { - tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = + tangential_coeffs[i][j][0] = tangential_coeffs[j][i][0] = tangential_coeffs_one[0]; } for (int k = 1; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = tangential_coeffs_one[k]; roll_model[i][j] = roll_model[j][i] = roll_model_one; @@ -974,7 +974,7 @@ void PairGranular::init_style() // determine whether we need a granular neigh list, how large it needs to be - use_history = normal_history || tangential_history || + use_history = normal_history || tangential_history || roll_history || twist_history; // for JKR, will need fix/neigh/history to keep track of touch arrays @@ -1133,36 +1133,36 @@ double PairGranular::init_one(int i, int j) } if (normal_model[i][j] == HERTZ || normal_model[i][j] == HOOKE) - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_geom(normal_coeffs[i][i][0], normal_coeffs[j][j][0]); else - normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = + normal_coeffs[i][j][0] = normal_coeffs[j][i][0] = mix_stiffnessE(Emod[i][i], Emod[j][j], poiss[i][i], poiss[j][j]); - normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = + normal_coeffs[i][j][1] = normal_coeffs[j][i][1] = mix_geom(normal_coeffs[i][i][1], normal_coeffs[j][j][1]); if ((normal_model[i][j] == JKR) || (normal_model[i][j] == DMT)) - normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = + normal_coeffs[i][j][3] = normal_coeffs[j][i][3] = mix_geom(normal_coeffs[i][i][3], normal_coeffs[j][j][3]); for (int k = 0; k < 3; k++) - tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = + tangential_coeffs[i][j][k] = tangential_coeffs[j][i][k] = mix_geom(tangential_coeffs[i][i][k], tangential_coeffs[j][j][k]); if (roll_model[i][j] != ROLL_NONE) { for (int k = 0; k < 3; k++) - roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = + roll_coeffs[i][j][k] = roll_coeffs[j][i][k] = mix_geom(roll_coeffs[i][i][k], roll_coeffs[j][j][k]); } if (twist_model[i][j] != TWIST_NONE && twist_model[i][j] != TWIST_MARSHALL) { for (int k = 0; k < 3; k++) - twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = + twist_coeffs[i][j][k] = twist_coeffs[j][i][k] = mix_geom(twist_coeffs[i][i][k], twist_coeffs[j][j][k]); } } - // It is possible that cut[i][j] at this point is still 0.0. + // It is possible that cut[i][j] at this point is still 0.0. // This can happen when // there is a future fix_pour after the current run. A cut[i][j] = 0.0 creates // problems because neighbor.cpp uses min(cut[i][j]) to decide on the bin size @@ -1176,7 +1176,7 @@ double PairGranular::init_one(int i, int j) if (((maxrad_dynamic[i] > 0.0) && (maxrad_dynamic[j] > 0.0)) || ((maxrad_dynamic[i] > 0.0) && (maxrad_frozen[j] > 0.0)) || // radius info about both i and j exist - ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { + ((maxrad_frozen[i] > 0.0) && (maxrad_dynamic[j] > 0.0))) { cutoff = maxrad_dynamic[i]+maxrad_dynamic[j]; pulloff = 0.0; if (normal_model[i][j] == JKR) { @@ -1194,7 +1194,7 @@ double PairGranular::init_one(int i, int j) } else { - // radius info about either i or j does not exist + // radius info about either i or j does not exist // (i.e. not present and not about to get poured; // set to largest value to not interfere with neighbor list) @@ -1520,7 +1520,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; // on unloading, rescale the shear displacements - if (a < history[3]) { + if (a < history[3]) { double factor = a/history[3]; history[0] *= factor; history[1] *= factor; @@ -1551,7 +1551,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } // classic pair gran/hooke (no history) - } else { + } else { fs = meff*damp_tangential*vrel; if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; else Ft = 0.0; @@ -1570,7 +1570,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, relrot3 = omega[i][2] - omega[j][2]; // rolling velocity, see eq. 31 of Wang et al, Particuology v 23, p 49 (2015) - // this is different from the Marshall papers, + // this is different from the Marshall papers, // which use the Bagi/Kuhn formulation // for rolling velocity (see Wang et al for why the latter is wrong) @@ -1690,7 +1690,7 @@ double PairGranular::memory_usage() mixing of Young's modulus (E) ------------------------------------------------------------------------- */ -double PairGranular::mix_stiffnessE(double Eii, double Ejj, +double PairGranular::mix_stiffnessE(double Eii, double Ejj, double poisii, double poisjj) { return 1/((1-poisii*poisii)/Eii+(1-poisjj*poisjj)/Ejj); @@ -1700,14 +1700,14 @@ double PairGranular::mix_stiffnessE(double Eii, double Ejj, mixing of shear modulus (G) ------------------------------------------------------------------------ */ -double PairGranular::mix_stiffnessG(double Eii, double Ejj, +double PairGranular::mix_stiffnessG(double Eii, double Ejj, double poisii, double poisjj) { return 1/((2*(2-poisii)*(1+poisii)/Eii) + (2*(2-poisjj)*(1+poisjj)/Ejj)); } /* ---------------------------------------------------------------------- - mixing of everything else + mixing of everything else ------------------------------------------------------------------------- */ double PairGranular::mix_geom(double valii, double valjj) @@ -1720,7 +1720,7 @@ double PairGranular::mix_geom(double valii, double valjj) compute pull-off distance (beyond contact) for a given radius and atom type ------------------------------------------------------------------------- */ -double PairGranular::pulloff_distance(double radi, double radj, +double PairGranular::pulloff_distance(double radi, double radj, int itype, int jtype) { double E, coh, a, Reff; diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 935e676487..d799acb733 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -5,7 +5,7 @@ Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under + certain rights in this software. This software is distributed under the GNU General Public License. See the README file in the top-level LAMMPS directory. From 03ee03c043523abb3a88b4574b0e6a2fc86eaa36 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 11:44:50 -0400 Subject: [PATCH 175/243] remove set but unused flag --- src/GRANULAR/fix_wall_gran.cpp | 1 - src/GRANULAR/fix_wall_gran.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 650938fd7c..555c5071e7 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -168,7 +168,6 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : if (iarg + 4 >= narg) error->all(FLERR,"Illegal wall/gran command, " "not enough parameters provided for JKR option"); - beyond_contact = 1; normal_model = JKR; Emod = force->numeric(FLERR,arg[iarg+1]); //E normal_coeffs[1] = force->numeric(FLERR,arg[iarg+2]); //damping diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index ee81477ddb..f147e29433 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -69,7 +69,6 @@ class FixWallGran : public Fix { // for granular model choices int normal_model, damping_model; int tangential_model, roll_model, twist_model; - int beyond_contact; // history flags int normal_history, tangential_history, roll_history, twist_history; From 3cc740b9d3950dff935eb65edacba5140638b1a3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 11:46:04 -0400 Subject: [PATCH 176/243] handle granular specific pair style flags consistently and make sure they are never accessed uninitialized --- src/GRANULAR/pair_gran_hooke_history.h | 2 -- src/pair.cpp | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index b1bb212f89..81f2d8fd4a 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -26,8 +26,6 @@ namespace LAMMPS_NS { class PairGranHookeHistory : public Pair { public: - int nondefault_history_transfer; - PairGranHookeHistory(class LAMMPS *); virtual ~PairGranHookeHistory(); virtual void compute(int, int); diff --git a/src/pair.cpp b/src/pair.cpp index 44cf3a43ea..bce70af2a3 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -100,6 +100,9 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) num_tally_compute = 0; list_tally_compute = NULL; + nondefault_history_transfer = 0; + beyond_contact = 0; + // KOKKOS per-fix data masks execution_space = Host; From b9bddd7ba6ce1a0dda0424e29250143db072a2e8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 11:47:41 -0400 Subject: [PATCH 177/243] use ev_init() and add some more cosmetic changes to pair granular --- src/GRANULAR/pair_granular.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 7cc2348bbd..5254f93c9e 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -170,13 +170,10 @@ void PairGranular::compute(int eflag, int vflag) int *touch,**firsttouch; double *history,*allhistory,**firsthistory; - bool touchflag; + bool touchflag = false; + const bool historyupdate = (update->setupflag) ? false : true; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - int historyupdate = 1; - if (update->setupflag) historyupdate = 0; + ev_init(eflag,vflag); // update rigid body info for owned & ghost atoms if using FixRigid masses // body[i] = which body atom I is in, -1 if none From 196b8c6eabda5c8f772dc05cd52eb161c3f97fd9 Mon Sep 17 00:00:00 2001 From: ckadding Date: Thu, 28 Mar 2019 11:53:32 -0400 Subject: [PATCH 178/243] Fix typos in error checking --- src/USER-MISC/compute_pressure_cylinder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/USER-MISC/compute_pressure_cylinder.cpp b/src/USER-MISC/compute_pressure_cylinder.cpp index 6fcd343e38..c250eaf677 100644 --- a/src/USER-MISC/compute_pressure_cylinder.cpp +++ b/src/USER-MISC/compute_pressure_cylinder.cpp @@ -63,7 +63,7 @@ ComputePressureCyl::ComputePressureCyl(LAMMPS *lmp, int narg, char **arg) : Rmax=force->numeric(FLERR,arg[5]); bin_width=force->numeric(FLERR,arg[6]); - if ((bin_width <= 0.0) || (bin_width < Rmax)) + if ((bin_width <= 0.0) || (bin_width > Rmax)) error->all(FLERR,"Illegal compute pressure/cylinder command"); if ((zhi < zlo) || ((zhi-zlo) < bin_width)) error->all(FLERR,"Illegal compute pressure/cylinder command"); @@ -76,7 +76,7 @@ ComputePressureCyl::ComputePressureCyl(LAMMPS *lmp, int narg, char **arg) : // NOTE: at 2^22 = 4.2M bins, we will be close to exhausting allocatable // memory on a 32-bit environment. so we use this as an upper limit. - if ((nbins < 1) || (nzbins < 1) || (nbins > 2>>22) || (nbins > 2>>22)) + if ((nbins < 1) || (nzbins < 1) || (nbins > 2<<22) || (nzbins > 2<<22)) error->all(FLERR,"Illegal compute pressure/cylinder command"); array_flag=1; From ab12a7c95b5287f560d24e6098705ccd157e1e7e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 11:58:04 -0400 Subject: [PATCH 179/243] use consistent constants from math_const.h and fast integer powers from math_special --- src/GRANULAR/pair_granular.cpp | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 5254f93c9e..973acbbaf4 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -36,17 +36,18 @@ See the README file in the top-level LAMMPS directory. #include "memory.h" #include "error.h" #include "math_const.h" +#include "math_special.h" using namespace LAMMPS_NS; using namespace MathConst; +using namespace MathSpecial; #define PI27SQ 266.47931882941264802866 // 27*PI**2 #define THREEROOT3 5.19615242270663202362 // 3*sqrt(3) #define SIXROOT6 14.69693845669906728801 // 6*sqrt(6) #define INVROOT6 0.40824829046386307274 // 1/sqrt(6) -#define FOURTHIRDS 1.333333333333333 // 4/3 +#define FOURTHIRDS 4.0/3.0 // 4/3 #define THREEQUARTERS 0.75 // 3/4 -#define TWOPI 6.28318530717959 // 2*PI #define EPSILON 1e-10 @@ -251,8 +252,8 @@ void PairGranular::compute(int eflag, int vflag) if (touch[jj]) { R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + a = cbrt(9.0*MY_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(MY_PI*coh*a/E); dist_pulloff = radsum-delta_pulloff; touchflag = (rsq < dist_pulloff*dist_pulloff); } else { @@ -318,15 +319,15 @@ void PairGranular::compute(int eflag, int vflag) t3 = 4*dR2*E; // in case sqrt(0) < 0 due to precision issues sqrt1 = MAX(0, t0*(t1+2*t2)); - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t4 = cbrt(t1+t2+THREEROOT3*MY_PI*sqrt(sqrt1)); t5 = t3/t4 + t4/E; sqrt2 = MAX(0, 2*dR + t5); t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*MY_PI*R2/(E*t6)); a = INVROOT6*(t6 + sqrt(sqrt3)); a2 = a*a; knfac = normal_coeffs[itype][jtype][0]*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + Fne = knfac*a2/Reff - MY_2PI*a2*sqrt(4*coh*E/(MY_PI*a)); } else { knfac = E; // Hooke Fne = knfac*delta; @@ -383,10 +384,10 @@ void PairGranular::compute(int eflag, int vflag) } if (normal_model[itype][jtype] == JKR) { - F_pulloff = 3*M_PI*coh*Reff; + F_pulloff = 3*MY_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } else if (normal_model[itype][jtype] == DMT) { - F_pulloff = 4*M_PI*coh*Reff; + F_pulloff = 4*MY_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } else { Fncrit = fabs(Fntot); @@ -899,9 +900,8 @@ void PairGranular::coeff(int narg, char **arg) if (damping_model_one == TSUJI) { double cor; cor = normal_coeffs_one[1]; - damp = 1.2728-4.2783*cor+11.087*pow(cor,2)-22.348*pow(cor,3)+ - 27.467*pow(cor,4)-18.022*pow(cor,5)+ - 4.8218*pow(cor,6); + damp = 1.2728-4.2783*cor+11.087*square(cor)-22.348*cube(cor)+ + 27.467*powint(cor,4)-18.022*powint(cor,5)+4.8218*powint(cor,6); } else damp = normal_coeffs_one[1]; for (int i = ilo; i <= ihi; i++) { @@ -1335,8 +1335,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, E *= THREEQUARTERS; R2 = Reff*Reff; coh = normal_coeffs[itype][jtype][3]; - a = cbrt(9.0*M_PI*coh*R2/(4*E)); - delta_pulloff = a*a/Reff - 2*sqrt(M_PI*coh*a/E); + a = cbrt(9.0*MY_PI*coh*R2/(4*E)); + delta_pulloff = a*a/Reff - 2*sqrt(MY_PI*coh*a/E); dist_pulloff = radsum+delta_pulloff; touchflag = (rsq <= dist_pulloff*dist_pulloff); } else touchflag = (rsq <= radsum*radsum); @@ -1427,15 +1427,15 @@ double PairGranular::single(int i, int j, int itype, int jtype, t3 = 4*dR2*E; // in case sqrt(0) < 0 due to precision issues sqrt1 = MAX(0, t0*(t1+2*t2)); - t4 = cbrt(t1+t2+THREEROOT3*M_PI*sqrt(sqrt1)); + t4 = cbrt(t1+t2+THREEROOT3*MY_PI*sqrt(sqrt1)); t5 = t3/t4 + t4/E; sqrt2 = MAX(0, 2*dR + t5); t6 = sqrt(sqrt2); - sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*M_PI*R2/(E*t6)); + sqrt3 = MAX(0, 4*dR - t5 + SIXROOT6*coh*MY_PI*R2/(E*t6)); a = INVROOT6*(t6 + sqrt(sqrt3)); a2 = a*a; knfac = normal_coeffs[itype][jtype][0]*a; - Fne = knfac*a2/Reff - TWOPI*a2*sqrt(4*coh*E/(M_PI*a)); + Fne = knfac*a2/Reff - MY_2PI*a2*sqrt(4*coh*E/(MY_PI*a)); } else { knfac = E; Fne = knfac*delta; @@ -1496,10 +1496,10 @@ double PairGranular::single(int i, int j, int itype, int jtype, vrel = sqrt(vrel); if (normal_model[itype][jtype] == JKR) { - F_pulloff = 3*M_PI*coh*Reff; + F_pulloff = 3*MY_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } else if (normal_model[itype][jtype] == DMT) { - F_pulloff = 4*M_PI*coh*Reff; + F_pulloff = 4*MY_PI*coh*Reff; Fncrit = fabs(Fne + 2*F_pulloff); } else { Fncrit = fabs(Fntot); @@ -1725,8 +1725,8 @@ double PairGranular::pulloff_distance(double radi, double radj, if (Reff <= 0) return 0; coh = normal_coeffs[itype][itype][3]; E = normal_coeffs[itype][jtype][0]*THREEQUARTERS; - a = cbrt(9*M_PI*coh*Reff/(4*E)); - return a*a/Reff - 2*sqrt(M_PI*coh*a/E); + a = cbrt(9*MY_PI*coh*Reff/(4*E)); + return a*a/Reff - 2*sqrt(MY_PI*coh*a/E); } /* ---------------------------------------------------------------------- From 61483da58b58332d831169009fcb577b744f983e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 12:25:40 -0400 Subject: [PATCH 180/243] error out when per-atom stress is requested --- src/USER-INTEL/README | 32 +++++++++++-------- src/USER-INTEL/pair_airebo_intel.cpp | 3 ++ src/USER-INTEL/pair_buck_coul_cut_intel.cpp | 2 ++ src/USER-INTEL/pair_buck_coul_long_intel.cpp | 2 ++ src/USER-INTEL/pair_buck_intel.cpp | 2 ++ src/USER-INTEL/pair_dpd_intel.cpp | 2 ++ src/USER-INTEL/pair_eam_intel.cpp | 2 ++ src/USER-INTEL/pair_gayberne_intel.cpp | 2 ++ .../pair_lj_charmm_coul_charmm_intel.cpp | 2 ++ .../pair_lj_charmm_coul_long_intel.cpp | 2 ++ .../pair_lj_cut_coul_long_intel.cpp | 2 ++ src/USER-INTEL/pair_lj_cut_intel.cpp | 2 ++ src/USER-INTEL/pair_rebo_intel.cpp | 2 +- src/USER-INTEL/pair_sw_intel.cpp | 2 ++ src/USER-INTEL/pair_tersoff_intel.cpp | 2 ++ 15 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/USER-INTEL/README b/src/USER-INTEL/README index 871d881f39..786033ca85 100644 --- a/src/USER-INTEL/README +++ b/src/USER-INTEL/README @@ -2,13 +2,13 @@ -------------------------------- LAMMPS Intel(R) Package -------------------------------- - + W. Michael Brown (Intel) michael.w.brown at intel.com Markus Hohnerbach (RWTH Aachen University) William McDoniel (RWTH Aachen University) Rodrigo Canales (RWTH Aachen University) Stan Moore (Sandia) - Ahmed E. Ismail (RWTH Aachen University) + Ahmed E. Ismail (RWTH Aachen University) Paolo Bientinesi (RWTH Aachen University) Anupama Kurpad (Intel) Biswajit Mishra (Shell) @@ -20,23 +20,29 @@ This package provides LAMMPS styles that: 1. include support for single and mixed precision in addition to double. 2. include modifications to support vectorization for key routines 3. include modifications for data layouts to improve cache efficiency - 3. include modifications to support offload to Intel(R) Xeon Phi(TM) + 3. include modifications to support offload to Intel(R) Xeon Phi(TM) coprocessors ----------------------------------------------------------------------------- +As of 2019/03/28 none of the styles provided in this package support +tallying per-atom stresses. Any attempt to compute/access it will +cause an error termination. + +----------------------------------------------------------------------------- + For Intel server processors codenamed "Skylake", the following flags should be added or changed in the Makefile depending on the version: 2017 update 2 - No changes needed 2017 updates 3 or 4 - Use -xCOMMON-AVX512 and not -xHost or -xCORE-AVX512 2018 inital release - Use -xCOMMON-AVX512 and not -xHost or -xCORE-AVX512 -2018u1 or newer - Use -xHost or -xCORE-AVX512 and -qopt-zmm-usage=high +2018u1 or newer - Use -xHost or -xCORE-AVX512 and -qopt-zmm-usage=high ----------------------------------------------------------------------------- When using the suffix command with "intel", intel styles will be used if they -exist. If the suffix command is used with "hybrid intel omp" and the USER-OMP +exist. If the suffix command is used with "hybrid intel omp" and the USER-OMP is installed, USER-OMP styles will be used whenever USER-INTEL styles are not available. This allow for running most styles in LAMMPS with threading. @@ -55,21 +61,21 @@ need to be changed. Unless Intel Math Kernel Library (MKL) is unavailable, -DLMP_USE_MKL_RNG should be added to the compile flags. This will enable using the MKL Mersenne -Twister random number generator (RNG) for Dissipative Particle Dynamics -(DPD). This RNG can allow significantly faster performance and it also has a +Twister random number generator (RNG) for Dissipative Particle Dynamics +(DPD). This RNG can allow significantly faster performance and it also has a significantly longer period than the standard RNG for DPD. ----------------------------------------------------------------------------- -In order to use offload to Intel(R) Xeon Phi(TM) coprocessors, the flag --DLMP_INTEL_OFFLOAD should be set in the Makefile. Offload requires the use of +In order to use offload to Intel(R) Xeon Phi(TM) coprocessors, the flag +-DLMP_INTEL_OFFLOAD should be set in the Makefile. Offload requires the use of Intel compilers. ----------------------------------------------------------------------------- -For portability reasons, vectorization directives are currently only enabled +For portability reasons, vectorization directives are currently only enabled for Intel compilers. Using other compilers may result in significantly -lower performance. This behavior can be changed by defining +lower performance. This behavior can be changed by defining LMP_SIMD_COMPILER for the preprocessor (see intel_preprocess.h). ----------------------------------------------------------------------------- @@ -81,9 +87,9 @@ compile with -DINTEL_OFFLOAD_NOAFFINITY. ----------------------------------------------------------------------------- -Vector intrinsics are temporarily being used for the Stillinger-Weber +Vector intrinsics are temporarily being used for the Stillinger-Weber potential to allow for advanced features in the AVX512 instruction set to be exploited on early hardware. We hope to see compiler improvements for AVX512 that will eliminate this requirement, so it is not recommended to -develop code based on the intrinsics implementation. Please e-mail the +develop code based on the intrinsics implementation. Please e-mail the authors for more details. diff --git a/src/USER-INTEL/pair_airebo_intel.cpp b/src/USER-INTEL/pair_airebo_intel.cpp index f330e3ec86..eedf45d75e 100644 --- a/src/USER-INTEL/pair_airebo_intel.cpp +++ b/src/USER-INTEL/pair_airebo_intel.cpp @@ -293,6 +293,9 @@ void PairAIREBOIntel::compute( int eflag, int vflag, IntelBuffers * buffers ) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); + pvector[0] = pvector[1] = pvector[2] = 0.0; const int inum = list->inum; diff --git a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp index 3f2d64fb93..4ad4398fbe 100644 --- a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp @@ -74,6 +74,8 @@ void PairBuckCoulCutIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_buck_coul_long_intel.cpp b/src/USER-INTEL/pair_buck_coul_long_intel.cpp index 2ddcd55663..150cfd3ee0 100644 --- a/src/USER-INTEL/pair_buck_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_long_intel.cpp @@ -74,6 +74,8 @@ void PairBuckCoulLongIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_buck_intel.cpp b/src/USER-INTEL/pair_buck_intel.cpp index 34af3462e2..b21ce13a34 100644 --- a/src/USER-INTEL/pair_buck_intel.cpp +++ b/src/USER-INTEL/pair_buck_intel.cpp @@ -67,6 +67,8 @@ void PairBuckIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_dpd_intel.cpp b/src/USER-INTEL/pair_dpd_intel.cpp index 016f3b5ca0..4ebdce9a96 100644 --- a/src/USER-INTEL/pair_dpd_intel.cpp +++ b/src/USER-INTEL/pair_dpd_intel.cpp @@ -83,6 +83,8 @@ void PairDPDIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag, vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_eam_intel.cpp b/src/USER-INTEL/pair_eam_intel.cpp index 7f4806c87c..9d2629ef1c 100644 --- a/src/USER-INTEL/pair_eam_intel.cpp +++ b/src/USER-INTEL/pair_eam_intel.cpp @@ -79,6 +79,8 @@ void PairEAMIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag, vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_gayberne_intel.cpp b/src/USER-INTEL/pair_gayberne_intel.cpp index 1d9ee7d4cd..862dee2287 100644 --- a/src/USER-INTEL/pair_gayberne_intel.cpp +++ b/src/USER-INTEL/pair_gayberne_intel.cpp @@ -73,6 +73,8 @@ void PairGayBerneIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag, vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nall = atom->nlocal + atom->nghost; diff --git a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp index 9689c0bf50..f3f81651fc 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -67,6 +67,8 @@ void PairLJCharmmCoulCharmmIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp index 8de4ced549..b4697ad122 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -71,6 +71,8 @@ void PairLJCharmmCoulLongIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp index 8ad1823d97..929ac2123f 100644 --- a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp @@ -72,6 +72,8 @@ void PairLJCutCoulLongIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_lj_cut_intel.cpp b/src/USER-INTEL/pair_lj_cut_intel.cpp index 74dae7e096..39db9c7333 100644 --- a/src/USER-INTEL/pair_lj_cut_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_intel.cpp @@ -63,6 +63,8 @@ void PairLJCutIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag, vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_rebo_intel.cpp b/src/USER-INTEL/pair_rebo_intel.cpp index 3decc0154b..b7cc3d1c71 100644 --- a/src/USER-INTEL/pair_rebo_intel.cpp +++ b/src/USER-INTEL/pair_rebo_intel.cpp @@ -28,7 +28,7 @@ PairREBOIntel::PairREBOIntel(LAMMPS *lmp) : PairAIREBOIntel(lmp) {} global settings ------------------------------------------------------------------------- */ -void PairREBOIntel::settings(int narg, char **/*arg*/) +void PairREBOIntel::settings(int narg, char ** /* arg */) { if (narg != 0) error->all(FLERR,"Illegal pair_style command"); diff --git a/src/USER-INTEL/pair_sw_intel.cpp b/src/USER-INTEL/pair_sw_intel.cpp index 8482895fb6..1955cd2e6d 100644 --- a/src/USER-INTEL/pair_sw_intel.cpp +++ b/src/USER-INTEL/pair_sw_intel.cpp @@ -96,6 +96,8 @@ void PairSWIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag, vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/USER-INTEL/pair_tersoff_intel.cpp b/src/USER-INTEL/pair_tersoff_intel.cpp index 668cb0cf33..76d06b02dd 100644 --- a/src/USER-INTEL/pair_tersoff_intel.cpp +++ b/src/USER-INTEL/pair_tersoff_intel.cpp @@ -108,6 +108,8 @@ void PairTersoffIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); const int inum = list->inum; const int nthreads = comm->nthreads; From 16f66dc5617c2cc37350caeea6a74a85620f8509 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 12:38:41 -0400 Subject: [PATCH 181/243] error out when per-atom stress is requested for bonded interactions with USER-INTEL --- src/USER-INTEL/angle_charmm_intel.cpp | 2 ++ src/USER-INTEL/angle_harmonic_intel.cpp | 2 ++ src/USER-INTEL/bond_fene_intel.cpp | 2 ++ src/USER-INTEL/bond_harmonic_intel.cpp | 2 ++ src/USER-INTEL/dihedral_charmm_intel.cpp | 2 ++ src/USER-INTEL/dihedral_fourier_intel.cpp | 2 ++ src/USER-INTEL/dihedral_harmonic_intel.cpp | 2 ++ src/USER-INTEL/dihedral_opls_intel.cpp | 2 ++ src/USER-INTEL/improper_cvff_intel.cpp | 2 ++ src/USER-INTEL/improper_harmonic_intel.cpp | 2 ++ 10 files changed, 20 insertions(+) diff --git a/src/USER-INTEL/angle_charmm_intel.cpp b/src/USER-INTEL/angle_charmm_intel.cpp index c5ada951a5..43de50e7fa 100644 --- a/src/USER-INTEL/angle_charmm_intel.cpp +++ b/src/USER-INTEL/angle_charmm_intel.cpp @@ -79,6 +79,8 @@ void AngleCharmmIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/angle_harmonic_intel.cpp b/src/USER-INTEL/angle_harmonic_intel.cpp index aae6fcf0a2..d073e7bc56 100644 --- a/src/USER-INTEL/angle_harmonic_intel.cpp +++ b/src/USER-INTEL/angle_harmonic_intel.cpp @@ -79,6 +79,8 @@ void AngleHarmonicIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/bond_fene_intel.cpp b/src/USER-INTEL/bond_fene_intel.cpp index bd8bc94c18..6578706a9b 100644 --- a/src/USER-INTEL/bond_fene_intel.cpp +++ b/src/USER-INTEL/bond_fene_intel.cpp @@ -75,6 +75,8 @@ void BondFENEIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/bond_harmonic_intel.cpp b/src/USER-INTEL/bond_harmonic_intel.cpp index 4424b868eb..55dda9fa15 100644 --- a/src/USER-INTEL/bond_harmonic_intel.cpp +++ b/src/USER-INTEL/bond_harmonic_intel.cpp @@ -75,6 +75,8 @@ void BondHarmonicIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/dihedral_charmm_intel.cpp b/src/USER-INTEL/dihedral_charmm_intel.cpp index 4f4b091300..2ea4eb6d21 100644 --- a/src/USER-INTEL/dihedral_charmm_intel.cpp +++ b/src/USER-INTEL/dihedral_charmm_intel.cpp @@ -85,6 +85,8 @@ void DihedralCharmmIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); // insure pair->ev_tally() will use 1-4 virial contribution diff --git a/src/USER-INTEL/dihedral_fourier_intel.cpp b/src/USER-INTEL/dihedral_fourier_intel.cpp index 030d371e44..8c4a2ce921 100644 --- a/src/USER-INTEL/dihedral_fourier_intel.cpp +++ b/src/USER-INTEL/dihedral_fourier_intel.cpp @@ -74,6 +74,8 @@ void DihedralFourierIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/dihedral_harmonic_intel.cpp b/src/USER-INTEL/dihedral_harmonic_intel.cpp index d84db4f4ac..60655f2618 100644 --- a/src/USER-INTEL/dihedral_harmonic_intel.cpp +++ b/src/USER-INTEL/dihedral_harmonic_intel.cpp @@ -74,6 +74,8 @@ void DihedralHarmonicIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/dihedral_opls_intel.cpp b/src/USER-INTEL/dihedral_opls_intel.cpp index eae796974b..5b580cd7d9 100644 --- a/src/USER-INTEL/dihedral_opls_intel.cpp +++ b/src/USER-INTEL/dihedral_opls_intel.cpp @@ -78,6 +78,8 @@ void DihedralOPLSIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/improper_cvff_intel.cpp b/src/USER-INTEL/improper_cvff_intel.cpp index de316250c0..f198e47d5c 100644 --- a/src/USER-INTEL/improper_cvff_intel.cpp +++ b/src/USER-INTEL/improper_cvff_intel.cpp @@ -84,6 +84,8 @@ void ImproperCvffIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { diff --git a/src/USER-INTEL/improper_harmonic_intel.cpp b/src/USER-INTEL/improper_harmonic_intel.cpp index 846c3cfbf9..d638e6a66e 100644 --- a/src/USER-INTEL/improper_harmonic_intel.cpp +++ b/src/USER-INTEL/improper_harmonic_intel.cpp @@ -85,6 +85,8 @@ void ImproperHarmonicIntel::compute(int eflag, int vflag, const ForceConst &fc) { ev_init(eflag,vflag); + if (vflag_atom) + error->all(FLERR,"USER-INTEL package does not support per-atom stress"); if (evflag) { if (vflag && !eflag) { From eab939af23efbfc2cbefaeeea54db53233cf89bd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 12:47:06 -0400 Subject: [PATCH 182/243] add a note about the lack of stress/atom in USER-INTEL to the manual --- doc/src/Speed_intel.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/src/Speed_intel.txt b/doc/src/Speed_intel.txt index da772f29fd..dc38cb0956 100644 --- a/doc/src/Speed_intel.txt +++ b/doc/src/Speed_intel.txt @@ -34,6 +34,10 @@ rebo, sw, tersoff :l K-Space Styles: pppm, pppm/disp :l :ule +IMPORTANT NOTE: None of the styles in the USER-INTEL package currently +support computing per-atom stress. If any compute or fix in your +input requires it, LAMMPS will abort with an error message. + [Speed-ups to expect:] The speedups will depend on your simulation, the hardware, which From 4aff7191e7888d2d3f504959ccf50ac14f2c33fd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 13:02:14 -0400 Subject: [PATCH 183/243] small whitespace cleanup --- src/fix_ave_histo.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index d60fe7af14..87da5222f0 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -46,9 +46,9 @@ enum{IGNORE,END,EXTRA}; FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - nvalues(0), which(NULL), argindex(NULL), value2index(NULL), + nvalues(0), which(NULL), argindex(NULL), value2index(NULL), ids(NULL), fp(NULL), stats_list(NULL), - bin(NULL), bin_total(NULL), bin_all(NULL), bin_list(NULL), + bin(NULL), bin_total(NULL), bin_all(NULL), bin_list(NULL), coord(NULL), vector(NULL) { if (narg < 10) error->all(FLERR,"Illegal fix ave/histo command"); @@ -232,7 +232,7 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : } else if (which[i] == VARIABLE) { int ivariable = input->variable->find(ids[i]); - if (ivariable < 0) + if (ivariable < 0) error->all(FLERR,"Fix ave/histo input is invalid variable"); // variables only produce one kind of output if (input->variable->equalstyle(ivariable)) kindglobal = 1; @@ -247,13 +247,13 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (kindperatom) kind = PERATOM; if (kindlocal) kind = LOCAL; } else if (kind == GLOBAL) { - if (!kindglobal) + if (!kindglobal) error->all(FLERR,"Fix ave/histo input kind is invalid"); } else if (kind == PERATOM) { - if (!kindperatom) + if (!kindperatom) error->all(FLERR,"Fix ave/histo input kind is invalid"); } else if (kind == LOCAL) { - if (!kindlocal) + if (!kindlocal) error->all(FLERR,"Fix ave/histo input kind is invalid"); } } From 30bca9f91ec6fc6f5c9478369b62bbc5af1e41dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 16:20:19 -0400 Subject: [PATCH 184/243] force loading of Sphinx version 1.7.6 instead of 2.0.0 or later, so the spellchecker keeps working --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 5c679440b8..fa60aa3698 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -211,7 +211,7 @@ $(VENV): @( \ $(VIRTUALENV) -p $(PYTHON) $(VENV); \ . $(VENV)/bin/activate; \ - pip install Sphinx; \ + pip install Sphinx==1.7.6; \ deactivate;\ ) From 088a6721967a37678542afd349a1fc0247246386 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 16:20:57 -0400 Subject: [PATCH 185/243] replace (evil) tabs with (nice) spaces --- src/special.cpp | 304 ++++++++++++++++++++++++------------------------ 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/src/special.cpp b/src/special.cpp index 22022519a2..62bc195b65 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -822,20 +822,20 @@ void Special::angle_trim() int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; - m = atom->map(angle_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(angle_atom3[i][j]); - if (m < 0 || m >= nlocal) nsend++; + if (tag[i] != angle_atom2[i][j]) continue; + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; } for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom3[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) nsend++; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } @@ -853,51 +853,51 @@ void Special::angle_trim() nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; + if (tag[i] != angle_atom2[i][j]) continue; - m = atom->map(angle_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = angle_atom1[i][j] % nprocs; - inbuf[nsend].atomID = angle_atom1[i][j]; - inbuf[nsend].partnerID = angle_atom3[i][j]; - nsend++; - } + m = atom->map(angle_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom1[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom1[i][j]; + inbuf[nsend].partnerID = angle_atom3[i][j]; + nsend++; + } - m = atom->map(angle_atom3[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = angle_atom3[i][j] % nprocs; - inbuf[nsend].atomID = angle_atom3[i][j]; - inbuf[nsend].partnerID = angle_atom1[i][j]; - nsend++; - } + m = atom->map(angle_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = angle_atom3[i][j] % nprocs; + inbuf[nsend].atomID = angle_atom3[i][j]; + inbuf[nsend].partnerID = angle_atom1[i][j]; + nsend++; + } } for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom1[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom1[i][j]; - inbuf[nsend].partnerID = dihedral_atom3[i][j]; - nsend++; - } + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom3[i][j]; + nsend++; + } - m = atom->map(dihedral_atom3[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom3[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom3[i][j]; - inbuf[nsend].partnerID = dihedral_atom1[i][j]; - nsend++; - } + m = atom->map(dihedral_atom3[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom3[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom3[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom4[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom4[i][j]; - inbuf[nsend].partnerID = dihedral_atom2[i][j]; - nsend++; - } + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom2[i][j]; + nsend++; + } } } @@ -925,7 +925,7 @@ void Special::angle_trim() for (i = 0; i < nlocal; i++) for (j = 0; j < nspecial[i][1]; j++) - flag[i][j] = 0; + flag[i][j] = 0; // reset nspecial[1] and onethree for all owned atoms based on output info // based on owned info plus rendezvous output info @@ -933,68 +933,68 @@ void Special::angle_trim() for (i = 0; i < nlocal; i++) { for (j = 0; j < num_angle[i]; j++) { - if (tag[i] != angle_atom2[i][j]) continue; + if (tag[i] != angle_atom2[i][j]) continue; - m = atom->map(angle_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == angle_atom3[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(angle_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } - m = atom->map(angle_atom3[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == angle_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(angle_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == angle_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } } for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom3[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom3[i][j]) { + flag[m][k] = 1; + break; + } + } - m = atom->map(dihedral_atom3[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(dihedral_atom3[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } - m = atom->map(dihedral_atom4[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][1]; k++) - if (onethree[m][k] == dihedral_atom2[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][1]; k++) + if (onethree[m][k] == dihedral_atom2[i][j]) { + flag[m][k] = 1; + break; + } + } } } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); for (k = 0; k < nspecial[i][1]; k++) - if (onethree[i][k] == outbuf[m].partnerID) { - flag[i][k] = 1; - break; - } + if (onethree[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } - + memory->destroy(outbuf); // use flag values to compress onefour list for each atom @@ -1002,11 +1002,11 @@ void Special::angle_trim() for (i = 0; i < nlocal; i++) { j = 0; while (j < nspecial[i][1]) { - if (flag[i][j] == 0) { - onethree[i][j] = onethree[i][nspecial[i][1]-1]; - flag[i][j] = flag[i][nspecial[i][1]-1]; - nspecial[i][1]--; - } else j++; + if (flag[i][j] == 0) { + onethree[i][j] = onethree[i][nspecial[i][1]-1]; + flag[i][j] = flag[i][nspecial[i][1]-1]; + nspecial[i][1]--; + } else j++; } } @@ -1077,11 +1077,11 @@ void Special::dihedral_trim() int nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) nsend++; - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) nsend++; + if (tag[i] != dihedral_atom2[i][j]) continue; + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) nsend++; + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) nsend++; } } @@ -1100,23 +1100,23 @@ void Special::dihedral_trim() nsend = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom1[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom1[i][j]; - inbuf[nsend].partnerID = dihedral_atom4[i][j]; - nsend++; - } + m = atom->map(dihedral_atom1[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom1[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom1[i][j]; + inbuf[nsend].partnerID = dihedral_atom4[i][j]; + nsend++; + } - m = atom->map(dihedral_atom4[i][j]); - if (m < 0 || m >= nlocal) { - proclist[nsend] = dihedral_atom4[i][j] % nprocs; - inbuf[nsend].atomID = dihedral_atom4[i][j]; - inbuf[nsend].partnerID = dihedral_atom1[i][j]; - nsend++; - } + m = atom->map(dihedral_atom4[i][j]); + if (m < 0 || m >= nlocal) { + proclist[nsend] = dihedral_atom4[i][j] % nprocs; + inbuf[nsend].atomID = dihedral_atom4[i][j]; + inbuf[nsend].partnerID = dihedral_atom1[i][j]; + nsend++; + } } } @@ -1144,39 +1144,39 @@ void Special::dihedral_trim() for (i = 0; i < nlocal; i++) for (j = 0; j < nspecial[i][2]; j++) - flag[i][j] = 0; + flag[i][j] = 0; for (i = 0; i < nlocal; i++) { for (j = 0; j < num_dihedral[i]; j++) { - if (tag[i] != dihedral_atom2[i][j]) continue; + if (tag[i] != dihedral_atom2[i][j]) continue; - m = atom->map(dihedral_atom1[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][2]; k++) - if (onefour[m][k] == dihedral_atom4[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(dihedral_atom1[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom4[i][j]) { + flag[m][k] = 1; + break; + } + } - m = atom->map(dihedral_atom4[i][j]); - if (m >= 0 && m < nlocal) { - for (k = 0; k < nspecial[m][2]; k++) - if (onefour[m][k] == dihedral_atom1[i][j]) { - flag[m][k] = 1; - break; - } - } + m = atom->map(dihedral_atom4[i][j]); + if (m >= 0 && m < nlocal) { + for (k = 0; k < nspecial[m][2]; k++) + if (onefour[m][k] == dihedral_atom1[i][j]) { + flag[m][k] = 1; + break; + } + } } } for (m = 0; m < nreturn; m++) { i = atom->map(outbuf[m].atomID); for (k = 0; k < nspecial[i][2]; k++) - if (onefour[i][k] == outbuf[m].partnerID) { - flag[i][k] = 1; - break; - } + if (onefour[i][k] == outbuf[m].partnerID) { + flag[i][k] = 1; + break; + } } memory->destroy(outbuf); @@ -1186,11 +1186,11 @@ void Special::dihedral_trim() for (i = 0; i < nlocal; i++) { j = 0; while (j < nspecial[i][2]) { - if (flag[i][j] == 0) { - onefour[i][j] = onefour[i][nspecial[i][2]-1]; - flag[i][j] = flag[i][nspecial[i][2]-1]; - nspecial[i][2]--; - } else j++; + if (flag[i][j] == 0) { + onefour[i][j] = onefour[i][nspecial[i][2]-1]; + flag[i][j] = flag[i][nspecial[i][2]-1]; + nspecial[i][2]--; + } else j++; } } @@ -1225,8 +1225,8 @@ void Special::dihedral_trim() ------------------------------------------------------------------------- */ int Special::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) + int &flag, int *&proclist, char *&outbuf, + void *ptr) { Special *sptr = (Special *) ptr; Memory *memory = sptr->memory; @@ -1255,7 +1255,7 @@ int Special::rendezvous_ids(int n, char *inbuf, flag = 0; return 0; } - + /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition From 9d0e518cc59efddc9122f0a5a1ff29dbf7b7fd18 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 28 Mar 2019 15:35:22 -0500 Subject: [PATCH 186/243] Updates for kim-api-2.0.2 release --- cmake/CMakeLists.txt | 26 +++++++++---------- ...dKIM-API-V2.cmake => FindKIM-API.cmake.in} | 22 ++++++++-------- doc/src/Build_extras.txt | 2 +- lib/kim/Install.py | 6 ++--- lib/kim/Makefile.lammps | 8 +++--- lib/kim/README | 20 +++++++------- 6 files changed, 42 insertions(+), 42 deletions(-) rename cmake/Modules/{FindKIM-API-V2.cmake => FindKIM-API.cmake.in} (61%) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 9b3125f04b..c003901199 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -207,7 +207,7 @@ include_directories(${LAMMPS_SOURCE_DIR}) if(PKG_USER-ADIOS) # The search for ADIOS2 must come before MPI because # it includes its own MPI search with the latest FindMPI.cmake - # script that defines the MPI::MPI_C target + # script that defines the MPI::MPI_C target enable_language(C) find_package(ADIOS2 REQUIRED) list(APPEND LAMMPS_LINK_LIBS adios2::adios2) @@ -663,19 +663,19 @@ endif() if(PKG_KIM) find_package(CURL) if(CURL_FOUND) - include_directories(${CURL_INCLUDE_DIRS}) + include_directories(${CURL_INCLUDE_DIRS}) list(APPEND LAMMPS_LINK_LIBS ${CURL_LIBRARIES}) add_definitions(-DLMP_KIM_CURL) endif() - option(DOWNLOAD_KIM "Download KIM-API v2 from OpenKIM instead of using an already installed one" OFF) + option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" OFF) if(DOWNLOAD_KIM) - message(STATUS "KIM-API v2 download requested - we will build our own") + message(STATUS "KIM-API download requested - we will build our own") enable_language(C) enable_language(Fortran) include(ExternalProject) ExternalProject_Add(kim_build - URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.1.txz - URL_MD5 289c57f0c3bc2a549662283cac1c4ef1 + URL https://s3.openkim.org/kim-api/kim-api-2.0.2.txz + URL_MD5 537d9c0abd30f85b875ebb584f9143fa BINARY_DIR build CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} @@ -684,17 +684,17 @@ if(PKG_KIM) -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} ) ExternalProject_get_property(kim_build INSTALL_DIR) - set(KIM-API-V2_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) - set(KIM-API-V2_LDFLAGS ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libkim-api-v2${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(KIM-API_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api) + set(KIM-API_LDFLAGS ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libkim-api${CMAKE_SHARED_LIBRARY_SUFFIX}) list(APPEND LAMMPS_DEPS kim_build) else() - find_package(KIM-API-V2) - if(NOT KIM-API-V2_FOUND) - message(FATAL_ERROR "KIM-API v2 not found, help CMake to find it by setting PKG_CONFIG_PATH, or set DOWNLOAD_KIM=ON to download it") + find_package(KIM-API) + if(NOT KIM-API_FOUND) + message(FATAL_ERROR "KIM-API not found, help CMake to find it by setting PKG_CONFIG_PATH, or set DOWNLOAD_KIM=ON to download it") endif() endif() - list(APPEND LAMMPS_LINK_LIBS "${KIM-API-V2_LDFLAGS}") - include_directories(${KIM-API-V2_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS "${KIM-API_LDFLAGS}") + include_directories(${KIM-API_INCLUDE_DIRS}) endif() if(PKG_MESSAGE) diff --git a/cmake/Modules/FindKIM-API-V2.cmake b/cmake/Modules/FindKIM-API.cmake.in similarity index 61% rename from cmake/Modules/FindKIM-API-V2.cmake rename to cmake/Modules/FindKIM-API.cmake.in index 6ca6e068df..d9397b9aba 100644 --- a/cmake/Modules/FindKIM-API-V2.cmake +++ b/cmake/Modules/FindKIM-API.cmake.in @@ -19,7 +19,7 @@ # # -# Copyright (c) 2013--2018, Regents of the University of Minnesota. +# Copyright (c) 2013--2019, Regents of the University of Minnesota. # All rights reserved. # # Contributors: @@ -28,23 +28,23 @@ # Ryan S. Elliott # -# - Find KIM-API-V2 +# - Find KIM-API # # sets standard pkg_check_modules variables plus: # -# KIM-API-V2-CMAKE_C_COMPILER -# KIM-API-V2-CMAKE_CXX_COMPILER -# KIM-API-V2-CMAKE_Fortran_COMPILER +# KIM-API-CMAKE_C_COMPILER +# KIM-API-CMAKE_CXX_COMPILER +# KIM-API-CMAKE_Fortran_COMPILER # find_package(PkgConfig REQUIRED) include(FindPackageHandleStandardArgs) -pkg_check_modules(KIM-API-V2 REQUIRED libkim-api-v2>=2.0) +pkg_check_modules(KIM-API REQUIRED libkim-api>=2.0) -pkg_get_variable(KIM-API-V2-CMAKE_C_COMPILER libkim-api-v2 CMAKE_C_COMPILER) -pkg_get_variable(KIM-API-V2-CMAKE_CXX_COMPILER libkim-api-v2 CMAKE_CXX_COMPILER) -pkg_get_variable(KIM-API-V2_CMAKE_Fortran_COMPILER libkim-api-v2 CMAKE_Fortran_COMPILER) +pkg_get_variable(KIM-API-V2-CMAKE_C_COMPILER libkim-api CMAKE_C_COMPILER) +pkg_get_variable(KIM-API-V2-CMAKE_CXX_COMPILER libkim-api CMAKE_CXX_COMPILER) +pkg_get_variable(KIM-API-V2_CMAKE_Fortran_COMPILER libkim-api CMAKE_Fortran_COMPILER) -# handle the QUIETLY and REQUIRED arguments and set KIM-API-V2_FOUND to TRUE +# handle the QUIETLY and REQUIRED arguments and set KIM-API_FOUND to TRUE # if all listed variables are TRUE -find_package_handle_standard_args(KIM-API-V2 REQUIRED_VARS KIM-API-V2_LIBRARIES) +find_package_handle_standard_args(KIM-API REQUIRED_VARS KIM-API_LIBRARIES) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 65a05c267e..f4111c51f2 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -195,7 +195,7 @@ https://openkim.org/browse/models/by-model-drivers If DOWNLOAD_KIM is set, the KIM library will be downloaded and built inside the CMake build directory. If the KIM library is already on your system (in a location CMake cannot find it), set the PKG_CONFIG_PATH -environment variable so that libkim-api-v2 can be found. +environment variable so that libkim-api can be found. [Traditional make]: diff --git a/lib/kim/Install.py b/lib/kim/Install.py index dfb6bc53dc..c3588241c4 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -18,7 +18,7 @@ parser = ArgumentParser(prog='Install.py', # settings thisdir = fullpath('.') -version = "kim-api-v2-2.0.1" +version = "kim-api-2.0.2" # help message @@ -154,7 +154,7 @@ if buildflag: # add all OpenKIM models, if desired if everythingflag: print("Adding all OpenKIM models, this will take a while ...") - cmd = '%s/bin/kim-api-v2-collections-management install system OpenKIM' % (kimdir) + cmd = '%s/bin/kim-api-collections-management install system OpenKIM' % (kimdir) txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) if verboseflag: print(txt.decode("UTF-8")) @@ -171,7 +171,7 @@ if addflag: sys.exit("\nkim-api is not installed") # download single model - cmd = '%s/bin/kim-api-v2-collections-management install system %s' % (kimdir.decode("UTF-8"), addmodelname) + cmd = '%s/bin/kim-api-collections-management install system %s' % (kimdir.decode("UTF-8"), addmodelname) txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) if verboseflag: print(txt.decode("UTF-8")) diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps index 492b9ddfc6..d4e10b0fb4 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -23,11 +23,11 @@ kim_PREFIX := $(if $(shell printf -- "$${PKG_CONFIG_PATH}"),$(kim_PREFIX):$(she # there is no usable libcurl installation ifeq ($(shell curl-config --version 2> /dev/null),) -kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api-v2 2> /dev/null) -kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api-v2 2> /dev/null) +kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api 2> /dev/null) +kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api 2> /dev/null) else -kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api-v2 2> /dev/null) $(shell curl-config --cflags) -DLMP_KIM_CURL -kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api-v2 2> /dev/null) $(shell curl-config --libs) +kim_SYSINC := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --cflags libkim-api 2> /dev/null) $(shell curl-config --cflags) -DLMP_KIM_CURL +kim_SYSLIB := $(shell export PKG_CONFIG_PATH="$(kim_PREFIX)"; pkg-config --libs libkim-api 2> /dev/null) $(shell curl-config --libs) endif ifeq ($(strip $(kim_SYSINC)),) diff --git a/lib/kim/README b/lib/kim/README index 493758561d..d3327537b6 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -17,7 +17,7 @@ As of KIM API version 2, the KIM package also provides a LAMMPS command to perform queries through the OpenKIM web API. This feature requires that the CURL library (libcurl) development package and its configuration query tool, curl-config, are installed. The provided Makefile.lammps -is set up to automatically detect this. +is set up to automatically detect this. ----------------- @@ -26,17 +26,17 @@ Instructions: 1. Configure lammps for use with the kim-api library installed in this directory # replace X.Y.Z as appropriate here and below -$ printf "${PWD}/installed-kim-api-vX-X.Y.Z" > ./kim-prefix.txt +$ printf "${PWD}/installed-kim-api-X-X.Y.Z" > ./kim-prefix.txt 2. Download and unpack the kim-api -$ wget http://s3.openkim.org/kim-api/kim-api-vX-X.Y.Z.txz -$ tar zxvf kim-api-vX-X.Y.Z.txz +$ wget http://s3.openkim.org/kim-api/kim-api-X.Y.Z.txz +$ tar zxvf kim-api-X.Y.Z.txz # configure the kim-api -$ cd kim-api-vX-X.Y.Z +$ cd kim-api-X.Y.Z $ mkdir build && cd build -$ cmake .. -DCMAKE_INSTALL_PREFIX=${PWD}/../../installed-kim-api-vX-X.Y.Z +$ cmake .. -DCMAKE_INSTALL_PREFIX=${PWD}/../../installed-kim-api-X.Y.Z 3. Build and install the kim-api and model @@ -46,14 +46,14 @@ $ make install 4. Remove source and build files $ cd ../../ -$ rm -rf kim-api-vX-X.Y.Z -$ rm -rf kim-api-vX-X.Y.Z.txz +$ rm -rf kim-api-X.Y.Z +$ rm -rf kim-api-X.Y.Z.txz 5. To add items do the following (replace the kim item name with your desired value) -$ source ${PWD}/kim-api-vX-X.Y.Z/bin/kim-api-vX-activate -$ kim-api-vX-collections-management install system Pair_Johnson_Fe__MO_857282754307_002 +$ source ${PWD}/kim-api-X.Y.Z/bin/kim-api-activate +$ kim-api-collections-management install system Pair_Johnson_Fe__MO_857282754307_002 ----------------- From 747ddf2642a328dea4589e7e5c9a11c3effa496d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 17:15:05 -0400 Subject: [PATCH 187/243] expose -DCUDA_PROXY define to CMake so that the GPU package can be used with nvidia MPS proxy server --- cmake/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 9b3125f04b..9bed8ea5e8 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1168,6 +1168,10 @@ if(PKG_GPU) message(FATAL_ERROR "Could not find bin2c, use -DBIN2C=/path/to/bin2c to help cmake finding it.") endif() option(CUDPP_OPT "Enable CUDPP_OPT" ON) + option(CUDA_MPS_SUPPORT "Enable tweaks to support CUDA Multi-process service (MPS)" OFF) + if(CUDA_MPS_SUPPORT) + set(GPU_CUDA_MPS_FLAGS "-DCUDA_PROXY") + endif() set(GPU_ARCH "sm_30" CACHE STRING "LAMMPS GPU CUDA SM primary architecture (e.g. sm_60)") @@ -1231,7 +1235,7 @@ if(PKG_GPU) add_library(gpu STATIC ${GPU_LIB_SOURCES} ${GPU_LIB_CUDPP_SOURCES} ${GPU_OBJS}) target_link_libraries(gpu ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY}) target_include_directories(gpu PRIVATE ${LAMMPS_LIB_BINARY_DIR}/gpu ${CUDA_INCLUDE_DIRS}) - target_compile_definitions(gpu PRIVATE -D_${GPU_PREC_SETTING} -DMPI_GERYON -DUCL_NO_EXIT) + target_compile_definitions(gpu PRIVATE -D_${GPU_PREC_SETTING} -DMPI_GERYON -DUCL_NO_EXIT ${GPU_CUDA_MPS_FLAGS}) if(CUDPP_OPT) target_include_directories(gpu PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini) target_compile_definitions(gpu PRIVATE -DUSE_CUDPP) From 1bf5047c7af36f366b1a884a9d7d83bda1f7cfe8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Mar 2019 18:03:54 -0400 Subject: [PATCH 188/243] document new CUDA_MPS_SUPPORT option in CMake --- cmake/README.md | 10 ++++++++++ doc/src/Build_extras.txt | 24 +++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/cmake/README.md b/cmake/README.md index ce3b4502af..1c37ecc92e 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -1503,6 +1503,16 @@ target API. + + CUDA_MPS_SUPPORT (CUDA only) + Enable tweaks for running with Nvidia CUDA Multi-process services daemon + +

+
on
+
off (default)
+
+ + BIN2C (CUDA only) Path to bin2c executable, will automatically pick up the first one in your $PATH. diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 65a05c267e..1fd6c320ce 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -82,17 +82,19 @@ which GPU hardware to build for. [CMake build]: --D GPU_API=value # value = opencl (default) or cuda --D GPU_PREC=value # precision setting - # value = double or mixed (default) or single --D OCL_TUNE=value # hardware choice for GPU_API=opencl - # generic (default) or intel (Intel CPU) or fermi, kepler, cypress (NVIDIA) --D GPU_ARCH=value # primary GPU hardware choice for GPU_API=cuda - # value = sm_XX, see below - # default is Cuda-compiler dependent, but typically sm_20 --D CUDPP_OPT=value # optimization setting for GPU_API=cuda - # enables CUDA Performance Primitives Optimizations - # yes (default) or no :pre +-D GPU_API=value # value = opencl (default) or cuda +-D GPU_PREC=value # precision setting + # value = double or mixed (default) or single +-D OCL_TUNE=value # hardware choice for GPU_API=opencl + # generic (default) or intel (Intel CPU) or fermi, kepler, cypress (NVIDIA) +-D GPU_ARCH=value # primary GPU hardware choice for GPU_API=cuda + # value = sm_XX, see below + # default is Cuda-compiler dependent, but typically sm_20 +-D CUDPP_OPT=value # optimization setting for GPU_API=cuda + # enables CUDA Performance Primitives Optimizations + # value = yes (default) or no +-D CUDA_MPS_SUPPORT=value # enables some tweaks required to run with active nvidia-cuda-mps daemon + # value = yes or no (default) GPU_ARCH settings for different GPU hardware is as follows: From 6a60dad2c3333312f6c8b428b5756b588549a348 Mon Sep 17 00:00:00 2001 From: Vishal Boddu Date: Fri, 29 Mar 2019 10:02:15 +0100 Subject: [PATCH 189/243] Set Coulomb summation cutoff radii in the case it is explicitly specified. --- src/pair_lj_cut_coul_wolf.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp index 2f796ded12..55aff0d7c5 100644 --- a/src/pair_lj_cut_coul_wolf.cpp +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -217,7 +217,8 @@ void PairLJCutCoulWolf::settings(int narg, char **arg) alf = force->numeric(FLERR,arg[0]); cut_lj_global = force->numeric(FLERR,arg[1]); - if (narg == 2) cut_coul = cut_lj_global; + if (narg == 3) cut_coul = force->numeric(FLERR,arg[2]); + else cut_coul = cut_lj_global; if (allocated) { int i,j; From 13255d63386369babeb7229527b87f21dd769778 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Mar 2019 09:20:33 -0400 Subject: [PATCH 190/243] step version to 29 March 2019 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 126ba7f3e6..e36e4063c9 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@ :line LAMMPS Documentation :c,h1 -28 Mar 2019 version :c,h2 +29 Mar 2019 version :c,h2 "What is a LAMMPS version?"_Manual_version.html diff --git a/src/version.h b/src/version.h index 8031f3e787..94fee893cb 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "28 Mar 2019" +#define LAMMPS_VERSION "29 Mar 2019" From ff819be807ff71d92c424e985dd5273d28ff7f0e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Mar 2019 10:21:44 -0400 Subject: [PATCH 191/243] more 'war on tabs' --- src/comm.cpp | 4 +- src/compute_angle_local.cpp | 76 +++++++++++++++---------------- src/compute_bond_local.cpp | 22 ++++----- src/compute_chunk_spread_atom.cpp | 56 +++++++++++------------ src/compute_dihedral_local.cpp | 26 +++++------ src/compute_property_atom.cpp | 2 +- src/compute_property_atom.h | 4 +- src/memory.h | 60 ++++++++++++------------ 8 files changed, 126 insertions(+), 124 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 8389e4993d..30fd7c243e 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -933,7 +933,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, "rendezvous:inbuf"); MPI_Alltoallv(inbuf_a2a,sendcount,sdispls,MPI_CHAR, - inbuf_rvous,recvcount,rdispls,MPI_CHAR,world); + inbuf_rvous,recvcount,rdispls,MPI_CHAR,world); if (!inorder) { memory->destroy(procs_a2a); @@ -1036,7 +1036,7 @@ rendezvous_all2all(int n, char *inbuf, int insize, int inorder, int *procs, outbuf = (char *) memory->smalloc((bigint) nout*outsize,"rendezvous:outbuf"); MPI_Alltoallv(outbuf_a2a,sendcount,sdispls,MPI_CHAR, - outbuf,recvcount,rdispls,MPI_CHAR,world); + outbuf,recvcount,rdispls,MPI_CHAR,world); memory->destroy(procs_rvous); memory->sfree(outbuf_rvous); diff --git a/src/compute_angle_local.cpp b/src/compute_angle_local.cpp index 641784fe03..8f0606329f 100644 --- a/src/compute_angle_local.cpp +++ b/src/compute_angle_local.cpp @@ -88,7 +88,7 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : int n = strlen(arg[iarg+2]) + 1; tstr = new char[n]; strcpy(tstr,arg[iarg+2]); - tflag = 1; + tflag = 1; } else error->all(FLERR,"Illegal compute angle/local command"); iarg += 3; } else error->all(FLERR,"Illegal compute angle/local command"); @@ -102,9 +102,9 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR,"Variable name for copute angle/local does not exist"); + error->all(FLERR,"Variable name for copute angle/local does not exist"); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable for compute angle/local is invalid style"); + error->all(FLERR,"Variable for compute angle/local is invalid style"); } if (tstr) { @@ -153,7 +153,7 @@ void ComputeAngleLocal::init() for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR,"Variable name for compute angle/local does not exist"); + error->all(FLERR,"Variable name for compute angle/local does not exist"); } if (tstr) { @@ -261,53 +261,53 @@ int ComputeAngleLocal::compute_angles(int flag) // theta needed by one or more outputs if (tflag) { - delx1 = x[atom1][0] - x[atom2][0]; - dely1 = x[atom1][1] - x[atom2][1]; - delz1 = x[atom1][2] - x[atom2][2]; - domain->minimum_image(delx1,dely1,delz1); + delx1 = x[atom1][0] - x[atom2][0]; + dely1 = x[atom1][1] - x[atom2][1]; + delz1 = x[atom1][2] - x[atom2][2]; + domain->minimum_image(delx1,dely1,delz1); - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; - r1 = sqrt(rsq1); - - delx2 = x[atom3][0] - x[atom2][0]; - dely2 = x[atom3][1] - x[atom2][1]; - delz2 = x[atom3][2] - x[atom2][2]; - domain->minimum_image(delx2,dely2,delz2); + rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + r1 = sqrt(rsq1); + + delx2 = x[atom3][0] - x[atom2][0]; + dely2 = x[atom3][1] - x[atom2][1]; + delz2 = x[atom3][2] - x[atom2][2]; + domain->minimum_image(delx2,dely2,delz2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - r2 = sqrt(rsq2); + rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + r2 = sqrt(rsq2); - // c = cosine of angle - // theta = angle in radians + // c = cosine of angle + // theta = angle in radians - c = delx1*delx2 + dely1*dely2 + delz1*delz2; - c /= r1*r2; - if (c > 1.0) c = 1.0; - if (c < -1.0) c = -1.0; - theta = acos(c); + c = delx1*delx2 + dely1*dely2 + delz1*delz2; + c /= r1*r2; + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + theta = acos(c); } if (nvalues == 1) ptr = &vlocal[m]; else ptr = alocal[m]; if (nvar) { - ivar = 0; - if (tstr) input->variable->internal_set(tvar,theta); + ivar = 0; + if (tstr) input->variable->internal_set(tvar,theta); } for (n = 0; n < nvalues; n++) { - switch (bstyle[n]) { - case THETA: - ptr[n] = 180.0*theta/MY_PI; - break; - case ENG: - if (atype > 0) ptr[n] = angle->single(atype,atom1,atom2,atom3); - else ptr[n] = 0.0; - break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; + switch (bstyle[n]) { + case THETA: + ptr[n] = 180.0*theta/MY_PI; + break; + case ENG: + if (atype > 0) ptr[n] = angle->single(atype,atom1,atom2,atom3); + else ptr[n] = 0.0; + break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; } } diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index adbbde1a0c..ccdd3ee77c 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -105,9 +105,9 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR,"Variable name for copute bond/local does not exist"); + error->all(FLERR,"Variable name for copute bond/local does not exist"); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable for compute bond/local is invalid style"); + error->all(FLERR,"Variable for compute bond/local is invalid style"); } if (dstr) { @@ -168,7 +168,7 @@ void ComputeBondLocal::init() for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR,"Variable name for compute bond/local does not exist"); + error->all(FLERR,"Variable name for compute bond/local does not exist"); } if (dstr) { @@ -377,10 +377,10 @@ int ComputeBondLocal::compute_bonds(int flag) if (nvalues == 1) ptr = &vlocal[m]; else ptr = alocal[m]; - if (nvar) { - ivar = 0; - if (dstr) input->variable->internal_set(dvar,sqrt(rsq)); - } + if (nvar) { + ivar = 0; + if (dstr) input->variable->internal_set(dvar,sqrt(rsq)); + } for (n = 0; n < nvalues; n++) { switch (bstyle[n]) { @@ -408,10 +408,10 @@ int ComputeBondLocal::compute_bonds(int flag) case VELVIB: ptr[n] = vvib; break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; } } } diff --git a/src/compute_chunk_spread_atom.cpp b/src/compute_chunk_spread_atom.cpp index 36fad5cca1..3d0cea1add 100644 --- a/src/compute_chunk_spread_atom.cpp +++ b/src/compute_chunk_spread_atom.cpp @@ -71,7 +71,7 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : ids[nvalues] = NULL; if (strncmp(arg[iarg],"c_",2) == 0 || - strncmp(arg[iarg],"f_",2) == 0) { + strncmp(arg[iarg],"f_",2) == 0) { if (arg[iarg][0] == 'c') which[nvalues] = COMPUTE; else if (arg[iarg][0] == 'f') which[nvalues] = FIX; @@ -123,15 +123,15 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : "does not calculate per-chunk values"); if (argindex[i] == 0) { - if (!modify->compute[icompute]->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom compute " + if (!modify->compute[icompute]->vector_flag) + error->all(FLERR,"Compute chunk/spread/atom compute " "does not calculate global vector"); } else { - if (!modify->compute[icompute]->array_flag) - error->all(FLERR,"Compute chunk/spread/atom compute " + if (!modify->compute[icompute]->array_flag) + error->all(FLERR,"Compute chunk/spread/atom compute " "does not calculate global array"); - if (argindex[i] > modify->compute[icompute]->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom compute array " + if (argindex[i] > modify->compute[icompute]->size_array_cols) + error->all(FLERR,"Compute chunk/spread/atom compute array " "is accessed out-of-range"); } @@ -140,15 +140,15 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : if (ifix < 0) error->all(FLERR,"Fix ID for compute chunk/spread/atom does not exist"); if (argindex[i] == 0) { - if (!modify->fix[ifix]->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom fix " + if (!modify->fix[ifix]->vector_flag) + error->all(FLERR,"Compute chunk/spread/atom fix " "does not calculate global vector"); } else { - if (!modify->fix[ifix]->array_flag) - error->all(FLERR,"Compute chunk/spread/atom fix " + if (!modify->fix[ifix]->array_flag) + error->all(FLERR,"Compute chunk/spread/atom fix " "does not calculate global array"); - if (argindex[i] > modify->fix[ifix]->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom fix array " + if (argindex[i] > modify->fix[ifix]->size_array_cols) + error->all(FLERR,"Compute chunk/spread/atom fix array " "is accessed out-of-range"); } } @@ -281,14 +281,14 @@ void ComputeChunkSpreadAtom::compute_peratom() compute->compute_vector(); compute->invoked_flag |= INVOKED_VECTOR; } - double *cvector = compute->vector; - for (i = 0; i < nlocal; i++, ptr += nstride) { - *ptr = 0.0; - if (!(mask[i] & groupbit)) continue; - index = ichunk[i]-1; - if (index < 0 || index >= nchunk) continue; - *ptr = cvector[index]; - } + double *cvector = compute->vector; + for (i = 0; i < nlocal; i++, ptr += nstride) { + *ptr = 0.0; + if (!(mask[i] & groupbit)) continue; + index = ichunk[i]-1; + if (index < 0 || index >= nchunk) continue; + *ptr = cvector[index]; + } } else { if (!(compute->invoked_flag & INVOKED_ARRAY)) { @@ -297,13 +297,13 @@ void ComputeChunkSpreadAtom::compute_peratom() } int icol = argindex[m]-1; double **carray = compute->array; - for (i = 0; i < nlocal; i++, ptr += nstride) { - *ptr = 0.0; - if (!(mask[i] & groupbit)) continue; - index = ichunk[i]-1; - if (index < 0 || index >= nchunk) continue; - *ptr = carray[index][icol]; - } + for (i = 0; i < nlocal; i++, ptr += nstride) { + *ptr = 0.0; + if (!(mask[i] & groupbit)) continue; + index = ichunk[i]-1; + if (index < 0 || index >= nchunk) continue; + *ptr = carray[index][icol]; + } } // access fix data, check if fix frequency is a match diff --git a/src/compute_dihedral_local.cpp b/src/compute_dihedral_local.cpp index 9e18d03f9f..9efdd61cb8 100644 --- a/src/compute_dihedral_local.cpp +++ b/src/compute_dihedral_local.cpp @@ -101,10 +101,10 @@ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR, + error->all(FLERR, "Variable name for copute dihedral/local does not exist"); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable for compute dihedral/local is invalid style"); + error->all(FLERR,"Variable for compute dihedral/local is invalid style"); } if (pstr) { @@ -154,7 +154,7 @@ void ComputeDihedralLocal::init() for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR, + error->all(FLERR, "Variable name for compute dihedral/local does not exist"); } @@ -307,19 +307,19 @@ int ComputeDihedralLocal::compute_dihedrals(int flag) else ptr = alocal[m]; if (nvar) { - ivar = 0; - if (pstr) input->variable->internal_set(pvar,phi); + ivar = 0; + if (pstr) input->variable->internal_set(pvar,phi); } for (n = 0; n < nvalues; n++) { - switch (bstyle[n]) { - case PHI: - ptr[n] = 180.0*phi/MY_PI; - break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; + switch (bstyle[n]) { + case PHI: + ptr[n] = 180.0*phi/MY_PI; + break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; } } diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index 862a66e3f9..0b57840696 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -141,7 +141,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_mu; - } else if (strcmp(arg[iarg],"spx") == 0) { // pack magnetic variables + } else if (strcmp(arg[iarg],"spx") == 0) { // pack magnetic variables if (!atom->sp_flag) error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h index 0c1ed7e305..eb002457fb 100644 --- a/src/compute_property_atom.h +++ b/src/compute_property_atom.h @@ -84,7 +84,9 @@ class ComputePropertyAtom : public Compute { void pack_radius(int); void pack_diameter(int); - void pack_spx(int); // pack magnetic variables + // pack magnetic variables + + void pack_spx(int); void pack_spy(int); void pack_spz(int); void pack_sp(int); diff --git a/src/memory.h b/src/memory.h index df942387fa..b5d70b977f 100644 --- a/src/memory.h +++ b/src/memory.h @@ -443,44 +443,44 @@ class Memory : protected Pointers { template TYPE ****grow(TYPE ****&array, int n1, int n2, int n3, int n4, - const char *name) + const char *name) { - if (array == NULL) return create(array, n1, n2, n3, n4, name); + if (array == NULL) return create(array, n1, n2, n3, n4, name); - bigint nbytes = ((bigint) sizeof(TYPE)) * n1*n2*n3*n4; - TYPE *data = (TYPE *)srealloc(array[0][0][0], nbytes, name); - nbytes = ((bigint) sizeof(TYPE *)) * n1*n2*n3; - TYPE **cube = (TYPE **)srealloc(array[0][0], nbytes, name); - nbytes = ((bigint) sizeof(TYPE **)) * n1*n2; - TYPE ***plane = (TYPE ***)srealloc(array[0], nbytes, name); - nbytes = ((bigint) sizeof(TYPE ***)) * n1; - array = (TYPE ****)srealloc(array, nbytes, name); + bigint nbytes = ((bigint) sizeof(TYPE)) * n1*n2*n3*n4; + TYPE *data = (TYPE *)srealloc(array[0][0][0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE *)) * n1*n2*n3; + TYPE **cube = (TYPE **)srealloc(array[0][0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE **)) * n1*n2; + TYPE ***plane = (TYPE ***)srealloc(array[0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE ***)) * n1; + array = (TYPE ****)srealloc(array, nbytes, name); - int i, j, k; - bigint m1, m2; - bigint n = 0; - for (i = 0; i < n1; i++) { - m2 = ((bigint)i) * n2; - array[i] = &plane[m2]; - for (j = 0; j < n2; j++) { - m1 = ((bigint)i) * n2 + j; - m2 = ((bigint)i) * n2*n3 + j*n3; - plane[m1] = &cube[m2]; - for (k = 0; k < n3; k++) { - m1 = ((bigint)i) * n2*n3 + j*n3 + k; - cube[m1] = &data[n]; - n += n4; - } - } - } - return array; + int i, j, k; + bigint m1, m2; + bigint n = 0; + for (i = 0; i < n1; i++) { + m2 = ((bigint)i) * n2; + array[i] = &plane[m2]; + for (j = 0; j < n2; j++) { + m1 = ((bigint)i) * n2 + j; + m2 = ((bigint)i) * n2*n3 + j*n3; + plane[m1] = &cube[m2]; + for (k = 0; k < n3; k++) { + m1 = ((bigint)i) * n2*n3 + j*n3 + k; + cube[m1] = &data[n]; + n += n4; + } + } + } + return array; } template TYPE *****grow(TYPE *****&array, int n1, int n2, int n3, int n4, - const char *name) + const char *name) { - fail(name); return NULL; + fail(name); return NULL; } /* ---------------------------------------------------------------------- From 75382cf265fce725a3c7ac306adc1220c0d48877 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Mar 2019 10:34:34 -0400 Subject: [PATCH 192/243] update documentation tweaks to run cleanly --- doc/src/Build_extras.txt | 2 +- doc/utils/sphinx-config/false_positives.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 1fd6c320ce..01a63f9d2e 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -94,7 +94,7 @@ which GPU hardware to build for. # enables CUDA Performance Primitives Optimizations # value = yes (default) or no -D CUDA_MPS_SUPPORT=value # enables some tweaks required to run with active nvidia-cuda-mps daemon - # value = yes or no (default) + # value = yes or no (default) :pre GPU_ARCH settings for different GPU hardware is as follows: diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 14f5b89072..d30cfe4129 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1267,6 +1267,7 @@ kcl Kd KDevelop ke +kepler KE Keblinski keflag @@ -1675,6 +1676,7 @@ mpiexec mpiio mpirun mplayer +mps Mryglod mscg MSCG @@ -1958,6 +1960,7 @@ oneway onn ons OO +opencl openKIM OpenMP openmp From ff7f129a5d4342d03e84267a0c01830a8eb76cda Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Mar 2019 11:37:26 -0400 Subject: [PATCH 193/243] remove trailing whitespace --- src/compute_angle_local.cpp | 2 +- src/special.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compute_angle_local.cpp b/src/compute_angle_local.cpp index 8f0606329f..1196211665 100644 --- a/src/compute_angle_local.cpp +++ b/src/compute_angle_local.cpp @@ -268,7 +268,7 @@ int ComputeAngleLocal::compute_angles(int flag) rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; r1 = sqrt(rsq1); - + delx2 = x[atom3][0] - x[atom2][0]; dely2 = x[atom3][1] - x[atom2][1]; delz2 = x[atom3][2] - x[atom2][2]; diff --git a/src/special.cpp b/src/special.cpp index 62bc195b65..ab3764a156 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -994,7 +994,7 @@ void Special::angle_trim() break; } } - + memory->destroy(outbuf); // use flag values to compress onefour list for each atom @@ -1255,7 +1255,7 @@ int Special::rendezvous_ids(int n, char *inbuf, flag = 0; return 0; } - + /* ---------------------------------------------------------------------- process data for atoms assigned to me in rendezvous decomposition From a28ae7c2c0e4d5b179fc7d627f0e5dde8fd9a31f Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 30 Mar 2019 13:56:02 -0500 Subject: [PATCH 194/243] Rename FindKIM-API.cmake.in to FindKIM-API.cmake Fixes: #1396 --- cmake/Modules/{FindKIM-API.cmake.in => FindKIM-API.cmake} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmake/Modules/{FindKIM-API.cmake.in => FindKIM-API.cmake} (100%) diff --git a/cmake/Modules/FindKIM-API.cmake.in b/cmake/Modules/FindKIM-API.cmake similarity index 100% rename from cmake/Modules/FindKIM-API.cmake.in rename to cmake/Modules/FindKIM-API.cmake From 74489621c41f89e96bcdd1be3f8d4829bde904b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 30 Mar 2019 22:35:41 -0400 Subject: [PATCH 195/243] correct misleading indentation to follow syntax --- src/GRANULAR/pair_granular.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 973acbbaf4..ce6cae75e4 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -872,16 +872,16 @@ void PairGranular::coeff(int narg, char **arg) if (iarg + 4 >= narg) error->all(FLERR,"Illegal pair_coeff command, " "not enough parameters provided for twist model"); - twist_model_one = TWIST_SDS; - twist_history = 1; - // kt and gammat and friction coeff - twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); - twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); - twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); - iarg += 5; + twist_model_one = TWIST_SDS; + twist_history = 1; + // kt and gammat and friction coeff + twist_coeffs_one[0] = force->numeric(FLERR,arg[iarg+2]); + twist_coeffs_one[1] = force->numeric(FLERR,arg[iarg+3]); + twist_coeffs_one[2] = force->numeric(FLERR,arg[iarg+4]); + iarg += 5; } else { - error->all(FLERR, "Illegal pair_coeff command, " - "twisting friction model not recognized"); + error->all(FLERR, "Illegal pair_coeff command, " + "twisting friction model not recognized"); } } else if (strcmp(arg[iarg], "cutoff") == 0) { if (iarg + 1 >= narg) From 506535008125ede5a9a549f4dcbd30721a387a8b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 30 Mar 2019 23:19:31 -0400 Subject: [PATCH 196/243] improve kim-query documentation --- doc/src/kim_query.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/src/kim_query.txt b/doc/src/kim_query.txt index be46783d82..c581de0ebb 100644 --- a/doc/src/kim_query.txt +++ b/doc/src/kim_query.txt @@ -26,12 +26,13 @@ kim_query latconst get_test_result test=TE_156715955670 model=MO_800509458712 & The kim_query command allows to retrieve properties from the OpenKIM through a web query. The result is stored in a string style "variable"_variable.html, the name of which must be given as the first -argument of the kim_query command. The second required argument is the -name of the actual query function (e.g. {get_test_result}). All following +argument of the kim_query command. The second required argument is the +name of the actual query function (e.g. {get_test_result}). All following arguments are parameters handed over to the web query in the format -{keyword=value}. This list of supported keywords and the type of how -the value has to be encoded depends on the query function used. -For more details on this, please refer to the OpenKIM homepage. +{keyword=value}. The list of supported keywords and the type of how +the value has to be encoded depends on the query function used. This +mirrors the functionality available on the OpenKIM webpage at +"https://query.openkim.org"_https://query.openkim.org/ [Restrictions:] From 971bce74283388f0f5d3b280144ed20f307270a1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 30 Mar 2019 23:33:54 -0400 Subject: [PATCH 197/243] address formatting issue in pair granular docs --- doc/src/pair_granular.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index e4b9bb3250..d287123246 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -19,7 +19,7 @@ pair_style granular command :h3 pair_style granular cutoff :pre -cutoff = global cutoff (optional). See discussion below. :l +cutoff = global cutoff (optional). See discussion below. :ul [Examples:] From fa407c05a1f8ecd6281889ea388909c525b89ffc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 31 Mar 2019 14:59:20 -0400 Subject: [PATCH 198/243] neither KOKKOS nor USER-INTEL require OpenMP; they can be built without --- cmake/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c15011b2af..77ca136b81 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -322,7 +322,7 @@ pkg_depends(USER-SCAFACOS MPI) find_package(OpenMP QUIET) option(BUILD_OMP "Build with OpenMP support" ${OpenMP_FOUND}) -if(BUILD_OMP OR PKG_KOKKOS OR PKG_USER-INTEL) +if(BUILD_OMP) find_package(OpenMP REQUIRED) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") @@ -1068,10 +1068,6 @@ if(PKG_USER-INTEL) message(FATAL_ERROR "USER-INTEL needs at least a 2016 intel compiler, found ${CMAKE_CXX_COMPILER_VERSION}") endif() - if(NOT BUILD_OMP) - message(FATAL_ERROR "USER-INTEL requires OpenMP") - endif() - if(NOT ${LAMMPS_MEMALIGN} STREQUAL "64") message(FATAL_ERROR "USER-INTEL is only useful with LAMMPS_MEMALIGN=64") endif() From 4d3c1785c6bade7552bf705e389abd14f71d1edc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 31 Mar 2019 17:12:11 -0400 Subject: [PATCH 199/243] add utility function to add custom integrate style --- cmake/Modules/StyleHeaderUtils.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/Modules/StyleHeaderUtils.cmake b/cmake/Modules/StyleHeaderUtils.cmake index a7b23b4cf1..ebaa5dae8e 100644 --- a/cmake/Modules/StyleHeaderUtils.cmake +++ b/cmake/Modules/StyleHeaderUtils.cmake @@ -91,6 +91,10 @@ function(RegisterFixStyle path) AddStyleHeader(${path} FIX) endfunction(RegisterFixStyle) +function(RegisterIntegrateStyle path) + AddStyleHeader(${path} INTEGRATE) +endfunction(RegisterIntegrateStyle) + function(RegisterStyles search_path) FindStyleHeaders(${search_path} ANGLE_CLASS angle_ ANGLE ) # angle ) # force FindStyleHeaders(${search_path} ATOM_CLASS atom_vec_ ATOM_VEC ) # atom ) # atom atom_vec_hybrid From 3bf4cd9c01858d595b4bdc9c453058ea5704dcca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 31 Mar 2019 17:17:07 -0400 Subject: [PATCH 200/243] major refactor of USER-INTEL support in CMake - decouple from USER-OMP - decouple from OpenMP support - make MKL and TBB optional - support compilers other than Intel (but print warning about bad performance) - expose Long-range thread support selection to CMake - fix bugs and typos and add missing code, so that it actually compiles and includes all styles --- cmake/CMakeLists.txt | 131 ++++++++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 46 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 77ca136b81..b730324a0d 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -944,7 +944,7 @@ if(PKG_USER-OMP) # detects styles which have USER-OMP version RegisterStylesExt(${USER-OMP_SOURCES_DIR} omp OMP_SOURCES) - RegisterFixStyle("${USER-OMP_SOURCES_DIR}/fix_omp.h") + RegisterFixStyle(${USER-OMP_SOURCES_DIR}/fix_omp.h) get_property(USER-OMP_SOURCES GLOBAL PROPERTY OMP_SOURCES) @@ -1057,33 +1057,72 @@ if(PKG_OPT) endif() if(PKG_USER-INTEL) - find_package(TBB REQUIRED) - find_package(MKL REQUIRED) + add_definitions(-DLMP_USER_INTEL) - if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - message(FATAL_ERROR "USER-INTEL is only useful together with intel compiler") - endif() + set(INTEL_ARCH "cpu" CACHE STRING "Architectures used by USER-INTEL (cpu or knl)") + set(INTEL_ARCH_VALUES cpu knl) + set_property(CACHE INTEL_ARCH PROPERTY STRINGS ${INTEL_ARCH_VALUES}) + validate_option(INTEL_ARCH INTEL_ARCH_VALUES) + string(TOUPPER ${INTEL_ARCH} INTEL_ARCH) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16) - message(FATAL_ERROR "USER-INTEL needs at least a 2016 intel compiler, found ${CMAKE_CXX_COMPILER_VERSION}") - endif() - - if(NOT ${LAMMPS_MEMALIGN} STREQUAL "64") - message(FATAL_ERROR "USER-INTEL is only useful with LAMMPS_MEMALIGN=64") - endif() - - set(INTEL_ARCH "cpu" CACHE STRING "Architectures used by USER-INTEL (cpu or knl)") - set(INTEL_ARCH_VALUES cpu knl) - set_property(CACHE INTEL_ARCH PROPERTY STRINGS ${INTEL_ARCH_VALUES}) - validate_option(INTEL_ARCH INTEL_ARCH_VALUES) - string(TOUPPER ${INTEL_ARCH} INTEL_ARCH) - - if(INTEL_ARCH STREQUAL "KNL") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -xHost -qopenmp -qoffload") - set(MIC_OPTIONS "-qoffload-option,mic,compiler,\"-fp-model fast=2 -mGLOB_default_function_attrs=\\\"gather_scatter_loop_unroll=4\\\"\"") - add_compile_options(-xMIC-AVX512 -qoffload -fno-alias -ansi-alias -restrict -qoverride-limits ${MIC_OPTIONS}) - add_definitions(-DLMP_INTEL_OFFLOAD) + # add_definitions(-DLMP_INTEL_USELRT) + find_package(Threads QUIET) + if(Threads_FOUND) + set(INTEL_LRT_MODE "threads" CACHE STRING "Long-range threads mode (none, threads, or c++11)") + else() + set(INTEL_LRT_MODE "none" CACHE STRING "Long-range threads mode (none, threads, or c++11)") + endif() + set(INTEL_LRT_VALUES none threads c++11) + set_property(CACHE INTEL_LRT_MODE PROPERTY STRINGS ${INTEL_LRT_VALUES}) + validate_option(INTEL_LRT_MODE INTEL_LRT_VALUES) + string(TOUPPER ${INTEL_LRT_MODE} INTEL_LRT_MODE) + if(INTEL_LRT_MODE STREQUAL "THREADS") + if(Threads_FOUND) + add_definitions(-DLMP_INTEL_USELRT) + list(APPEND LAMMPS_LINK_LIBS ${CMAKE_THREAD_LIBS_INIT}) else() + message(FATAL_ERROR "Must have working threads library for Long-range thread support") + endif() + endif() + if(INTEL_LRT_MODE STREQUAL "C++11") + add_definitions(-DLMP_INTEL_USERLRT -DLMP_INTEL_LRT11) + endif() + + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16) + message(FATAL_ERROR "USER-INTEL needs at least a 2016 Intel compiler, found ${CMAKE_CXX_COMPILER_VERSION}") + endif() + else() + message(WARNING "USER-INTEL gives best performance with Intel compilers") + endif() + + find_package(TBB QUIET) + if(TBB_FOUND) + list(APPEND LAMMPS_LINK_LIBS ${TBB_MALLOC_LIBRARIES}) + else() + add_definitions(-DLMP_INTEL_NO_TBB) + endif() + + find_package(MKL QUIET) + if(MKL_FOUND) + add_definitions(-DLMP_USE_MKL_RNG) + list(APPEND LAMMPS_LINK_LIBS ${MKL_LIBRARIES}) + endif() + + if((NOT ${LAMMPS_MEMALIGN} STREQUAL "64") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "128") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "256")) + message(FATAL_ERROR "USER-INTEL only supports memory alignment of 64, 128 or 256") + endif() + + if(INTEL_ARCH STREQUAL "KNL") + if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + message(FATAL_ERROR "Must use Intel compiler with USER-INTEL for KNL architecture") + endif() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -xHost -qopenmp -qoffload") + set(MIC_OPTIONS "-qoffload-option,mic,compiler,\"-fp-model fast=2 -mGLOB_default_function_attrs=\\\"gather_scatter_loop_unroll=4\\\"\"") + add_compile_options(-xMIC-AVX512 -qoffload -fno-alias -ansi-alias -restrict -qoverride-limits ${MIC_OPTIONS}) + add_definitions(-DLMP_INTEL_OFFLOAD) + else() + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.4) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xCOMMON-AVX512") else() @@ -1096,33 +1135,33 @@ if(PKG_USER-INTEL) add_compile_options(${_FLAG}) endif() endforeach() + else() + add_compile_options(-O3 -ffast-math) endif() + endif() - add_definitions(-DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG) + # collect sources + set(USER-INTEL_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-INTEL) + set(USER-INTEL_SOURCES ${USER-INTEL_SOURCES_DIR}/fix_intel.cpp + ${USER-INTEL_SOURCES_DIR}/fix_nh_intel.cpp + ${USER-INTEL_SOURCES_DIR}/intel_buffers.cpp + ${USER-INTEL_SOURCES_DIR}/nbin_intel.cpp + ${USER-INTEL_SOURCES_DIR}/npair_intel.cpp + ${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.cpp) - list(APPEND LAMMPS_LINK_LIBS ${TBB_MALLOC_LIBRARIES} ${MKL_LIBRARIES}) + set_property(GLOBAL PROPERTY "USER-INTEL_SOURCES" "${USER-INTEL_SOURCES}") - set(USER-INTEL_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-INTEL) - set(USER-INTEL_SOURCES ${USER-INTEL_SOURCES_DIR}/intel_preprocess.h - ${USER-INTEL_SOURCES_DIR}/intel_buffers.h - ${USER-INTEL_SOURCES_DIR}/intel_buffers.cpp - ${USER-INTEL_SOURCES_DIR}/math_extra_intel.h - ${USER-INTEL_SOURCES_DIR}/nbin_intel.h - ${USER-INTEL_SOURCES_DIR}/nbin_intel.cpp - ${USER-INTEL_SOURCES_DIR}/npair_intel.h - ${USER-INTEL_SOURCES_DIR}/npair_intel.cpp - ${USER-INTEL_SOURCES_DIR}/intel_simd.h - ${USER-INTEL_SOURCES_DIR}/intel_intrinsics.h) + # detect styles which have a USER-INTEL version + RegisterStylesExt(${USER-INTEL_SOURCES_DIR} intel USER-INTEL_SOURCES) + RegisterNBinStyle(${USER-INTEL_SOURCES_DIR}/nbin_intel.h) + RegisterNPairStyle(${USER-INTEL_SOURCES_DIR}/npair_intel.h) + RegisterFixStyle(${USER-INTEL_SOURCES_DIR}/fix_intel.h) + RegisterIntegrateStyle(${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.h) - set_property(GLOBAL PROPERTY "USER-INTEL_SOURCES" "${USER-INTEL_SOURCES}") + get_property(USER-INTEL_SOURCES GLOBAL PROPERTY USER-INTEL_SOURCES) - # detects styles which have USER-INTEL version - RegisterStylesExt(${USER-INTEL_SOURCES_DIR} opt USER-INTEL_SOURCES) - - get_property(USER-INTEL_SOURCES GLOBAL PROPERTY USER-INTEL_SOURCES) - - list(APPEND LIB_SOURCES ${USER-INTEL_SOURCES}) - include_directories(${USER-INTEL_SOURCES_DIR}) + list(APPEND LIB_SOURCES ${USER-INTEL_SOURCES}) + include_directories(${USER-INTEL_SOURCES_DIR}) endif() if(PKG_GPU) From 7688ead60fd8f56ddf96a846420303dfb0614733 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 04:42:56 -0400 Subject: [PATCH 201/243] add pair style granular to pair style overview page in manual --- doc/src/Commands_pair.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/Commands_pair.txt b/doc/src/Commands_pair.txt index b18d852c09..e887f0178a 100644 --- a/doc/src/Commands_pair.txt +++ b/doc/src/Commands_pair.txt @@ -98,6 +98,7 @@ OPT. "gran/hertz/history (o)"_pair_gran.html, "gran/hooke (o)"_pair_gran.html, "gran/hooke/history (ko)"_pair_gran.html, +"granular"_pair_granular.html, "gw"_pair_gw.html, "gw/zbl"_pair_gw.html, "hbond/dreiding/lj (o)"_pair_hbond_dreiding.html, From 2e7316a9e34f1b888a58ab05b58d0946a6fcc637 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 08:11:22 -0400 Subject: [PATCH 202/243] fix another windows portability issue in USER-PTM by adding missing header include --- src/USER-PTM/ptm_polar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/USER-PTM/ptm_polar.cpp b/src/USER-PTM/ptm_polar.cpp index 7a2695b504..5e234127a9 100644 --- a/src/USER-PTM/ptm_polar.cpp +++ b/src/USER-PTM/ptm_polar.cpp @@ -88,6 +88,7 @@ #include #include #include +#include "ptm_polar.h" #include "ptm_quat.h" From b7aecc0d5928244de708f4127d0d87584f49c0cd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:22:53 -0400 Subject: [PATCH 203/243] avoid linking with -ldl on windows, as it is not needed or supported --- cmake/CMakeLists.txt | 5 ++++- cmake/presets/mingw-cross.cmake | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 cmake/presets/mingw-cross.cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c15011b2af..eb7e419ec9 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -607,7 +607,10 @@ if(PKG_USER-MOLFILE) set(MOLFILE_INCLUDE_DIRS "${LAMMPS_LIB_SOURCE_DIR}/molfile" CACHE STRING "Path to VMD molfile plugin headers") add_library(molfile INTERFACE) target_include_directories(molfile INTERFACE ${MOLFILE_INCLUDE_DIRS}) - target_link_libraries(molfile INTERFACE ${CMAKE_DL_LIBS}) + # no need to link with -ldl on windows + if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + target_link_libraries(molfile INTERFACE ${CMAKE_DL_LIBS}) + endif() list(APPEND LAMMPS_LINK_LIBS molfile) endif() diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake new file mode 100644 index 0000000000..5c41509d5f --- /dev/null +++ b/cmake/presets/mingw-cross.cmake @@ -0,0 +1,12 @@ +set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE + GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS + PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI + USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS + USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP + USER-MANIFOLD USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE + USER-OMP USER-PHONON USER-QTB USER-REAXC USER-SDPD USER-SMD + USER-SMTBQ USER-SPH USER-TALLY USER-UEF) + +foreach(PKG ${WIN_PACKAGES}) + set(PKG_${PKG} ON CACHE BOOL "" FORCE) +endforeach() From d5aa60dbfe2b62046bf56096eec00e5a63c23f7c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:23:27 -0400 Subject: [PATCH 204/243] skip inline function optimizations for windows when compiling with mingw --- src/lmpwindows.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/lmpwindows.h b/src/lmpwindows.h index 546fa62535..92a248a05e 100644 --- a/src/lmpwindows.h +++ b/src/lmpwindows.h @@ -24,14 +24,13 @@ inline double pow(int i, int j){ return pow((double)i,j); } -#endif -inline double sqrt(int i){ - return sqrt((double) i); -} - inline double fabs(int i){ return fabs((double) i); } +inline double sqrt(int i){ + return sqrt((double) i); +} +#endif inline double trunc(double x) { return x > 0 ? floor(x) : ceil(x); From 8d8f0af7a626fb6a6cc93263cea6b05189af2b32 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:38:53 -0400 Subject: [PATCH 205/243] add download flags to mingw preset --- cmake/presets/mingw-cross.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index 5c41509d5f..841972b858 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -10,3 +10,5 @@ set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE foreach(PKG ${WIN_PACKAGES}) set(PKG_${PKG} ON CACHE BOOL "" FORCE) endforeach() +set(DOWNLOAD_VORO ON CACHE BOOL "" FORCE) +set(DOWNLOAD_EIGEN3 ON CACHE BOOL "" FORCE) From 70ae5f41e35df1fa7c1fa2ab7011edb47bd36a3e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:46:25 -0400 Subject: [PATCH 206/243] tweaks for compiling USER-INTEL in cpu mode on Windows with GCC --- cmake/CMakeLists.txt | 2 +- cmake/presets/mingw-cross.cmake | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a9147bf8c7..9402ec0663 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1112,7 +1112,7 @@ if(PKG_USER-INTEL) list(APPEND LAMMPS_LINK_LIBS ${MKL_LIBRARIES}) endif() - if((NOT ${LAMMPS_MEMALIGN} STREQUAL "64") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "128") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "256")) + if((NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "64") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "128") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "256")) message(FATAL_ERROR "USER-INTEL only supports memory alignment of 64, 128 or 256") endif() diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index 841972b858..d8edf95403 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -12,3 +12,4 @@ foreach(PKG ${WIN_PACKAGES}) endforeach() set(DOWNLOAD_VORO ON CACHE BOOL "" FORCE) set(DOWNLOAD_EIGEN3 ON CACHE BOOL "" FORCE) +set(LAMMPS_MEMALIGN "0" CACHE STRING "" FORCE) From 35129c0881991c028ab549ea48de83a39e88bddf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:51:53 -0400 Subject: [PATCH 207/243] posix_memalign() does not exist on windows, so we have to workaround using it with USER-INTEL --- src/memory.cpp | 2 +- src/my_page.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/memory.cpp b/src/memory.cpp index 971de3dce6..b2f8a95b17 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -26,7 +26,7 @@ #endif #endif -#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) +#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) #define LAMMPS_MEMALIGN 64 #endif diff --git a/src/my_page.h b/src/my_page.h index 5cd7098d8c..01542a9174 100644 --- a/src/my_page.h +++ b/src/my_page.h @@ -48,7 +48,7 @@ methods: #ifndef LAMMPS_MY_PAGE_H #define LAMMPS_MY_PAGE_H -#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) +#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) #define LAMMPS_MEMALIGN 64 #endif From 76b848bb0ad2028deff14c37584f22922c9387ca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:58:19 -0400 Subject: [PATCH 208/243] include USER-INTEL, but need to disable support for LRT mode --- cmake/presets/mingw-cross.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index d8edf95403..11921c05c9 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -2,7 +2,7 @@ set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP + USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-INTEL USER-MANIFOLD USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE USER-OMP USER-PHONON USER-QTB USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF) @@ -13,3 +13,4 @@ endforeach() set(DOWNLOAD_VORO ON CACHE BOOL "" FORCE) set(DOWNLOAD_EIGEN3 ON CACHE BOOL "" FORCE) set(LAMMPS_MEMALIGN "0" CACHE STRING "" FORCE) +set(INTEL_LRT_MODE "none" CACHE STRING "" FORCE) From 3a0b108f914401e7b1328611888471ba55acbd07 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 18:22:06 -0400 Subject: [PATCH 209/243] reformat --- cmake/presets/mingw-cross.cmake | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index 11921c05c9..cab5a3ca41 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -1,15 +1,16 @@ -set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE - GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI - USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-INTEL - USER-MANIFOLD USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE +set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANULAR + KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS QEQ REPLICA + RIGID SHOCK SNAP SRD VORONOI USER-ATC USER-AWPMD USER-BOCS + USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD + USER-DRUDE USER-EFF USER-FEP USER-INTEL USER-MANIFOLD + USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE USER-OMP USER-PHONON USER-QTB USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF) foreach(PKG ${WIN_PACKAGES}) set(PKG_${PKG} ON CACHE BOOL "" FORCE) endforeach() + set(DOWNLOAD_VORO ON CACHE BOOL "" FORCE) set(DOWNLOAD_EIGEN3 ON CACHE BOOL "" FORCE) set(LAMMPS_MEMALIGN "0" CACHE STRING "" FORCE) From 200aa2d06fc6c52171eb7e2211947b5fb130d059 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 18:50:53 -0400 Subject: [PATCH 210/243] missed a few packages in cross-compiler preset --- cmake/presets/mingw-cross.cmake | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index cab5a3ca41..b53e5a7b93 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -1,11 +1,11 @@ -set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANULAR - KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS QEQ REPLICA - RIGID SHOCK SNAP SRD VORONOI USER-ATC USER-AWPMD USER-BOCS - USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD - USER-DRUDE USER-EFF USER-FEP USER-INTEL USER-MANIFOLD - USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE - USER-OMP USER-PHONON USER-QTB USER-REAXC USER-SDPD USER-SMD - USER-SMTBQ USER-SPH USER-TALLY USER-UEF) +set(WIN_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU + GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI POEMS QEQ + REPLICA RIGID SHOCK SNAP SPIN SRD VORONOI USER-ATC USER-AWPMD + USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION + USER-DPD USER-DRUDE USER-EFF USER-FEP USER-INTEL USER-MANIFOLD + USER-MEAMC USER-MESO USER-MISC USER-MOFFF USER-MOLFILE USER-OMP + USER-PHONON USER-PTM USER-QTB USER-REAXC USER-SDPD USER-SMD + USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-YAFF) foreach(PKG ${WIN_PACKAGES}) set(PKG_${PKG} ON CACHE BOOL "" FORCE) From b1badb6555f595d5bd8a44597ed2a18552b1ef26 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 22:09:58 -0400 Subject: [PATCH 211/243] update all-on and all-off presets for recently added and removed packages --- cmake/presets/all_off.cmake | 4 ---- cmake/presets/all_on.cmake | 4 ---- 2 files changed, 8 deletions(-) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index b434796d7c..cdcf5fc675 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -11,10 +11,6 @@ set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVA USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK) -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP USER-SMD USER-VTK) - set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) foreach(PKG ${ALL_PACKAGES}) diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index 3a1100f337..1351eb8315 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -11,10 +11,6 @@ set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVA USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK) -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP USER-SMD USER-VTK) - set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) foreach(PKG ${ALL_PACKAGES}) From 719a74a02fc8ab2f84652b9edcb2a7054cf3729f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 22:10:55 -0400 Subject: [PATCH 212/243] must include omp.h header when using OpenMP API functions --- src/KOKKOS/pair_exp6_rx_kokkos.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp index fa10c6d30f..0a6372fdf8 100644 --- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -36,6 +36,10 @@ #include "atom_kokkos.h" #include "kokkos.h" +#ifdef _OPENMP +#include +#endif + using namespace LAMMPS_NS; using namespace MathConst; using namespace MathSpecialKokkos; From 2fc7395c140224d493c19de02ef7f660bdb03702 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 22:22:31 -0400 Subject: [PATCH 213/243] add some comments to updated all-on / all-off presets --- cmake/presets/all_off.cmake | 3 +++ cmake/presets/all_on.cmake | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index cdcf5fc675..80a12c6991 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -1,3 +1,6 @@ +# preset that turns on all existing packages off. can be used to reset +# an existing package selection without losing any other settings + set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC MOLECULE MPIIO MSCG OPT PERI POEMS diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index 1351eb8315..b66434df63 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -1,3 +1,7 @@ +# preset that turns on all existing packages. using the combination +# this preset with the nolib.cmake preset should configure a LAMMPS +# binary, that can be compiled with just a working C++ compiler. + set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC MOLECULE MPIIO MSCG OPT PERI POEMS From c044eeb482467ff4687cb3b35883120ff0ef0b86 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 22:23:36 -0400 Subject: [PATCH 214/243] update nolib.cmake and change it so it disables all packages requiring some external library or equivalent --- cmake/presets/nolib.cmake | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/cmake/presets/nolib.cmake b/cmake/presets/nolib.cmake index 4c02fb6210..663f87122b 100644 --- a/cmake/presets/nolib.cmake +++ b/cmake/presets/nolib.cmake @@ -1,21 +1,10 @@ -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) +# preset that turns off all packages that require some form of external +# library or special compiler (fortran or cuda) or equivalent. -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP USER-SMD USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) +set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MPIIO MSCG PYTHON + VORONOI USER-ADIOS USER-ATC USER-AWPMD USER-H5MD USER-LB + USER-MOLFILE USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP + USER-SMD USER-VTK) foreach(PKG ${PACKAGES_WITH_LIB}) set(PKG_${PKG} OFF CACHE BOOL "" FORCE) From 91f3a948510bf75128c8765e5aa28fee6b6bc4d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 05:49:25 -0400 Subject: [PATCH 215/243] fix typo in docs --- doc/src/velocity.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/velocity.txt b/doc/src/velocity.txt index 96d3fa6dc4..decdf2a923 100644 --- a/doc/src/velocity.txt +++ b/doc/src/velocity.txt @@ -134,7 +134,7 @@ The {mom} and {rot} keywords are used by {create}. If mom = yes, the linear momentum of the newly created ensemble of velocities is zeroed; if rot = yes, the angular momentum is zeroed. -*line +:line If specified, the {temp} keyword is used by {create} and {scale} to specify a "compute"_compute.html that calculates temperature in a From 800f3a81b1152895b8e9af89a957172f505ca781 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 06:59:19 -0400 Subject: [PATCH 216/243] update documentation for changes in USER-INTEL support in CMake --- cmake/README.md | 21 +++++++++++++++++---- doc/src/Build_extras.txt | 25 ++++++++++++++++++------- doc/src/Speed_intel.txt | 2 +- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/cmake/README.md b/cmake/README.md index 1c37ecc92e..a635f3e06d 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -155,11 +155,13 @@ make The CMake build exposes a lot of different options. In the old build system some of the package selections were possible by using special make target like -`make yes-std` or `make no-lib`. Achieving the same result with cmake requires +`make yes-std` or `make no-lib`. Achieving a similar result with cmake requires specifying all options manually. This can quickly become a very long command line that is hard to handle. While these could be stored in a simple script file, there is another way of defining "presets" to compile LAMMPS in a certain -way. +way. Since the cmake build process - contrary to the conventional build system - +includes the compilation of the bundled libraries into the standard build process, +the grouping of those presets is somewhat different. A preset is a regular CMake script file that can use constructs such as variables, lists and for-loops to manipulate configuration options and create @@ -171,10 +173,10 @@ Such a file can then be passed to cmake via the `-C` flag. Several examples of presets can be found in the `cmake/presets` folder. ```bash -# build LAMMPS with all "standard" packages which don't use libraries and enable GPU package +# build LAMMPS with all packages enabled which don't use external libraries and enable GPU package mkdir build cd build -cmake -C ../cmake/presets/std_nolib.cmake -D PKG_GPU=on ../cmake +cmake -C ../cmake/presets/all_on.cmake -C ../cmake/presets/nolib.cmake -D PKG_GPU=on ../cmake ``` # Reference @@ -1429,6 +1431,17 @@ TODO + + INTEL_LRT_MODE + How to support Long-range thread mode in Verlet integration + +
+
threads (default, if pthreads available)
+
none (default, if pthreads not available)
+
c++11
+
+ + diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 2aa304faff..17d18243f2 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -859,23 +859,34 @@ file. USER-INTEL package :h4,link(user-intel) To build with this package, you must choose which hardware you want to -build for, either Intel CPUs or Intel KNLs. You should also typically -"install the USER-OMP package"_#user-omp, as it can be used in tandem -with the USER-INTEL package to good effect, as explained on the "Speed -intel"_Speed_intel.html doc page. +build for, either x86 CPUs or Intel KNLs in offload mode. You should +also typically "install the USER-OMP package"_#user-omp, as it can be +used in tandem with the USER-INTEL package to good effect, as explained +on the "Speed intel"_Speed_intel.html doc page. [CMake build]: -D INTEL_ARCH=value # value = cpu (default) or knl --D BUILD_OMP=yes # also required to build with the USER-INTEl package :pre +-D INTEL_LRT_MODE=value # value = threads, none, or c++11 :pre -Requires an Intel compiler as well as the Intel TBB and MKL libraries. +In Long-range thread mode (LRT) a modified verlet style is used, that +operates the Kspace calculation in a separate thread concurrently to +other calculations. This has to be enabled in the "package intel"_package.html +command at runtime. With the setting "threads" it used the pthreads +library, while c++11 will use the built-in thread support of C++11 +compilers. The option "none" skips compilation of this feature. The +default is to use "threads" if pthreads is available and otherwise "none". + +Best performance is achieved with Intel hardware, Intel compilers, as well as +the Intel TBB and MKL libraries. However, the code also compiles, links, and +runs with other compilers and without TBB and MKL. [Traditional make]: Choose which hardware to compile for in Makefile.machine via the following settings. See src/MAKE/OPTIONS/Makefile.intel_cpu* and -Makefile.knl files for examples. +Makefile.knl files for examples. and src/USER-INTEL/README for +additional information. For CPUs: diff --git a/doc/src/Speed_intel.txt b/doc/src/Speed_intel.txt index dc38cb0956..2688b43e6f 100644 --- a/doc/src/Speed_intel.txt +++ b/doc/src/Speed_intel.txt @@ -24,7 +24,7 @@ LAMMPS to run on the CPU cores and co-processor cores simultaneously. Angle Styles: charmm, harmonic :ulb,l Bond Styles: fene, fourier, harmonic :l -Dihedral Styles: charmm, harmonic, opls :l +Dihedral Styles: charmm, fourier, harmonic, opls :l Fixes: nve, npt, nvt, nvt/sllod, nve/asphere :l Improper Styles: cvff, harmonic :l Pair Styles: airebo, airebo/morse, buck/coul/cut, buck/coul/long, From 0ab65c0343bfefb88618cad078fa70583d928f65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 07:12:55 -0400 Subject: [PATCH 217/243] update docs for building LAMMPS for windows --- doc/src/Build_windows.txt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/src/Build_windows.txt b/doc/src/Build_windows.txt index bf1ec265a1..b3dbf775c9 100644 --- a/doc/src/Build_windows.txt +++ b/doc/src/Build_windows.txt @@ -51,11 +51,10 @@ provides a unix/linux interface to low-level Windows functions, so LAMMPS can be compiled on Windows. The necessary (minor) modifications to LAMMPS are included, but may not always up-to-date for recently added functionality and the corresponding new code. A machine makefile for using cygwin for -the old build system is provided. The CMake build system is untested -for this; you will have to request that makefiles are generated and -manually set the compiler. +the old build system is provided. Using CMake for this mode of compilation +is untested and not likely to work. -When compiling for Windows [not] set the -DLAMMPS_MEMALIGN define +When compiling for Windows do [not] set the -DLAMMPS_MEMALIGN define in the LMP_INC makefile variable and add -lwsock32 -lpsapi to the linker flags in LIB makefile variable. Try adding -static-libgcc or -static or both to the linker flags when your resulting LAMMPS Windows executable @@ -79,7 +78,13 @@ probably the currently best tested and supported way to build LAMMPS executables for Windows. There are makefiles provided for the traditional build system, but CMake has also been successfully tested using the mingw32-cmake and mingw64-cmake wrappers that are bundled -with the cross-compiler environment on Fedora machines. +with the cross-compiler environment on Fedora machines. A CMake preset +selecting all packages compatible with this cross-compilation build +is provided. You likely need to disable the GPU package unless you +download and install the contents of the pre-compiled "OpenCL ICD loader +library"_https://download.lammps.org/thirdparty/opencl-win-devel.tar.gz +into your MinGW64 cross-compiler environment. The cross-compilation +currently will only produce non-MPI serial binaries. Please keep in mind, though, that this only applies to compiling LAMMPS. Whether the resulting binaries do work correctly is no tested by the From ef184c9b1b73f0e55f7393d8320250f925edbe0e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 09:34:03 -0400 Subject: [PATCH 218/243] remove presets, that try to mimic settings from the conventional build, but make little sense with cmake --- cmake/presets/manual_selection.cmake | 71 ---------------------------- cmake/presets/std.cmake | 22 --------- cmake/presets/std_nolib.cmake | 26 ---------- cmake/presets/user.cmake | 22 --------- 4 files changed, 141 deletions(-) delete mode 100644 cmake/presets/manual_selection.cmake delete mode 100644 cmake/presets/std.cmake delete mode 100644 cmake/presets/std_nolib.cmake delete mode 100644 cmake/presets/user.cmake diff --git a/cmake/presets/manual_selection.cmake b/cmake/presets/manual_selection.cmake deleted file mode 100644 index 6db41b708c..0000000000 --- a/cmake/presets/manual_selection.cmake +++ /dev/null @@ -1,71 +0,0 @@ -set(PKG_ASPHERE OFF CACHE BOOL "" FORCE) -set(PKG_BODY OFF CACHE BOOL "" FORCE) -set(PKG_CLASS2 OFF CACHE BOOL "" FORCE) -set(PKG_COLLOID OFF CACHE BOOL "" FORCE) -set(PKG_COMPRESS OFF CACHE BOOL "" FORCE) -set(PKG_CORESHELL OFF CACHE BOOL "" FORCE) -set(PKG_DIPOLE OFF CACHE BOOL "" FORCE) -set(PKG_GPU OFF CACHE BOOL "" FORCE) -set(PKG_GRANULAR OFF CACHE BOOL "" FORCE) -set(PKG_KIM OFF CACHE BOOL "" FORCE) -set(PKG_KOKKOS OFF CACHE BOOL "" FORCE) -set(PKG_KSPACE OFF CACHE BOOL "" FORCE) -set(PKG_LATTE OFF CACHE BOOL "" FORCE) -set(PKG_LIB OFF CACHE BOOL "" FORCE) -set(PKG_MANYBODY OFF CACHE BOOL "" FORCE) -set(PKG_MC OFF CACHE BOOL "" FORCE) -set(PKG_MEAM OFF CACHE BOOL "" FORCE) -set(PKG_MISC OFF CACHE BOOL "" FORCE) -set(PKG_MOLECULE OFF CACHE BOOL "" FORCE) -set(PKG_MPIIO OFF CACHE BOOL "" FORCE) -set(PKG_MSCG OFF CACHE BOOL "" FORCE) -set(PKG_OPT OFF CACHE BOOL "" FORCE) -set(PKG_PERI OFF CACHE BOOL "" FORCE) -set(PKG_POEMS OFF CACHE BOOL "" FORCE) -set(PKG_PYTHOFF OFF CACHE BOOL "" FORCE) -set(PKG_QEQ OFF CACHE BOOL "" FORCE) -set(PKG_REAX OFF CACHE BOOL "" FORCE) -set(PKG_REPLICA OFF CACHE BOOL "" FORCE) -set(PKG_RIGID OFF CACHE BOOL "" FORCE) -set(PKG_SHOCK OFF CACHE BOOL "" FORCE) -set(PKG_SNAP OFF CACHE BOOL "" FORCE) -set(PKG_SRD OFF CACHE BOOL "" FORCE) -set(PKG_VOROFFOI OFF CACHE BOOL "" FORCE) - -set(PKG_USER OFF CACHE BOOL "" FORCE) -set(PKG_USER-ATC OFF CACHE BOOL "" FORCE) -set(PKG_USER-AWPMD OFF CACHE BOOL "" FORCE) -set(PKG_USER-BOCS OFF CACHE BOOL "" FORCE) -set(PKG_USER-CGDNA OFF CACHE BOOL "" FORCE) -set(PKG_USER-CGSDK OFF CACHE BOOL "" FORCE) -set(PKG_USER-COLVARS OFF CACHE BOOL "" FORCE) -set(PKG_USER-DIFFRACTIOFF OFF CACHE BOOL "" FORCE) -set(PKG_USER-DPD OFF CACHE BOOL "" FORCE) -set(PKG_USER-DRUDE OFF CACHE BOOL "" FORCE) -set(PKG_USER-EFF OFF CACHE BOOL "" FORCE) -set(PKG_USER-FEP OFF CACHE BOOL "" FORCE) -set(PKG_USER-H5MD OFF CACHE BOOL "" FORCE) -set(PKG_USER-INTEL OFF CACHE BOOL "" FORCE) -set(PKG_USER-LB OFF CACHE BOOL "" FORCE) -set(PKG_USER-MANIFOLD OFF CACHE BOOL "" FORCE) -set(PKG_USER-MEAMC OFF CACHE BOOL "" FORCE) -set(PKG_USER-MESO OFF CACHE BOOL "" FORCE) -set(PKG_USER-MGPT OFF CACHE BOOL "" FORCE) -set(PKG_USER-MISC OFF CACHE BOOL "" FORCE) -set(PKG_USER-MOFFF OFF CACHE BOOL "" FORCE) -set(PKG_USER-MOLFILE OFF CACHE BOOL "" FORCE) -set(PKG_USER-NETCDF OFF CACHE BOOL "" FORCE) -set(PKG_USER-OMP OFF CACHE BOOL "" FORCE) -set(PKG_USER-PHONON OFF CACHE BOOL "" FORCE) -set(PKG_USER-PLUMED OFF CACHE BOOL "" FORCE) -set(PKG_USER-QMMM OFF CACHE BOOL "" FORCE) -set(PKG_USER-QTB OFF CACHE BOOL "" FORCE) -set(PKG_USER-QUIP OFF CACHE BOOL "" FORCE) -set(PKG_USER-REAXC OFF CACHE BOOL "" FORCE) -set(PKG_USER-SDPD OFF CACHE BOOL "" FORCE) -set(PKG_USER-SMD OFF CACHE BOOL "" FORCE) -set(PKG_USER-SMTBQ OFF CACHE BOOL "" FORCE) -set(PKG_USER-SPH OFF CACHE BOOL "" FORCE) -set(PKG_USER-TALLY OFF CACHE BOOL "" FORCE) -set(PKG_USER-UEF OFF CACHE BOOL "" FORCE) -set(PKG_USER-VTK OFF CACHE BOOL "" FORCE) diff --git a/cmake/presets/std.cmake b/cmake/presets/std.cmake deleted file mode 100644 index 4176aba44e..0000000000 --- a/cmake/presets/std.cmake +++ /dev/null @@ -1,22 +0,0 @@ -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) - -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-QMMM USER-QUIP USER-SMD USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) - -foreach(PKG ${STANDARD_PACKAGES}) - set(PKG_${PKG} ON CACHE BOOL "" FORCE) -endforeach() diff --git a/cmake/presets/std_nolib.cmake b/cmake/presets/std_nolib.cmake deleted file mode 100644 index aa067f2ba0..0000000000 --- a/cmake/presets/std_nolib.cmake +++ /dev/null @@ -1,26 +0,0 @@ -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) - -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-QMMM USER-QUIP USER-SMD USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) - -foreach(PKG ${STANDARD_PACKAGES}) - set(PKG_${PKG} ON CACHE BOOL "" FORCE) -endforeach() - -foreach(PKG ${PACKAGES_WITH_LIB}) - set(PKG_${PKG} OFF CACHE BOOL "" FORCE) -endforeach() diff --git a/cmake/presets/user.cmake b/cmake/presets/user.cmake deleted file mode 100644 index af606203e9..0000000000 --- a/cmake/presets/user.cmake +++ /dev/null @@ -1,22 +0,0 @@ -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) - -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MEAM MPIIO MSCG POEMS PYTHON REAX VORONOI - USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-LB USER-MOLFILE - USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP USER-SMD USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) - -foreach(PKG ${USER_PACKAGES}) - set(PKG_${PKG} ON CACHE BOOL "" FORCE) -endforeach() From 764fb2522b705130929df8a3af1e5051fffc78ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 11:21:25 -0400 Subject: [PATCH 219/243] abort already in cmake when including USER-INTEL with -DLAMMPS_BIGBIG --- cmake/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 9402ec0663..39d1e4e382 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1060,6 +1060,9 @@ if(PKG_OPT) endif() if(PKG_USER-INTEL) + if(LAMMPS_SIZES STREQUAL BIGBIG) + message(FATAL_ERROR "The USER-INTEL Package is not compatible with -DLAMMPS_BIGBIG") + endif() add_definitions(-DLMP_USER_INTEL) set(INTEL_ARCH "cpu" CACHE STRING "Architectures used by USER-INTEL (cpu or knl)") @@ -1068,7 +1071,6 @@ if(PKG_USER-INTEL) validate_option(INTEL_ARCH INTEL_ARCH_VALUES) string(TOUPPER ${INTEL_ARCH} INTEL_ARCH) - # add_definitions(-DLMP_INTEL_USELRT) find_package(Threads QUIET) if(Threads_FOUND) set(INTEL_LRT_MODE "threads" CACHE STRING "Long-range threads mode (none, threads, or c++11)") From fd7c680654ba57cfa1302b90cf97e22fd6de367c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 11:39:46 -0400 Subject: [PATCH 220/243] the lammps_gather_atom*() and lammps_scatter_atom() library functions are not compatible with -DLAMMPS_BIGBIG. divert to dummy functions resulting in error exists. --- src/library.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/library.cpp b/src/library.cpp index d8c55159a2..da4ebaf479 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -801,6 +801,13 @@ void lammps_reset_box(void *ptr, double *boxlo, double *boxhi, Allreduce to sum vector into data across all procs ------------------------------------------------------------------------- */ +#if defined(LAMMPS_BIGBIG) +void lammps_gather_atoms(void * /*ptr*/, char * /*name */, + int /*type*/, int /*count*/, void * /*data*/) +{ + lmp->error->all(FLERR,"Library function lammps_gather_atoms() not compatible with -DLAMMPS_BIGBIG"); +} +#else void lammps_gather_atoms(void *ptr, char *name, int type, int count, void *data) { @@ -905,6 +912,7 @@ void lammps_gather_atoms(void *ptr, char *name, } END_CAPTURE } +#endif /* ---------------------------------------------------------------------- gather the named atom-based entity for all atoms @@ -927,6 +935,13 @@ void lammps_gather_atoms(void *ptr, char *name, Allgather Nlocal atoms from each proc into data ------------------------------------------------------------------------- */ +#if defined(LAMMPS_BIGBIG) +void lammps_gather_atoms_concat(void * /*ptr*/, char * /*name */, + int /*type*/, int /*count*/, void * /*data*/) +{ + lmp->error->all(FLERR,"Library function lammps_gather_atoms_concat() not compatible with -DLAMMPS_BIGBIG"); +} +#else void lammps_gather_atoms_concat(void *ptr, char *name, int type, int count, void *data) { @@ -1047,6 +1062,7 @@ void lammps_gather_atoms_concat(void *ptr, char *name, } END_CAPTURE } +#endif /* ---------------------------------------------------------------------- gather the named atom-based entity for a subset of atoms @@ -1071,6 +1087,14 @@ void lammps_gather_atoms_concat(void *ptr, char *name, Allreduce to sum vector into data across all procs ------------------------------------------------------------------------- */ +#if defined(LAMMPS_BIGBIG) +void lammps_gather_atoms_subset(void * /*ptr*/, char * /*name */, + int /*type*/, int /*count*/, + int /*ndata*/, int * /*ids*/, void * /*data*/) +{ + lmp->error->all(FLERR,"Library function lammps_gather_atoms_subset() not compatible with -DLAMMPS_BIGBIG"); +} +#else void lammps_gather_atoms_subset(void *ptr, char *name, int type, int count, int ndata, int *ids, void *data) @@ -1188,6 +1212,7 @@ void lammps_gather_atoms_subset(void *ptr, char *name, } END_CAPTURE } +#endif /* ---------------------------------------------------------------------- scatter the named atom-based entity in data to all atoms @@ -1205,6 +1230,13 @@ void lammps_gather_atoms_subset(void *ptr, char *name, loop over Natoms, if I own atom ID, set its values from data ------------------------------------------------------------------------- */ +#if defined(LAMMPS_BIGBIG) +void lammps_scatter_atoms(void * /*ptr*/, char * /*name */, + int /*type*/, int /*count*/, void * /*data*/) +{ + lmp->error->all(FLERR,"Library function lammps_scatter_atoms() not compatible with -DLAMMPS_BIGBIG"); +} +#else void lammps_scatter_atoms(void *ptr, char *name, int type, int count, void *data) { @@ -1299,6 +1331,7 @@ void lammps_scatter_atoms(void *ptr, char *name, } END_CAPTURE } +#endif /* ---------------------------------------------------------------------- scatter the named atom-based entity in data to a subset of atoms @@ -1318,6 +1351,14 @@ void lammps_scatter_atoms(void *ptr, char *name, loop over Ndata, if I own atom ID, set its values from data ------------------------------------------------------------------------- */ +#if defined(LAMMPS_BIGBIG) +void lammps_scatter_atoms_subset(void * /*ptr*/, char * /*name */, + int /*type*/, int /*count*/, + int /*ndata*/, int * /*ids*/, void * /*data*/) +{ + lmp->error->all(FLERR,"Library function lammps_scatter_atoms_subset() not compatible with -DLAMMPS_BIGBIG"); +} +#else void lammps_scatter_atoms_subset(void *ptr, char *name, int type, int count, int ndata, int *ids, void *data) @@ -1420,6 +1461,7 @@ void lammps_scatter_atoms_subset(void *ptr, char *name, } END_CAPTURE } +#endif /* ---------------------------------------------------------------------- create N atoms and assign them to procs based on coords From 3eab343821792d9f82d6d0be1f2485a1e5ba244c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 11:49:08 -0400 Subject: [PATCH 221/243] give access to LAMMPS object and wrap in macros for optional exception handling --- src/library.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index da4ebaf479..a653b83adb 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -802,10 +802,14 @@ void lammps_reset_box(void *ptr, double *boxlo, double *boxhi, ------------------------------------------------------------------------- */ #if defined(LAMMPS_BIGBIG) -void lammps_gather_atoms(void * /*ptr*/, char * /*name */, +void lammps_gather_atoms(void *ptr, char * /*name */, int /*type*/, int /*count*/, void * /*data*/) { + LAMMPS *lmp = (LAMMPS *) ptr; + + BEGIN_CAPTURE lmp->error->all(FLERR,"Library function lammps_gather_atoms() not compatible with -DLAMMPS_BIGBIG"); + END_CAPTURE } #else void lammps_gather_atoms(void *ptr, char *name, @@ -936,10 +940,14 @@ void lammps_gather_atoms(void *ptr, char *name, ------------------------------------------------------------------------- */ #if defined(LAMMPS_BIGBIG) -void lammps_gather_atoms_concat(void * /*ptr*/, char * /*name */, +void lammps_gather_atoms_concat(void *ptr, char * /*name */, int /*type*/, int /*count*/, void * /*data*/) { + LAMMPS *lmp = (LAMMPS *) ptr; + + BEGIN_CAPTURE lmp->error->all(FLERR,"Library function lammps_gather_atoms_concat() not compatible with -DLAMMPS_BIGBIG"); + END_CAPTURE } #else void lammps_gather_atoms_concat(void *ptr, char *name, @@ -1088,11 +1096,15 @@ void lammps_gather_atoms_concat(void *ptr, char *name, ------------------------------------------------------------------------- */ #if defined(LAMMPS_BIGBIG) -void lammps_gather_atoms_subset(void * /*ptr*/, char * /*name */, +void lammps_gather_atoms_subset(void *ptr, char * /*name */, int /*type*/, int /*count*/, int /*ndata*/, int * /*ids*/, void * /*data*/) { + LAMMPS *lmp = (LAMMPS *) ptr; + + BEGIN_CAPTURE lmp->error->all(FLERR,"Library function lammps_gather_atoms_subset() not compatible with -DLAMMPS_BIGBIG"); + END_CAPTURE } #else void lammps_gather_atoms_subset(void *ptr, char *name, @@ -1231,10 +1243,14 @@ void lammps_gather_atoms_subset(void *ptr, char *name, ------------------------------------------------------------------------- */ #if defined(LAMMPS_BIGBIG) -void lammps_scatter_atoms(void * /*ptr*/, char * /*name */, +void lammps_scatter_atoms(void *ptr, char * /*name */, int /*type*/, int /*count*/, void * /*data*/) { + LAMMPS *lmp = (LAMMPS *) ptr; + + BEGIN_CAPTURE lmp->error->all(FLERR,"Library function lammps_scatter_atoms() not compatible with -DLAMMPS_BIGBIG"); + END_CAPTURE } #else void lammps_scatter_atoms(void *ptr, char *name, @@ -1352,11 +1368,15 @@ void lammps_scatter_atoms(void *ptr, char *name, ------------------------------------------------------------------------- */ #if defined(LAMMPS_BIGBIG) -void lammps_scatter_atoms_subset(void * /*ptr*/, char * /*name */, +void lammps_scatter_atoms_subset(void *ptr, char * /*name */, int /*type*/, int /*count*/, int /*ndata*/, int * /*ids*/, void * /*data*/) { + LAMMPS *lmp = (LAMMPS *) ptr; + + BEGIN_CAPTURE lmp->error->all(FLERR,"Library function lammps_scatter_atoms_subset() not compatible with -DLAMMPS_BIGBIG"); + END_CAPTURE } #else void lammps_scatter_atoms_subset(void *ptr, char *name, From 74ce164457494ddb4ced33721214199ab729ee2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 12:06:51 -0400 Subject: [PATCH 222/243] restore lost edit to all_on.cmake and all_off.cmake that syncs the list of packages --- cmake/presets/all_off.cmake | 25 +++++++++++-------------- cmake/presets/all_on.cmake | 25 +++++++++++-------------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index 80a12c6991..0e37611da4 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -1,20 +1,17 @@ # preset that turns on all existing packages off. can be used to reset # an existing package selection without losing any other settings -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) - -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) +set(ALL_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU + GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MOLECULE MPIIO + MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN SRD + VORONOI + USER-ADIOS USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK + USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP + USER-H5MD USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO + USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF USER-OMP + USER-PHONON USER-PLUMED USER-PTM USER-QMMM USER-QTB USER-QUIP + USER-REAXC USER-SCAFACOS USER-SDPD USER-SMD USER-SMTBQ USER-SPH + USER-TALLY USER-UEF USER-VTK USER-YAFF) foreach(PKG ${ALL_PACKAGES}) set(PKG_${PKG} OFF CACHE BOOL "" FORCE) diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index b66434df63..a24403c847 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -2,20 +2,17 @@ # this preset with the nolib.cmake preset should configure a LAMMPS # binary, that can be compiled with just a working C++ compiler. -set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MEAM MISC - MOLECULE MPIIO MSCG OPT PERI POEMS - PYTHON QEQ REAX REPLICA RIGID SHOCK SNAP SRD VORONOI) - -set(USER_PACKAGES USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS - USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD - USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO - USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE - USER-NETCDF USER-OMP USER-PHONON USER-QMMM USER-QTB - USER-QUIP USER-REAXC USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY - USER-UEF USER-VTK) - -set(ALL_PACKAGES ${STANDARD_PACKAGES} ${USER_PACKAGES}) +set(ALL_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU + GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MOLECULE MPIIO + MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN SRD + VORONOI + USER-ADIOS USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK + USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP + USER-H5MD USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO + USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF USER-OMP + USER-PHONON USER-PLUMED USER-PTM USER-QMMM USER-QTB USER-QUIP + USER-REAXC USER-SCAFACOS USER-SDPD USER-SMD USER-SMTBQ USER-SPH + USER-TALLY USER-UEF USER-VTK USER-YAFF) foreach(PKG ${ALL_PACKAGES}) set(PKG_${PKG} ON CACHE BOOL "" FORCE) From cb5c3f900ef3edf4268b071779f819b951f5142a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 12:41:12 -0400 Subject: [PATCH 223/243] add minimal.cmake and most.cmake presets --- cmake/presets/all_on.cmake | 5 +++-- cmake/presets/minimal.cmake | 8 ++++++++ cmake/presets/most.cmake | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 cmake/presets/minimal.cmake create mode 100644 cmake/presets/most.cmake diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index a24403c847..57f1228abe 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -1,6 +1,7 @@ # preset that turns on all existing packages. using the combination -# this preset with the nolib.cmake preset should configure a LAMMPS -# binary, that can be compiled with just a working C++ compiler. +# this preset followed by the nolib.cmake preset should configure a +# LAMMPS binary, with as many packages included, that can be compiled +# with just a working C++ compiler and an MPI library. set(ALL_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MOLECULE MPIIO diff --git a/cmake/presets/minimal.cmake b/cmake/presets/minimal.cmake new file mode 100644 index 0000000000..e9ce6d6103 --- /dev/null +++ b/cmake/presets/minimal.cmake @@ -0,0 +1,8 @@ +# preset that turns on just a few, frequently used packages +# this will be compiled quickly and handle a lot of common inputs. + +set(ALL_PACKAGES KSPACE MANYBODY MOLECULE RIGID) + +foreach(PKG ${ALL_PACKAGES}) + set(PKG_${PKG} ON CACHE BOOL "" FORCE) +endforeach() diff --git a/cmake/presets/most.cmake b/cmake/presets/most.cmake new file mode 100644 index 0000000000..eed4599670 --- /dev/null +++ b/cmake/presets/most.cmake @@ -0,0 +1,15 @@ +# preset that turns on a wide range of packages none of which require +# external libraries. Some more unusual packages are removed as well. +# The resulting binary should be able to run most inputs. + +set(ALL_PACKAGES ASPHERE CLASS2 COLLOID CORESHELL DIPOLE + GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI + QEQ REPLICA RIGID SHOCK SRD + USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD + USER-DRUDE USER-FEP USER-MEAMC USER-MESO + USER-MISC USER-MOFFF USER-OMP USER-PHONON USER-REAXC + USER-SPH USER-UEF USER-YAFF) + +foreach(PKG ${ALL_PACKAGES}) + set(PKG_${PKG} ON CACHE BOOL "" FORCE) +endforeach() From 5a751254262718bc8f3a4293c3311b923b82a735 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 14:30:34 -0400 Subject: [PATCH 224/243] add some popular packages requiring libraries to most.cmake preset --- cmake/presets/most.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/presets/most.cmake b/cmake/presets/most.cmake index eed4599670..35ad7ba55c 100644 --- a/cmake/presets/most.cmake +++ b/cmake/presets/most.cmake @@ -1,14 +1,14 @@ -# preset that turns on a wide range of packages none of which require -# external libraries. Some more unusual packages are removed as well. -# The resulting binary should be able to run most inputs. +# preset that turns on a wide range of packages, some of which require +# external libraries. Compared to all_on.cmake some more unusual packages +# are removed. The resulting binary should be able to run most inputs. set(ALL_PACKAGES ASPHERE CLASS2 COLLOID CORESHELL DIPOLE GRANULAR KSPACE MANYBODY MC MISC MOLECULE OPT PERI - QEQ REPLICA RIGID SHOCK SRD + PYTHON QEQ REPLICA RIGID SHOCK SRD VORONOI USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-FEP USER-MEAMC USER-MESO - USER-MISC USER-MOFFF USER-OMP USER-PHONON USER-REAXC - USER-SPH USER-UEF USER-YAFF) + USER-MISC USER-MOFFF USER-OMP USER-PLUMED USER-PHONON USER-REAXC + USER-SPH USER-SMD USER-UEF USER-YAFF) foreach(PKG ${ALL_PACKAGES}) set(PKG_${PKG} ON CACHE BOOL "" FORCE) From 4824992a1e2f367f026daefeeb4ed19857df4124 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 14:31:13 -0400 Subject: [PATCH 225/243] update documentation for recent changes to CMake presets --- doc/src/Build_cmake.txt | 3 ++- doc/src/Build_package.txt | 28 +++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/src/Build_cmake.txt b/doc/src/Build_cmake.txt index 5c29e11280..69d5d31f54 100644 --- a/doc/src/Build_cmake.txt +++ b/doc/src/Build_cmake.txt @@ -108,7 +108,8 @@ command-line options. Several useful ones are: -D CMAKE_BUILD_TYPE=type # type = Release or Debug -G output # style of output CMake generates -DVARIABLE=value # setting for a LAMMPS feature to enable --D VARIABLE=value # ditto, but cannot come after CMakeLists.txt dir :pre +-D VARIABLE=value # ditto, but cannot come after CMakeLists.txt dir +-C path/to/preset/file # load some CMake settings before configuring :pre All the LAMMPS-specific -D variables that a LAMMPS build supports are described on the pages linked to from the "Build"_Build.html doc page. diff --git a/doc/src/Build_package.txt b/doc/src/Build_package.txt index c5eca96edb..774cdda6a1 100644 --- a/doc/src/Build_package.txt +++ b/doc/src/Build_package.txt @@ -149,26 +149,32 @@ system. Using these files you can enable/disable portions of the available packages in LAMMPS. If you need a custom preset you can take one of them as a starting point and customize it to your needs. -cmake -C ../cmake/presets/all_on.cmake \[OPTIONS\] ../cmake | enable all packages +cmake -C ../cmake/presets/all_on.cmake \[OPTIONS\] ../cmake | enable all packages cmake -C ../cmake/presets/all_off.cmake \[OPTIONS\] ../cmake | disable all packages -cmake -C ../cmake/presets/std.cmake \[OPTIONS\] ../cmake | enable standard packages -cmake -C ../cmake/presets/user.cmake \[OPTIONS\] ../cmake | enable user packages -cmake -C ../cmake/presets/std_nolib.cmake \[OPTIONS\] ../cmake | enable standard packages that do not require extra libraries -cmake -C ../cmake/presets/nolib.cmake \[OPTIONS\] ../cmake | disable all packages that do not require extra libraries -cmake -C ../cmake/presets/manual_selection.cmake \[OPTIONS\] ../cmake | example of how to create a manual selection of packages :tb(s=|,a=l) +cmake -C ../cmake/presets/minimal.cmake \[OPTIONS\] ../cmake | enable just a few core packages +cmake -C ../cmake/presets/most.cmake \[OPTIONS\] ../cmake | enable most common packages +cmake -C ../cmake/presets/nolib.cmake \[OPTIONS\] ../cmake | disable packages that do require extra libraries or tools +cmake -C ../cmake/presets/mingw.cmake \[OPTIONS\] ../cmake | enable all packages compatible with MinGW (cross-)compilation on Windows :tb(s=|,a=l)s NOTE: Running cmake this way manipulates the variable cache in your -current build directory. You can combine presets and options with -multiple cmake runs. +current build directory. You can combine multiple presets and options +with multiple cmake runs. [Example:] -# build LAMMPS with all "standard" packages which don't -# use libraries and enable GPU package +# build LAMMPS with most commonly used packages, but then remove +# those requiring additional library or tools, but still enable +# GPU package and configure it for using CUDA. You can run. mkdir build cd build -cmake -C ../cmake/presets/std_nolib.cmake -D PKG_GPU=on ../cmake :pre +cmake -C ../cmake/presets/most.cmake -C ../cmake/presets/nolib.cmake -D PKG_GPU=on -D GPU_API=cuda ../cmake :pre +# to add another package, say BODY to the previous configuration you can run: +cmake -D PKG_BODY=on . :pre + +# to reset the package selection from above to the default of no packages +# but leaving all other settings untouched. You can run: +cmake -C ../cmake/presets/no_all.cmake . :pre :line [Make shortcuts for installing many packages]: From 98bd720c684cd3f56c4925b763b070a0270cffb7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 14:56:51 -0400 Subject: [PATCH 226/243] improved formatting of cmake settings and presets related docs --- doc/src/Build_cmake.txt | 5 +++-- doc/src/Build_package.txt | 21 ++++++++++++++------- doc/src/Build_settings.txt | 13 ++++++++----- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/doc/src/Build_cmake.txt b/doc/src/Build_cmake.txt index 69d5d31f54..265c16e3d4 100644 --- a/doc/src/Build_cmake.txt +++ b/doc/src/Build_cmake.txt @@ -28,7 +28,7 @@ Makefile(s). Example: cd lammps # change to the LAMMPS distribution directory mkdir build; cd build # create a new directory (folder) for build -cmake ../cmake \[options ...\] # configuration with (command-line) cmake +cmake \[options ...\] ../cmake # configuration with (command-line) cmake make # compilation :pre The cmake command will detect available features, enable selected @@ -41,7 +41,8 @@ If your machine has multiple CPU cores (most do these days), using a command like "make -jN" (with N being the number of available local CPU cores) can be much faster. If you plan to do development on LAMMPS or need to re-compile LAMMPS repeatedly, installation of the -ccache (= Compiler Cache) software may speed up compilation even more. +ccache (= Compiler Cache) software may speed up repeated compilation +even more. After compilation, you can optionally copy the LAMMPS executable and library into your system folders (by default under $HOME/.local) with: diff --git a/doc/src/Build_package.txt b/doc/src/Build_package.txt index 774cdda6a1..e37936e052 100644 --- a/doc/src/Build_package.txt +++ b/doc/src/Build_package.txt @@ -149,16 +149,23 @@ system. Using these files you can enable/disable portions of the available packages in LAMMPS. If you need a custom preset you can take one of them as a starting point and customize it to your needs. -cmake -C ../cmake/presets/all_on.cmake \[OPTIONS\] ../cmake | enable all packages -cmake -C ../cmake/presets/all_off.cmake \[OPTIONS\] ../cmake | disable all packages -cmake -C ../cmake/presets/minimal.cmake \[OPTIONS\] ../cmake | enable just a few core packages -cmake -C ../cmake/presets/most.cmake \[OPTIONS\] ../cmake | enable most common packages -cmake -C ../cmake/presets/nolib.cmake \[OPTIONS\] ../cmake | disable packages that do require extra libraries or tools -cmake -C ../cmake/presets/mingw.cmake \[OPTIONS\] ../cmake | enable all packages compatible with MinGW (cross-)compilation on Windows :tb(s=|,a=l)s +cmake -C ../cmake/presets/all_on.cmake \[OPTIONS\] ../cmake | + enable all packages | +cmake -C ../cmake/presets/all_off.cmake \[OPTIONS\] ../cmake | + disable all packages | +cmake -C ../cmake/presets/minimal.cmake \[OPTIONS\] ../cmake | + enable just a few core packages | +cmake -C ../cmake/presets/most.cmake \[OPTIONS\] ../cmake | + enable most common packages | +cmake -C ../cmake/presets/nolib.cmake \[OPTIONS\] ../cmake | + disable packages that do require extra libraries or tools | +cmake -C ../cmake/presets/mingw.cmake \[OPTIONS\] ../cmake | + enable all packages compatible with MinGW compilers :tb(c=2,s=|,a=l) NOTE: Running cmake this way manipulates the variable cache in your current build directory. You can combine multiple presets and options -with multiple cmake runs. +in a single cmake run, or change settings incrementally by running +cmake with new flags. [Example:] diff --git a/doc/src/Build_settings.txt b/doc/src/Build_settings.txt index f1db9f0130..287cd39ff6 100644 --- a/doc/src/Build_settings.txt +++ b/doc/src/Build_settings.txt @@ -57,10 +57,10 @@ FFT_INC = -DFFT_SINGLE # do not specify for double precision FFT_INC = -DFFT_PACK_ARRAY # or -DFFT_PACK_POINTER or -DFFT_PACK_MEMCPY :pre # default is FFT_PACK_ARRAY if not specified -FFT_INC = -I/usr/local/include +FFT_INC = -I/usr/local/include FFT_PATH = -L/usr/local/lib -FFT_LIB = -lfftw3 # FFTW3 double precision -FFT_LIB = -lfftw3 -lfftw3f # FFTW3 single precision +FFT_LIB = -lfftw3 # FFTW3 double precision +FFT_LIB = -lfftw3 -lfftw3f # FFTW3 single precision FFT_LIB = -lmkl_intel_lp64 -lmkl_sequential -lmkl_core # MKL with Intel compiler FFT_LIB = -lmkl_gf_lp64 -lmkl_sequential -lmkl_core # MKL with GNU compier :pre @@ -179,8 +179,11 @@ e.g. from 511 to -512, which can cause diagnostics like the mean-squared displacement, as calculated by the "compute msd"_compute_msd.html command, to be faulty. -Note that the USER-ATC package is not currently compatible with the -"bigbig" setting. +Note that the USER-ATC package and the USER-INTEL package are currently +not compatible with the "bigbig" setting. Also, there are limitations +when using the library interface. Some functions with known issues +have been replaced by dummy calls printing a corresponding error rather +than crashing randomly or corrupting data. Also note that the GPU package requires its lib/gpu library to be compiled with the same size setting, or the link will fail. A CMake From 978b52ee8c90a74ee316e3f9578d05ce2409a5fd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 15:06:56 -0400 Subject: [PATCH 227/243] add warning/status messages about skipping TBB malloc and MKL RNG --- cmake/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 39d1e4e382..dd693255a6 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1106,16 +1106,21 @@ if(PKG_USER-INTEL) list(APPEND LAMMPS_LINK_LIBS ${TBB_MALLOC_LIBRARIES}) else() add_definitions(-DLMP_INTEL_NO_TBB) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + message(WARNING "USER-INTEL with Intel compilers should use TBB malloc libraries") + endif() endif() find_package(MKL QUIET) if(MKL_FOUND) add_definitions(-DLMP_USE_MKL_RNG) list(APPEND LAMMPS_LINK_LIBS ${MKL_LIBRARIES}) + else() + message(STATUS "Pair style dpd/intel will be faster with MKL libraries") endif() if((NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "64") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "128") AND (NOT ${LAMMPS_MEMALIGN} STREQUAL "256")) - message(FATAL_ERROR "USER-INTEL only supports memory alignment of 64, 128 or 256") + message(FATAL_ERROR "USER-INTEL only supports memory alignment of 64, 128 or 256 on this platform") endif() if(INTEL_ARCH STREQUAL "KNL") From 34b023456b6c0b0f57ab7a7fb6d37e03eeee16f9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 15:28:48 -0400 Subject: [PATCH 228/243] add message about -DLAMMPS_BIGBIG incompatibility of scatter/gather functions --- doc/src/Howto_library.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_library.txt b/doc/src/Howto_library.txt index 40a8bf0a70..7bbf08a964 100644 --- a/doc/src/Howto_library.txt +++ b/doc/src/Howto_library.txt @@ -166,9 +166,6 @@ void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *) void lammps_scatter_atoms(void *, char *, int, int, void *) void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *) :pre -void lammps_create_atoms(void *, int, tagint *, int *, double *, double *, - imageint *, int) :pre - The gather functions collect peratom info of the requested type (atom coords, atom types, forces, etc) from all processors, and returns the same vector of values to each calling processor. The scatter @@ -176,6 +173,11 @@ functions do the inverse. They distribute a vector of peratom values, passed by all calling processors, to individual atoms, which may be owned by different processors. +IMPORTANT NOTE: These functions are not compatible with the +-DLAMMPS_BIGBIG setting when compiling LAMMPS. Dummy functions +that result in an error message and abort will be subsituted +instead of resulting in random crashes and memory corruption. + The lammps_gather_atoms() function does this for all N atoms in the system, ordered by atom ID, from 1 to N. The lammps_gather_atoms_concat() function does it for all N atoms, but @@ -196,6 +198,9 @@ those values to each atom in the system. The lammps_scatter_atoms_subset() function takes a subset of IDs as an argument and only scatters those values to the owning atoms. +void lammps_create_atoms(void *, int, tagint *, int *, double *, double *, + imageint *, int) :pre + The lammps_create_atoms() function takes a list of N atoms as input with atom types and coords (required), an optionally atom IDs and velocities and image flags. It uses the coords of each atom to assign From 365166fef0f0b898b61dbf6de818e8f4f2c804fd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 16:01:42 -0400 Subject: [PATCH 229/243] print warning messages about calls to self only once --- src/STUBS/mpi.c | 60 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/STUBS/mpi.c b/src/STUBS/mpi.c index 053108fee8..09bb48ecdc 100644 --- a/src/STUBS/mpi.c +++ b/src/STUBS/mpi.c @@ -200,7 +200,11 @@ int MPI_Request_free(MPI_Request *request) int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { - printf("MPI Stub WARNING: Should not send message to self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not send message to self\n"); + ++callcount; + } return 0; } @@ -209,7 +213,11 @@ int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request) { - printf("MPI Stub WARNING: Should not send message to self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not send message to self\n"); + ++callcount; + } return 0; } @@ -218,7 +226,11 @@ int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int MPI_Rsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { - printf("MPI Stub WARNING: Should not rsend message to self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not rsend message to self\n"); + ++callcount; + } return 0; } @@ -227,7 +239,11 @@ int MPI_Rsend(const void *buf, int count, MPI_Datatype datatype, int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) { - printf("MPI Stub WARNING: Should not recv message from self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not recv message from self\n"); + ++callcount; + } return 0; } @@ -236,7 +252,11 @@ int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request) { - printf("MPI Stub WARNING: Should not recv message from self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not recv message from self\n"); + ++callcount; + } return 0; } @@ -244,7 +264,11 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int MPI_Wait(MPI_Request *request, MPI_Status *status) { - printf("MPI Stub WARNING: Should not wait on message from self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not wait on message from self\n"); + ++callcount; + } return 0; } @@ -252,7 +276,11 @@ int MPI_Wait(MPI_Request *request, MPI_Status *status) int MPI_Waitall(int n, MPI_Request *request, MPI_Status *status) { - printf("MPI Stub WARNING: Should not wait on message from self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not wait on message from self\n"); + ++callcount; + } return 0; } @@ -261,7 +289,11 @@ int MPI_Waitall(int n, MPI_Request *request, MPI_Status *status) int MPI_Waitany(int count, MPI_Request *request, int *index, MPI_Status *status) { - printf("MPI Stub WARNING: Should not wait on message from self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not wait on message from self\n"); + ++callcount; + } return 0; } @@ -272,7 +304,11 @@ int MPI_Sendrecv(const void *sbuf, int scount, MPI_Datatype sdatatype, MPI_Datatype rdatatype, int source, int rtag, MPI_Comm comm, MPI_Status *status) { - printf("MPI Stub WARNING: Should not send message to self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not send message to self\n"); + ++callcount; + } return 0; } @@ -280,7 +316,11 @@ int MPI_Sendrecv(const void *sbuf, int scount, MPI_Datatype sdatatype, int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count) { - printf("MPI Stub WARNING: Should not get count of message to self\n"); + static int callcount=0; + if (callcount == 0) { + printf("MPI Stub WARNING: Should not get count of message to self\n"); + ++callcount; + } return 0; } From 4a003644feb7d7c9fb2fdd034803da7c364132f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 16:41:02 -0400 Subject: [PATCH 230/243] fix typo --- doc/src/Howto_library.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Howto_library.txt b/doc/src/Howto_library.txt index 7bbf08a964..7695fd59e2 100644 --- a/doc/src/Howto_library.txt +++ b/doc/src/Howto_library.txt @@ -175,7 +175,7 @@ owned by different processors. IMPORTANT NOTE: These functions are not compatible with the -DLAMMPS_BIGBIG setting when compiling LAMMPS. Dummy functions -that result in an error message and abort will be subsituted +that result in an error message and abort will be substiuted instead of resulting in random crashes and memory corruption. The lammps_gather_atoms() function does this for all N atoms in the From 6411ff8359cfbb1d05ec943bf86017ac119d6773 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 17:25:26 -0400 Subject: [PATCH 231/243] transfer MPI/OpenMP selection from LAMMPS to downloaded Plumed library configuration --- cmake/CMakeLists.txt | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index dd693255a6..59caf8ca9f 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -560,6 +560,20 @@ if(PKG_USER-PLUMED) option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" OFF) if(DOWNLOAD_PLUMED) + if(BUILD_MPI) + set(PLUMED_CONFIG_MPI "--enable-mpi") + set(PLUMED_CONFIG_CC ${CMAKE_MPI_C_COMPILER}) + set(PLUMED_CONFIG_CXX ${CMAKE_MPI_CXX_COMPILER}) + else() + set(PLUMED_CONFIG_MPI "--disable-mpi") + set(PLUMED_CONFIG_CC ${CMAKE_C_COMPILER}) + set(PLUMED_CONFIG_CXX ${CMAKE_CXX_COMPILER}) + endif() + if(BUILD_OMP) + set(PLUMED_CONFIG_OMP "--enable-openmp") + else() + set(PLUMED_CONFIG_OMP "--disable-openmp") + endif() message(STATUS "PLUMED download requested - we will build our own") include(ExternalProject) ExternalProject_Add(plumed_build @@ -568,9 +582,11 @@ if(PKG_USER-PLUMED) BUILD_IN_SOURCE 1 CONFIGURE_COMMAND /configure --prefix= ${CONFIGURE_REQUEST_PIC} - --enable-modules=all - CXX=${CMAKE_MPI_CXX_COMPILER} - CC=${CMAKE_MPI_C_COMPILER} + --enable-modules=all + ${PLUMED_CONFIG_MPI} + ${PLUMED_CONFIG_OMP} + CXX=${PLUMED_CONFIG_CXX} + CC=${PLUMED_CONFIG_CC} ) ExternalProject_get_property(plumed_build INSTALL_DIR) set(PLUMED_INSTALL_DIR ${INSTALL_DIR}) From bd923d8bd4c2b07a830fdd92b8cb50c41d4a799f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 17:33:35 -0400 Subject: [PATCH 232/243] fix second typo in the same word. i need a break... :-( --- doc/src/Howto_library.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Howto_library.txt b/doc/src/Howto_library.txt index 7695fd59e2..ba009cfad9 100644 --- a/doc/src/Howto_library.txt +++ b/doc/src/Howto_library.txt @@ -175,7 +175,7 @@ owned by different processors. IMPORTANT NOTE: These functions are not compatible with the -DLAMMPS_BIGBIG setting when compiling LAMMPS. Dummy functions -that result in an error message and abort will be substiuted +that result in an error message and abort will be substituted instead of resulting in random crashes and memory corruption. The lammps_gather_atoms() function does this for all N atoms in the From 778537e73490d8e6c53f4bc2dd5bd5addcbb0246 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 22:32:15 -0400 Subject: [PATCH 233/243] update micelle example for improved reproducibility --- examples/micelle/in.micelle | 4 +- examples/micelle/in.micelle-rigid | 87 ++++++ examples/micelle/log.28Feb2019.micelle.g++.1 | 259 ---------------- examples/micelle/log.28Feb2019.micelle.g++.4 | 259 ---------------- .../micelle/log.28Feb2019.micelle.rigid.g++.1 | 290 ------------------ .../micelle/log.28Feb2019.micelle.rigid.g++.4 | 290 ------------------ .../micelle/log.29Mar2019.micelle-rigid.g++.1 | 260 ++++++++++++++++ .../micelle/log.29Mar2019.micelle-rigid.g++.4 | 260 ++++++++++++++++ examples/micelle/log.29Mar2019.micelle.g++.1 | 218 +++++++++++++ examples/micelle/log.29Mar2019.micelle.g++.4 | 218 +++++++++++++ 10 files changed, 1045 insertions(+), 1100 deletions(-) create mode 100644 examples/micelle/in.micelle-rigid delete mode 100644 examples/micelle/log.28Feb2019.micelle.g++.1 delete mode 100644 examples/micelle/log.28Feb2019.micelle.g++.4 delete mode 100644 examples/micelle/log.28Feb2019.micelle.rigid.g++.1 delete mode 100644 examples/micelle/log.28Feb2019.micelle.rigid.g++.4 create mode 100644 examples/micelle/log.29Mar2019.micelle-rigid.g++.1 create mode 100644 examples/micelle/log.29Mar2019.micelle-rigid.g++.4 create mode 100644 examples/micelle/log.29Mar2019.micelle.g++.1 create mode 100644 examples/micelle/log.29Mar2019.micelle.g++.4 diff --git a/examples/micelle/in.micelle b/examples/micelle/in.micelle index 2abdd18734..34bc9ad359 100644 --- a/examples/micelle/in.micelle +++ b/examples/micelle/in.micelle @@ -58,7 +58,7 @@ pair_coeff 1 4 1.0 1.0 1.12246 pair_coeff 2 3 1.0 0.88 1.12246 pair_coeff 2 4 1.0 0.75 1.12246 -thermo 1000 +thermo 50 #dump 1 all atom 2000 dump.micelle @@ -69,4 +69,4 @@ thermo 1000 #dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 reset_timestep 0 -run 60000 +run 1000 diff --git a/examples/micelle/in.micelle-rigid b/examples/micelle/in.micelle-rigid new file mode 100644 index 0000000000..93cb2655f8 --- /dev/null +++ b/examples/micelle/in.micelle-rigid @@ -0,0 +1,87 @@ +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle +special_bonds fene + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 500 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 50 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +group solute subtract all solvent +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +fix 4 all enforce2d +run 500 +unfix 2 +unfix 4 +unfix 5 +fix 5 solute rigid/small molecule +fix 4 all enforce2d +run 500 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.1 b/examples/micelle/log.28Feb2019.micelle.g++.1 deleted file mode 100644 index c2bbc7cde4..0000000000 --- a/examples/micelle/log.28Feb2019.micelle.g++.1 +++ /dev/null @@ -1,259 +0,0 @@ -LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors - special bonds CPU = 0.000394821 secs - read_data CPU = 0.00212336 secs -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - special bonds CPU = 0.00018549 secs - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.113919 on 1 procs for 1000 steps with 1200 atoms - -Performance: 3792167.464 tau/day, 8778.165 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.076825 | 0.076825 | 0.076825 | 0.0 | 67.44 -Bond | 0.0041864 | 0.0041864 | 0.0041864 | 0.0 | 3.67 -Neigh | 0.017061 | 0.017061 | 0.017061 | 0.0 | 14.98 -Comm | 0.0019042 | 0.0019042 | 0.0019042 | 0.0 | 1.67 -Output | 0.00017285 | 0.00017285 | 0.00017285 | 0.0 | 0.15 -Modify | 0.011218 | 0.011218 | 0.011218 | 0.0 | 9.85 -Other | | 0.002551 | | | 2.24 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 195 ave 195 max 195 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3136 ave 3136 max 3136 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -run 60000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.024 | 4.024 | 4.024 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 - 1000 0.45 -1.9727644 0.05860769 -1.4645317 1.9982326 - 2000 0.46143408 -1.9889684 0.058103225 -1.4698156 1.7806269 - 3000 0.44459291 -1.9997961 0.068724164 -1.4868496 1.4369618 - 4000 0.46939549 -2.0330437 0.073499424 -1.4905399 1.3780016 - 5000 0.44411088 -2.0339936 0.05862049 -1.5316323 1.2544164 - 6000 0.44034597 -2.0265475 0.066481992 -1.5200864 1.2362891 - 7000 0.45097378 -2.0331083 0.058467565 -1.5240428 1.2762333 - 8000 0.45797632 -2.0330255 0.060048036 -1.5153828 1.3862396 - 9000 0.45297811 -2.0383417 0.067056519 -1.5186845 1.2762554 - 10000 0.45 -2.0628269 0.065650067 -1.5475518 1.0566213 - 11000 0.44466757 -2.0593977 0.06190999 -1.5531907 1.1452469 - 12000 0.46743534 -2.0684295 0.061056278 -1.5403274 1.0824225 - 13000 0.45601091 -2.0689708 0.054868536 -1.5584713 0.96703283 - 14000 0.44111882 -2.0553174 0.058249816 -1.5563164 1.0986427 - 15000 0.43894405 -2.0866829 0.064117804 -1.5839869 0.90031836 - 16000 0.43856814 -2.0879319 0.056024166 -1.593705 0.96387323 - 17000 0.45977841 -2.103188 0.058097306 -1.5856955 0.83352919 - 18000 0.43423341 -2.0813151 0.066623991 -1.5808196 0.98157638 - 19000 0.44245939 -2.0851261 0.057637655 -1.5853978 0.84228341 - 20000 0.43144678 -2.0895403 0.06536727 -1.5930858 0.88177768 - 21000 0.45014968 -2.106686 0.059137572 -1.5977739 0.89408935 - 22000 0.4575126 -2.1024115 0.063013023 -1.5822672 0.84886734 - 23000 0.45 -2.10897 0.06724784 -1.5920971 0.66205013 - 24000 0.43055602 -2.0894725 0.061566464 -1.5977089 0.81764789 - 25000 0.4366384 -2.0926743 0.059609321 -1.5967905 0.85549875 - 26000 0.4521714 -2.0963996 0.062031863 -1.5825731 0.80137118 - 27000 0.45734834 -2.1060987 0.061712636 -1.5874188 0.82899415 - 28000 0.44803467 -2.0859226 0.061871856 -1.5763894 0.97007526 - 29000 0.45 -2.1106243 0.063825481 -1.5971738 0.63798376 - 30000 0.44932806 -2.1006036 0.053053934 -1.598596 0.63907113 - 31000 0.44713779 -2.1096164 0.066470416 -1.5963808 0.66832708 - 32000 0.4373357 -2.0941237 0.058871613 -1.5982808 0.78176106 - 33000 0.44030485 -2.105644 0.058804306 -1.6069017 0.66286458 - 34000 0.43781175 -2.1233209 0.064611206 -1.6212628 0.56342584 - 35000 0.45670132 -2.1059408 0.053049584 -1.5965705 0.73992396 - 36000 0.45555427 -2.1149877 0.057627709 -1.6021854 0.85854939 - 37000 0.44134236 -2.1106202 0.064444306 -1.6052013 0.74674603 - 38000 0.44812623 -2.1003681 0.057266258 -1.5953491 0.78239359 - 39000 0.44167062 -2.11141 0.055354 -1.6147534 0.7066385 - 40000 0.46103176 -2.1166687 0.062155412 -1.5938657 0.73620955 - 41000 0.44537102 -2.0993898 0.05631213 -1.5980778 0.87348756 - 42000 0.44752506 -2.1115212 0.057506521 -1.6068625 0.72999561 - 43000 0.4483886 -2.1184719 0.066943915 -1.6035131 0.78112063 - 44000 0.45944897 -2.0916657 0.055242781 -1.5773568 0.98660473 - 45000 0.46238513 -2.1163075 0.0530031 -1.6013046 0.74416054 - 46000 0.45979064 -2.1165545 0.060657581 -1.5964895 0.63516974 - 47000 0.45936546 -2.1140678 0.049931919 -1.6051532 0.76425182 - 48000 0.45424613 -2.1122681 0.061885599 -1.5965149 0.71981142 - 49000 0.44449524 -2.1147361 0.06626748 -1.6043438 0.78720467 - 50000 0.4641185 -2.1114668 0.055104874 -1.5926302 0.70195865 - 51000 0.44220655 -2.1075773 0.0589109 -1.6068283 0.73806859 - 52000 0.43097906 -2.1189493 0.061502241 -1.6268271 0.69622593 - 53000 0.45 -2.137688 0.053631829 -1.6344311 0.48269158 - 54000 0.43777118 -2.1089246 0.047098534 -1.6244197 0.70423814 - 55000 0.46061985 -2.1129502 0.062520353 -1.5901938 0.72492307 - 56000 0.4524841 -2.1195648 0.06580089 -1.6016569 0.52709892 - 57000 0.44914574 -2.1041993 0.061040876 -1.594387 0.7979988 - 58000 0.46446286 -2.1181238 0.055741995 -1.598306 0.51009146 - 59000 0.4632674 -2.1169321 0.050672678 -1.6033781 0.83110911 - 60000 0.46340478 -2.122846 0.058485209 -1.6013422 0.69966471 -Loop time of 8.01683 on 1 procs for 60000 steps with 1200 atoms - -Performance: 3233199.903 tau/day, 7484.259 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 5.4027 | 5.4027 | 5.4027 | 0.0 | 67.39 -Bond | 0.23585 | 0.23585 | 0.23585 | 0.0 | 2.94 -Neigh | 1.5188 | 1.5188 | 1.5188 | 0.0 | 18.95 -Comm | 0.14452 | 0.14452 | 0.14452 | 0.0 | 1.80 -Output | 0.00060487 | 0.00060487 | 0.00060487 | 0.0 | 0.01 -Modify | 0.56352 | 0.56352 | 0.56352 | 0.0 | 7.03 -Other | | 0.1508 | | | 1.88 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 395 ave 395 max 395 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 9652 ave 9652 max 9652 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 9652 -Ave neighs/atom = 8.04333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 4886 -Dangerous builds = 0 -Total wall time: 0:00:08 diff --git a/examples/micelle/log.28Feb2019.micelle.g++.4 b/examples/micelle/log.28Feb2019.micelle.g++.4 deleted file mode 100644 index 6af9051ed2..0000000000 --- a/examples/micelle/log.28Feb2019.micelle.g++.4 +++ /dev/null @@ -1,259 +0,0 @@ -LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 2 by 2 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors - special bonds CPU = 0.000130415 secs - read_data CPU = 0.00132132 secs -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - special bonds CPU = 4.76837e-05 secs - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.0377742 on 4 procs for 1000 steps with 1200 atoms - -Performance: 11436375.633 tau/day, 26473.092 timesteps/s -96.6% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.016871 | 0.017299 | 0.018185 | 0.4 | 45.80 -Bond | 0.0010128 | 0.0010633 | 0.001116 | 0.1 | 2.81 -Neigh | 0.004832 | 0.0048565 | 0.0048807 | 0.0 | 12.86 -Comm | 0.0066509 | 0.0077528 | 0.0084352 | 0.8 | 20.52 -Output | 0.00022054 | 0.00028259 | 0.00046587 | 0.0 | 0.75 -Modify | 0.0035386 | 0.0036086 | 0.0036943 | 0.1 | 9.55 -Other | | 0.002912 | | | 7.71 - -Nlocal: 300 ave 305 max 292 min -Histogram: 1 0 0 0 0 0 1 0 1 1 -Nghost: 100.25 ave 108 max 93 min -Histogram: 1 0 1 0 0 0 1 0 0 1 -Neighs: 784 ave 815 max 739 min -Histogram: 1 0 0 0 0 0 1 1 0 1 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -run 60000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.032 | 4.124 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 - 1000 0.45 -1.9727652 0.058608073 -1.4645321 1.9982444 - 2000 0.44428815 -1.9902282 0.064240544 -1.4820698 1.7051263 - 3000 0.46641766 -1.9856844 0.065017468 -1.4546379 1.6939772 - 4000 0.45734058 -2.0242583 0.070494626 -1.4968042 1.3474276 - 5000 0.44904747 -2.0086954 0.058801142 -1.501221 1.4632351 - 6000 0.44961405 -2.0334509 0.05721299 -1.5269985 1.3093586 - 7000 0.45474928 -2.0453645 0.064725006 -1.5262692 1.1581035 - 8000 0.44274767 -2.0375379 0.062216035 -1.5329431 1.312914 - 9000 0.46176571 -2.0473031 0.065581966 -1.5203402 1.2013868 - 10000 0.45046977 -2.0540466 0.065402724 -1.5385495 0.95819581 - 11000 0.45016671 -2.0610028 0.056993955 -1.5542172 1.0433435 - 12000 0.43823039 -2.073155 0.065171939 -1.5701178 1.1400059 - 13000 0.44482161 -2.0678338 0.063901045 -1.5594819 0.97993813 - 14000 0.45 -2.0892562 0.061753632 -1.5778776 0.89841778 - 15000 0.44328626 -2.0859346 0.059956258 -1.5830615 0.90664821 - 16000 0.45666508 -2.0859262 0.059582346 -1.5700593 0.9702235 - 17000 0.44832038 -2.0762124 0.059153394 -1.5691122 0.93020504 - 18000 0.4555831 -2.0844959 0.057986324 -1.5713062 0.87398232 - 19000 0.45257867 -2.0671736 0.062190389 -1.5527816 0.89208496 - 20000 0.44010419 -2.1020944 0.062053708 -1.6003033 0.84140973 - 21000 0.45239369 -2.0820308 0.060981799 -1.5690323 0.98502522 - 22000 0.44607468 -2.0820602 0.051731316 -1.5846259 0.86120529 - 23000 0.45088473 -2.0865286 0.05727778 -1.5787418 1.1479844 - 24000 0.45526919 -2.1086678 0.057378327 -1.5963997 0.86944138 - 25000 0.46536624 -2.1055425 0.05665328 -1.5839108 0.72895438 - 26000 0.46716668 -2.1035267 0.057498747 -1.5792505 0.85105386 - 27000 0.44374699 -2.0932213 0.060937242 -1.5889069 0.93200759 - 28000 0.45944001 -2.0968869 0.053052954 -1.5847768 0.78909249 - 29000 0.4543632 -2.10493 0.061511018 -1.5894345 0.85862527 - 30000 0.44987776 -2.0942536 0.062431086 -1.5823197 0.7349894 - 31000 0.43829016 -2.0951259 0.060245682 -1.5969553 0.86702973 - 32000 0.45416601 -2.0991679 0.055978905 -1.5894015 0.75777153 - 33000 0.4605079 -2.1118364 0.058205688 -1.5935066 0.86041104 - 34000 0.43638213 -2.0925345 0.067533519 -1.5889825 0.85100425 - 35000 0.46912252 -2.1082718 0.051646432 -1.5878938 0.73613751 - 36000 0.45 -2.0966442 0.052507159 -1.5945121 0.88722487 - 37000 0.44970507 -2.1029685 0.065454263 -1.588184 0.76033821 - 38000 0.44910233 -2.097751 0.05767009 -1.5913528 0.95830923 - 39000 0.4322161 -2.1060426 0.062453704 -1.611733 0.74681695 - 40000 0.46143858 -2.1328575 0.057333011 -1.6144704 0.58326322 - 41000 0.43180549 -2.1070656 0.064150563 -1.6114694 0.82842684 - 42000 0.46738909 -2.1067947 0.058017036 -1.5817781 0.73292362 - 43000 0.43699124 -2.1171964 0.062817262 -1.6177521 0.73354741 - 44000 0.45262916 -2.1281307 0.055228619 -1.6206502 0.64167946 - 45000 0.43905419 -2.088789 0.055597999 -1.5945027 0.8002542 - 46000 0.44485569 -2.1035061 0.067828181 -1.5911929 0.71861494 - 47000 0.44496824 -2.0968296 0.0632326 -1.5889996 0.75202899 - 48000 0.46567244 -2.1235948 0.061032118 -1.5972783 0.64094556 - 49000 0.43202506 -2.0986097 0.053464022 -1.6134806 0.83857984 - 50000 0.45454698 -2.1263344 0.058119708 -1.6140465 0.67030037 - 51000 0.43702766 -2.1292347 0.074047424 -1.6185238 0.52896462 - 52000 0.46367081 -2.1177288 0.06726625 -1.5871781 0.74343227 - 53000 0.45 -2.1341074 0.062769314 -1.6217131 0.51130365 - 54000 0.44862492 -2.1272108 0.057723381 -1.6212364 0.54735429 - 55000 0.44926027 -2.1350444 0.066186625 -1.6199719 0.66821299 - 56000 0.4544227 -2.1325537 0.065298628 -1.6132111 0.63597556 - 57000 0.45697003 -2.1323238 0.053312855 -1.6224218 0.55572633 - 58000 0.45698902 -2.1043208 0.055835989 -1.5918766 0.63502658 - 59000 0.4425306 -2.1120353 0.056617261 -1.6132563 0.65681272 - 60000 0.44319296 -2.1171981 0.058330294 -1.6160442 0.63602511 -Loop time of 2.63918 on 4 procs for 60000 steps with 1200 atoms - -Performance: 9821248.084 tau/day, 22734.371 timesteps/s -97.3% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.1742 | 1.278 | 1.3471 | 5.9 | 48.43 -Bond | 0.046621 | 0.06565 | 0.081322 | 5.1 | 2.49 -Neigh | 0.46642 | 0.46917 | 0.47105 | 0.3 | 17.78 -Comm | 0.47295 | 0.55928 | 0.67758 | 10.5 | 21.19 -Output | 0.00073624 | 0.00173 | 0.0047016 | 4.1 | 0.07 -Modify | 0.14511 | 0.15226 | 0.15887 | 1.5 | 5.77 -Other | | 0.1131 | | | 4.28 - -Nlocal: 300 ave 309 max 281 min -Histogram: 1 0 0 0 0 0 0 1 0 2 -Nghost: 232.75 ave 234 max 231 min -Histogram: 1 0 0 1 0 0 0 0 0 2 -Neighs: 2450.25 ave 2576 max 2179 min -Histogram: 1 0 0 0 0 0 0 0 1 2 - -Total # of neighbors = 9801 -Ave neighs/atom = 8.1675 -Ave special neighs/atom = 0.5 -Neighbor list builds = 4887 -Dangerous builds = 0 -Total wall time: 0:00:02 diff --git a/examples/micelle/log.28Feb2019.micelle.rigid.g++.1 b/examples/micelle/log.28Feb2019.micelle.rigid.g++.1 deleted file mode 100644 index ec0079818d..0000000000 --- a/examples/micelle/log.28Feb2019.micelle.rigid.g++.1 +++ /dev/null @@ -1,290 +0,0 @@ -LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors - special bonds CPU = 0.000271559 secs - read_data CPU = 0.00115585 secs -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - special bonds CPU = 8.39233e-05 secs - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.107201 on 1 procs for 1000 steps with 1200 atoms - -Performance: 4029800.456 tau/day, 9328.242 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.072035 | 0.072035 | 0.072035 | 0.0 | 67.20 -Bond | 0.0039918 | 0.0039918 | 0.0039918 | 0.0 | 3.72 -Neigh | 0.016078 | 0.016078 | 0.016078 | 0.0 | 15.00 -Comm | 0.0018375 | 0.0018375 | 0.0018375 | 0.0 | 1.71 -Output | 0.00016379 | 0.00016379 | 0.00016379 | 0.0 | 0.15 -Modify | 0.010665 | 0.010665 | 0.010665 | 0.0 | 9.95 -Other | | 0.002429 | | | 2.27 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 195 ave 195 max 195 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3136 ave 3136 max 3136 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -group solvent molecule 0 -750 atoms in group solvent -group solute subtract all solvent -450 atoms in group solute -unfix 1 -unfix 2 -unfix 4 -fix 1 solvent nve -fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 -fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 -150 rigid bodies with 450 atoms -fix 4 all enforce2d -run 20000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 5.274 | 5.274 | 5.274 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.44603578 -1.7056163 0.08808163 -1.2555023 3.4039736 - 1000 0.46008168 -1.9040837 0.08808163 -1.4425691 0.93225457 - 2000 0.44520658 -1.9317253 0.08808163 -1.4822843 3.8192896 - 3000 0.43988556 -1.945898 0.08808163 -1.5007759 3.0371634 - 4000 0.4646519 -1.9753553 0.08808163 -1.5101312 -1.8041178 - 5000 0.4362993 -1.9763715 0.08808163 -1.5341603 1.5037284 - 6000 0.47007384 -1.9833154 0.08808163 -1.5136905 2.1227653 - 7000 0.44854623 -1.9914288 0.08808163 -1.5392772 3.9458099 - 8000 0.43841372 -1.9779603 0.08808163 -1.5340328 -4.5429769 - 9000 0.4518303 -1.9834387 0.08808163 -1.5286215 4.4230447 - 10000 0.43562904 -2.001471 0.08808163 -1.5598038 1.8919582 - 11000 0.44014575 -1.9820611 0.08808163 -1.5367278 -2.1189418 - 12000 0.44466956 -2.0134014 0.08808163 -1.5643963 -2.5218497 - 13000 0.45274369 -2.021443 0.08808163 -1.5658844 2.4795173 - 14000 0.44742645 -2.011108 0.08808163 -1.5598653 -0.74697767 - 15000 0.4674843 -2.024737 0.08808163 -1.5572139 -1.9539999 - 16000 0.45610154 -2.0401029 0.08808163 -1.5818189 -0.53082066 - 17000 0.44679292 -2.0365577 0.08808163 -1.5858291 -6.5040295 - 18000 0.44279107 -2.0500326 0.08808163 -1.6025522 -0.051597102 - 19000 0.45603993 -2.0306289 0.08808163 -1.5723948 1.0986608 - 20000 0.44519606 -2.0412229 0.08808163 -1.5917904 -1.0406746 -Loop time of 3.68102 on 1 procs for 20000 steps with 1200 atoms - -Performance: 2347175.802 tau/day, 5433.277 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.7349 | 1.7349 | 1.7349 | 0.0 | 47.13 -Bond | 0.079483 | 0.079483 | 0.079483 | 0.0 | 2.16 -Neigh | 0.49063 | 0.49063 | 0.49063 | 0.0 | 13.33 -Comm | 0.049093 | 0.049093 | 0.049093 | 0.0 | 1.33 -Output | 0.00022578 | 0.00022578 | 0.00022578 | 0.0 | 0.01 -Modify | 1.273 | 1.273 | 1.273 | 0.0 | 34.58 -Other | | 0.05369 | | | 1.46 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 395 ave 395 max 395 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 8915 ave 8915 max 8915 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 8915 -Ave neighs/atom = 7.42917 -Ave special neighs/atom = 0.5 -Neighbor list builds = 1580 -Dangerous builds = 0 -unfix 5 -unfix 4 -fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 - create bodies CPU = 0.00012517 secs -150 rigid bodies with 450 atoms - 1.04536 = max distance from body owner to body atom -fix 4 all enforce2d -run 20000 -Per MPI rank memory allocation (min/avg/max) = 8.633 | 8.633 | 8.633 Mbytes -Step Temp E_pair E_mol TotEng Press - 20000 0.44519606 -2.0412229 0.08808163 -1.5917904 1.3058893 - 21000 0.4353376 -2.0483342 0.08808163 -1.6069035 0.53023317 - 22000 0.44034324 -2.0416876 0.08808163 -1.5961941 4.0327077 - 23000 0.4685403 -2.05295 0.08808163 -1.5845698 3.6792349 - 24000 0.44872075 -2.0320623 0.08808163 -1.579769 -2.0476923 - 25000 0.46829594 -2.0671408 0.08808163 -1.5989589 2.180811 - 26000 0.45257544 -2.0418792 0.08808163 -1.5864572 3.3924018 - 27000 0.44269664 -2.0409905 0.08808163 -1.5935868 -0.17012673 - 28000 0.46961216 -2.0552479 0.08808163 -1.5859978 -7.2870888 - 29000 0.46683129 -2.0438334 0.08808163 -1.5768404 3.0583141 - 30000 0.44262228 -2.036737 0.08808163 -1.5893937 0.087520915 - 31000 0.43517227 -2.0479672 0.08808163 -1.6066708 -0.3426009 - 32000 0.44543779 -2.0538031 0.08808163 -1.6041744 -0.2093148 - 33000 0.44629079 -2.0409901 0.08808163 -1.5906691 3.310113 - 34000 0.43058831 -2.0713827 0.08808163 -1.6338069 0.14128843 - 35000 0.44546512 -2.0427068 0.08808163 -1.593056 -3.1386697 - 36000 0.42971129 -2.0527435 0.08808163 -1.6158795 -2.7334963 - 37000 0.44707969 -2.0461803 0.08808163 -1.595219 -3.8777678 - 38000 0.43150818 -2.0435276 0.08808163 -1.6052052 0.2905487 - 39000 0.44463343 -2.0522113 0.08808163 -1.6032355 3.543123 - 40000 0.44582593 -2.052213 0.08808163 -1.6022693 1.1486536 -Loop time of 3.69012 on 1 procs for 20000 steps with 1200 atoms - -Performance: 2341388.948 tau/day, 5419.882 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.756 | 1.756 | 1.756 | 0.0 | 47.59 -Bond | 0.079221 | 0.079221 | 0.079221 | 0.0 | 2.15 -Neigh | 0.49085 | 0.49085 | 0.49085 | 0.0 | 13.30 -Comm | 0.048317 | 0.048317 | 0.048317 | 0.0 | 1.31 -Output | 0.0002315 | 0.0002315 | 0.0002315 | 0.0 | 0.01 -Modify | 1.2616 | 1.2616 | 1.2616 | 0.0 | 34.19 -Other | | 0.05386 | | | 1.46 - -Nlocal: 1200 ave 1200 max 1200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 393 ave 393 max 393 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 9091 ave 9091 max 9091 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 9091 -Ave neighs/atom = 7.57583 -Ave special neighs/atom = 0.5 -Neighbor list builds = 1582 -Dangerous builds = 0 -Total wall time: 0:00:07 diff --git a/examples/micelle/log.28Feb2019.micelle.rigid.g++.4 b/examples/micelle/log.28Feb2019.micelle.rigid.g++.4 deleted file mode 100644 index a6687a3c00..0000000000 --- a/examples/micelle/log.28Feb2019.micelle.rigid.g++.4 +++ /dev/null @@ -1,290 +0,0 @@ -LAMMPS (28 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) - using 1 OpenMP thread(s) per MPI task -# 2d micelle simulation - -dimension 2 - -neighbor 0.3 bin -neigh_modify delay 5 - -atom_style bond - -# Soft potential push-off - -read_data data.micelle - orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) - 2 by 2 by 1 MPI processor grid - reading atoms ... - 1200 atoms - scanning bonds ... - 1 = max bonds/atom - reading bonds ... - 300 bonds - 2 = max # of 1-2 neighbors - 1 = max # of 1-3 neighbors - 1 = max # of 1-4 neighbors - 2 = max # of special neighbors - special bonds CPU = 0.000175714 secs - read_data CPU = 0.00145626 secs -special_bonds fene - 2 = max # of 1-2 neighbors - 2 = max # of special neighbors - special bonds CPU = 7.22408e-05 secs - -pair_style soft 1.12246 -pair_coeff * * 0.0 1.12246 - -bond_style harmonic -bond_coeff 1 50.0 0.75 - -velocity all create 0.45 2349852 - -variable prefactor equal ramp(1.0,20.0) - -fix 1 all nve -fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 -fix 3 all adapt 1 pair soft a * * v_prefactor -fix 4 all enforce2d - -thermo 50 -run 1000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.42246 - ghost atom cutoff = 1.42246 - binsize = 0.71123, bins = 51 51 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair soft, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 - 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 - 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 - 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 - 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 - 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 - 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 - 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 - 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 - 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 - 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 - 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 - 600 0.45 0.58193041 0.088386617 1.119942 5.131481 - 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 - 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 - 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 - 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 - 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 - 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 - 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 - 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 -Loop time of 0.0389124 on 4 procs for 1000 steps with 1200 atoms - -Performance: 11101855.138 tau/day, 25698.739 timesteps/s -95.7% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.016776 | 0.017405 | 0.018435 | 0.5 | 44.73 -Bond | 0.0010033 | 0.0011995 | 0.0015519 | 0.6 | 3.08 -Neigh | 0.0044944 | 0.0045093 | 0.0045218 | 0.0 | 11.59 -Comm | 0.0080328 | 0.0093863 | 0.010242 | 0.9 | 24.12 -Output | 0.00021577 | 0.00027579 | 0.00045323 | 0.0 | 0.71 -Modify | 0.0034575 | 0.0036355 | 0.0040002 | 0.4 | 9.34 -Other | | 0.002501 | | | 6.43 - -Nlocal: 300 ave 305 max 292 min -Histogram: 1 0 0 0 0 0 1 0 1 1 -Nghost: 100.25 ave 108 max 93 min -Histogram: 1 0 1 0 0 0 1 0 0 1 -Neighs: 784 ave 815 max 739 min -Histogram: 1 0 0 0 0 0 1 1 0 1 - -Total # of neighbors = 3136 -Ave neighs/atom = 2.61333 -Ave special neighs/atom = 0.5 -Neighbor list builds = 92 -Dangerous builds = 0 - -unfix 3 - -# Main run - -pair_style lj/cut 2.5 - -# solvent/head - full-size and long-range - -pair_coeff 1 1 1.0 1.0 2.5 -pair_coeff 2 2 1.0 1.0 2.5 -pair_coeff 1 2 1.0 1.0 2.5 - -# tail/tail - size-averaged and long-range - -pair_coeff 3 3 1.0 0.75 2.5 -pair_coeff 4 4 1.0 0.50 2.5 -pair_coeff 3 4 1.0 0.67 2.5 - -# solvent/tail - full-size and repulsive - -pair_coeff 1 3 1.0 1.0 1.12246 -pair_coeff 1 4 1.0 1.0 1.12246 - -# head/tail - size-averaged and repulsive - -pair_coeff 2 3 1.0 0.88 1.12246 -pair_coeff 2 4 1.0 0.75 1.12246 - -thermo 1000 - -#dump 1 all atom 2000 dump.micelle - -#dump 2 all image 2000 image.*.jpg type type zoom 1.6 -#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -#dump 3 all movie 2000 movie.mpg type type zoom 1.6 -#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 - -reset_timestep 0 -group solvent molecule 0 -750 atoms in group solvent -group solute subtract all solvent -450 atoms in group solute -unfix 1 -unfix 2 -unfix 4 -fix 1 solvent nve -fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 -fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 -150 rigid bodies with 450 atoms -fix 4 all enforce2d -run 20000 -Neighbor list info ... - update every 1 steps, delay 5 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 26 26 1 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 5.251 | 5.282 | 5.374 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0.44603578 -1.7056163 0.08808163 -1.2555023 3.4039736 - 1000 0.46008163 -1.9040835 0.08808163 -1.4425689 0.93225869 - 2000 0.44943348 -1.9355135 0.08808163 -1.4826417 3.8399671 - 3000 0.4448437 -1.9480307 0.08808163 -1.4988842 2.5506553 - 4000 0.46013872 -1.9783821 0.08808163 -1.5168212 -1.8963215 - 5000 0.45520233 -1.9659462 0.08808163 -1.5083921 1.9238897 - 6000 0.44942049 -1.9663403 0.08808163 -1.513479 3.0633512 - 7000 0.45975758 -1.988462 0.08808163 -1.5272105 4.8267309 - 8000 0.45125238 -1.9913522 0.08808163 -1.5370041 -4.6644852 - 9000 0.45863606 -1.9792375 0.08808163 -1.5188962 4.3655071 - 10000 0.46264541 -1.9864611 0.08808163 -1.5228656 2.2176464 - 11000 0.45048361 -1.9907235 0.08808163 -1.5369994 -0.055360699 - 12000 0.44536719 -2.012875 0.08808163 -1.5633037 -0.2583823 - 13000 0.44212663 -2.0060111 0.08808163 -1.55907 3.3616171 - 14000 0.44984353 -2.0335408 0.08808163 -1.5803361 -0.21585645 - 15000 0.44896672 -2.0385265 0.08808163 -1.5860335 -4.6186206 - 16000 0.46694997 -2.032795 0.08808163 -1.5657056 0.53443281 - 17000 0.43208201 -2.0272255 0.08808163 -1.5884373 -6.5239975 - 18000 0.43281873 -2.0331268 0.08808163 -1.5937406 -0.048319943 - 19000 0.44704527 -2.0286742 0.08808163 -1.5777408 1.6356417 - 20000 0.44279735 -2.0443561 0.08808163 -1.5968706 -3.8337952 -Loop time of 1.71924 on 4 procs for 20000 steps with 1200 atoms - -Performance: 5025468.853 tau/day, 11633.030 timesteps/s -98.2% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.39864 | 0.40873 | 0.42192 | 1.6 | 23.77 -Bond | 0.02118 | 0.021816 | 0.022785 | 0.4 | 1.27 -Neigh | 0.13931 | 0.14031 | 0.14117 | 0.2 | 8.16 -Comm | 0.13974 | 0.15328 | 0.16884 | 3.3 | 8.92 -Output | 0.00026131 | 0.00044435 | 0.00099206 | 0.0 | 0.03 -Modify | 0.93275 | 0.94138 | 0.95072 | 0.7 | 54.76 -Other | | 0.05327 | | | 3.10 - -Nlocal: 300 ave 303 max 298 min -Histogram: 1 0 1 0 1 0 0 0 0 1 -Nghost: 218.5 ave 226 max 215 min -Histogram: 2 1 0 0 0 0 0 0 0 1 -Neighs: 2258.75 ave 2283 max 2216 min -Histogram: 1 0 0 0 0 0 1 0 1 1 - -Total # of neighbors = 9035 -Ave neighs/atom = 7.52917 -Ave special neighs/atom = 0.5 -Neighbor list builds = 1580 -Dangerous builds = 0 -unfix 5 -unfix 4 -fix 5 solute rigid/small molecule langevin 0.45 0.45 0.5 112211 - create bodies CPU = 5.43594e-05 secs -150 rigid bodies with 450 atoms - 0.916597 = max distance from body owner to body atom -fix 4 all enforce2d -run 20000 -Per MPI rank memory allocation (min/avg/max) = 8.568 | 8.6 | 8.691 Mbytes -Step Temp E_pair E_mol TotEng Press - 20000 0.44279735 -2.0443561 0.08808163 -1.5968706 -1.033643 - 21000 0.4529129 -2.049461 0.08808163 -1.5937651 0.93160285 - 22000 0.45039188 -2.0530092 0.08808163 -1.5993595 -0.10608965 - 23000 0.45261583 -2.0336042 0.08808163 -1.5781494 -2.5769871 - 24000 0.4608331 -2.0404645 0.08808163 -1.57834 3.1931675 - 25000 0.43479001 -2.0617104 0.08808163 -1.6207242 2.8190122 - 26000 0.47009651 -2.0754873 0.08808163 -1.605844 -0.9158501 - 27000 0.45002704 -2.0782104 0.08808163 -1.6248568 0.98629661 - 28000 0.45126136 -2.0592619 0.08808163 -1.6049065 0.03305448 - 29000 0.44355328 -2.0572858 0.08808163 -1.6091868 -6.0797989 - 30000 0.45053899 -2.0530953 0.08808163 -1.5993261 0.38382951 - 31000 0.46931923 -2.0718827 0.08808163 -1.6028703 2.2346891 - 32000 0.45348857 -2.0744024 0.08808163 -1.6182393 4.5028966 - 33000 0.44767742 -2.0597127 0.08808163 -1.6082662 -2.8021641 - 34000 0.45287544 -2.0857303 0.08808163 -1.6300648 -5.384091 - 35000 0.44743898 -2.0927246 0.08808163 -1.6414717 1.4800508 - 36000 0.45627028 -2.0720546 0.08808163 -1.6136336 -2.9961696 - 37000 0.4641334 -2.0701098 0.08808163 -1.6053065 8.4186854 - 38000 0.45922901 -2.0962331 0.08808163 -1.6354106 0.38361763 - 39000 0.4692834 -2.0573815 0.08808163 -1.5883982 -2.2177345 - 40000 0.46206931 -2.057851 0.08808163 -1.5947231 -1.0405727 -Loop time of 1.25476 on 4 procs for 20000 steps with 1200 atoms - -Performance: 6885775.862 tau/day, 15939.296 timesteps/s -98.1% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.40627 | 0.43037 | 0.45515 | 2.6 | 34.30 -Bond | 0.020504 | 0.021573 | 0.022739 | 0.5 | 1.72 -Neigh | 0.14337 | 0.14438 | 0.1453 | 0.2 | 11.51 -Comm | 0.13776 | 0.16647 | 0.19351 | 5.0 | 13.27 -Output | 0.00025082 | 0.00052994 | 0.0013635 | 0.0 | 0.04 -Modify | 0.45467 | 0.45822 | 0.46259 | 0.5 | 36.52 -Other | | 0.03321 | | | 2.65 - -Nlocal: 300 ave 304 max 293 min -Histogram: 1 0 0 0 0 1 0 0 0 2 -Nghost: 215.25 ave 217 max 213 min -Histogram: 1 0 0 0 0 1 0 1 0 1 -Neighs: 2340 ave 2378 max 2290 min -Histogram: 1 0 0 1 0 0 0 0 0 2 - -Total # of neighbors = 9360 -Ave neighs/atom = 7.8 -Ave special neighs/atom = 0.5 -Neighbor list builds = 1579 -Dangerous builds = 0 -Total wall time: 0:00:03 diff --git a/examples/micelle/log.29Mar2019.micelle-rigid.g++.1 b/examples/micelle/log.29Mar2019.micelle-rigid.g++.1 new file mode 100644 index 0000000000..f1001e6cea --- /dev/null +++ b/examples/micelle/log.29Mar2019.micelle-rigid.g++.1 @@ -0,0 +1,260 @@ +LAMMPS (29 Mar 2019) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000473022 secs + read_data CPU = 0.0024147 secs +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.00022316 secs + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 500 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.54981866 0.93548899 0.068440043 1.5532895 1.9232786 + 100 0.45 0.99659327 0.079228519 1.5254468 3.2135679 + 150 0.86965411 0.90456016 0.07493355 1.8484231 4.3821925 + 200 0.45 1.01454 0.10663502 1.5708 4.7598476 + 250 0.79636561 0.82567712 0.12105337 1.7424325 5.4983899 + 300 0.45 0.86475538 0.11819875 1.4325791 5.8554758 + 350 0.72135464 0.70693069 0.10912636 1.5368106 6.0388247 + 400 0.45 0.75067331 0.14165013 1.3419484 6.3840708 + 450 0.64839221 0.62402486 0.14173679 1.4136135 6.4791009 + 500 0.45 0.66669513 0.13695201 1.2532721 6.807146 +Loop time of 0.103162 on 1 procs for 500 steps with 1200 atoms + +Performance: 2093802.885 tau/day, 4846.766 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.068308 | 0.068308 | 0.068308 | 0.0 | 66.21 +Bond | 0.004235 | 0.004235 | 0.004235 | 0.0 | 4.11 +Neigh | 0.014069 | 0.014069 | 0.014069 | 0.0 | 13.64 +Comm | 0.0019219 | 0.0019219 | 0.0019219 | 0.0 | 1.86 +Output | 0.00017262 | 0.00017262 | 0.00017262 | 0.0 | 0.17 +Modify | 0.011728 | 0.011728 | 0.011728 | 0.0 | 11.37 +Other | | 0.002726 | | | 2.64 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 197 ave 197 max 197 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3094 ave 3094 max 3094 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3094 +Ave neighs/atom = 2.57833 +Ave special neighs/atom = 0.5 +Neighbor list builds = 52 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 50 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +750 atoms in group solvent +group solute subtract all solvent +450 atoms in group solute +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +150 rigid bodies with 450 atoms +fix 4 all enforce2d +run 500 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.274 | 5.274 | 5.274 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45318168 -1.3753652 0.13695201 -0.8705807 1.975423 + 50 0.77871641 -1.6955252 0.13695201 -0.92651507 0.64222539 + 100 0.5336062 -1.7124572 0.13695201 -1.1423948 -0.11959696 + 150 0.58789067 -1.7926109 0.13695201 -1.1784877 1.2592743 + 200 0.47864796 -1.8040298 0.13695201 -1.2785752 3.6739793 + 250 0.51124651 -1.8614797 0.13695201 -1.309566 2.5817722 + 300 0.45695639 -1.8708384 0.13695201 -1.3629901 3.0833794 + 350 0.477504 -1.8924359 0.13695201 -1.3679098 -5.1605926 + 400 0.45328205 -1.87754 0.13695201 -1.372674 -4.0355858 + 450 0.47465031 -1.9071924 0.13695201 -1.3849826 3.1949617 + 500 0.45533691 -1.9072316 0.13695201 -1.4006978 0.48079061 +Loop time of 0.178806 on 1 procs for 500 steps with 1200 atoms + +Performance: 1208012.705 tau/day, 2796.326 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.086131 | 0.086131 | 0.086131 | 0.0 | 48.17 +Bond | 0.0042472 | 0.0042472 | 0.0042472 | 0.0 | 2.38 +Neigh | 0.021317 | 0.021317 | 0.021317 | 0.0 | 11.92 +Comm | 0.0025985 | 0.0025985 | 0.0025985 | 0.0 | 1.45 +Output | 0.000175 | 0.000175 | 0.000175 | 0.0 | 0.10 +Modify | 0.061408 | 0.061408 | 0.061408 | 0.0 | 34.34 +Other | | 0.00293 | | | 1.64 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 416 ave 416 max 416 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 8769 ave 8769 max 8769 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 8769 +Ave neighs/atom = 7.3075 +Ave special neighs/atom = 0.5 +Neighbor list builds = 47 +Dangerous builds = 2 +unfix 2 +unfix 4 +unfix 5 +fix 5 solute rigid/small molecule + create bodies CPU = 0.00015378 secs +150 rigid bodies with 450 atoms + 1.30435 = max distance from body owner to body atom +fix 4 all enforce2d +run 500 +Per MPI rank memory allocation (min/avg/max) = 8.64 | 8.64 | 8.64 Mbytes +Step Temp E_pair E_mol TotEng Press + 500 0.45533691 -1.9072316 0.13695201 -1.4006978 2.4545793 + 550 0.45627282 -1.912409 0.13695201 -1.4051155 2.1845065 + 600 0.44734553 -1.8890695 0.13695201 -1.389022 2.3458965 + 650 0.46444648 -1.9042462 0.13695201 -1.3903185 2.1609319 + 700 0.47113236 -1.8977576 0.13695201 -1.3784032 2.2420351 + 750 0.48554548 -1.9253545 0.13695201 -1.3943015 2.143907 + 800 0.46350091 -1.8865749 0.13695201 -1.3734146 2.294431 + 850 0.4766104 -1.9094039 0.13695201 -1.3856031 2.2077157 + 900 0.48988467 -1.9051538 0.13695201 -1.3705787 2.0107056 + 950 0.48351943 -1.9162485 0.13695201 -1.3868399 2.1891332 + 1000 0.49033701 -1.9115165 0.13695201 -1.3765742 2.1508141 +Loop time of 0.166502 on 1 procs for 500 steps with 1200 atoms + +Performance: 1297278.008 tau/day, 3002.958 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.085767 | 0.085767 | 0.085767 | 0.0 | 51.51 +Bond | 0.0042562 | 0.0042562 | 0.0042562 | 0.0 | 2.56 +Neigh | 0.018039 | 0.018039 | 0.018039 | 0.0 | 10.83 +Comm | 0.0024002 | 0.0024002 | 0.0024002 | 0.0 | 1.44 +Output | 0.00018239 | 0.00018239 | 0.00018239 | 0.0 | 0.11 +Modify | 0.052717 | 0.052717 | 0.052717 | 0.0 | 31.66 +Other | | 0.003141 | | | 1.89 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 415 ave 415 max 415 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 8743 ave 8743 max 8743 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 8743 +Ave neighs/atom = 7.28583 +Ave special neighs/atom = 0.5 +Neighbor list builds = 40 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/micelle/log.29Mar2019.micelle-rigid.g++.4 b/examples/micelle/log.29Mar2019.micelle-rigid.g++.4 new file mode 100644 index 0000000000..e65f67a527 --- /dev/null +++ b/examples/micelle/log.29Mar2019.micelle-rigid.g++.4 @@ -0,0 +1,260 @@ +LAMMPS (29 Mar 2019) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000422001 secs + read_data CPU = 0.00473404 secs +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000183344 secs + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 500 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.54981866 0.93548899 0.068440043 1.5532895 1.9232786 + 100 0.45 0.99659327 0.079228519 1.5254468 3.2135679 + 150 0.86965411 0.90456016 0.07493355 1.8484231 4.3821925 + 200 0.45 1.01454 0.10663502 1.5708 4.7598476 + 250 0.79636561 0.82567712 0.12105337 1.7424325 5.4983899 + 300 0.45 0.86475538 0.11819875 1.4325791 5.8554758 + 350 0.72135464 0.70693069 0.10912636 1.5368106 6.0388247 + 400 0.45 0.75067331 0.14165013 1.3419484 6.3840708 + 450 0.64839221 0.62402486 0.14173679 1.4136135 6.4791009 + 500 0.45 0.66669513 0.13695201 1.2532721 6.807146 +Loop time of 0.0426326 on 4 procs for 500 steps with 1200 atoms + +Performance: 5066547.720 tau/day, 11728.120 timesteps/s +98.7% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.016784 | 0.019254 | 0.022154 | 1.5 | 45.16 +Bond | 0.0010612 | 0.0012558 | 0.0014153 | 0.4 | 2.95 +Neigh | 0.0046048 | 0.0046697 | 0.0047245 | 0.1 | 10.95 +Comm | 0.0064592 | 0.0097114 | 0.012527 | 2.4 | 22.78 +Output | 0.00022507 | 0.00026393 | 0.00033951 | 0.0 | 0.62 +Modify | 0.0041659 | 0.0048084 | 0.0053945 | 0.8 | 11.28 +Other | | 0.002669 | | | 6.26 + +Nlocal: 300 ave 304 max 292 min +Histogram: 1 0 0 0 0 0 0 0 2 1 +Nghost: 103.5 ave 108 max 98 min +Histogram: 1 0 0 1 0 0 0 0 0 2 +Neighs: 773.5 ave 792 max 735 min +Histogram: 1 0 0 0 0 0 0 0 2 1 + +Total # of neighbors = 3094 +Ave neighs/atom = 2.57833 +Ave special neighs/atom = 0.5 +Neighbor list builds = 52 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 50 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +group solvent molecule 0 +750 atoms in group solvent +group solute subtract all solvent +450 atoms in group solute +unfix 1 +unfix 2 +unfix 4 +fix 1 solvent nve +fix 2 solvent temp/rescale 100 0.45 0.45 0.02 1.0 +fix 5 solute rigid molecule langevin 0.45 0.45 0.5 112211 +150 rigid bodies with 450 atoms +fix 4 all enforce2d +run 500 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.251 | 5.282 | 5.374 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45318168 -1.3753652 0.13695201 -0.8705807 1.975423 + 50 0.77871641 -1.6955252 0.13695201 -0.92651507 0.64222539 + 100 0.5336062 -1.7124572 0.13695201 -1.1423948 -0.11959696 + 150 0.58789067 -1.7926109 0.13695201 -1.1784877 1.2592743 + 200 0.47864796 -1.8040298 0.13695201 -1.2785752 3.6739793 + 250 0.51124651 -1.8614797 0.13695201 -1.309566 2.5817722 + 300 0.45695639 -1.8708384 0.13695201 -1.3629901 3.0833794 + 350 0.477504 -1.8924359 0.13695201 -1.3679098 -5.1605926 + 400 0.45328205 -1.87754 0.13695201 -1.372674 -4.0355858 + 450 0.47465031 -1.9071924 0.13695201 -1.3849826 3.1949617 + 500 0.45533691 -1.9072316 0.13695201 -1.4006978 0.48079061 +Loop time of 0.0887392 on 4 procs for 500 steps with 1200 atoms + +Performance: 2434100.210 tau/day, 5634.491 timesteps/s +98.9% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.022611 | 0.022839 | 0.023082 | 0.1 | 25.74 +Bond | 0.0010793 | 0.0011569 | 0.0012515 | 0.2 | 1.30 +Neigh | 0.0064609 | 0.0064996 | 0.0065265 | 0.0 | 7.32 +Comm | 0.0071712 | 0.0073687 | 0.0077734 | 0.3 | 8.30 +Output | 0.00023389 | 0.00025356 | 0.00030327 | 0.0 | 0.29 +Modify | 0.047258 | 0.047683 | 0.048503 | 0.2 | 53.73 +Other | | 0.002938 | | | 3.31 + +Nlocal: 300 ave 309 max 291 min +Histogram: 1 0 0 1 0 0 1 0 0 1 +Nghost: 218.75 ave 223 max 216 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Neighs: 2192.25 ave 2251 max 2113 min +Histogram: 1 0 0 1 0 0 0 0 0 2 + +Total # of neighbors = 8769 +Ave neighs/atom = 7.3075 +Ave special neighs/atom = 0.5 +Neighbor list builds = 47 +Dangerous builds = 2 +unfix 2 +unfix 4 +unfix 5 +fix 5 solute rigid/small molecule + create bodies CPU = 7.70092e-05 secs +150 rigid bodies with 450 atoms + 1.30435 = max distance from body owner to body atom +fix 4 all enforce2d +run 500 +Per MPI rank memory allocation (min/avg/max) = 8.565 | 8.597 | 8.69 Mbytes +Step Temp E_pair E_mol TotEng Press + 500 0.45533691 -1.9072316 0.13695201 -1.4006978 2.4545793 + 550 0.45627282 -1.912409 0.13695201 -1.4051155 2.1845065 + 600 0.44734553 -1.8890695 0.13695201 -1.389022 2.3458965 + 650 0.46444648 -1.9042462 0.13695201 -1.3903185 2.1609319 + 700 0.47113236 -1.8977576 0.13695201 -1.3784032 2.2420351 + 750 0.48554548 -1.9253545 0.13695201 -1.3943015 2.143907 + 800 0.46350091 -1.8865749 0.13695201 -1.3734146 2.294431 + 850 0.4766104 -1.9094039 0.13695201 -1.3856031 2.2077157 + 900 0.48988467 -1.9051538 0.13695201 -1.3705787 2.0107056 + 950 0.48351942 -1.9162485 0.13695201 -1.3868399 2.1891332 + 1000 0.490337 -1.9115164 0.13695201 -1.3765742 2.1508141 +Loop time of 0.0588261 on 4 procs for 500 steps with 1200 atoms + +Performance: 3671840.233 tau/day, 8499.630 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.022407 | 0.022631 | 0.0229 | 0.1 | 38.47 +Bond | 0.0010669 | 0.0011355 | 0.0012124 | 0.2 | 1.93 +Neigh | 0.0052333 | 0.00528 | 0.0053182 | 0.0 | 8.98 +Comm | 0.0063677 | 0.0066406 | 0.0068488 | 0.2 | 11.29 +Output | 0.00023055 | 0.00024778 | 0.00028086 | 0.0 | 0.42 +Modify | 0.020577 | 0.020651 | 0.020834 | 0.1 | 35.11 +Other | | 0.00224 | | | 3.81 + +Nlocal: 300 ave 303 max 295 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 219 ave 224 max 215 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Neighs: 2185.75 ave 2244 max 2143 min +Histogram: 1 1 0 0 0 1 0 0 0 1 + +Total # of neighbors = 8743 +Ave neighs/atom = 7.28583 +Ave special neighs/atom = 0.5 +Neighbor list builds = 40 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/micelle/log.29Mar2019.micelle.g++.1 b/examples/micelle/log.29Mar2019.micelle.g++.1 new file mode 100644 index 0000000000..d482d6c890 --- /dev/null +++ b/examples/micelle/log.29Mar2019.micelle.g++.1 @@ -0,0 +1,218 @@ +LAMMPS (29 Mar 2019) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.00037837 secs + read_data CPU = 0.00206876 secs +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000177383 secs + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.799 | 3.799 | 3.799 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.208895 on 1 procs for 1000 steps with 1200 atoms + +Performance: 2068027.282 tau/day, 4787.100 timesteps/s +99.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.14142 | 0.14142 | 0.14142 | 0.0 | 67.70 +Bond | 0.008441 | 0.008441 | 0.008441 | 0.0 | 4.04 +Neigh | 0.025716 | 0.025716 | 0.025716 | 0.0 | 12.31 +Comm | 0.0036864 | 0.0036864 | 0.0036864 | 0.0 | 1.76 +Output | 0.0003562 | 0.0003562 | 0.0003562 | 0.0 | 0.17 +Modify | 0.023699 | 0.023699 | 0.023699 | 0.0 | 11.35 +Other | | 0.00558 | | | 2.67 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 195 ave 195 max 195 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3136 ave 3136 max 3136 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 +Ave special neighs/atom = 0.5 +Neighbor list builds = 92 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 50 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.024 | 4.024 | 4.024 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 + 50 0.59734982 -1.8103783 0.076066922 -1.1374593 3.2770557 + 100 0.45 -1.8347112 0.093132329 -1.2919539 3.024661 + 150 0.51924311 -1.8943977 0.076004124 -1.2995832 2.5570373 + 200 0.45 -1.8918672 0.082422107 -1.3598201 2.5629655 + 250 0.50281134 -1.920406 0.074011331 -1.3440023 2.3518682 + 300 0.45 -1.9351047 0.075337265 -1.4101424 2.3249947 + 350 0.47650026 -1.9313687 0.072115117 -1.3831504 2.1987532 + 400 0.45 -1.9554318 0.081603939 -1.4242028 2.0787066 + 450 0.47220236 -1.9468502 0.065625624 -1.4094157 2.0984288 + 500 0.4684673 -1.9444333 0.076696283 -1.3996601 2.0528682 + 550 0.47683128 -1.958676 0.070589719 -1.4116523 2.0856022 + 600 0.46851243 -1.9338267 0.07060548 -1.3950992 2.26405 + 650 0.46874142 -1.9462493 0.069134685 -1.4087638 2.1070263 + 700 0.46437384 -1.9309953 0.071977522 -1.3950309 2.2256923 + 750 0.47326225 -1.9484255 0.075435845 -1.4001218 2.0880254 + 800 0.45 -1.9646005 0.064159585 -1.4508159 2.0612696 + 850 0.46748307 -1.970559 0.060384874 -1.4430806 1.9472879 + 900 0.46909484 -1.953723 0.062470295 -1.4225488 2.0222909 + 950 0.45631531 -1.9387753 0.067536568 -1.4153037 2.0638421 + 1000 0.45 -1.9727646 0.058607721 -1.4645318 1.9982315 +Loop time of 0.252254 on 1 procs for 1000 steps with 1200 atoms + +Performance: 1712557.882 tau/day, 3964.254 timesteps/s +99.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.17177 | 0.17177 | 0.17177 | 0.0 | 68.09 +Bond | 0.0084555 | 0.0084555 | 0.0084555 | 0.0 | 3.35 +Neigh | 0.03991 | 0.03991 | 0.03991 | 0.0 | 15.82 +Comm | 0.0049119 | 0.0049119 | 0.0049119 | 0.0 | 1.95 +Output | 0.00039077 | 0.00039077 | 0.00039077 | 0.0 | 0.15 +Modify | 0.021131 | 0.021131 | 0.021131 | 0.0 | 8.38 +Other | | 0.005685 | | | 2.25 + +Nlocal: 1200 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 415 ave 415 max 415 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 8586 ave 8586 max 8586 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 8586 +Ave neighs/atom = 7.155 +Ave special neighs/atom = 0.5 +Neighbor list builds = 86 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/micelle/log.29Mar2019.micelle.g++.4 b/examples/micelle/log.29Mar2019.micelle.g++.4 new file mode 100644 index 0000000000..f3a54970cf --- /dev/null +++ b/examples/micelle/log.29Mar2019.micelle.g++.4 @@ -0,0 +1,218 @@ +LAMMPS (29 Mar 2019) + using 1 OpenMP thread(s) per MPI task +# 2d micelle simulation + +dimension 2 + +neighbor 0.3 bin +neigh_modify delay 5 + +atom_style bond + +# Soft potential push-off + +read_data data.micelle + orthogonal box = (0 0 -0.1) to (35.8569 35.8569 0.1) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 1200 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 300 bonds + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000413656 secs + read_data CPU = 0.00487924 secs +special_bonds fene + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000178576 secs + +pair_style soft 1.12246 +pair_coeff * * 0.0 1.12246 + +bond_style harmonic +bond_coeff 1 50.0 0.75 + +velocity all create 0.45 2349852 + +variable prefactor equal ramp(1.0,20.0) + +fix 1 all nve +fix 2 all temp/rescale 100 0.45 0.45 0.02 1.0 +fix 3 all adapt 1 pair soft a * * v_prefactor +fix 4 all enforce2d + +thermo 50 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.42246 + ghost atom cutoff = 1.42246 + binsize = 0.71123, bins = 51 51 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair soft, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.758 | 3.85 | 4.126 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 0.40003481 2.2200223e-06 0.84966203 0.78952518 + 50 0.47411013 0.67721272 0.057404514 1.2083323 1.3375852 + 100 0.45 0.73046745 0.054836584 1.234929 2.3196516 + 150 0.67521742 0.72402001 0.043490075 1.4421648 2.8744416 + 200 0.45 0.78481891 0.076931503 1.3113754 3.0412388 + 250 0.66479018 0.69790602 0.081075564 1.4432178 3.6917024 + 300 0.45 0.76820218 0.066727591 1.2845548 3.7861054 + 350 0.67619136 0.625715 0.072722727 1.3740656 4.2861621 + 400 0.45 0.68527759 0.090724527 1.2256271 4.4725214 + 450 0.56702844 0.64402767 0.080555563 1.2911391 4.7402211 + 500 0.45 0.64883009 0.078376672 1.1768318 4.7919294 + 550 0.564664 0.58260368 0.080779475 1.2275766 4.9855705 + 600 0.45 0.58193041 0.088386617 1.119942 5.131481 + 650 0.52110993 0.5415273 0.097683746 1.1598867 5.2500294 + 700 0.45 0.50856787 0.088471208 1.0466641 5.2550165 + 750 0.51510855 0.47441291 0.089429375 1.0785216 5.375763 + 800 0.45 0.49926696 0.085958476 1.0348504 5.4665914 + 850 0.50688494 0.46614429 0.088962292 1.0615691 5.556932 + 900 0.45 0.47785593 0.10150857 1.0289895 5.7765975 + 950 0.49590559 0.46050477 0.096404887 1.052402 5.8649245 + 1000 0.45 0.47691182 0.08808163 1.0146185 6.0177568 +Loop time of 0.0906248 on 4 procs for 1000 steps with 1200 atoms + +Performance: 4766906.584 tau/day, 11034.506 timesteps/s +98.9% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.036572 | 0.039266 | 0.041216 | 1.0 | 43.33 +Bond | 0.0023205 | 0.0024512 | 0.0025697 | 0.2 | 2.70 +Neigh | 0.0088909 | 0.0089301 | 0.0089679 | 0.0 | 9.85 +Comm | 0.022308 | 0.024047 | 0.027175 | 1.3 | 26.53 +Output | 0.00057411 | 0.00061274 | 0.00071025 | 0.0 | 0.68 +Modify | 0.0083182 | 0.0092374 | 0.0098341 | 0.6 | 10.19 +Other | | 0.006081 | | | 6.71 + +Nlocal: 300 ave 305 max 292 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 100.25 ave 108 max 93 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Neighs: 784 ave 815 max 739 min +Histogram: 1 0 0 0 0 0 1 1 0 1 + +Total # of neighbors = 3136 +Ave neighs/atom = 2.61333 +Ave special neighs/atom = 0.5 +Neighbor list builds = 92 +Dangerous builds = 0 + +unfix 3 + +# Main run + +pair_style lj/cut 2.5 + +# solvent/head - full-size and long-range + +pair_coeff 1 1 1.0 1.0 2.5 +pair_coeff 2 2 1.0 1.0 2.5 +pair_coeff 1 2 1.0 1.0 2.5 + +# tail/tail - size-averaged and long-range + +pair_coeff 3 3 1.0 0.75 2.5 +pair_coeff 4 4 1.0 0.50 2.5 +pair_coeff 3 4 1.0 0.67 2.5 + +# solvent/tail - full-size and repulsive + +pair_coeff 1 3 1.0 1.0 1.12246 +pair_coeff 1 4 1.0 1.0 1.12246 + +# head/tail - size-averaged and repulsive + +pair_coeff 2 3 1.0 0.88 1.12246 +pair_coeff 2 4 1.0 0.75 1.12246 + +thermo 50 + +#dump 1 all atom 2000 dump.micelle + +#dump 2 all image 2000 image.*.jpg type type zoom 1.6 +#dump_modify 2 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +#dump 3 all movie 2000 movie.mpg type type zoom 1.6 +#dump_modify 3 pad 5 adiam 1 0.5 adiam 2 1.5 adiam 3 1.0 adiam 4 0.75 + +reset_timestep 0 +run 1000 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 26 26 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.001 | 4.032 | 4.124 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.45 -1.7056163 0.08808163 -1.1679097 3.9431686 + 50 0.59734982 -1.8103783 0.076066922 -1.1374593 3.2770557 + 100 0.45 -1.8347112 0.093132329 -1.2919539 3.024661 + 150 0.51924311 -1.8943977 0.076004124 -1.2995832 2.5570373 + 200 0.45 -1.8918672 0.082422107 -1.3598201 2.5629655 + 250 0.50281134 -1.920406 0.074011331 -1.3440023 2.3518682 + 300 0.45 -1.9351047 0.075337265 -1.4101424 2.3249947 + 350 0.47650026 -1.9313687 0.072115117 -1.3831504 2.1987532 + 400 0.45 -1.9554318 0.081603939 -1.4242028 2.0787066 + 450 0.47220236 -1.9468502 0.065625625 -1.4094157 2.0984288 + 500 0.4684673 -1.9444333 0.076696285 -1.3996601 2.0528682 + 550 0.47683128 -1.958676 0.070589721 -1.4116523 2.0856023 + 600 0.46851245 -1.9338267 0.070605469 -1.3950992 2.26405 + 650 0.46874143 -1.9462493 0.069134686 -1.4087638 2.1070262 + 700 0.4643739 -1.9309953 0.071977511 -1.3950309 2.225692 + 750 0.47326259 -1.9484258 0.075435808 -1.4001218 2.0880235 + 800 0.45 -1.9646003 0.06415956 -1.4508158 2.0612703 + 850 0.46748278 -1.9705588 0.06038513 -1.4430804 1.9472884 + 900 0.46909438 -1.9537221 0.062470305 -1.4225483 2.0223008 + 950 0.45631508 -1.9387742 0.067536066 -1.4153033 2.063854 + 1000 0.45 -1.9727651 0.058608085 -1.464532 1.9982447 +Loop time of 0.0878521 on 4 procs for 1000 steps with 1200 atoms + +Performance: 4917357.613 tau/day, 11382.772 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.043517 | 0.044455 | 0.046903 | 0.7 | 50.60 +Bond | 0.0020199 | 0.0022303 | 0.0024347 | 0.4 | 2.54 +Neigh | 0.012207 | 0.012335 | 0.012512 | 0.1 | 14.04 +Comm | 0.014938 | 0.018265 | 0.020068 | 1.5 | 20.79 +Output | 0.00061369 | 0.00064814 | 0.00073504 | 0.0 | 0.74 +Modify | 0.0052264 | 0.0053691 | 0.0055039 | 0.2 | 6.11 +Other | | 0.00455 | | | 5.18 + +Nlocal: 300 ave 305 max 296 min +Histogram: 1 1 0 0 0 0 1 0 0 1 +Nghost: 219.5 ave 228 max 214 min +Histogram: 1 0 1 1 0 0 0 0 0 1 +Neighs: 2146.5 ave 2201 max 2114 min +Histogram: 1 1 0 1 0 0 0 0 0 1 + +Total # of neighbors = 8586 +Ave neighs/atom = 7.155 +Ave special neighs/atom = 0.5 +Neighbor list builds = 86 +Dangerous builds = 0 +Total wall time: 0:00:00 From b1070f4703d6b0cf70cae82ceea0e13853fde3c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 23:10:59 -0400 Subject: [PATCH 234/243] must add USER-SCAFACOS to nolib.cmake preset, as it requires GSL --- cmake/presets/nolib.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/presets/nolib.cmake b/cmake/presets/nolib.cmake index 663f87122b..c0968a8d82 100644 --- a/cmake/presets/nolib.cmake +++ b/cmake/presets/nolib.cmake @@ -4,7 +4,7 @@ set(PACKAGES_WITH_LIB COMPRESS GPU KIM KOKKOS LATTE MPIIO MSCG PYTHON VORONOI USER-ADIOS USER-ATC USER-AWPMD USER-H5MD USER-LB USER-MOLFILE USER-NETCDF USER-PLUMED USER-QMMM USER-QUIP - USER-SMD USER-VTK) + USER-SCAFACOS USER-SMD USER-VTK) foreach(PKG ${PACKAGES_WITH_LIB}) set(PKG_${PKG} OFF CACHE BOOL "" FORCE) From a149fdb4201d958bb8915ff582c195780a3b4851 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 23:19:37 -0400 Subject: [PATCH 235/243] forgot MESSAGE package in all_on/off.cmake preset --- cmake/presets/all_off.cmake | 6 +++--- cmake/presets/all_on.cmake | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index 0e37611da4..9d03be99ec 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -2,9 +2,9 @@ # an existing package selection without losing any other settings set(ALL_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MOLECULE MPIIO - MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN SRD - VORONOI + GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MESSAGE MOLECULE + MPIIO MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN + SRD VORONOI USER-ADIOS USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index 57f1228abe..2ff107975a 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -4,9 +4,9 @@ # with just a working C++ compiler and an MPI library. set(ALL_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GPU - GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MOLECULE MPIIO - MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN SRD - VORONOI + GRANULAR KIM KOKKOS KSPACE LATTE MANYBODY MC MISC MESSAGE MOLECULE + MPIIO MSCG OPT PERI POEMS PYTHON QEQ REPLICA RIGID SHOCK SNAP SPIN + SRD VORONOI USER-ADIOS USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD USER-INTEL USER-LB USER-MANIFOLD USER-MEAMC USER-MESO From 6cb120d691b656e32a5619005041768842683d6b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 23:20:53 -0400 Subject: [PATCH 236/243] get rid of "using" in USER-REAXC header --- src/USER-REAXC/reaxc_types.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 2666fcf85c..ff922e012c 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -392,8 +392,6 @@ typedef struct double ghost_cutoff; } boundary_cutoff; -using LAMMPS_NS::Pair; - struct _reax_system { reax_interaction reax_param; @@ -411,7 +409,7 @@ struct _reax_system boundary_cutoff bndry_cuts; reax_atom *my_atoms; - class Pair *pair_ptr; + class LAMMPS_NS::Pair *pair_ptr; int my_bonds; int mincap; double safezone, saferzone; From 40f1662c93e0e4ffa35890830cdfc63e6fb39ef9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 23:44:00 -0400 Subject: [PATCH 237/243] reduce compiler warnings --- src/MESSAGE/fix_client_md.cpp | 6 ++---- src/MESSAGE/message.cpp | 12 +++--------- src/MESSAGE/server_mc.cpp | 4 ++-- src/MESSAGE/server_md.cpp | 2 +- src/special.cpp | 2 +- 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/MESSAGE/fix_client_md.cpp b/src/MESSAGE/fix_client_md.cpp index 9c1bfcc796..727481dcc0 100644 --- a/src/MESSAGE/fix_client_md.cpp +++ b/src/MESSAGE/fix_client_md.cpp @@ -89,7 +89,7 @@ FixClientMD::~FixClientMD() int nfield; int *fieldID,*fieldtype,*fieldlen; - int msgID = cs->recv(nfield,fieldID,fieldtype,fieldlen); + cs->recv(nfield,fieldID,fieldtype,fieldlen); // clean-up @@ -173,8 +173,6 @@ void FixClientMD::min_setup(int vflag) void FixClientMD::post_force(int vflag) { - int i,j,m; - // energy and virial setup if (vflag) v_setup(vflag); @@ -286,7 +284,7 @@ void FixClientMD::receive_fev(int vflag) int nfield; int *fieldID,*fieldtype,*fieldlen; - int msgID = cs->recv(nfield,fieldID,fieldtype,fieldlen); + cs->recv(nfield,fieldID,fieldtype,fieldlen); double *forces = (double *) cs->unpack(FORCES); double **f = atom->f; diff --git a/src/MESSAGE/message.cpp b/src/MESSAGE/message.cpp index e9bff7d38a..61221ca26e 100644 --- a/src/MESSAGE/message.cpp +++ b/src/MESSAGE/message.cpp @@ -22,10 +22,6 @@ using namespace LAMMPS_NS; using namespace CSLIB_NS; -// customize by adding a new server protocol enum - -enum{MD,MC}; - /* ---------------------------------------------------------------------- */ void Message::command(int narg, char **arg) @@ -38,12 +34,10 @@ void Message::command(int narg, char **arg) else error->all(FLERR,"Illegal message command"); lmp->clientserver = clientserver; - // customize by adding a new server protocol + // validate supported protocols - int protocol; - if (strcmp(arg[1],"md") == 0) protocol = MD; - else if (strcmp(arg[1],"mc") == 0) protocol = MC; - else error->all(FLERR,"Unknown message protocol"); + if ((strcmp(arg[1],"md") != 0) && (strcmp(arg[1],"mc") != 0)) + error->all(FLERR,"Unknown message protocol"); // instantiate CSlib with chosen communication mode diff --git a/src/MESSAGE/server_mc.cpp b/src/MESSAGE/server_mc.cpp index 8e9a297912..8152b1f772 100644 --- a/src/MESSAGE/server_mc.cpp +++ b/src/MESSAGE/server_mc.cpp @@ -37,8 +37,8 @@ ServerMC::ServerMC(LAMMPS *lmp) : Pointers(lmp) {} void ServerMC::loop() { - int i,j,m; - double xold[3],xnew[3]; + int m; + double xold[3]; tagint atomid; CSlib *cs = (CSlib *) lmp->cslib; diff --git a/src/MESSAGE/server_md.cpp b/src/MESSAGE/server_md.cpp index 8debd3a987..bef327616e 100644 --- a/src/MESSAGE/server_md.cpp +++ b/src/MESSAGE/server_md.cpp @@ -78,7 +78,7 @@ ServerMD::~ServerMD() void ServerMD::loop() { - int i,j,m; + int j,m; // cs = instance of CSlib diff --git a/src/special.cpp b/src/special.cpp index ab3764a156..7f855163e0 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -1225,7 +1225,7 @@ void Special::dihedral_trim() ------------------------------------------------------------------------- */ int Special::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, + int &flag, int *& /*proclist*/, char *& /*outbuf*/, void *ptr) { Special *sptr = (Special *) ptr; From f02b364e6efe7770716c9f826a81d2add9237ec7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 00:03:34 -0400 Subject: [PATCH 238/243] remove "using namespace" from header and include required header --- src/USER-SMD/smd_material_models.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/USER-SMD/smd_material_models.h b/src/USER-SMD/smd_material_models.h index acb498c04d..557612bdf5 100644 --- a/src/USER-SMD/smd_material_models.h +++ b/src/USER-SMD/smd_material_models.h @@ -22,10 +22,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#ifndef SMD_MATERIAL_MODELS_H_ -#define SMD_MATERIAL_MODELS_H_ +#ifndef SMD_MATERIAL_MODELS_H +#define SMD_MATERIAL_MODELS_H -using namespace Eigen; +#include /* * EOS models @@ -42,22 +42,22 @@ void PerfectGasEOS(const double gamma, const double vol, const double mass, cons /* * Material strength models */ -void LinearStrength(const double mu, const Matrix3d sigmaInitial_dev, const Matrix3d d_dev, const double dt, - Matrix3d &sigmaFinal_dev__, Matrix3d &sigma_dev_rate__); -void LinearPlasticStrength(const double G, const double yieldStress, const Matrix3d sigmaInitial_dev, const Matrix3d d_dev, - const double dt, Matrix3d &sigmaFinal_dev__, Matrix3d &sigma_dev_rate__, double &plastic_strain_increment); +void LinearStrength(const double mu, const Eigen::Matrix3d sigmaInitial_dev, const Eigen::Matrix3d d_dev, const double dt, + Eigen::Matrix3d &sigmaFinal_dev__, Eigen::Matrix3d &sigma_dev_rate__); +void LinearPlasticStrength(const double G, const double yieldStress, const Eigen::Matrix3d sigmaInitial_dev, const Eigen::Matrix3d d_dev, + const double dt, Eigen::Matrix3d &sigmaFinal_dev__, Eigen::Matrix3d &sigma_dev_rate__, double &plastic_strain_increment); void JohnsonCookStrength(const double G, const double cp, const double espec, const double A, const double B, const double a, const double C, const double epdot0, const double T0, const double Tmelt, const double M, const double dt, const double ep, - const double epdot, const Matrix3d sigmaInitial_dev, const Matrix3d d_dev, Matrix3d &sigmaFinal_dev__, - Matrix3d &sigma_dev_rate__, double &plastic_strain_increment); + const double epdot, const Eigen::Matrix3d sigmaInitial_dev, const Eigen::Matrix3d d_dev, Eigen::Matrix3d &sigmaFinal_dev__, + Eigen::Matrix3d &sigma_dev_rate__, double &plastic_strain_increment); /* * Damage models */ -bool IsotropicMaxStrainDamage(const Matrix3d E, const double maxStrain); -bool IsotropicMaxStressDamage(const Matrix3d E, const double maxStrain); -double JohnsonCookFailureStrain(const double p, const Matrix3d Sdev, const double d1, const double d2, const double d3, +bool IsotropicMaxStrainDamage(const Eigen::Matrix3d E, const double maxStrain); +bool IsotropicMaxStressDamage(const Eigen::Matrix3d E, const double maxStrain); +double JohnsonCookFailureStrain(const double p, const Eigen::Matrix3d Sdev, const double d1, const double d2, const double d3, const double d4, const double epdot0, const double epdot); From 52a13f31b3d21a6256faeea5691ec6f2cefd6a5d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 00:04:12 -0400 Subject: [PATCH 239/243] remove "using namespace" from header --- src/USER-SMD/smd_math.h | 97 +++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 62 deletions(-) diff --git a/src/USER-SMD/smd_math.h b/src/USER-SMD/smd_math.h index cea9e9dbc7..52e7c983d5 100644 --- a/src/USER-SMD/smd_math.h +++ b/src/USER-SMD/smd_math.h @@ -9,14 +9,11 @@ * * ----------------------------------------------------------------------- */ -//test -#ifndef SMD_MATH_H_ -#define SMD_MATH_H_ +#ifndef SMD_MATH_H +#define SMD_MATH_H #include #include -using namespace Eigen; -using namespace std; namespace SMD_Math { static inline void LimitDoubleMagnitude(double &x, const double limit) { @@ -31,8 +28,8 @@ static inline void LimitDoubleMagnitude(double &x, const double limit) { /* * deviator of a tensor */ -static inline Matrix3d Deviator(const Matrix3d M) { - Matrix3d eye; +static inline Eigen::Matrix3d Deviator(const Eigen::Matrix3d M) { + Eigen::Matrix3d eye; eye.setIdentity(); eye *= M.trace() / 3.0; return M - eye; @@ -53,14 +50,14 @@ static inline Matrix3d Deviator(const Matrix3d M) { * obtained again from an SVD. The rotation should proper now, i.e., det(R) = +1. */ -static inline bool PolDec(Matrix3d M, Matrix3d &R, Matrix3d &T, bool scaleF) { +static inline bool PolDec(Eigen::Matrix3d M, Eigen::Matrix3d &R, Eigen::Matrix3d &T, bool scaleF) { - JacobiSVD svd(M, ComputeFullU | ComputeFullV); // SVD(A) = U S V* - Vector3d S_eigenvalues = svd.singularValues(); - Matrix3d S = svd.singularValues().asDiagonal(); - Matrix3d U = svd.matrixU(); - Matrix3d V = svd.matrixV(); - Matrix3d eye; + Eigen::JacobiSVD svd(M, Eigen::ComputeFullU | Eigen::ComputeFullV); // SVD(A) = U S V* + Eigen::Vector3d S_eigenvalues = svd.singularValues(); + Eigen::Matrix3d S = svd.singularValues().asDiagonal(); + Eigen::Matrix3d U = svd.matrixU(); + Eigen::Matrix3d V = svd.matrixV(); + Eigen::Matrix3d eye; eye.setIdentity(); // now do polar decomposition into M = R * T, where R is rotation @@ -105,16 +102,12 @@ static inline bool PolDec(Matrix3d M, Matrix3d &R, Matrix3d &T, bool scaleF) { * Pseudo-inverse via SVD */ -static inline void pseudo_inverse_SVD(Matrix3d &M) { +static inline void pseudo_inverse_SVD(Eigen::Matrix3d &M) { - //JacobiSVD < Matrix3d > svd(M, ComputeFullU | ComputeFullV); - JacobiSVD svd(M, ComputeFullU); // one Eigevector base is sufficient because matrix is square and symmetric + Eigen::JacobiSVD svd(M, Eigen::ComputeFullU); // one Eigevector base is sufficient because matrix is square and symmetric - Vector3d singularValuesInv; - Vector3d singularValues = svd.singularValues(); - -//cout << "Here is the matrix V:" << endl << V * singularValues.asDiagonal() * U << endl; -//cout << "Its singular values are:" << endl << singularValues << endl; + Eigen::Vector3d singularValuesInv; + Eigen::Vector3d singularValues = svd.singularValues(); double pinvtoler = 1.0e-16; // 2d machining example goes unstable if this value is increased (1.0e-16). for (int row = 0; row < 3; row++) { @@ -126,39 +119,19 @@ static inline void pseudo_inverse_SVD(Matrix3d &M) { } M = svd.matrixU() * singularValuesInv.asDiagonal() * svd.matrixU().transpose(); - -// JacobiSVD < Matrix3d > svd(M, ComputeFullU | ComputeFullV); -// -// Vector3d singularValuesInv; -// Vector3d singularValues = svd.singularValues(); -// -// //cout << "Here is the matrix V:" << endl << V * singularValues.asDiagonal() * U << endl; -// //cout << "Its singular values are:" << endl << singularValues << endl; -// -// double pinvtoler = 1.0e-16; // 2d machining example goes unstable if this value is increased (1.0e-16). -// for (int row = 0; row < 3; row++) { -// if (singularValues(row) > pinvtoler) { -// singularValuesInv(row) = 1.0 / singularValues(row); -// } else { -// singularValuesInv(row) = 0.0; -// } -// } -// -// M = svd.matrixU() * singularValuesInv.asDiagonal() * svd.matrixV().transpose(); - } /* * test if two matrices are equal */ -static inline double TestMatricesEqual(Matrix3d A, Matrix3d B, double eps) { - Matrix3d diff; +static inline double TestMatricesEqual(Eigen::Matrix3d A, Eigen::Matrix3d B, double eps) { + Eigen::Matrix3d diff; diff = A - B; double norm = diff.norm(); if (norm > eps) { - printf("Matrices A and B are not equal! The L2-norm difference is: %g\n", norm); - cout << "Here is matrix A:" << endl << A << endl; - cout << "Here is matrix B:" << endl << B << endl; + std::cout << "Matrices A and B are not equal! The L2-norm difference is: " << norm << "\n" + << "Here is matrix A:\n" << A << "\n" + << "Here is matrix B:\n" << B << std::endl; } return norm; } @@ -167,12 +140,12 @@ static inline double TestMatricesEqual(Matrix3d A, Matrix3d B, double eps) { Limit eigenvalues of a matrix to upper and lower bounds. ------------------------------------------------------------------------- */ -static inline Matrix3d LimitEigenvalues(Matrix3d S, double limitEigenvalue) { +static inline Eigen::Matrix3d LimitEigenvalues(Eigen::Matrix3d S, double limitEigenvalue) { /* * compute Eigenvalues of matrix S */ - SelfAdjointEigenSolver < Matrix3d > es; + Eigen::SelfAdjointEigenSolver < Eigen::Matrix3d > es; es.compute(S); double max_eigenvalue = es.eigenvalues().maxCoeff(); @@ -183,17 +156,17 @@ static inline Matrix3d LimitEigenvalues(Matrix3d S, double limitEigenvalue) { if ((amax_eigenvalue > limitEigenvalue) || (amin_eigenvalue > limitEigenvalue)) { if (amax_eigenvalue > amin_eigenvalue) { // need to scale with max_eigenvalue double scale = amax_eigenvalue / limitEigenvalue; - Matrix3d V = es.eigenvectors(); - Matrix3d S_diag = V.inverse() * S * V; // diagonalized input matrix + Eigen::Matrix3d V = es.eigenvectors(); + Eigen::Matrix3d S_diag = V.inverse() * S * V; // diagonalized input matrix S_diag /= scale; - Matrix3d S_scaled = V * S_diag * V.inverse(); // undiagonalize matrix + Eigen::Matrix3d S_scaled = V * S_diag * V.inverse(); // undiagonalize matrix return S_scaled; } else { // need to scale using min_eigenvalue double scale = amin_eigenvalue / limitEigenvalue; - Matrix3d V = es.eigenvectors(); - Matrix3d S_diag = V.inverse() * S * V; // diagonalized input matrix + Eigen::Matrix3d V = es.eigenvectors(); + Eigen::Matrix3d S_diag = V.inverse() * S * V; // diagonalized input matrix S_diag /= scale; - Matrix3d S_scaled = V * S_diag * V.inverse(); // undiagonalize matrix + Eigen::Matrix3d S_scaled = V * S_diag * V.inverse(); // undiagonalize matrix return S_scaled; } } else { // limiting does not apply @@ -201,17 +174,17 @@ static inline Matrix3d LimitEigenvalues(Matrix3d S, double limitEigenvalue) { } } -static inline bool LimitMinMaxEigenvalues(Matrix3d &S, double min, double max) { +static inline bool LimitMinMaxEigenvalues(Eigen::Matrix3d &S, double min, double max) { /* * compute Eigenvalues of matrix S */ - SelfAdjointEigenSolver < Matrix3d > es; + Eigen::SelfAdjointEigenSolver < Eigen::Matrix3d > es; es.compute(S); if ((es.eigenvalues().maxCoeff() > max) || (es.eigenvalues().minCoeff() < min)) { - Matrix3d S_diag = es.eigenvalues().asDiagonal(); - Matrix3d V = es.eigenvectors(); + Eigen::Matrix3d S_diag = es.eigenvalues().asDiagonal(); + Eigen::Matrix3d V = es.eigenvectors(); for (int i = 0; i < 3; i++) { if (S_diag(i, i) < min) { //printf("limiting eigenvalue %f --> %f\n", S_diag(i, i), min); @@ -229,10 +202,10 @@ static inline bool LimitMinMaxEigenvalues(Matrix3d &S, double min, double max) { } } -static inline void reconstruct_rank_deficient_shape_matrix(Matrix3d &K) { +static inline void reconstruct_rank_deficient_shape_matrix(Eigen::Matrix3d &K) { - JacobiSVD svd(K, ComputeFullU | ComputeFullV); - Vector3d singularValues = svd.singularValues(); + Eigen::JacobiSVD svd(K, Eigen::ComputeFullU | Eigen::ComputeFullV); + Eigen::Vector3d singularValues = svd.singularValues(); for (int i = 0; i < 3; i++) { if (singularValues(i) < 1.0e-8) { From 537704fdaa7e5e285d1e93edf118f09c857607d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 00:13:52 -0400 Subject: [PATCH 240/243] eliminate the use of the "using" keyword in headers of the KOKKOS package --- src/KOKKOS/domain_kokkos.h | 10 ++++++---- src/KOKKOS/pair_snap_kokkos_impl.h | 3 ++- src/KOKKOS/sna_kokkos_impl.h | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/domain_kokkos.h b/src/KOKKOS/domain_kokkos.h index 7b8504dba8..eccc36a021 100644 --- a/src/KOKKOS/domain_kokkos.h +++ b/src/KOKKOS/domain_kokkos.h @@ -36,10 +36,12 @@ class DomainKokkos : public Domain { void image_flip(int, int, int); void x2lamda(int); void lamda2x(int); - // these lines bring in the x2lamda signatures from Domain - // that are not overloaded here - using Domain::x2lamda; - using Domain::lamda2x; + // forward remaining x2lamda() and lambda2x() variants to parent class + void x2lamda(double *a, double *b) { Domain::x2lamda(a,b); } + void lamda2x(double *a, double *b) { Domain::lamda2x(a,b); } + void x2lamda(double *a, double *b, double *c, double *d) { + Domain::x2lamda(a,b,c,d); + } int closest_image(const int, int) const; diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 569783f926..bb2a5e9171 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -32,7 +32,7 @@ #define MAXLINE 1024 #define MAXWORD 3 -using namespace LAMMPS_NS; +namespace LAMMPS_NS { // Outstanding issues with quadratic term // 1. there seems to a problem with compute_optimized energy calc @@ -674,3 +674,4 @@ double PairSNAPKokkos::memory_usage() bytes += snaKK.memory_usage(); return bytes; } +} diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h index 6a19c57829..0f2a450a3d 100644 --- a/src/KOKKOS/sna_kokkos_impl.h +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -20,7 +20,7 @@ #include #include -using namespace LAMMPS_NS; +namespace LAMMPS_NS { static const double MY_PI = 3.14159265358979323846; // pi @@ -1300,3 +1300,5 @@ double SNAKokkos::memory_usage() bytes += jdim * jdim * jdim * jdim * jdim * sizeof(std::complex); return bytes; } + +} // namespace LAMMPS_NS From f17aff6331db0bbef287991084f5e1f6c7f0d982 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 00:24:36 -0400 Subject: [PATCH 241/243] add some missing entries to src/USER-MISC/README --- src/USER-MISC/README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 13e406d42f..8e821c03a9 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -67,14 +67,17 @@ improper_style distance, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style agni, Axel Kohlmeyer, akohlmey at gmail.com, 9 Nov 16 pair_style buck/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 +pair_style coul/shield, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 +pair_style ilp/graphene/hbn, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 pair_style lebedeva/z, Zbigniew Koziol (National Center for Nuclear Research), softquake at gmail dot com, 4 Jan 19 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 +pair_style kolmogorov/crespi/full, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 pair_style kolmogorov/crespi/z, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Feb 17 pair_style meam/spline, Alexander Stukowski (LLNL), alex at stukowski.com, 1 Feb 12 pair_style meam/sw/spline, Robert Rudd (LLNL), robert.rudd at llnl.gov, 1 Oct 12 From 7372e8fde1a02d605873d2591d395517cf789f78 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 00:41:03 -0400 Subject: [PATCH 242/243] must add STUBS_MPI to cslib includes when compiling without MPI --- cmake/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 59caf8ca9f..fd93814574 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -728,6 +728,7 @@ if(PKG_MESSAGE) set_target_properties(cslib PROPERTIES OUTPUT_NAME "csmpi") else() target_compile_definitions(cslib PRIVATE -DMPI_NO) + target_include_directories(cslib PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/message/cslib/src/STUBS_MPI) set_target_properties(cslib PROPERTIES OUTPUT_NAME "csnompi") endif() From 1696432e8220906c38c2603879a3fb7fba490a76 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 01:00:53 -0400 Subject: [PATCH 243/243] resolve conflict between src/STUBS/mpi.h and lib/message/cslib/src/STUBS_MPI/mpi.h --- lib/message/cslib/src/STUBS_MPI/{mpi.h => mpi_dummy.h} | 0 lib/message/cslib/src/cslib.cpp | 4 ++++ lib/message/cslib/src/cslib_wrap.cpp | 4 ++++ lib/message/cslib/src/msg.cpp | 4 ++++ lib/message/cslib/src/msg.h | 6 +++++- lib/message/cslib/src/msg_file.cpp | 4 ++++ lib/message/cslib/src/msg_mpi_one.cpp | 4 ++++ lib/message/cslib/src/msg_mpi_two.cpp | 4 ++++ lib/message/cslib/src/msg_zmq.cpp | 4 ++++ 9 files changed, 33 insertions(+), 1 deletion(-) rename lib/message/cslib/src/STUBS_MPI/{mpi.h => mpi_dummy.h} (100%) diff --git a/lib/message/cslib/src/STUBS_MPI/mpi.h b/lib/message/cslib/src/STUBS_MPI/mpi_dummy.h similarity index 100% rename from lib/message/cslib/src/STUBS_MPI/mpi.h rename to lib/message/cslib/src/STUBS_MPI/mpi_dummy.h diff --git a/lib/message/cslib/src/cslib.cpp b/lib/message/cslib/src/cslib.cpp index 874333607e..336ba87588 100644 --- a/lib/message/cslib/src/cslib.cpp +++ b/lib/message/cslib/src/cslib.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/cslib_wrap.cpp b/lib/message/cslib/src/cslib_wrap.cpp index c2d69eaf0d..64b4d53b25 100644 --- a/lib/message/cslib/src/cslib_wrap.cpp +++ b/lib/message/cslib/src/cslib_wrap.cpp @@ -14,7 +14,11 @@ // C style library interface to CSlib class +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/msg.cpp b/lib/message/cslib/src/msg.cpp index da22c81850..ff654ecbcf 100644 --- a/lib/message/cslib/src/msg.cpp +++ b/lib/message/cslib/src/msg.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/msg.h b/lib/message/cslib/src/msg.h index f75942b027..81c2d21cb9 100644 --- a/lib/message/cslib/src/msg.h +++ b/lib/message/cslib/src/msg.h @@ -15,7 +15,11 @@ #ifndef MSG_H #define MSG_H +#ifdef MPI_YES #include +#else +#include +#endif namespace CSLIB_NS { @@ -37,7 +41,7 @@ class Msg { int nfield; int *fieldID,*fieldtype,*fieldlen; int lengths[2]; - + void init(int); void allocate(int, int &, int *&, int, int &, char *&); void *smalloc(int); diff --git a/lib/message/cslib/src/msg_file.cpp b/lib/message/cslib/src/msg_file.cpp index d97e249fad..31cdfef544 100644 --- a/lib/message/cslib/src/msg_file.cpp +++ b/lib/message/cslib/src/msg_file.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/msg_mpi_one.cpp b/lib/message/cslib/src/msg_mpi_one.cpp index db11735b27..c6fbd8732f 100644 --- a/lib/message/cslib/src/msg_mpi_one.cpp +++ b/lib/message/cslib/src/msg_mpi_one.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/msg_mpi_two.cpp b/lib/message/cslib/src/msg_mpi_two.cpp index e9a9e87eeb..2a4fa65ff7 100644 --- a/lib/message/cslib/src/msg_mpi_two.cpp +++ b/lib/message/cslib/src/msg_mpi_two.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include diff --git a/lib/message/cslib/src/msg_zmq.cpp b/lib/message/cslib/src/msg_zmq.cpp index c2d408f3a5..8bee3aebde 100644 --- a/lib/message/cslib/src/msg_zmq.cpp +++ b/lib/message/cslib/src/msg_zmq.cpp @@ -12,7 +12,11 @@ See the README file in the top-level CSlib directory. ------------------------------------------------------------------------- */ +#ifdef MPI_YES #include +#else +#include +#endif #include #include #include

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�McTn^@)5uX=ct-}r!(>1_41CM8Pa?3W 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